인터럽트의 종류(Page 138)
인터럽트의 동작(Page 139)
: ISR(interrupt service routine, interrupt handler)
어느 기기나 장치에 기계적으로나 운영체제에 의해서 호출이 되는 것
여기서 기계적으로 호출이 되는것을 일반적인 Interrupt 라고 하며,
운영체제에서 호출이 되는 것을 'Call Back', Call Back 함수를 호출했다. 라고한다.
▶ EXT_INT.c
#include "EXT_INT.h" #include "Lcd.h" void INT_Init(void) // Low 레벨에서 걸리도록. Negative-Edge { EICRB = (0<<ISC40) | (0<<ISC41); EIMSK = (1<<INT4); sei(); // 글로벌 인터럽트를 켜줘야 외부인터럽트 동작을 하므로 sei() 함수를 호출해주었다. return; } void __vector_5(void) { LCD_string("Hello, World!!"); return; } |
▶ EXT_INT.h
#ifndef _EXT_INT_H #define _EXT_INT_H /**** 외부인터럽트 제어 레지스터 EICRA ***/ #define EICRA ((*(volatile unsigned char *)0x69)) #define ISC31 7 #define ISC30 6 #define ISC21 5 #define ISC20 4 #define ISC11 3 #define ISC10 2 #define ISC01 1 #define ISC00 0 /**** 외부인터럽트 제어 레지스터 EICRB ***/ #define EICRB ((*(volatile unsigned char *)0x6A)) #define ISC71 7 #define ISC70 6 #define ISC61 5 #define ISC60 4 #define ISC51 3 #define ISC50 2 #define ISC41 1 #define ISC40 0 /**** 외부인터럽트 마스크 레지스터 EIMSK **/ #define EIMSK ((*(volatile unsigned char *)0x3D)) #define INT7 7 #define INT6 6 #define INT5 5 #define INT4 4 // 6번핀을 사용할 것이다. #define INT3 3 #define INT2 2 #define INT1 1 #define INT0 0 void INT_Init(void); void __vector_5(void) __attribute__ ((signal, used, externally_visible)); #define sei(void) __asm__ __volatile__ ("sei" ::) // InLine asm , 소스코드 안에 직접 집어넣는 어셈블러 // C소스안에 어셈블리어를 쓸수없는데, 어셈블리어를 넣을때 InLine 으로 넣을수 있다. // C가 아니기 때문에 전처리, 컴파일에서 걸리지 않는다. gcc 문법임. // 방법 (1) SREG = ((SREG) | (1<<Global_Interrupt_Enable)); 직접 넣는 명령어. // (2) 어셈블리 명령어 sei(); 어셈블리 명령어. #define sleep(void) __asm__ __volatile__ ( "sleep" "\n\t" :: ) // 전력소모를 줄이기위한 어셈블리 대기상태 명령. #endif // _EXT_INT_H |
'AVR2560' 카테고리의 다른 글
2013.06.10_USART로 모든 기능 활용_ (0) | 2013.06.11 |
---|---|
2013.06.10_초음파센서_활용 (0) | 2013.06.11 |
2013.06.07_EEPROM에_직접_읽고/쓰기 (0) | 2013.06.07 |
2013.06.05_AVR_ADC동작. (0) | 2013.06.07 |
2013.05.30_AVR_한글띄우기_포팅_BSD(퍼온자료_종영이형꺼) (0) | 2013.05.31 |