다섯째날 : 외부 인터럽트 - 당근이의 AVR 갖고 놀기 - 당근닷컴 http://www.carroty.com 당근닷컴 http://www.carroty.com 서울특별시 광진구 모진동 199-6 KCC 파크타운 1404호 e-mail : rainbow77@korea.com
INDEX 1 Goal 2 Introduction & Base Knowledge 3 Circuit & Environment 4 Register Setting 이전 “당근이의 AVR 갖고 놀기” 화면 5 Experiment & Result 6 Conclusion & Future Works
Goal 목표 인터럽트에 대한 이해 폴링 방식과 인터럽트 방식의 차이 폴링 방식이 아닌 인터럽트 방식으로 스위치 입력 처리
Introduction 회로도 PIN0, PIN1이 INT0, INT1에 물려있음 : PD4/PD5/PD6/PD7 동작은 전과 동일 : 평소에 HIGH, 눌려지면 LOW
Polling Method 앞장에서 스위치 입력을 받은 예제 : polling 방식 while(true) 부분에서 키입력을 무한히 검사한다. 원래 폴링이 이래요. #include <avr/io.h> #include "./carroty/fundamental.h" #include "./carroty/delay.h" int main(void) { unsigned char key= 0; DDRA= 0xFF; DDRD= 0x0F; while(true) { key= PIND; switch(key) { case (KEY1) : PORTA= LED1_ON; break; case (KEY2) : PORTA= LED2_ON; break; case (KEY3) : PORTA= LED3_ON; break; case (KEY4) : PORTA= LED4_ON; break; default : PORTA= 0xFF; break; } return 0;
Register Setting MCUCR : MCU Control Register GICR : General Interrupt Control Register SREG : Status Register GIFR : General Interrupt Flag Register
Register Setting MCUCR : MCU Control Register GICR : General Interrupt Control Register INT1=1 : PORT D3 ON / INT0=0 : PORT D3 OFF SREG I=1 : All Interrupt Enable : INT설정이 의미가 없어진다.
Register Setting GICR : General Interrupt Control Register INT1=1 : PORT D3 ON / INT0=0 : PORT D3 OFF SREG I=1 : All Interrupt Enable : INT설정이 의미가 없어진다. GIFR : General Interrupt Flag Register INTF1 : INT1 입력 인터럽트 발생시 1로 설정됨 인터럽트 함수가 수행되면 0으로 설정됨 이 값을 루프를 통해 주시하는 것이 아닌 INT가 발생하면 자동으로 인터럽트 함수가 호출됨 : 이점이 폴링 방식과 다르다.
Example External Interrupt Method vs Polling Method #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> /* Interrupt Service Routine */ SIGNAL(SIG_INTERRUPT0) { PORTA= LED1_ON; } // INT0 interrupt function SIGNAL(SIG_INTERRUPT1) { PORT2= LED2_ON; } // INT1 interrupt function int main(void) { cli(); // global interrupt disable MCUCR |= 0b10001010; // SRE(7) : External SRAM/XMEM Enable // ISC11:ISC10(3,2) - 10 : INT1(Falling edge) // ISC01:ISC00(1,0) - 10 : INT0(Falling edge) GICR = 0b11000000; // INT1(7) - 1 : INT1 interrupt enable // INT0(6) - 1 : INT0 interrupt enable GIFR = 0b00000000; // INTF1(7) - 0 : INT1 interrupt flag clear // INTF0(6) - 0 : INT0 interrupt flag clear PORTA= LED1_OFF; PORTA= LED2_OFF; sei(); // global interrupt enable return 0; }