-
20140509 (Interrupt Reg)부산IT학원/스마트컨트롤러 2014. 5. 9. 11:30
57일차
----------------------
ATMega128 Interrupt
----------------------
--- Interrupt 신호를 받는 시간 종류
- 상승 엣지란
0v 에서 5v 로 바뀔 때 그래프로 표현하면 위의 그림과 같이
상승하는 모서리가 생긴다고 상승 엣지라고 한다.
- 하강 엣지란
5v 에서 0v 로 바뀔 때 그래프로 표현하면 위의 그림과 같이
하강하는 모서리가 생긴다고 하강 엣지라고 한다.
- 기호
회사마다 상승 엣지, Positive Edge, Rising Edge등 부르는 이름이 다르다.
--- Interrupt Reg
- 외부 인터럽트는 총 8개 있는데
EICRA, EICRB에 각 비트당 속성 이름을 보면
ISC00, ISC01,
ISC10, ISC11,
.....
ISC70, ISC71로
외부 인터럽트 각각에 대응하는 두개의 비트가 있다는 것을 볼 수 있다.
이 비트들은 위에서 설명한 신호를 받는 시간에 대한 설정이다.
0 ~ 3 번까지
1. Low 일 때
2. 예약 (사용 안함)
3. 하강 엣지(Negative Edge, Falling Edge) 일 때
4. 상승 엣지(Positive Edge, Rising Edge) 일 때
4 ~ 7 번까지
1. Low 일 때
2. 신호의 변화가 있을 때
3. 하강 엣지(Negative Edge, Falling Edge) 일 때
4. 상승 엣지(Positive Edge, Rising Edge) 일 때
신호를 보낸다를 설정할 수 있다.
4~7번에 2번이 추가 되어 있으니 4~7번 옵션이 더 많다.
- SREG, EIMSK는 문 같은 역할이다.
EIMSK는 각 외부 인터럽트 활성, 비활성 설정하고,
SREG에 I 비트는 Golbal 인터럽트로 모든 인터럽트를 활성, 비활성 설정한다.
--- 인터럽트 함수 이름
아래 인터럽트 벡터 테이블에 숫자가 있는데
어제 언급했던 함수를 선언할 때에 예로 INT2번을 쓴다면
void __vector_4(void) __attribute__((signal, used, externally_visible));
이런식으로 선언했었는데,
벡터넘버가 1부터 표기되어 있지만 실제로 시작할 때는 0부터 시작하기 때문에
void __vector_3(void) __attribute__((signal, used, externally_visible));
이렇게 선언해야 한다.
--- 소스
- Int.h
....
....
__asm__ 은 어셈블리를 사용한다는 뜻인데
컴파일러마다 어셈블리를 허용하는 컴파일러가 있고
각각 문법도 다르다.
cli 는 글로벌 인터럽트를 끄기 위해서
SREG = SREG & ~(1<<I);
이렇게 명령을 해야하지만 일이 많아지기에
cli라는 명령으로 한방에 똑같은 일을 할 수 있게 제작사에서 만들어 놓았다.
sei 는 글로벌 인터럽트를 켜기 위해
SREG = SREG | (1<<I);
이렇게 위와 같이 해야하는 것을
한방에 똑같은 일을 할 수 있게 제작사에서 만들어 놓았다.
sleep 은 cpu의 동작을 멈추는 명령이다.
여기서 가져왔다.
- Int.c
sei, EIMSK로 인터럽트를 열어놓아
INT7에 5v가 걸려오면
__vector_8() 함수를 호출한다.
- main.c
실습 사진
'부산IT학원 > 스마트컨트롤러' 카테고리의 다른 글
20140513 (타이머, 카운터) (0) 2014.05.13 20140512 (Usart, adc 신호도 Interrupt로 전환) (0) 2014.05.12 20140508 (Interrupt, 서적관리 프로그램 작성, open) (0) 2014.05.08 20140507 (ADCL, ADCH, 광센서 실습, 서적관리 프로그램 구현) (0) 2014.05.07 20140430 (ADC, 컴파일 -D 옵션, extern, static) (0) 2014.04.30