마이크로컨트롤러 2 (MicroController2) 2 강 ATmega128 의 external interrupt 이귀형교수님
학습목표 interrupt 란무엇인가? 기본개념을알아본다. interrupt 중에서가장사용하기쉬운 external interrupt 의사용방법을학습한다.
1. Interrupt 는왜필요할까? 함수동작을추가하여실행시키려면? //*** example-1 *** #include <avr/io.h> void initialize_port(); void delay(); int main(void) unsigned char ii; initialize_port(); while(1) for(ii=0x01;ii<=0x05;ii++) PORTA=ii; delay(); void initialize_port() DDRA = 0xFF; PORTA = 0x00; void delay( ) unsigned int ta,tb,i,j; ta=10; tb=50000; for(i=0; i<ta; i++) for(j=0; j<tb; j++); void SW0_action() unsigned char jj; for(jj=0x06; jj<=0x0a; jj++) PORTA = jj; delay();
1. Interrupt 는왜필요할까? main 동작중에 SW0 을누를때, 정해진함수동작을실행시키려면? //*** example-2 *** #include <avr/io.h> #define SW0 0x00 void initialize_port(); void delay(); void SW0_action(); int main(void) unsigned char ii; initialize_port(); while(1) while((pind&sw0)==0x00); SW0_action(); for(ii=0x01;ii<=0x05;ii++) PORTA=ii; delay(); void initialize_port() DDRA = 0xFF; DDRD = 0x00; PORTA = 0x00; void delay( ) unsigned int ta,tb,i,j; ta=10; tb=50000; for(i=0; i<ta; i++) for(j=0; j<tb; j++); void SW0_action() unsigned char jj; for(jj=0x06; jj<=0x0a; jj++) PORTA = jj; delay();
1. Interrupt 는왜필요할까? main 동작중에 SW0 을누를때, 정해진함수동작을실행시키려면? //*** example-3 *** #include <avr/io.h> #define SW0 0x00 void initialize_port(); void delay(); void SW0_action(); int main(void) unsigned char ii; initialize_port(); while(1) for(ii=0x01;ii<=0x05;ii++) PORTA=ii; delay(); if((pind&sw0)!=0x00) SW0_action(); void initialize_port() DDRA = 0xFF; DDRD = 0x00; PORTA = 0x00; void delay( ) unsigned int ta,tb,i,j; ta=10; tb=50000; for(i=0; i<ta; i++) for(j=0; j<tb; j++); void SW0_action() unsigned char jj; for(jj=0x06; jj<=0x0a; jj++) PORTA = jj; delay();
2. Interrupt 기초사항 interrupt (by hardware or software) interrupt service routine (isr) interrupt vector ATmega128 에는 35 개의 interrupt 장점 고성능 hardware 제어기능사용가능 프로그램이간결 multi-tasking 이가능
3. External Interrupt external interrupt input INT0~INT7
3. External Interrupt 연관 register 들 external interrupt control register A - EICRA Interrupt Sense Control Bit ISCn 1 ISCn 0 trigger 설정 0 0 INTn 입력의 low level 에인터럽트를요청한다 0 1 reserved 1 0 INTn 입력의 falling edge 때비동기로인터럽트를요청한다 1 1 INTn 입력의 rising edge 때비동기로인터럽트를요청한다
3. External Interrupt 연관 register 들 external interrupt control register B - EICRB Interrupt Sense Control Bit ISCn 1 ISCn 0 trigger 설정 0 0 INTn 입력의 low level 에인터럽트를요청한다 0 1 INTn 입력의 falling & rising edge 에인터럽트를요청한다 1 0 INTn 입력의 falling edge 때비동기로인터럽트를요청한다 1 1 INTn 입력의 rising edge 때비동기로인터럽트를요청한다
3. External Interrupt 연관 register들 external interrupt flag register - EIFR INT7..0까지 interrupt flag를나타내며, isr으로 jump하면해당 flag는클리어됨이 bit를강제로 clear하려면해당 bit에 1을 write해야함
3. External Interrupt 연관 register들 external interrupt mask register - EIMSK INT7..0 까지 interrupt 를 enable/disable 을설정함
3. External Interrupt 연관 register들 status register - SREG 가장최근에수행된연산결과에대한정보를저장하나의연산이끝날때마다 update Bit7 - Global Interrupt Enable 미리설정 함수 sei() 을실행하면 set global interrupt enable(i bit->1) interrupt.h cli() 을실행하면 clear global interrupt enable(i bit->0) interrupt.h
4. External Interrupt 실습문제 external interrupt input INT0, INT1 사용요구조건 external interrupt INT0, INT1(chattering 제거 switch 를사용할것 ) 을동시에사용하려고한다. 다음과같은동작을하는프로그램을작성하라. 1 2 3 main 에서는 PORTA 으로 01H 02H 03H 04H 05H 01H 02H... 를약 1 초간격으로반복출력한다. external interrupt INT0 신호를입력하면, external INT0 isr 에서는 06H 07H 08H 09H 0AH 를한번출력하고 main 으로되돌아간다. external interrupt INT1 신호를입력하면, external INT1 isr 에서는 0BH 0CH 0DH 0EH 0FH 를한번출력하고 main 으로되돌아간다.
4. External Interrupt 실습문제 EICRA 설정 1 1 1 1 #define INT0_RISING_EDGE_TRIGGER 0x03 // 0000 0011 #define INT1_RISING_EDGE_TRIGGER 0x0C // 0000 1100 EICRA = INT0_RISING_EDGE_TRIGGER INT1_RISING_EDGE_TRIGGER; //0000 1111
4. External Interrupt 실습문제 EIMSK 설정 1 1 #define EXT_INT0_ENABLE 0x01 // 0000 0001 #define EXT_INT1_ENABLE 0x02 // 0000 0010 EIMSK = EXT_INT0_ENABLE EXT_INT1_ENABLE; //0000 0011
4. External Interrupt 실습문제 SREG 설정 1 global interrupt enable #include <avr/interrupt.h> sei();
4. External Interrupt 실습문제 Isr (interrupt service routine) 명칭지정 ISR(INT0_vect) BYTE jj; for(jj=0x06; jj<=0x0a; jj++) PORTA = jj; delay(); iom128.h <= io.h /* Interrupt vectors */ /* External Interrupt Request 0 */ #define INT0_vect _VECTOR(1) #define SIG_INTERRUPT0 _VECTOR(1) /* External Interrupt Request 1 */ #define INT1_vect _VECTOR(2) #define SIG_INTERRUPT1 _VECTOR(2)
4. External Interrupt 실습문제 최종 program list //*** example *** #include <avr/io.h> #include <avr/interrupt.h> #define INT0_RISING_EDGE_TRIGGER 0x03 // 0000 0011 #define INT1_RISING_EDGE_TRIGGER 0x0C // 0000 1100 #define EXT_INT0_ENABLE 0x01 // 0000 0001 #define EXT_INT1_ENABLE 0x02 // 0000 0010 void initialize_port(); void initialize_interrupt(); void delay(); int main(void) unsigned char ii; initialize_port(); initialize_interrupt(); sei(); while(1) for(ii=0x01;ii<=0x05;ii++) PORTA=ii; delay(); void initialize_port() DDRA = 0xFF; PORTA = 0x00;
4. External Interrupt 실습문제 최종 program list void initialize_interrupt() EICRA = INT0_RISING_EDGE_TRIGGER INT1_RISING_EDGE_TRIGGER; EIMSK = EXT_INT0_ENABLE EXT_INT1_ENABLE; void delay() unsigned int ta,tb,i,j; ta=10; tb=50000; for(i=0; i<ta; i++) for(j=0; j<tb; j++); ISR(INT0_vect) unsigned char jj; for(jj=0x06; jj<=0x0a; jj++) PORTA = jj; delay(); ISR(INT1_vect) unsigned char kk; for(kk=0x0b; kk<=0x0f; kk++) PORTA = kk; delay();
학습정리 interrupt 를사용하려면외부에서 hardware 신호를입력해주어야하며프로그램첫부분에는 software 로미리설정해주어야한다. interrupt 를사용하면 main 에서 software 적으로함수를부르는동작이생략되어프로그램이간결해지며, 복잡한프로그램에서 multi-tasking 이가능해진다. 다양한기능을활용함으로써, 고도의제어동작이가능해진다. external interrupt 를사용하려면 global interrupt enable(sreg), individual interrupt enable(eimsk) 을선언해주고, external interrupt control register(eicra, B) 에해당입력신호의형태를설정해주어야한다.