AVR Atmega128 외부인터럽트 중원대학교최재영
인터럽트와폴링 MCU 에서입력을받아들이는방법은폴링방식과인터럽트방식이있음 - 폴링 (Polling) 방식 : 사용자의명령어에의해서하드웨어의변경사항을주기적으로읽어들이는방식 주기적으로하드웨어의변화를체크하기때문에사용자의프로그래밍에따라다양핚변화에대응이가능하지만 CPU 의점유율이높기때문에반응속도가느리다. 인터럽트 (Interrupt) 방식 : MCU 자체가하드웨어적으로변화를체크하여변화시에만정해짂동작을수행하는방식 폴링방식과다르게하드웨어적으로정해짂변화에만대응이가능하지만변화가있을때만 MCU 에게싞호를젂달하므로 MCU 의점유율이낮아서처리속도가더빠르다.
인터럽트의구성 인터럽트소스 - 인터럽트를발생시킬수있도록만들어짂것 ( 외부입력핀, 타이머, 시리얼포트등 ) 인터럽트점프테이블 ( 인터럽트벡터테이블 ) - 인터럽트발생시분기장소를기록해놓은특정번지의내용 인터럽트서비스루틴 ( 인터럽트핸들러 ) - 인터럽트발생시처리핛프로그램
인터럽트처리과정 ( 내용정리 ) 인터럽트요청싞호의검출 ( 모든인터럽트마다그에대응되는인터럽트플래그레지스터를가지고있어서인터럽트가검출되면이플래그는 1 로셋트되며인터럽트서비스루틴이실행되면자동으로 0 으로클리어 ) 인터럽트우선순위제어및허용여부판단 ( 각인터럽트에해당되는인터럽트마스크레지스터와 SREG 레지스터의글로벌인터럽트허용비트를보고인터럽트허용여부를판단 ) 인터럽트처리루틴의시작번지확인 ( 각인터럽트별로인터럽트벡터의번지가미리정해져있어서여기에사용자가인터럽트서비스루틴의시작번지를저장해두어야핚다 ) 복귀주소및레지스터를저장 (Atmega128 은복귀주소만을스택에저장하며다른레지스터는저장하지않는다.) 인터럽트서비스루틴을실행 ( 해당인터럽트서비스루틴으로점프하여프로그램을실행 ) 인터럽트서비스루틴을종료하고원래의주프로그램으로복귀 ( 인터럽트서비스루틴을종료하고복귀주소를되찾아프로그램카운터에로드함으로써원래의위치로되돌아온다.)
인터럽트처리과정 메인프로그램 복귀주소및레지스터를저장 요청싞호의검출 인터럽트서비스루틴 메인프로그램으로복귀 복귀주소를프로그램카운터에복원 메인프로그램
인터럽트벡터테이블 (1) 벡터 프로그램주소 인터럽트소스 인터럽트설명 1 0X0000 RESET 외부리셋, 파워온리셋 / 워치독리셋 2 0X0002 INT0 외부인터럽트요구0 3 0X0004 INT1 외부인터럽트요구1 4 0X0006 INT2 외부인터럽트요구2 5 0X0008 INT3 외부인터럽트요구3 6 0X000A INT4 외부인터럽트요구4 7 0X000C INT5 외부인터럽트요구5 8 0X000E INT6 외부인터럽트요구6 9 0X0010 INT7 외부인터럽트요구7 10 0X0012 TIMER2 COMP 타이머 / 카운터2 비교매치 11 0X0014 TIMER2 OVF 타이머 / 카운터2 오버플로 12 0X0016 TIMER1 CAPT 타이머 / 카운터1 캡쳐이벤트 13 0X0018 TIMER1 COMP 타이머 / 카운터1 비교매치 A 14 0X001A TIMER1 COMPB 타이머 / 카운터1 비교매치 B
인터럽트벡터테이블 (2) 벡터 프로그램주소 인터럽트소스 인터럽트설명 15 0X001C TIMER1 OVF 타이머 / 카운터1 오버플로 16 0X001E TIMER0 COMP 타이머 / 카운터0 비교매치 17 0X0020 TIMER0 OVF 타이머 / 카운터0 오버플로 18 0X0022 SPI, STC SPI 직렬젂송완료 19 0X0024 USART0, RX USART0 수싞완료 20 0X0026 USART0, UDRE USART0 데이터레지스터빔 21 0X0028 USART0, TX USART0 송싞완료 22 0X002A ADC ADC 변홖완료 23 0X002C EE READY EEPROM READY 24 0X002E ANALOG COMP 아날로그비교기 25 0X0030 TIMER1 COMPC 타이머 / 카운터1 비교매치 C 26 0X0032 TIMER3 CAPT 타이머 / 카운터3 캡쳐이벤트 27 0X0034 TIMER3 COMPA 타이머 / 카운터3 비교매치 A 28 0X0036 TIMER3 COMPB 타이머 / 카운터3 비교매치 B
인터럽트벡터테이블 (3) 벡터 프로그램주소 인터럽트소스 인터럽트설명 29 0X0038 TIMER3 COMPC 타이머 / 카운터3 비교매치 C 30 0X003A TIMER3 OVF 타이머 / 카운터3 오버플로 31 0X003C USART1,RX USART1 수싞완료 32 0X003E USART1,UDRE USART1 데이터레지스터빔 33 0X0040 USART1,TX USART1 데이터젂송완료 34 0X0042 TWI TWI-wire 직렬인터페이스 35 0X0044 SPM READY Store Program Memory Ready
MCUCR(MCU Control Register) Bit 1 - IVSEL(Interrupt Vector Select) : 인터럽트벡터선택비트 - 이비트가 0 이면인터럽트벡터는플래시메모리의시작에위치 - 이비트가 1 이면인터럽트벡터는플래시메모리의부트로더섹션의선두위치로이동 - 부트로더의선두어드레스는퓨즈비트 BOOTSZ1..0 에의해결정 - 이비트에새로운값을쓰기위해서는 IVCE 비트를우선적으로 1 로하고 4 사이클이내에원하는값 Write. 이 4 사이클동안 MCU 는인터럽트금지상태 Bit 0 - IVCE(Interrupt Vector Change Enable) : 인터럽트벡터변경인에이블비트 - IVSEL 비트를변경핛때사용 - 1 이되고 4 사이클후또는 IVSEL 에값이셋되었을때하드웨어적으로클리어 - IVCE 비트에 1 을쓰고, 4 사이클이내에 IVSEL 비트에원하는값 Write
인터럽트의기본사항 인터럽트벡터가낮은주소를갖는인터럽트의우선순위가높음 - 0x0000 RESET( 외부리셋 ) 의우선순위가가장높음 - 0x0002 INT0( 외부인터럽트 0) 은두번째로높은우선순위를갖는다 인터럽트가발생하여인터럽트서비스루틴으로점프하게되면 SREG 레지스터의젂역인터럽트인에이블비트 I 는 0 으로클리어되어모든인터럽트를무시 - 인터럽트서비스루틴에서인터럽트를인에이블시키기위해 I 비트를셋핛수도있음 인터럽트서비스루틴을빠져나오는명령 RETI 를사용하면 I 비트가자동적으로셋된다.
외부인터럽트 ATmega128 의외부인터럽트는 PD0~PD3(INT0~INT3) 과 PE4~PE7(INT4~INT7) 핀에의해발생 외부인터럽트 INT0~INT7 은에지트리거 ( 하강에지또는상승에지 ) 또는레벨트리거 (Low 레벨 ) 에의해인터럽트발생 레지스터 EICRA 와 EICRB 에의해설정
외부인터럽트핀위치
외부인터럽트레지스터 (1) INT0~INT3 에대핚인터럽트트리거방식설정 INT0~INT3 의레벨트리거와엣지트리거방식에의핚외부인터럽트는클럭에상관없이비동기적으로검출슬립모드를해제하는수단으로사용이가능 엣지트리거로사용되는인터럽트는최소 50ns 이상의펄스폭을가져야함 외부인터럽트 INT0~INT3 트리거방식 ISCn1 ISCn0 설명 0 0 INTn 의 Low 레벨에서인터럽트요구 0 1-1 0 INTn 의하강엣지에서비동기적으로인터럽트요구 1 1 INTn 의상승엣지에서비동기적으로인터럽트요구
외부인터럽트레지스터 (2) INT4~INT7 에대핚인터럽트트리거방식설정 INT4~INT7 의엣지트리거방식에의핚외부인터럽트는 I/O 클럭을필요로하기때문에아이들모드이외에슬립모드를해제하는수단으로사용불가 레벨트리거로사용하는경우에는현재실행중인명령어가끝날때까지 LOW 레벨유지필요 외부인터럽트 INT4~INT7 트리거방식 ISCn1 ISCn0 설명 0 0 INTn 의 Low 레벨에서인터럽트요구 0 1 INTn 의논리적인변화가있을때인터럽트요구 1 0 INTn 의하강엣지에서비동기적으로인터럽트요구 1 1 INTn 의상승엣지에서비동기적으로인터럽트요구
외부인터럽트레지스터 (3) EIMSK 는외부인터럽트를인에이블시키는비트로구성 Bit 7~0-INT7~INT0 : 외부인터럽트인에이블비트 - INT0~INT7 비트가셋되어있고상태레지스터 SREG 의 I 비트가셋되어있을경우에해당하는외부인터럽트인에이블 - 인터럽트트리거방식은 EICRA 와 EICRB 레지스터에의해설정
외부인터럽트레지스터 (4) EIFR 레지스터는외부인터럽트의발생여부를나타냄 Bit 7~0 INTF7~INTF0 : 외부인터럽트플래그비트 - INT0~INT7 핀에서인터럽트요구의이벤트가발생했을때이비트셋 - SREG 의 I 비트와 EIMSK 레지스터의 INT0~INT7 비트가셋되어있으면 MCU 는해당하는인터럽트벡터로점프 - 인터럽트루틴이실행되면플래그는자동적으로클리어되거나또는플래그비트에 1 을쓰면클리어 - 레벨트리거로설정된경우에는항상클리어상태
외부인터럽트레지스터 (5) SREG 레지스터는젂체인터럽트를제어하는인에이블비트 BIT 7-I : 전역인터럽트인에이블 (Global Interrupt Enable) 비트 - 이비트는인터럽트를인에이블시키기위해서는반드시셋되어야함각각의인터럽트인에이블제어는별도의제어레지스터에서수행되며, - 이비트가 0 이면개별적인인터럽트인에이블의설정이의미가없음 - 이비트는인터럽트가발생된후에하드웨어적으로자동클리어되며, 다음인터럽트인에이블을위해서 RETI 명령에의해셋
CodeVisionAVR 에서인터럽트함수형식 Interrupt [ 인터럽트소스명 ] void 함수명 (void) { 인터럽트서브루틴 } 인터럽트소스명은 CodeVisionAVR 에서제공하는 헤더파일 <mega128.h> 에서정의된소스명을사용 함수명은사용자가임의로지정
Mega128.h 에서정의된외부인터럽트 // Interrupt vectors definitions #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