인터럽트 란?
내부적인 처리 및 연산에 의한 다른 인터럽트( 소프트웨어적 처리 )와는 달리 외부핀 INT0~INT7에 직접 입력되는 신호(High & Low)값을 입력 값으로 받아 인터럽트가 걸려 정해놓은 인터럽트 루틴을 실행( 하드웨어적 )
Rising Falling LOW
![](http://www.icbank.com/icbank_data/image/board/2013/0324C27F-D33B-49C3-95D0-C55BD1EE0362.jpg)
EIMSK(External Interrupt Mask Register)
EICRA(External Interrupt Control Register A)
ISCn1 | ISCn0 | 설명 |
0 | 0 | INTn의 Low 신호시에 일반적인 인터럽트 요청을 한다. |
0 | 1 | (reserved) |
1 | 0 | INTn의 하강엣지 신호시에 일반 비동기적인 인터럽트를 요청한다 |
1 | 1 | INTn의 상승엣지 신호시에 일반 비동기적인 인터럽트를 요청한다 |
EICRB(External Interrupt Control Register B)
![](http://www.icbank.com/icbank_data/image/board/2013/CD77BEC8-B114-42AD-AECA-AFE295E7E204.jpg)
ISCn1 | ISCn0 | 설명 |
0 | 0 | INTn의 Low 신호시에 일반적인 인터럽트 요청을 한다. |
0 | 1 | 어떠한 신호의 변화에서든 일반적인 인터럽트 요청을 한다. |
1 | 0 | INTn의 두 샘플 신호간의 하강엣지 신호시에 일반적인 인터럽트를 요청한다 |
1 | 1 | INTn의 두 샘플 신호간의 상승엣지 신호시에 일반적인 인터럽트를 요청한다 |
EIFR(External Interrupt Flag Register)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #include <interrupt.h> #define DDRA (*((volatile unsigned char *)0x21)) #define PORTA (*((volatile unsigned char *)0x22)) #define PINA (*((volatile unsigned char *)0x20)) #define EICRA (*((volatile unsigned char *)0x69)) #define EICRB (*((volatile unsigned char *)0x6A)) #define EIMSK (*((volatile unsigned char *)0x3D)) #define SREG (*((volatile unsigned char *)0x5F)) #define INT7 7 #define INT6 6 #define INT5 5 #define INT4 4 #define INT3 3 #define INT2 2 #define INT1 1 #define INT0 0 #define ISC7 6 #define ISC6 4 #define ISC5 2 #define ISC4 0 #define ISC3 6 #define ISC2 4 #define ISC1 2 #define ISC0 0 #define sei() __asm__ __volatile__ ("sei" ::) #define sleep() __asm__ __volatile__ ( "sleep" "\n\t" :: ) void __vector_1 (void) __attribute__((signal, used, externally_visible)); //__attribute__ 속성 전달 //externally_visible 외부에서 호출가능 //함수명 임의로 정할수없음 정확해야됨 int main(void) { DDRA = 0xFF; PORTA = 0x00; EICRA = (3 << ISC0); // ISC0 == INT0 EIMSK = (1 << INT0); //EIMSK의 비트 1값들어감 임베디드에서 자주쓰는것 EIMSK = 1 동일 //EIMSK = (1 << INT0)|(1 << INT3); SREG = SREG|(1 << INT7); //다른값건드리면 안됨 //sei(); 와 동일 // 인트럽트활성화 while(1){ sleep(); } return 0; } void __vector_1(void) // 1번 인터럽 // pdf에선 벡터2번을 의미함 +1 { volatile unsigned int uiCnt; for(uiCnt = 0; 30000>uiCnt ; ++uiCnt); PORTA = ~PORTA; return; } | cs |
29번 : #define sei() __asm__ __volatile__ ("sei" ::)
SREG 인터럽트 활성화 시키는 어셈블리어 sei(set enable interrupt)자동으로 1의 값을 가짐
30번 : #define sleep() __asm__ __volatile__ ( "sleep" "\n\t" :: )
SREG 인터럽트 슬립 시키는 어셈블리어 ....c로 cpu를 제어할수없는것을 어셈블리어로 제어. 통틀어 inline assembly라고 부름.
컴파일이 바뀌면 사용불가.
void __vector_1(void) __attribute__((signal, used, externally_visible));
gcc컴파일러만 사용됨 이 함수의 속성을 적어줌. 리눅스에서는 시그널....인터럽트.
외부에서 이 함수를 호출가능.
data sheet 와 달리 벡터 넘버를 보면 실제 코딩할 때는 번호가 0부터 시작
42번 : EICRA 상승엣지 ,외부인터럽트 제어
43번 : EIMSK 의 1의 값일때 sei() 가 처리됨
45번 : sei(); 와 동일, 인트럽트 활성화시킴
50번 : 동작이 없을때 쉬게함
상단 코드 main.c 와 main.h 분리
소스코드를 기능별로 나눠서 관리에 유리
헤더파일 : 일종의 메뉴판 , define 이나 함수의 원형등을 선언함
main.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #include "main.h" int main(void) { DDRA = 0xFF; PORTA = 0x00; EICRA = (3 << ISC0); // ISC0 == INT0 EIMSK = (1 << INT0); //EIMSK의 비트 1값들어감 임베디드에서 자주쓰는것 EIMSK = 1 동일 //EIMSK = (1 << INT0)|(1 << INT3); SREG = SREG|(1 << INT7); //다른값건드리면 안됨 //sei(); 와 동일 // 인트럽트활성화 while(1){ sleep(); } return 0; } void __vector_1(void) // 1번 인터럽 // pdf에선 벡터2번을 의미함 +1 { volatile unsigned int uiCnt; for(uiCnt = 0; 30000>uiCnt ; ++uiCnt); PORTA = ~PORTA; return; } | cs |
1번 : 분리된 main.h를 불러옮
main.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #ifndef __MAIN_H__ #define __MAIN_H__ #define DDRA (*((volatile unsigned char *)0x21)) #define PORTA (*((volatile unsigned char *)0x22)) #define PINA (*((volatile unsigned char *)0x20)) #define EICRA (*((volatile unsigned char *)0x69)) #define EICRB (*((volatile unsigned char *)0x6A)) #define EIMSK (*((volatile unsigned char *)0x3D)) #define SREG (*((volatile unsigned char *)0x5F)) #define INT7 7 #define INT6 6 #define INT5 5 #define INT4 4 #define INT3 3 #define INT2 2 #define INT1 1 #define INT0 0 #define ISC7 6 #define ISC6 4 #define ISC5 2 #define ISC4 0 #define ISC3 6 #define ISC2 4 #define ISC1 2 #define ISC0 0 #define sei() __asm__ __volatile__ ("sei" ::) #define sleep() __asm__ __volatile__ ( "sleep" "\n\t" :: ) void __vector_1 (void) __attribute__((signal, used, externally_visible)); #endif //__MAIN_H_ | cs |
기존 코드에서 분리된 define이나 함수의 원형등을 여기서 선언함
미니케이블 연결시
LED ON 상태
버튼누른뒤 LED OFF 상태
그외 참고사항
AVR로 개발시 유의 사항 : Sharehobby.tistory.com
'코스웨어 > 16년 스마트컨트롤러' 카테고리의 다른 글
20160316_장진웅_업무일지_펌웨어 실습(LCD) (0) | 2016.03.16 |
---|---|
Lcd.h (0) | 2016.03.16 |
Alpha Yong (1) | 2016.03.16 |
20160310_업무일지_정우민_펌웨어실습 (0) | 2016.03.16 |
20160311_업무일지_정우민_펌웨어실습 (0) | 2016.03.16 |
20160315-이보원 AVR2560 LCD 실험 준비 (2) | 2016.03.16 |
20160314_박진한_업무일지_펌웨어 분석 (1) | 2016.03.16 |
20160310_노유찬_CPU모듈 (0) | 2016.03.16 |