Timer 인터럽트와 External 인터럽트를 동시에 사용.
void Timer1_init() {
TCCR1A = 0x00; // WGM11, WGM10 -> 0
TCCR1B = (1 << WGM12) | (1 << CS11) | (1 << CS10); // WGM13, WGM12 -> 0100 (CTC 모드), CS12, CS11, CS10 -> 011 (분주비 64)
OCR1A = 0x3D08; // 0x3D08 = 15624 (1초), 16MHz / 1024 / 15624 = 약 1Hz
TIMSK1 = (1 << OCIE1A); // Timer 1 Output Compare A Interrupt Enable
}
TIMSK1 레지스터에서 OCIE1A를 '1'로 set해줌으로서 타이머 비교 인터럽트 사용.
void EXTINT_init() { // External interrupt 초기화
EIMSK = 0x01; // INTF0 허용
EICRA = 0x02; // falling edge 일 때 interrupt 발생
}
ISR(INT0_vect) { // INT0이 falling edge일 때 인터럽트 발생
Switch_flag = 1;
}
ISR(TIMER1_COMPA_vect){
Timer_flag = 1;
}
외부 인터럽트 초기화 및 인터럽트 선언.
// volatile 지정 시 컴파일러가 최적화를 할 때 무시하지 않음.
volatile unsigned char Switch_flag = 0;
volatile unsigned char Timer_flag = 0;
flag는 전역 변수로 지정.
LED의 출력을 보기 위해 _delay_ms를 사용.
1초마다 Timer1 인터럽트 동작.
버튼을 누를 시 Switch 인터럽트 동작.