부산IT학원/스마트컨트롤러

20140509 (Interrupt Reg)

EHOzlO 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







실습 사진