AVR STUDY 2주차
타이머 카운터 인터럽트
INTERRUPT란?
★ CPU 외부/내부의 하드웨어적인 요구에 의해서 프로그램의 실행 순서를 변경하여 보다 시급한 작업을 먼저 수행한 후에 다시 원래의 위치로 복귀하는 작업 ★ ISR = Interrupt Service Routine
왜 인터럽트를 사용하는가?
★ 1초마다 숫자 증가 필요
왜 인터럽트를 사용하는가?
★ 저번 시간에 사용했던 방법은 delay
왜 인터럽트를 사용하는가?
ATMEGA128의 인터럽트
★ 총 4개의 인터럽트 ★ 8비트 타이머/카운터 0,2 0x00 ~ 0xFF ★ 8비트 관련 레지스터 TCNT, TCCR, OCR, ASSR, TIMSK, TIFR, SFIOR ★ 16비트 타이머/카운터 1,3 0x0000 ~ 0xFFFF ★ 16비트 관련 레지스터 TCNT, TCCRnA, TCCRnB, TCCRnC, OCRnA~OCRnC, ICR, TIMSK, ETIMSK, TIFR, ETIFR, SFIOR ★ 인터럽트의 다양한 모드 일반모드, CTC 모드, Fast PWM MODE. PC PWM MOCE
8비트 타이머/카운터0 일반모드
★ 알아야 할 함수 cli() sei() ISR(TIMER0_OVF_vect) ★ 알아야 할 레지스터 TCCR0 TCNT0 TIMSK
cli() & sei() & ISR(TIMER0_OVF_vect)
★ cli() = CLear Interrupt flag 모든 인터럽트를 비활성화시키는 함수 ★ sei() = SEt Interrupt mask. 설정된 인터럽트들을 모두 활성화시키는 함수 ★ ISR(TIMER0_OVF_vect) WinAVR 레퍼런스의 avr/interrupt.h
TCCR0
★ Timer/Counter0 Control Register
★ FOC0 = 0 // 사용 안 하는 bit
TCCR0
TCCR0
★ 타이머/카운터0 분주비(prescaler) ★ TCCR0=0x05 //0000101 CLKtos/128 (from prescaler)
TCNT0
★ Timer/Counter Register
★ Count되는 수치가 저장되는 레지스터
TIMSK
★ Timer/Counter Interrupt Mask Register
★ 출력비교 인터럽트, 오버플로우 인터럽트 등을 결정 ★ TIMSK=0x01;
TCCR0 & TCNT0 & TIMSK
예제
8비트 타이머로는 1초 불가능 16비트 타이머에서 가능
CODE
예제 (1/2)
예제 (2/2)