타이머/카운터를 isr루틴이 아닌 폴링방식을 통해서 사용해보고 싶어서 프로그램을 짰는데요
개념상으로는 타이머초기화한 후에 무한반복문에서 오버플로우 플래그 계속 읽다가 1로 변하면
I/O포트의 신호를 토글하는 식으로 만들려고 하거든요.
모드는 일반으로 해보는거구요. 다른 모드는 이거 이 후에 하려구요
근대 이게 잘 안되요 코드는 보시면
#include <mega128.h>
void Init_Timer1(void)
{
TCCR1A = 0x00;
TCCR1B = 0x00;
TIFR &= ~(1 << TOV1); // 오버플로우 플래그
TCNT1H = 0xE3;//65535 - 7200
TCNT1L = 0xDF;
}
void main(void)
{
bit ovf;
Init_Timer1();
TCCR1A = 0x00;
TCCR1B = 0x05; //분주비 설정 = 타이머 스타트
DDRB.0 = 1;
PORTB = 0xff;
ovf = 0;
while (1)
{
ovf = TOV1;
if(ovf == 1){
PORTB.0 =~ PORTB.0;
TIFR &= ~(1 << TOV1); // 오버플로우 플래그
TCNT1H = 0xE3;//65535 - 7200
TCNT1L = 0xDF;
Init_Timer1();
TCCR1A = 0x00;
TCCR1B = 0x05;
}
}
}
저 빨간 부분을 지우면 LED가 한번 켜지고 다시 토글이 안되요
그러니까 오버플로우 플래그가 클리어가 안되는거죠 분명히 클리어해줬는데
책에는 오버플로우 플래그에 1을써주면 클리어 된대서 1을 써줘봤는데 역시 안됨.
그래서 오버플로우때마다 아예 타이머를 껐다 켜버리고 있어요.
플래그를 안보고 카운터값을 검출해서 해보기도 했는데 역시 플래그를 검출해서
짜보려고 하거든요. 뭐가 문제인건가요.
AVR의 타이머는 일반모드에서는 isr루틴이 아니고선 한번 오버플로우가 나면 다시 시작하지 않나요?
학교다닐때 다뤄본적있는데 다까묵.. 혹시 관련카페없나요? 카페에서 물어보심이..