Section 03 인터럽트활성화와인터럽트서비스루틴연결 33/82
Section 03 인터럽트활성화와인터럽트서비스루틴연결 34/82 장치에대한인터럽트설정과활성화 내부장치에대한특수레지스터존재 장치의특성을반영한동작설정용또는상태관찰용비트로구성 인터럽트사건의발생패턴을설정해야함 인터럽트활성화비트를 1 로셋하여, 인터럽트발생을허락» 전제, 전역인터럽트활성화비트가 1 로셋되었을때 ATmega128 인터럽트서비스, 개별인터럽트활성화비트및레지스터
Section 03 인터럽트활성화와인터럽트서비스루틴연결 35/82
Section 03 인터럽트활성화와인터럽트서비스루틴연결 36/82
Section 03 인터럽트활성화와인터럽트서비스루틴연결 37/82 전역인터럽트 I- 비트활성화 개별인터럽트가활성화되고, 전역인터럽트비트 (SREG 의 I- 비트 ) 가 1 로셋되어있을때, 인터럽트서비스루틴이실행됨 인터럽트사건이발생하면, 해당인터럽트플래그가 1 로설정되고, 인터럽트서비스루틴이개시되면, 그인터럽트플래그는클리어됨
38/82 Section 03 인터럽트활성화와인터럽트서비스루틴연결 인터럽트서비스루틴의연결 #include <avr/interrupt.h> 를앞에적어인터럽트관련레이블과매크로정의 ISR( ) 함수인수위치에인터럽트서비스루틴명칭을넣어작성 ISR(INT0_vect) ISR(ADC_vect)
Section 03 인터럽트활성화와인터럽트서비스루틴연결 39/82 인터럽트대기와실행 동시에여러인터럽트가요청되었을때는, 작은숫자의벡터값의인터럽트가높은우선순위를가짐 일반적인마이크로프로세서 높은우선순위의인터럽트가발생하면, 현재인터럽트서비스루틴을중단하고, 새로운인터럽트서비스루틴을실행 ATmega128 우선순위가더높은인터럽트가발생하더라도, 현재인터럽트서비스루틴을중단하지는않음 인터럽트서비스루틴이종료되면, 대기 (pending) 인터럽트중에서우선순위가높은인터럽트서비스루틴을수행
40/82 Section 03 인터럽트활성화와인터럽트서비스루틴연결 인터럽트서비스프로그램중요청된인터럽트처리 인터럽트 1 발생, 인터럽트 1 플래그셋 인터럽트 1 서비스루틴이실행되면서,» SREG 의 I- 비트와인터럽트 1 의플래그가클리어됨 인터럽트 2 발생, 인터럽트 2 플래그셋 인터럽트 1 서비스루틴종료까지대기» 인터럽트 1 서비스루틴이종료하면 SREG 의 I- 비트가다시 1 로셋 인터럽트 2 서비스루틴이실행되면서,» SREG 의 I- 비트와인터럽트 1 의플래그가클리어됨 인터럽트 2 서비스루틴이종료되면, SREG 의 I- 비트가다시 1 로셋
Section 03 인터럽트활성화와인터럽트서비스루틴연결 41/82 인터럽트플래그비트 인터럽트플래그가 1 이되어대기 인터럽트서비스루틴 (interrupt service routine) 이실행되면, 대부분의인터럽트플래그 (interrupt flag) 는자동으로클리어 (clear) 됨» 몇가지는수동으로인터럽트플래그클리어해주어야함 만일대기중인인터럽트플래그에 소프트웨어적으로 1을기록하면, 인터럽트플래그는클리어 대기중인인터럽트해지
Section 03 인터럽트활성화와인터럽트서비스루틴연결 42/82 개별인터럽트활성화비트와인터럽트플래그비트
Section 03 인터럽트활성화와인터럽트서비스루틴연결 43/82
Section 04 외부인터럽트 44/82 외부인터럽트설정과활성화 디지털 I/O 핀의디지털전압레벨을외부인터럽트로감지 EIMSK : 외부인터럽트마스크레지스터 (External Interrupt Mask Register) 외부인터럽트 INT0~INT7 를개별적으로활성화시킬수있음
Section 04 외부인터럽트 45/82 EICRA, EICRB : 외부인터럽트제어레지스터 (External Interrupt Control Register) 인터럽트발생순간을 ISCnx(n 은 0~7, x 는 0~1) 비트로설정
Section 04 외부인터럽트 46/82 외부인터럽트와외부인터럽트서비스루틴과의연결 외부인터럽트서비스루틴을작성하여, 주프로그램과인터럽트를연결 EIFR : 외부인터럽트플래그레지스터 (External Interrupt Flag Register) 활성화된외부인터럽트는전역인터럽트가활성화되어있고, 설정된발생조건을만족하면, 외부인터럽트플래그비트를 1로셋하고, 인터럽트서비스루틴실행절차가수행
Section 04 외부인터럽트 47/82 인터럽트서비스루틴실행절차 ( 인터럽트플래그관점 ) ❶ EICRA, EICRB 레지스터에설정된조건이만족되어인터럽트사건발생 ❷ EIFR 레지스터의해당인터럽트플래그비트 (INTF0~INT7) 가 1로셋됨 ( 인터럽트사건이발생된시점에다른인터럽트서비스루틴이실행중이면, 그인터럽트서비스루틴이종료될때까지대기 ) ❸ 인터럽트서비스루틴으로진입되면, 인터럽트플래그비트는클리어됨 ❹ ( 예외적 ) 만일 2번단계에서해당인터럽트플래그비트를 1로기록하면, 3번단계를수행하지않고, 인터럽트플래그비트는클리어됨
Section 05 주프로그램과인터럽트서비스루틴의요청 / 응답인터페이스 48/82 인터럽트서비스루틴과요청 / 응답인터페이스절차 인터럽트서비스루틴과요청 / 응답인터페이스 ❶ 주프로그램은인터럽트서비스루틴과약속된전역변수에요청을기록 ❷ 인터럽트가발생하고인터럽트서비스루틴이실행되면, 요청동작을수행한후전역변수에요청에대한응답을기록 ❸ 주프로그램은응답을확인하고, 알고리즘의진행단계를조정
Section 05 주프로그램과인터럽트서비스루틴의요청 / 응답인터페이스 50/82 주프로그램과인터럽트서비스사이의변수공유 인터페이스변수는 volatile 지시어를사용하여전역변수로선언 C 컴파일러는최적화과정으로목적프로그램으로간소화 volatile 지시어를선언하지않으면, 간소화에의해인터럽트서비스루틴과상호연관성이끊어질수있음 [ 예제 6-1] SW0, SW1 각스위치가연속으로 5 회이상눌리면 LED 를반전 주프로그램요청부» volatile로선언된 req_int0, req_int1 변수로, 인터럽트서비스루틴과인터페이스» 인터럽트서비스루틴이 REPLY로응답했을때 LED 반전 LED 반전명령 PORTA ^= 1<<PA0;
Section 05 주프로그램과인터럽트서비스루틴의요청 / 응답인터페이스 51/82 main( ) 함수의인터럽트서비스루틴과인터페이스부 while(1){ if(req_int0 = = REPLY){ PORTA ^= 1<<PA0; // INT0에서응답하면 PA0 비트값반전 req_int0 = NOT_REQUEST; // req_int0 요청해지 req_int1 = REQUEST; // req_int1 요청 }else if(req_int1 = = REPLY){ PORTA ^= 1<<PA0; // INT1에서응답하면 PA0 비트값반전 req_int0 = REQUEST; // req_int0 요청 req_int1 = NOT_REQUEST; // req_int1 요청해지 } } req_int0, req_int1 : 전역변수
Section 05 주프로그램과인터럽트서비스루틴의요청 / 응답인터페이스 52/82 인터럽트서비스루틴응답부» ISR(INT0_vect){} 사례» req_int0 변수에 REQUEST 요청이있을때동작 - event 변수를인터럽트가발생할때마다증가 - NUM_EVENT 이상발생되면 REPLY로응답 volatile int req_int0 = REQUEST, req_int1 = NOT_REQUEST; ISR(INT0_vect) { static long event = 0; } if(req_int0 = = REQUEST){ event++; if(event>=num_event){ event = 0; req_int0 = REPLY; } }
Section 05 주프로그램과인터럽트서비스루틴의요청 / 응답인터페이스 53/82 요청 / 응답인터페이스와인터럽트과부하절감 인터럽트발생빈도와주프로그램수행 인터럽트발생빈도가높아지면원하는시스템동작이되지않을수있음» 대기하던인터럽트서비스루틴만실행되고, 주프로그램이거의수행되지못할수있음» 인터럽트서비스루틴에머무르는시간을가능한짧게하고인터럽트의발생빈도를적게하는것이바람직함» 인터럽트서비스루틴은수행시간이짧은장치와관계된조작명령, 상태확인등과관련된간단한동작을수행 상태결과에따른주된동작은요청 / 응답인터페이스로, 주프로그램에서수행하는것이바람직함
Section 05 주프로그램과인터럽트서비스루틴의요청 / 응답인터페이스 54/82 [ 예제 6-2] 인터럽트서비스루틴의과부하절감을요청 / 응답인터페이스사례 인터럽트감지순간을결정하는비트가 (pp. 244) ISC01 = 0, ISC00 = 0 일때, LOW 디지털전압레벨이면인터럽트가계속발생 강제시간지연 delay( ) 함수위치에따른반응관찰 1. 인터럽트서비스루틴안에서 delay( ) 함수를실행하는경우와, 2. 주프로그램에서 delay( ) 함수를실행하는경우의차이점확인
Section 05 주프로그램과인터럽트서비스루틴의요청 / 응답인터페이스 55/82 DELAY_IN_ISR #include #include <avr/io.h> <avr/interrupt.h> // DELAY_IN_ISR void { delay(volatile long count) for(; count>0; count--); } int { main(void) EIMSK = 1<<INT0; EICRA = 0x0; PORTD = 1<<INT0; DDRA = 1<<PA0; sei(); while(1){ // INT0 활성화 // LOW일때연속인터럽트 // 내부저항풀업연결 // PA0 출력설정 // 전역인터럽트활성화 ISR(INT0_vect) { delay(1000); } // DELAY_IN_ISR } delay(200); PORTA ^= 1<<PA0; } return 0;
Section 05 주프로그램과인터럽트서비스루틴의요청 / 응답인터페이스 56/82 DELAY_IN_MAIN #include #include #define volatile void { } <avr/io.h> <avr/interrupt.h> DELAY_IN_MAIN ISR(INT0_vect) { req = 0; } unsigned int req=1; delay(volatile long count) for(; count>0; count--); int { #define main(void) EIMSK = 1<<INT0; EICRA = 0x0; PORTD = 1<<INT0; DDRA = 1<<PA0; sei(); while(1){ DELAY_IN_MAIN if(!req){ } // INT0 활성화 // LOW일때연속인터럽트 // 내부저항풀업연결 // PA0 출력설정 // 전역인터럽트활성화 delay(1000); req = 1; } delay(200); PORTA ^= 1<<PA0; } return 0;
Section 05 주프로그램과인터럽트서비스루틴의요청 / 응답인터페이스 57/82 #ifdef lable_a --- A --- #else --- B --- #endif lable_a 라는이름의레이블이정의되어있으면, --- A --- 부분을수행그렇지않으면, --- B --- 부분을수행하라는매크로 #define DELAY_IN_ISR 로 DELAY_IN_ISR 을정의하면 ISR(INT0_vect) 인터럽트서비스루틴에서 delay( ) 함수실행 //#define DELAY_IN_ISR 로 DELAY_IN_ISR 을정의해놓지않으면 main( ) 함수의 while( ) 반복문에서 delay( ) 함수실행
Section 05 주프로그램과인터럽트서비스루틴의요청 / 응답인터페이스 58/82
Section 05 주프로그램과인터럽트서비스루틴의요청 / 응답인터페이스 59/82 결과관찰» 스위치를누르지않으면, 매우빠르게 PA0에연결된 LED를반전시킴너무빨라 LED가항상켜진것처럼보임» 스위치 SW0을누르면, 지속적으로인터럽트가요청되어, 인터럽트서비스루틴이수행» DELAY_IN_ISR을 4번라인위치에두고, 매크로정의하여, 프로그램컴파일 / 링크 / 다운로드후관찰» DELAY_IN_ISR을 4번라인위치에서삭제하여, 매크로정의를없앤후, 프로그램컴파일 / 링크 / 다운로드후관찰» LED의점멸주기의빠른정도를관찰하여, 주프로그램의실행정도를간접적으로알수있음
Section 06 포토인터럽터인터페이스 60/82 사전지식 포토인터럽터는포토다이오드와포토트랜지스터를일체형으로만든부품 포토인터럽터 SG-207[( 주 ) 광전자제품 ] 을중심으로주요규격검토 약 940[nm] 의적외선이포토트랜지스터의베이스로투과 베이스단자에전압이생성되고, 이미터로충분한순방향전류가흐름 컬렉터와이미터사이의스위치를 ON시킴 포토다이오드와포토트랜지스터간격에적외선을차단시켜센서동작
Section 06 포토인터럽터인터페이스 61/82 특성곡선 ATmega128 내부풀업저항 20[kΩ] 이상가정
Section 06 포토인터럽터인터페이스 62/82 적외선관통포토트랜지스터에도달되면 ON, LOW 디지털전압레벨 다이오드순방향전류계산 12[mA] 에의한적외선관통예측광전류 트랜지스터 ON 트랜지스터의포화동작을만족시킴 입력핀 PD0 는전압 VCE(Sat) 이되어 LOW 디지털전압레벨 핀에서인식되는논리값은 0 적외선이차단되면포토트랜지스터 OFF, HIGH 디지털전압레벨 적외선이차단되었을때, 광전류 I L 은 0[mA] 따라서, 핀에인가되는전압은 V CC 이되어 HIGH 디지털전압레벨 핀에서인식되는논리값은 1
Section 06 포토인터럽터인터페이스 63/82 실험목적및동작 (1) 포토인터럽터의회로동작이해 (2) 빛차단과투과가포토트랜지스터의 ON/OFF로출력에미치는영향 (3-1) 포토인터럽터출력신호가상승하는에지를폴링으로감지하는방법 (3-2) 포토인터럽터출력신호가상승하는에지를인터럽트로감지하는방법 PD0 핀에연결된포토인터럽터간격에물체로빛을차단할때, PA0 에연결된 LED 를반전하기위한회로
Section 06 포토인터럽터인터페이스 64/82 폴링에의한포토인터럽터에지검사 // PD0 가 HIGH 면 1 을취함 for(i=0; i<100; i++) { } // PD0 상승에지검사
Section 06 포토인터럽터인터페이스 65/82 인터럽트방식에의한포토인터럽터에지검출
Section 06 포토인터럽터인터페이스 66/82 포토인터럽터인터페이스 (video.zip 참고 / 6-6)