질문게시판 > AVR 128 -> 2560으로 변경하는 법좀 알려주세요ㅠㅠ

TODAY1,626 TOTAL2,426,013
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 질문게시판 | AVR 128 -> 2560으로 변경하는 법좀 알려주세요ㅠㅠ

페이지 정보

작성자 tnwls 작성일2022-06-07 13:25 조회5,224회 댓글2건

본문

	

AVR 2560으로 타이머를 만들고 있습니다.

128 코드가 있어서 이거를 가지고 2560에 사용가능하도록 바꾸려고 하는 중인데 잘 안되네요ㅠㅠ

 

TCCR0  -> TCCR0B

TIMSK -> TIMSK0 

OCIE0 -> OCIE0B 

OCR0 -> OCR0A 

이런식으로 바꿨는데 다른거 어떤걸 더 바꿔야할까요?

 

128 코드입니다.

 

#define F_CPU 16000000UL    //시스템클록을 16Mhz로 설정.

 

/* 사용자 매크로___인터럽트 스위치에 대한 판단값. */

#define SETTING 0

#define STOP 1

#define START 2

#define END 3

 

#include <avr/io.h> // 입-출력 레지스터가 정의되어있는 헤더파일을 include.

#include <avr/interrupt.h> // 인터럽트 관련 레지스터가 정의되어있는 헤더파일을 include.

#include <util/delay.h> // 지연함수가 정으되어있는 헤더파일을 include.

 

unsigned char distinction = 0;    //타이머 설정 및 시작 스위치.

unsigned char data[2][2];    //타이머 동작시 FND의 출력 제어에 사용되는 변수.

unsigned short realTime = 0;    //타이머사용시 실제적으로 사용될 변수.

unsigned char timerCount = 0;    //타이머 동작시 사용될 변수.

 

unsigned char stopTcnt;    //정지하엿을 시의 tcnt의 값을 저장할 변수.

unsigned char stopCount; //정지하엿을 시의 timerCount값을 저장할 변수.

unsigned char stopEffect = 0x00; // 타이머가 종료하였을 시를 알리기위해 FND의 깜빡거림을 논하는 변수.

 

ISR(INT0_vect) -> 외부 인터럽트0 핸들러를 지정

{

    switch(distinction)

    {

        case SETTING :

        case START :

            distinction = STOP;

            TCCR0 &= ~(0x06 << CS00);    //타이머카운터 정지.

            stopTcnt = TCNT0;

            stopCount = timerCount;

            TCNT0 = 0;

            break;

        case STOP :

            distinction = START;

            TCNT0 = stopTcnt;

            timerCount = stopCount;

            TCCR0 |= 0x06 << CS00;    //타이머카운터 시작.

            break;

        case END :

            distinction = SETTING;

    }

}

ISR(TIMER0_COMP_vect)

{

    timerCount+=1;

    

    if(timerCount >= 250)

    {

        //1초의 시간이 흐름.

        timerCount=0;

        

        switch(distinction)

        {

            case END :

                PORTC = ~stopEffect;

                stopEffect = ~stopEffect;

                break;

            default :

                realTime -=1;

                if(realTime <= 0)

                {

                    //타이머 동작 종료 및 종료음 발생.

                    distinction = END;

                    //TCCR0 = (0x00 << CS00);    //타이머 카운터 중지. ___ 기능추가로 삭제.

                    realTime = 0;    //FND의 값을 만들기 위해 사용.

                }

                /* realTime의 단위 : 초*/

                data[0][0] = realTime / 600; // realTime / 60초 --> 분의 개념, 분 / 10 --> 십의 자리값.

                data[0][1] = (realTime / 60) % 10; // realTime / 60초 --> 분의 개념, 10자리값을 제외한 값 --> 1의 자리값.

                data[1][0] = (realTime % 60) / 10; // realTime % 60초 --> 0~ 59초의 개념, /10 --> 초단위 10의 자리값.

                data[1][1] = (realTime % 60) % 10; // realTime % 60초 --> 0 ~ 59초의 개념, %10 --> 초단위 1의 자리값.

        }

    }

}

/* 사용자 함수 */

void timeSetting(void);

void timerSystem(void);

void timerEnd(void);

 

/*  FND에 표현될 데이터 변수 */

unsigned char segmentData[11] = {0b11000000,0b11111001,0b10100100,0b10110000,0b10011001,0b10010010,0b10000011,0b11011000,0b10000000,0b10011000,0b01111111};

    

int main(void)

{

    //LED 제어핀 설정.

    DDRA  = 0xff;    //LED 출력핀.

    DDRC = 0x0f;    //common 단자핀.

    DDRB = 0x10;    //스위치 핀.

    DDRD = 0x00;    //스위치 핀(인터럽트 사용)

    

    /* 풀업 저항 사용 */

    PORTB = 0x07;

    

    //외부인터럽트 사용하기위한 설정.

    EICRA =(0x01 << ISC01) | (0x00 << ISC00);    //fallingEgde에서 인터럽트 발생.

    EIMSK = 0x01 << INT0;    //외부인터럽트0(INT0) 사용. ___핀 : PD0

    

    //타이머 기능설정.

    TCCR0 = (0x01 << WGM01) | (0X06 << CS00);    //CTC 모드, 256분주비, 62500 카운트하면 1초, OCR = 250이고 25번 반복하면 0.1초.

    TIMSK = (0x01 << OCIE0); //출력 비교일치 인터럽트를 허용.

    OCR0 = (unsigned char)250;

    

    //전역 인터럽트 허용.

    sei();

    

    while(1)

    {

        timeSetting();

        timerSystem();

        timerEnd();

    }

    

    return 0;

}

 

void timeSetting(void)

{

    unsigned char data_;        //PIN을 통하여 읽어들인 값을 저장 / FND로 출력될 데이터 처리 변수.

    unsigned char timeData[2] = {0,0};    //분과 초의 데이터가 저장되는 변수.

    unsigned char outputData=0;    //FND로 출력될 데이터를 처리할때 사용되는 변수.

    

    unsigned char position[2] = {0x08,0x04};    //FND 출력 위치를 지정하는 변수.

    unsigned char d = 0;    //연속 누름 방지.

    unsigned char state = 0; //분 / 초 선택 변수.

    

    /*

     * 스위치 눌림을 판단하여 분,초의 증감을 시킨다.

     * state = 0 : 10의 자리 계산, state = 1 : 1의 자리 계산을 실시.

     * outputData와 position을 사용하여 FND 출력위치 및 출력값을 생성한다.

     * outputData와 position은 공용으로 사용하는 변수.

    */

    while(!distinction)    //인터럽트 발생여부에 따라 종료됨.

    {

        data_ = PINB;

        if(!(data_ & 0x01) && d == 0)    //증가 스위치가 눌렸을 경우.

        {

            d=1;

            switch(state)

            {

                case 0 :

                    timeData[state]+=1;

                    outputData = timeData[state];

                    break;

                case 1 :

                    timeData[state]+=1;

                    outputData = timeData[state];

                    break;

            }

        }

        else if(!(data_ & 0x02) && d==0)    //감소 스위치가 눌렸을 경우.

        {

            d=1;

            switch(state)

            {

                case 0 :

                    if(timeData[0]>0)

                    {

                        timeData[state]-=1;

                        outputData = timeData[state];

                    }

                    break;

                case 1 :

                    if(timeData[1]>0) 

                    {

                        timeData[state]-=1;

                        outputData = timeData[state];

                    }

                    break;

            }

        }

        else if(!(data_ & 0x04) && d==0)    //분 --> 초, 초 --> 분으로 설정.

        {

            d=1;

            switch(state)

            {

                case 0 :

                    state = 1;

                    position[0] = 0x02;

                    position[1] = 0x01;

                    outputData = timeData[state];

                    break;

                case 1 :

                    state = 0;

                    position[0] = 0x08;

                    position[1] = 0x04;

                    outputData = timeData[state];

                    break;

            }

        }

        

        /* 스위치가 OFF되었는지를 판단 --> 중복 눌림을 방지. */

        data_ = PINB;

        data_ &=0x07;

        

        if(data_ >=7) d = 0;

        /* ********************************************* */

        

        //FND의 10의자리 값을 만듬.

        data_ = outputData/10;

        

        PORTC = position[0];

        PORTA = segmentData[data_];

        _delay_ms(10);

        PORTA = 0xff;    //FND의 출력 잔상을 없애기 위해서 사용.

        PORTC = position[1];

        PORTA = segmentData[outputData-(data_*10)];

        _delay_ms(10);

        PORTA = 0xff;    //FND의 출력 잔상을 없애기 위해서 사용.

    }

    

    /* 타이머 설정이 완료 ___타이머 작동시 사용될 변수에 저장.*/

    realTime = (timeData[0] * 60)+timeData[1];    //1분 == 60초.

    

    data[0][0] = timeData[0] / 10;

    data[0][1] = timeData[0] - (data[0][0] * 10);

    data[1][0] = timeData[1] / 10;

    data[1][1] = timeData[1] - (data[1][0] * 10);

}

 

void timerSystem(void)

{

    while(distinction != END)

    {    

    /* FND에 값을 출력 */

        

        // 1000의 자릿값.

        PORTC = 0x08;

        PORTA = segmentData[data[0][0]];

        _delay_ms(5);

        PORTA = 0xff;

        

        // 100의 자릿값.

        PORTC = 0x04;

        PORTA = segmentData[data[0][1]];

        _delay_ms(5);

        PORTA = 0xff;

        

        // 10의 자릿값.

        PORTC = 0x02;

        PORTA = segmentData[data[1][0]];

        _delay_ms(5);

        PORTA = 0xff;

        

        // 1의 자릿값.

        PORTC = 0x01;

        PORTA = segmentData[data[1][1]];

        _delay_ms(5);

        PORTA = 0xff;

    }

}

 

void timerEnd(void)

{

    //FND에 종료이벤트 발생을 위해 값을 초기화.

    PORTC = 0x00;

    PORTA = segmentData[0];

    

    while(distinction == END) // 인터럽트 스위치를 눌러서 종료해야한다.

    {

        //부저 발생.

        PORTB |= 0x10;

        _delay_ms(500);

        PORTB &= ~0x10;

        _delay_ms(500);

    }

}

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글 2

조회수 5,224

master님의 댓글

master 작성일

//타이머 기능설정.
    TCCR0 = (0x01 << WGM01) | (0X06 << CS00);    //CTC 모드, 256분주비, 62500 카운트하면 1초, OCR = 250이고 25번 반   
    TIMSK = (0x01 << OCIE0); //출력 비교일치 인터럽트를 허용.
    OCR0 = (unsigned char)250;
타이머0 사용하는 레지스터가 3개인가요?
128과 2560 데이터시트에서 레지스터 비트가 조금 다른 부분이 있는지 체크해서 수정하세요

tnwls님의 댓글

tnwls 댓글의 댓글 작성일

네.
TCCR0  -> TCCR0B
TIMSK -> TIMSK0
OCIE0 -> OCIE0B
OCR0 -> OCR0A
WGM01
이 부분들을 수정해봤는데 작동이 잘 안되는데 어디를 더 수정해야 할까요?
비교해보면 나머지는 같은거 같은데 놓치는 부분이 있는 것 같습니다.

질문게시판HOME > 질문게시판 목록

MCU, AVR, 아두이노 등 전자공학에 관련된 질문을 무료회원가입 후 작성해주시면 전문가가 답변해드립니다.
ATMEGA128PWMLED초음파
아두이노AVR블루투스LCD
UART모터적외선ATMEGA
전체 스위치 센서
질문게시판 목록
제목 작성자 작성일 조회
질문 (도와주세요ㅠ) 초음파센서로 lcd와 부저 울리기 첨부파일 승천 22-11-06 271
답변 답변글 답변 : (도와주세요ㅠ) 초음파센서로 lcd와 부저 울리기댓글[4] master 22-11-06 490
질문 서보모터 2개 구동하는법댓글[1] 호하늘 22-11-05 346
질문 블루투스 모듈간에 페어링이 안됩니다 ㅠ댓글[3] starter92 22-11-05 331
질문 블루투스 모듈 HC-05,06은 레오나르도와 사용이 불가능한가요?댓글[2] starter92 22-11-05 181
질문 안녕하십니까? 핀볼관련 코드 질문 드립니다 이미지첨부파일 Honor 22-11-04 391
답변 답변글 답변 : 안녕하십니까? 핀볼관련 코드 질문 드립니다댓글[2] 이미지 master 22-11-05 446
질문 GP2Y0A02YK센서 사용 거리 측정댓글[1] 이미지 cky88 22-11-04 307
질문 wifi server 구현하고 메시지 송신하는 방법좀댓글[1] 라칸 22-11-04 216
질문 Atmega128질문좀 부탁드려요. ㅠㅠ댓글[5] 그냥사는사람 22-11-04 509
질문 초음파 센서를 이용해서 lcd거리측정에 부저 집어넣기...댓글[1] 이미지첨부파일 승천 22-11-04 367
질문 pull down 이용해서댓글[1] 이미지첨부파일 무어유 22-11-03 406
질문 atemega128 가변저항을 이용하여 single conversion mode로 변환하는 과정 질문입니다댓글[1] 호루라기 22-11-03 358
질문 atmega128 인터럽트 스위치, 반복문 안에 반복문댓글[2] 시속90 22-11-03 415
답변 답변글 답변 : atmega128 인터럽트 스위치, 반복문 안에 반복문 master 22-11-03 269
질문 (도와주세요..ㅜ) 아두이노 초음파센서를 이용한 서보모터, 부저 제어 질문댓글[2] 이미지첨부파일 승천 22-11-03 486
질문 아두이노 자동 창문 개폐기 코드 질문드립니다. keajoo12 22-11-03 273
답변 답변글 답변 : 아두이노 자동 창문 개폐기 코드 질문드립니다.댓글[3] master 22-11-03 378
질문 시리얼 모니터를 통한 LCD 문자 출력 시 오류(괴문자)댓글[2] 이미지첨부파일 takeonefor 22-11-02 252
질문 stm32 spi로 센서 모듈 여러개 사용하는 방법좀댓글[4] 이미지첨부파일 라칸 22-11-01 380
질문 stm32 i2c로 센서 2개를 읽고 쓰고 싶은데댓글[4] 라칸 22-11-01 406
질문 블루투스 관련 질문입니다.댓글[5] 이미지 LightP 22-11-01 438
질문 ESP8266을 이용해서 Atmega128에 연결된 모터 제어댓글[1] bbbin 22-11-01 365
질문 릴레이 모듈, 가습기 모듈, 아두이노 연결댓글[1] 이미지첨부파일 보라색 22-10-31 341
질문 스텝모터,twi,LCD관련 질문 있습니다..!댓글[1] 이미지첨부파일 만두 22-10-31 445
질문 ATmega128 디지털 도어락 관련 질문입니다댓글[3] 이미지첨부파일 아트메가왕초보 22-10-30 823
질문 심박수 센서 오류관련 질문입니다댓글[1] starter92 22-10-30 361
질문 압력센서 8개 mux모듈 이미지 ㅋㅈㅇ 22-10-29 330
답변 답변글 답변 : 압력센서 8개 mux모듈 이미지 master 22-10-29 216
답변 답변글 답변 : 답변 : 압력센서 8개 mux모듈댓글[1] 이미지 ㅋㅈㅇ 22-10-29 276
게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기