AVR atmega128a timer3 질문드립니다.
페이지 정보
작성자 야랙핑크 작성일22-12-16 11:48 조회15,178회 댓글4건첨부파일
본문
안녕하세요. atmega128a timer3 질문드립니다.
데이타시트를 보면서 하고 있는데 너무 헷갈려서요ㅠㅠㅠ항상 감사드립니다.
첫번째질문. timer3 인터럽트 초기화가 너무 어렵습니다. 어떤부분을 어떻게 만져야할지 모르겠습니다.
두번째 질문. 메인함수에 ISR(TIMER3_COMPA_vect)을 넣고 했습니다. 인터럽트로 뛰는 부분도 종류가 굉장히 많더라고요..
무엇을 어떻게 써야할지 모르겠습니다.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
제가 사용한 인터럽트 초기화 부분 (master님이 작성하신 코드를 그냥 그대로 따왔습니다ㅠ)
TCCR3B=0x0A; OCR3AH=31679>>5; OCR3AL=31679&0xFF; ETIMSK=0x10;
EICRB=0xFF; EIMSK=0x20;
제가 사용한 인터럽트 부분
ISR(TIMER3_COMPA_vect)
{
incTick();
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
구현하고 싶은 내용.
timer3 인터럽트와 DHT11 센서를 이용해서 온습도를 LCD에 받아오고 싶습니다.
void Presenter_showTempHumid()
{
static uint32_t prevTime = 0;
if(getTick() - prevTime < 3000) {
return;
}
prevTime = getTick();
char buff[30];
sprintf(buff, "T:%02d.%0dC H:%02d.%0d%%", tempInt, tempDec, humidInt, humidDec);
LCD_WriteStringXY(1, 0, buff);
}
인터럽트를 1ms마다 1번으로 잡아서 3초가 지나면 온습도 데이터를 받는 방식입니다.
void incTick()
{
timeTick++;
}
uint32_t getTick()
{
return timeTick;
}
1ms마다 타임틱이 늘어나고 3천이 되면 맨위 함수가 작동하여 온습도가 업데이트 됩니다..
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
정리
timer3 를 이용해서 3초마다 온습도데이터가 업데이트 되면서 LCD에 출력되면 좋겠습니다...
댓글 : 4
조회수 : 15,178
master님의 댓글
master 작성일
TCCR3B=0x0A; OCR3AH=31679>>5; OCR3AL=31679&0xFF; ETIMSK=0x10;
이 설정은 1ms 설정은 아닌 것으로 보입니다.
TCCR3B=0x0A; OCR3AH=19999>>8; OCR3AL=19999&0xFF; ETIMSK=0x10; //10ms
TCCR3B=0x0A; OCR3AH=31999>>8; OCR3AL=31999&0xFF; ETIMSK=0x10; //16ms
16ms에 가까우니 15ms 정도 될까요?
TCCR3B=0x09; OCR3AH=15999>>8; OCR3AL=15999&0xFF; ETIMSK=0x10; //1ms
TCCR3B=0x0A; OCR3AH=1999>>8; OCR3AL=1999&0xFF; ETIMSK=0x10; //1ms
TCCR3B=0x0B; OCR3AH=249>>8; OCR3AL=249&0xFF; ETIMSK=0x10; //1ms
1ms는 위 설정 중 어느 하나를 선택하면 될 것으로 보입니다만
TCCR3B=0x0D; OCR3AH=46874>>8; OCR3AL=46874&0xFF; ETIMSK=0x10; //3sec
3초 인터벌의 설정도 있습니다.
master님의 댓글
master 작성일
TCCR3B=0x0D; OCR3AH=46874>>8; OCR3AL=46874&0xFF; ETIMSK=0x10; //3sec
volatile char flag=0;
ISR(TIMER3_COMPA_vect){ flag=1; }
char buff[30];
while(1){
if(flag){ flag=0;
온습도 센서 read();
sprintf(buff,"T:%02d.%0dC H:%02d.%0d%%",tempInt,tempDec,humidInt,humidDec);
LCD_WriteStringXY(1,0,buff);
}
}
야랙핑크님의 댓글
야랙핑크 작성일
정말 감사합니다!!! 근데 뭔가 인터럽트가 걸리는 과정에서 딜레이같은게 있나봐요. 혹시 다른 타이머가 영향을 주기도 하나요??
타이머 0 1 2 3 을 다 사용하고 있어서요
master님의 댓글
master 작성일
질문을 할 때는 전체 소스를 첨부하셔야 합니다.
소스를 올리지 않고 물어보시려면 전문가가 아닌 점쟁이에게 문의 하셔야 합니다.