ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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







    실습 사진





Designed by Tistory.