20140509 (Interrupt Reg)
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
실습 사진