원하는 주기당 한번씩의 인터럽트 루틴이 필요하다면 0번 타이머 인터럽트를 추천한다!
본인은 툴을 Codevision을 사용하므로 Codevision Wizard를 사용하면 쉽게 레지스터를 설정해줄 수 있다.
위 그림 처럼 0번 타이머에서 Clock Value를 설정하는데 prescaler에 따라 그림처럼 선택할 수 있다.
다음으로 mode인데 모드마다 각각의 특징이 있는데 일단 심플한 타이머 인터럽트를 쓰려했으나 Normal mode는 잘못 사용하면 CPU에 무리를 준다는 내용을 보고 그냥 이전에 써본 CTC mode를 선택했다. CTC모드는 적외선 센서 컨트롤 할때 Carrier 주파수 생성과 같은 경우에 유용하게 쓸 수 있다.
그리고 Overflow Interrupt 체크박스를 살포시 눌러주었다.
결과적으로 소스는 다음과 같이 생성된다.
[레지스터 값 설정 부분]
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 15.625 kHz
// Mode: CTC top=OCR0
// OC0 output: Disconnected
ASSR=0x00;
TCCR0=0x0F;
TCNT0=0x0F;
OCR0=0x00;
[타이머 인터럽트 & 글로벌 인터럽트 Enable] <- 이부분을 빼먹고 헤매는 경우가 많다
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
// Global enable interrupts
#asm("sei")
[오버플로우 인터럽트 서비스 루틴]
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0x0F;
// Place your code here
}
'IT > AVR' 카테고리의 다른 글
초음파 센서 제어(2Y0A21) (0) | 2014.06.07 |
---|---|
초음파센서 제어(GP2D150A) (0) | 2014.06.05 |
UART to TTL(MAX232) (0) | 2014.06.05 |