8051
AVR
EZLab
PIC
80C196KC
DSP
ARM
VHDL
마이크로마우스
로봇축구
Battle 로봇
로봇대회
휴먼로봇
Embeded Linux
HW/SW 강좌
RTOS
 
 

 3. 인터럽트 서비스 루틴 사용법


 

 ■ 인터럽트 서비스 루틴 사용법

 

  아! 인터럽트라~~ 과연 인터럽트가 뭘까요? 인터럽트(interrupt)의 사전적인 의미는 방해하다, 가로막다 뭐 이런 거겠죠. 제 경험상 어떤 공학적이든 물리적이든 용어가 나오면 의미부터 곰곰이 따지고 넘어가야 한다고 생각합니다.

그럼 인터럽트를 예를 들어 설명하면 우리가 공부를 하고 있는데 전화가 오면 전화를 받고 공부를 다시 하죠. 바로 이것과 같이 설명드릴 수 있겠네요. 여기서 인터럽트는 전화가 오는 거로 비교할 수 있습니다. PIC에서 인터럽트 의미를 예를 들어 설명하면 A/D변환을 하면서 포트B의 0번, 1번(RB0, RB1)에 값을 읽는 프로그램이 있고, A/D 변환이 완료되면 인터럽트가 걸리게 프로그램 했다고 합시다. 그럼, 보통 사람은 무한 루프를 돌리면서 A/D 변환 완료 인터럽트를 셋팅해 놓고 있겠죠. 이렇게 하면 PIC는 항상 RB0, RB1 포트를 검사하겠죠. 바로 이 행동이 우리가 공부하는 것과 같다고 보고, A/D 변환 완료가 전화가 오는 것과 같다고 볼 수 있습니다. 그리고 다음과 같이 정리될 수 있습니다.

 

        정상 수행시

        인터럽트 발생시

        인터럽트 종류 후

        공부한다.

        전화가 온다.

        공부한다.

        RB0, RB1 포트를 검사한다.

        A/D 변환 서비스 루틴으로 간다.

        RB0, RB1 포트를 검사한다.


우리가 프로그램을 코딩할 때 방법은 여러 가지가 있지만 그 중에도 인터럽트 방식과 폴링방식이 있습니다. 예를 들어 위에서 들은 예와 같이 프로그램을 했다고 합시다. 인터럽트 방식은 레지스터를 계속 검사하지 않고 RB0, RB1을 검사하다가 인터럽트가 걸리면 그 일을 처리하는 것을 말하고 폴링방식은 RB0, RB1을 검사도 하고, A/D 변환이 완료되었는지 레지스터를 계속 검사하는 방식의 프로그램입니다. 당연히 그 결과를 보면 인터럽트 방식이 약간 효과적인 방식이라는 것을 알 수 있습니다. 더 깊이 들어가면 OS( Operating System )의 개념이 나오기 때문에 여기서 멈추기로 하고요, 시간이 나면 저도 OS에 대해 더 공부해서 강의하도록 하겠습니다.

그럼, PIC는 어떤 인터럽트를 가지고 있으며 어떤 방법으로 인터럽트 서비스 루틴을 수행하는지 알아봅시다.

 

1. PIC16C74B가 가지고 있는 인터럽트의 종류

    PIC의 인터럽트는 19개의 인터럽트가 있습니다. 사실은 이렇게 많은지 저도 이번에 알았습니다.

    1) 위치

      main()함수 바로 위

    2) FORMAT

       

      #int_xxx

      TYPE function_name(parameter) {

        ...........

        ...........

      }

       

      void main(voic)

      {

        ...........

        ...........

      }

         

- main()함수 위에 기술하면 됩니다.

- 여기서 xxx는 19종류의 인터럽트를 말하며 CCS-C 사의 컴파일러는 다음과 같이 정의하였습니다.

 

2) 인터럽트 종류와 FORMAT

      번호

      format

      설명

      1

      #int_ext

      external interrupt

      2

      #int_rtcc

      timer0(RTCC) overflow 발생시

      3

      #int_rb

      rb4∼rb7이 변하였을 때 발생

      4

      #int_ad

      A/D 변환이 완료시

      5

      #int_eeprom

      eeprom write 완료시( eeprom 계열 즉, 16f84 .... 등 )

      6

      #int_timer1

      timer1 overflow 발생시

      7

      #int_timer2

      timer2 overflow 발생시

      8

      #int_ccp1

      ccp1 capture

      9

      #int_ccp2

      ccp2 capture

      10

      #int_ssp

      SPI, I2C 완료시

      11

      #int_psp

      Paraller port

      12

      #int_tbe

      SCI serial data 전송 완료시( RS232C )

      13

      #int_rda

      SCI serial data 수신 완료시( RS232C )

      14

      #int_comp

      comparator interrupt

      15

      #int_adof

      14000 A/D overflowe 발생시

      16

      #int_rc

      14000 Channel ON Cx pin

      17

      #int_i2c

      14000 i2c

      18

      #int_button

      14000 push button

      19

      #int_lcd

      pic16c9x 계열의 LCD


정리하다보니 저도 모르는 인터럽트들이 나옵니다. 실력의 미비함의 새삼 느낍니다. 위의 15번의 14000이라는 것은 PIC14000으로 PIC 계열중의 하나입니다. microchip 홈페지를 참고하시기 바랍니다.

예제를 볼까요! 의외로 간단합니다. 위에서 설명 드린 예제로 A/D 변환을 하면서 포트 B( RB0, RB1 )를 검색하면서 A/D 변환이 완료되면 A/D 변환된 결과 값을 포트 B에 출력하는 것을 예제로 봅시다. 소스는 홈페지에 올려놓겠습니다. 보물찾기할까요?

 

※ 힌트

PIC 강좌란에 A/D 변환 소스가 그 답임. 그리고 답은 아래에 있습다. 항상 저의 퀴즈는 쉽습다 ~~ ^^

 

#include "H_16c74b.h"
#use delay(clock=4000000)       

#int_ad
void ad_int_svr(void)
{
        // A/D변환된 값을 PORTB에 써서 A/D 변환된 값을 체크한다.  
        PORTB = read_adc();
}


void main()
{
        // 이 함수는 컴파일러에서 제공하는 함수이다.
        // 모든 아날로그 핀을 A/D 변환 포트로 사용
        setup_adc_ports( all_analog );

        // clock을 2분주하여 A/D 변환을 한다.
        setup_adc(adc_clock_div_2);

        // adc가 온료 했을 때 인터럽트가 걸리게 셋팅한다.
        enable_interrupts(adc_done);
        // 이 부분이 없으면 인터럽트가 걸리지 않는다.
        enable_interrupts(global);

        while(1) {
                // ra0포트에 아날로그핀을 연결한다. ( 0~5[V] level )
                set_adc_channel(1);
        }
}

 

 

 




상호 : (주) 로보블럭 사업자등록번호:214-86-56219 통신판매업신고19-2544 대표: 신대섭 전화:(02)2679-8556 Fax :(02)2679-8557
본사 : 경기도 부천시 원미구 약대동 부천 테크노파크 401동 502호     서울사무소 : 서울시 영등포구 문래동 4가 8-1 4층
Copyright(C) 2004, (주) 로보블럭 시스템즈 All Rights Reserved E-Mail : WebMaster