순천향대학교컴퓨터학부이상정 1 학습내용 인터럽트기본 ATmega128 인터럽트벡터외부인터럽트인터페이스외부인터럽트프로그램예 순천향대학교컴퓨터학부이상정 2
인터럽트기본 순천향대학교컴퓨터학부이상정 3 인터럽트개념 CPU 내부또는외부의요구에의해서정상적인프로그램의실행순서를변경하여보다시급한작업 ( 인터럽트서비스루틴 ) 을먼저수행한후에다시원래의프로그램으로복귀하는것 인터럽트는주변장치의서비스요청에 CPU가가장빠르게대응할수있는방법. 주변장치측으로부터의발생시기를예측하기어려운비동기적인일 (event, 사건 ) 을 CPU가빠르게처리. 서로비동기적으로동작하는 CPU( 매우고속으로동작 ) 와주변장치 ( 비교적저속으로동작 ) 사이에서효율적으로일을수행하는중요한수단. 순천향대학교정보기술공학부이상정 4
인터럽트종류 (1) 인터럽트발생원인에따라분류 하드웨어인터럽트 CPU 코어기준으로내부, 외부분류 내부인터럽트 산술연산오버플로우, 잘못된명령실행, 메모리보호위반 외부인터럽트 외부입력핀, 타이머, 직렬포트, A/D 변환완료, DMA 동작의종료 소프트웨어인터럽트 소프트웨어명령 (supervisor call) 에의해인터럽트발생 순천향대학교정보기술공학부이상정 5 인터럽트종류 (2) 인터럽트를요구한외부하드웨어를확인하는방법에따른분류 조사형인터럽트 (polled interrupt) 외부인터럽트을요청한장치를소프웨어적으로확인하여인터럽트서비스루틴으로점프 벡터형인터럽트 (vectored interrupt) 인터럽트를요청한장치가 CPU에인터럽트벡터 (interrupt vector) 를전송 인터럽트벡터는인터럽트서비스루틴주소의힌트를갖는번호 메모리특정영역에서비스루틴의주소나점프명령등을저장하는인터럽트벡터테이블설정 인터럽트발생시인터럽트벡터테이블참조하여인터럽트서비스으로분기 순천향대학교컴퓨터학부이상정 6
인터럽트의우선순위제어 인터럽트우선순위 (priority) 제어의필요성 2개이상의주변장치가동시에신호를보내인터럽트를요청하는경우 하나의인터럽트가서비스되고있는동안에또다른인터럽트 가요청되는경우 조사형인터럽트의경우 CPU가각주변장치를소프트웨어적으로차례로폴링하는순서에의하여인터럽트의우선순위가결정 필요할때마다소프트웨어를수정하여손쉽게우선순위를변경하는것이가능 인터럽트제어기를사용하는벡터형인터럽트의경우 하드웨어인터럽트인터페이스가우선순위결정 인터럽트마스크레지스터또는인터럽트허용레지스터를가지고있어서인터럽트허용여부를설정 인터럽트우선순위제어레지스터로우선순위를지정 순천향대학교정보기술공학부이상정 7 인터럽트처리과정 프로그램 인터럽트벡터테이블 인터럽트벡터 처리흐름 인터럽트서비스루틴 인터럽트발생 인터럽트금지 프로세서상태저장 인터럽트처리 프로세서상태복구 인터럽트복귀 인터럽트허용 순천향대학교컴퓨터학부이상정 8
ATmega128 인터럽트벡터 순천향대학교컴퓨터학부이상정 9 ATmega128 인터럽트 35 개의인터럽트소스제공 리셋, 외부입력핀, 타이머 / 카운터, 직렬통신, A/D변환완료등 각인터럽트소스는고유의인터럽트벡터로표시 인터럽트인에이블 SREG 레지스터의 I 비트로전체인터럽트인에이블지정 각인터럽트소스개별적으로인에이블지정 인터럽트벡터테이블에는서비스루틴의점프명령저장 표5-1, 낮은주소의인터럽트소스가우선순위높음 MCUCR 레지스터의 IVSEL 값에따라저장위치다름 IVSEL=0 이면0번지부터저장 IVSEL= 1 이면부트플래시섹션의시작번지 순천향대학교컴퓨터학부이상정 10
인터럽트벡터테이블 순천향대학교컴퓨터학부이상정 11 MCUCR 레지스터 MCUCR MCU 제어레지스터 (MCU Control Register) 비트 1, IVSEL (Interrupt Vector Select) 인터럽트벡터테이블저장위치지정 0 : 인터럽트벡터테이블이플래시메모리시작에위치 1: 인터럽트벡터테이블이플래시메모리의부트로더섹션시작에위치 비트 0, IVCE (Interrupt Vector Change Enable) IVSEL 변경시 1 로세팅 비트 7 6 5 4 3 2 1 0 0x35(0x55) SRE SRW10 SE SM1 SM0 SM2 IVSEL IVCE MCUCR 읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기 초기값 0 0 0 0 0 0 0 0 순천향대학교컴퓨터학부이상정 12
인터럽트벡터테이블위치 퓨즈비트 (fuse bit) BOOTRST 와 IVSEL 조합으로리셋및인터럽트벡터테이블위치조정 퓨즈비트는 CodeVisionAVR C 컴파일러에서세팅 퓨즈비트가 0인경우에선택 (programmed) [Project] 메뉴 -> Configure -> [After Build] 탭 BOOTRST IVSEL Reset 어드레스인터럽트벡터시작어드레스 1 0 0x0000 0x002 1 1 0x0000 Boot Reset address + 0x0002 0 0 Boot Reset address 0x002 0 1 Boot Reset address Boot Reset address + 0x002 순천향대학교컴퓨터학부이상정 13 메모리섹션예 BOOTSZ 2 비트퓨즈비트에따라부트로더크기지정 순천향대학교컴퓨터학부이상정 14
BOOTRST=1, IVSEL=0 0x0000 rjmp RESET ; Reset Handler 0x0002 rjmp EXT_INT0 ; IRQ0 Handler 0x0004 rjmp EXT_INT1 ; IRQ1 Handler 0x0006 rjmp EXT_INT2 ; IRQ2 Handler 0x0044 rjmp SPM_RDY ; SPM Ready Handler ; 0x046 RESET: ldi r16,high(ramend) ; Main program start 0x012 out SPH,r16 ; Set Stack Pointer to top of RAM 0x013 ldi r16,low(ramend) 0x014 out SPL,r16 0x015 sei ; Enable interrupts 0x016 <instr> xxx......... 순천향대학교컴퓨터학부이상정 15 BOOTRST=1, IVSEL=1, 부트로더 8KB 0x000 RESET: ldi r16,high(ramend) ; Main program start 0x001 out SPH,r16 ; Set Stack Pointer to top of RAM 0x002 ldi r16,low(ramend) 0x003 out SPL,r16 0x004 sei ; Enable interrupts 0x005 <instr> xxx.org 0xF002 0xF002 rjmp EXT_INT0 0xF004 rjmp EXT_INT1........ ; 0xF044 rjmp SPM_RDY ; IRQ0 Handler ; IRQ1 Handler ; Store Program memory Ready 순천향대학교컴퓨터학부이상정 16
외부인터럽트 순천향대학교컴퓨터학부이상정 17 ATmega128 외부인터럽트 외부입력핀으로부터인터럽트신호수신 하강에지, 상승에지, 레벨트리거신호에의해발생 INT0 INT7 의 8 개외부인터럽트소스 I/O 포트와핀공유 포트 D의하위 4비트 : INT0 INT3 포트 E 의상위 4 비트 :INT4 INT7 제어레지스터 외부인터럽트제어레지스터 EICRA, EICRB 외부인터럽트마스크레지스터 EIMSK 외부인터럽트플래그레지스터 EIFR 상태레지스터 SREG 순천향대학교컴퓨터학부이상정 18
외부인터럽트제어레지스터 (1) EICRA (External Interrupt Control Register A) INT0 INT3 의인터럽트트리거방식설정 비트 7 6 5 4 3 2 1 0 0x6A ISC31 ISC30 ISC21 ISC20 ISC11 ISC10 ISC01 ISC00 EICRA 읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기 초기값 0 0 0 0 0 0 0 0 ISCn1 ISCn0 설명 0 0 INTn 의 Low 레벨에서인터럽트요구 0 1-1 0 INTn 의하강에지에서비동기적으로인터럽트요구 1 1 INTn 의상승에지에서비동기적으로인터럽트요구 순천향대학교컴퓨터학부이상정 19 외부인터럽트제어레지스터 (2) EICRB (External Interrupt Control Register B) INT4 INT7 의인터럽트트리거방식설정 비트 7 6 5 4 3 2 1 0 0x3A(0x5A) ISC71 ISC70 ISC61 ISC60 ISC51 ISC50 ISC41 ISC40 EICRB 읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기 초기값 0 0 0 0 0 0 0 0 ISCn1 ISCn0 설명 0 0 INTn 의 Low 레벨에서인터럽트요구 0 1 INTn 에논리적인변화가있을때인터럽트요구 1 0 INTn 의하강에지에서인터럽트요구 1 1 INTn 의상승에지에서인터럽트요구 순천향대학교컴퓨터학부이상정 20
외부인터럽트마스크레지스터 EIMSK(External Interrupt Mask Register) 8개의외부인터럽트를인에이블 SREG의 I 비트를세트시키고, EIMSK 레지스터의각비트를세트하여인터럽트인에이블 비트 7 6 5 4 3 2 1 0 0x39(0x59) INT7 INT6 INT5 INT4 INT3 INT2 INT1 INT0 EIMSK 읽기 / 쓰기 읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기 초기값 0 0 0 0 0 0 0 0 SREG(Status Register) I 비트를세트하여전역인터럽트를인에이블 비트 7 6 5 4 3 2 1 0 0x3F(0x5F) I T H S V N Z C SREG 읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기 초기값 0 0 0 0 0 0 0 0 순천향대학교컴퓨터학부이상정 21 외부인터럽트플래그레지스터 EIFR(External Interrupt Flag Register) 외부인터럽트발생여부표시 INT0 INT7에인터럽트요구이벤트발생시해당비트세트 인터럽트루틴이실행되면플래그는자동적으로클리어 강제로클리어할려면해당플래그비트에 1을쓰기하면됨 레벨트리거로설정된경우에는항상클리어 비트 7 6 5 4 3 2 1 0 0x38(0x58) INTF7 INTF6 INTF5 INTF4 INTF3 INTF2 INTF1 INTF0 EIFR 읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기읽기 / 쓰기 초기값 0 0 0 0 0 0 0 0 순천향대학교컴퓨터학부이상정 22
외부인터럽트설정예 하강에지에트리거되는 INT0 외부인터럽트설정 EICRA = 0x02 ; EIMSK = 0x01; SREG = 0x80; // INT0 하강에지설정 // INT0 인에이블 // 전역인터럽트인에이블 레벨트리거로트리거되는 INT5 외부인터럽트설정 EICRB = 0 ; EIMSK = 0b00100000; SREG = 0x80; // INT5 레벨트리거설정 // INT5 인에이블 // 전역인터럽트인에이블 순천향대학교컴퓨터학부이상정 23 외부인터럽트프로그램예 순천향대학교컴퓨터학부이상정 24
인터럽트서비스루틴작성 CodeVisionAVR 에서인터럽트서비스루틴작성 인터럽트소스명은헤더파일 <mega128.h> 에정의된소스명을사용 함수명은사용자가임의로지정 // Interrupt vectors definitions interrupt [ 인터럽트소스명 ] void 함수명 (void) 인터럽트서브루틴 순천향대학교컴퓨터학부이상정 25 #define EXT_INT0 2 #define EXT_INT1 3 #define EXT_INT2 4 #define EXT_INT3 5 #define EXT_INT4 6 #define EXT_INT5 7 #define EXT_INT6 8 #define EXT_INT7 9 #define TIM2_COMP 10 #define TIM2_OVF 11 #define TWI 34 #define SPM_RDY 35 #endif 인터럽트서비스루틴작성예 [ 예 ] 외부인터럽트 0 interrupt [EXT_INT0] void ext_int0(void) [ 예 ] 타이머 / 카운터0 비교매치 interrupt t [TIM0_COMP] void tim0_comp(void) id) 순천향대학교컴퓨터학부이상정 26
프로그램예제 4-1 토글스위치를사용하여하강에지의 INT4 외부인터럽트신호가들어올때마다 LED가 5번깜빡거리는프로그램 토글스위치 1을 INT4핀 (PE4 핀 ) 에연결 포트 A에 LED 연결 토글스위치가 1 -> 0 인경우만인터럽트가발생하여 LED 5번깜빡거림을확인 순천향대학교컴퓨터학부이상정 27 #include <mega128.h> #include <delay.h> 프로그램예제 4-1 #define LED_OFF 0x00 #define LED_ON 0xff void main() // LED 포트초기화 DDRA=0xff; PORTA = LED_OFF; //PORTA 출력설정 // 인터럽트초기화 EICRB = 0b00000010; // INT4 하강에지설정 EIMSK = 0b00010000; // INT4 인에이블 SREG = 0x80; // 전역인터럽트인에이블 while(1) // 무한루프 ; 순천향대학교컴퓨터학부이상정 28 interrupt [EXT_INT4] void led_blink(void) unsigned char i; for (i=0; i < 5; i++) PORTA = LED_ON; delay_ms(100); PORTA = LED_OFF; delay_ms(100);
프로그램예제 4-2 인터럽트택트스위치를사용하여레벨트리거의 INT6 외부인터럽트신호가들어올때마다 LED가 5번깜빡거리고, 7- 세그먼트 LED에는인터럽트인가횟수가표시되는프로그램 인터럽트택트스위치 INT0를 INT6 핀 (PE6 핀 ) 에연결 포트 A 에 LED 연결 7-세그먼트 a~g, dp 데이터라인은포트 B에연결 7-세그먼트 C1-C4 선택라인은포트 C에연결 인터럽트택트스위치 5V 평소에는 5V 인가 누르면 0V 인가 0V 누름 순천향대학교컴퓨터학부이상정 29 #include <mega128.h> #include <delay.h> _ #define LED_ON 0xff #define U0 PORTC.0 // 첫째자릿수를선택 #define U1 PORTC.1 // 둘째자릿수를선택 #define U2 PORTC.2 // 셋째자릿수를선택 #define U3 PORTC.3 // 넷째자릿수를선택 unsigned int number[4]; const unsigned char font[16]= 0xc0,0xf9,0xa4, //0,1,2 0xb0,0x99,0x92, 0x99 0x92 //3,4,5 0x82,0xf8,0x80, //6,7,8 0x90,0x88,0x83, //9,A,b 0xc6,0xa1,0x86, 0xa1 0x86 //c,d,e 0x8e; // F #define LED_OFF 0x00 프로그램예제 4-2 // 포트초기화 void port_init(void) // LED 포트초기화 DDRA=0xff; // 포트 A 출력설정 PORTA = LED_OFF; 순천향대학교컴퓨터학부이상정 30 // 7-세그먼트포트초기화 DDRB=0xff; // 데이터라인포트 B 출력 DDRC=0xff; // 선택라인포트 C 출력 PORTB=0xff; PORTC=0xff; // 인터럽트초기화 EICRB = 0; // INT6 0V레벨트리거설정 EIMSK = 0x40; // INT6 인에이블 SREG = 0x80; // 전역인터럽트인에이블 // num을 4자리 10진수로변환 void fnd_number(unsigned int num) unsigned char i; for (i=0; i < 4; i++) number[3-i] = num % 10; num =num / 10;
// 7-SEG. LED에표시 void dp_fnd(void) U0=0; // 첫째자릿수를선택 PORTB = ~font[number[0]]; // 반전출력 delay_ms(5); // 잔상효과지연 U0=1; U1=0; // 둘째자릿수선택 PORTB = ~font[number[1]]; delay_ms(5); U1=1; 1; U2=0; // 셋째자릿수를선택 PORTB = ~font[number[2]]; delay_ms(5); U2=1; U3=0; // 넷째자릿수를선택 PORTB = ~font[number[3]]; delay_ms(5); U3=1; 순천향대학교컴퓨터학부이상정 31 unsigned int counter = 0; void main() 프로그램예제 4-2 port_init(); // 포트초기화 while(1) fnd_number(counter); number(counter); // 10 진수생성 dp_fnd(); // 7-세그먼트 10진수출력 interrupt [EXT_INT6] void led_blink(void) unsigned char i; ++counter; if (counter == 9999) counter = 0; for (i=0; i < 5; i++) PORTA = LED_ON; delay_ms(100); PORTA = LED_OFF; delay_ms(100); 실습예제 4-1 평소에는 LED 가좌우로시프트하다가상승에지의인터업트인가시에 LED가 5번깜빡거린후다시좌우시프트하도록다음과같이프로그램을작성하라. 인터럽트택트스위치 INT1를 INT5 핀 (PE5 핀 ) 에연결 포트 F 에 LED 연결 7-세그먼트 LED에는인터럽트인가횟수가표시 7-세그먼트 a~g, dp 데이터라인은포트 A에연결 7- 세그먼트 C1-C4 선택라인은포트 B 에연결 순천향대학교컴퓨터학부이상정 32
프로그램예제 4-3 두개의인터럽트택트스위치에서하강에지의인터럽트인가하여 7-세그먼트 4자리를입력하는프로그램 외부인터럽트 INT4 (PE4) 택트스위치 INT0에를연결하고, 인터럽트인가시마다현재선택된자리의값 +1 외부인터럽트 INT5 (PE5) 택트스위치 INT1에를연결하고, 인터럽트인가시마다입력될위치를 1자리 -> 10자리 -> 100자리 -> 1000자리 -> 1자리 로자리이동 7-세그먼트 LED 7-세그먼트 a~g, dp 데이터라인은포트 B에연결 7- 세그먼트 C1-C4 C4 선택라인은포트 C 에연결 순천향대학교컴퓨터학부이상정 33 프로그램예제 4-3 #include <mega128.h> #include <delay.h> #define U0 PORTC.0 // 첫째자릿수를선택 #define U1 PORTC.1 // 둘째자릿수를선택 #define U2 PORTC.2 // 셋째자릿수를선택 #define U3 PORTC.3 // 넷째자릿수를선택 const unsigned char font[16]= 0xc0,0xf9,0xa4, //0,1,2 0xb0,0x99,0x92, //3,4,5 0x82,0xf8,0x80, 0xf8 0x80 //6,7,8 0x90,0x88,0x83, //9,A,b 0xc6,0xa1,0x86, //c,d,e 08 0x8e; //F unsigned char N1, N10, N100, N1000; char pos = 0; // 0 : 1 자리, 1 : 10 자리 // 2 : 100자리, 3 : 1000자리 void 순천향대학교 Seg4_out(void); 컴퓨터학부이상정 34 // 포트초기화 void port_init(void) // 7-세그먼트포트초기화 DDRB=0xff; // 데이터라인포트 B 출력 DDRC=0xff; // 선택라인포트 C 출력 PORTB=0xff; PORTC=0xff; // 인터럽트초기화 EICRB = 0x0a; // INT4,5 하강에지설정 EIMSK = 0x30; // INT4,5 인에이블 SREG = 0x80; // 전역인터럽트인에이블 // 자릿수초기화 N1 = N10 = N100 = N1000 = 0; void main() port_init(); while(1) Seg4_out(); // 포트초기화
// 7-SEG. LED에표시 void Seg4_out(void) U0=0; // 1000자리 PORTB = ~font[n1000]; delay_ms(5); U0=1; 프로그램예제 4-3 U1=0; // 100 자리 PORTB = ~font[n100]; delay_ms(5); U1=1; 1; U2=0; // 10자리 PORTB = ~font[n10]; delay_ms(5); U2=1; 프로그램예제 4-3 // 외부인터럽트4 서비스루틴 interrupt [EXT_INT4] void num_incr(void) if (pos == 0) N1 = (N1 + 1) % 10; // 1자리 +1 else if (pos == 1) N10 = (N10 + 1) % 10; // 10자리 +1 else if (pos == 2) N100 = (N100 + 1) % 10; // 100자리 +1 else N1000 = (N1000 + 1) % 10; // 1000자리 +1 U3=0; // 1자리 PORTB = ~font[n1]; delay_ms(5); U3=1; 순천향대학교컴퓨터학부이상정 35 // 외부인터럽트5 서비스루틴 interrupt [EXT_INT5] void position_sel(void) pos = (pos + 1) % 4; // 입력자리이동 실습예제 4-2 두개의인터럽트택트스위치에서하강에지의인터럽트인가하여 7- 세그먼트 4자리를토글스위치로입력하는프로그램 외부인터럽트 INT6 (PE6) 택트스위치 INT0 에를연결하고, 인터럽트인가시마다입력될위치를 1 자리 - > 10자리 -> 100자리 -> 1000자리 -> 1자리 로자리이동 외부인터럽트 INT7 (PE7) 택트스위치 INT1 에를연결하고, 인터럽트인가시마다 LED 깜빡깜빡 토글스위치 포트 E의하위 4비트에연결하고, INT6 인터럽트인가시입력된값이 7-세그먼트에표시 LED 포트 A 에연결되고좌우시프트하다가인터럽트인가되면 5 번깜빡깜빡 7- 세그먼트 LED 7- 세그먼트 a~g, dp 데이터라인은포트 B 에연결 7- 세그먼트 C1-C4 선택라인은포트 C 에연결 순천향대학교컴퓨터학부이상정 36