AVR Timer+Interrupt

cdm·2023년 12월 5일
0

AVR

목록 보기
5/8

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 인터럽트 동작.

0개의 댓글