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

 1. I/O 포트 제어하기

 

※ I/O port control

  본 강좌는 PIC16c74로 설명하며, CCS-C사의 C 컴파일러를 중심으로 하겠다. 그러다 보면 세부적인 것은 컴파일러가 알아서 해주기 때문에 내용이 빠질 경우도 있다. 그러나 CCS-C 컴파일러를 사용하는데는 전혀 문제가 되지 않을 거라 생각한다. 또한 본 강좌는 PIC16c74를 잘 다룬다면 나머지 DEVICE는 그리 어렵지 않게 사용할 수 있을 거라 본인은 생각하기 때문에 PIC16C74로 설명을 하겠다.
  본론으로 들어가서 I/O port를 제어하기 위해서는 File Address중 06h 혹은 86h를 컨트롤함으로써 PIC의 I/O포트에 logic 0[ 0V ] 혹은 logic 1[ 5V ]을 줄 수 있다.

(1) PORTB를 입출력으로 사용하기

    1) PORTB를 모두 입력으로 사용하기
        PORTB를 모두 입력으로 사용하기 위해서는 TRISB에 0xFF로 설정하면 된다.

        ① 방법
            TRISB REGISTER

      1

       1

      1

      1

      1

      1

      1

      1

            위와 같이 TRISB REGISTER에 값을 쓰면 PORTB 모두를 입력으로 사용이 가능하므로 외부 장치의 값을 읽어 오는 것이 가능하다.

                [ 예제 1 ]


        ......
        SET_TRIS_B( 0xFF );   //  = SET_TRIS_B( all_in );
        ......

         

 

    2) PORTB를 모두 출력으로 사용하기
        PORTB를 모두 출력으로 사용하기 위해서는 TRISB를 0x00으로 설정하면 된다.

        ① 방법
            TRISB REGISTER

      0

       0

      0

      0

      0

      0

      0

      0

           위와 같이 TRISB REGISTER에 값을 쓰면 PORTB 모두를 출력으로 사용이 가능하므로 외부 장치 제어가 가능하다.

                                 [ 예제 2 ]

         

        ......
        SET_TRIS_B( 0x00 );         //  = SET_TRIS_B( all_out );
        OUTPUT_HIGH( PIN_B0 ); // B0포트에 HIGH출력 내보내기
        OUTPUT_LOW( PIN_B1 );  // B1포트에 LOW출력 내보내기
        ......

 

 

         

    3) PORTB를 입력과 출력으로 혼용하여 사용하기
           TRISB REGISTER

      1

      0

      1

      0

      0

      1

      0

      0

      위와 같이 TRISB REGISTER를 설정하면 PORTB의 첫 번째 즉, RB0는 출력으로 설정되고, RB1은 출력으로, RB2는 입력으로, RB3는 출력으로, RB4는 출력으로, RB5는 입력으로, RB6은 출력으로, RB7은 입력으로 설정이 된다. 프로그램적으로는 [ 예제 3 ]와 같이 하면 된다.

                                            [ 예제 3 ]


                           ......
                           SET_TRIS_B( 0xA4 );      
                           ......

 

 

    * SET_TRIS_B(), OUTPUT_HIGH( PIN_B0 ), OUTPUT_LOW( PIN_B1 )함수나 앞으로 나오게 될 함수의 자세한 사용법은 게시판에 공개한 매뉴얼 중 Built-In Functions Command Summary 부분에 자세히 설명되어 있습니다. 참고하시기 바랍니다.

   

위의 내용을 토대로 해서 8개의 LED를 순차적으로 반복해서 켜는 실험이다. 회로도와 소스가 있으니 쉽게 이해하리라 생각합니다.  

실험에 이용될 회로도는 다음과 같습니다. RC0에 RESET를 만들었는데 소스에는 RESET 기능이 없습니다. 이상하게 생각하지 마세여~

   그리고 아래의 소스는 아래와 같다.

                                                   [방법 1]

#include "16C74B.h"

#use delay(clock=4000000)

 

void main(void)

{

   SET_TRIS_B( 0x00 );         //  = SET_TRIS_B( all_out );

      while(1) {

        OUTPUT_HIGH( PIN_B0 ); // B0포트에 HIGH출력 내보내기

        DELAY_MS(1000);              // 0~65535까지 파라메타로 사용 가능, 즉 65.535 초까지 가능

        OUTPUT_LOW( PIN_B0 );  // B1포트에 LOW출력 내보내기

        DELAY_MS(1000);           

        OUTPUT_HIGH( PIN_B1 );

        DELAY_MS(1000);           

        OUTPUT_LOW( PIN_B1 );

        DELAY_MS(1000);           

        OUTPUT_HIGH( PIN_B2 );

        DELAY_MS(1000);           

        OUTPUT_LOW( PIN_B2 );

        DELAY_MS(1000);           

        OUTPUT_HIGH( PIN_B3 );

        DELAY_MS(1000);           

        OUTPUT_LOW( PIN_B3 );

        DELAY_MS(1000);           

        OUTPUT_HIGH( PIN_B4 );

        DELAY_MS(1000);           

        OUTPUT_LOW( PIN_B4 );

        DELAY_MS(1000);          

        OUTPUT_HIGH( PIN_B5 );

        DELAY_MS(1000);           

        OUTPUT_LOW( PIN_B5 );

        DELAY_MS(1000);          

        OUTPUT_HIGH( PIN_B6 );

        DELAY_MS(1000);           

        OUTPUT_LOW( PIN_B6 );

        DELAY_MS(1000);          

        OUTPUT_HIGH( PIN_B7 );

        DELAY_MS(1000);           

        OUTPUT_LOW( PIN_B7 );

        DELAY_MS(1000);          

    }

}

 

위의 소스는 무한루프 즉, while()을 돌면서 LED를 1초 간격으로 켰다 껐다 하는 프로그램입니다. 참고로 CCS C사의 컴파일러는 대소문자 구분이 없습니다. 또하나 위와 같이 하면 불편을 느끼는 사람이 있습니다. 보통의 사람들이 어셈블리에 익숙해져 있기 때문에 헤더파일을 수정해서 우리가 좀더 익숙한 방식으로 코딩이 가능합니다. 헤더파일은 게시판에 올려 놓겠습니다. 자, 그럼 소스롤 볼까요!

                                                   [방법 2]

#include "H_16C74B.h"

#use delay(clock=4000000)

 

void main(void)
{

        trisb = 0x00;

        while(1) {
                rb0 = 0;    delay_ms(1000);

                rb0 = 1;    delay_ms(1000);

                rb1 = 0;    delay_ms(1000);

                rb1 = 1;    delay_ms(1000);

                rb2 = 0;    delay_ms(1000);

                rb2 = 1;    delay_ms(1000);

                rb3 = 0;    delay_ms(1000);

                rb3 = 1;    delay_ms(1000);

                rb4 = 0;    delay_ms(1000);

                rb4 = 1;    delay_ms(1000);

                rb5 = 0;    delay_ms(1000);

                rb5 = 1;    delay_ms(1000);

                rb6 = 0;    delay_ms(1000);

                rb6 = 1;    delay_ms(1000);

                rb7 = 0;    delay_ms(1000);

                rb7 = 1;    delay_ms(1000);

        }
}

 

 소스를 보면 "rb0=0" 라고 되어 있습니다. 이런 방식이 가능한게 제가 헤더파일 즉, 16C74B.h의 내용을 바꿔서 "H_16C74B.h" 파일로 만들었습니다. 궁금하신 분들은 두 헤더 파일을 비교해서 보시면 이해가 가시리라 생각합니다. 이런 내용까지 하면 내용이 너무 방대하게 됩니다. 각자 숙제로 남기고요, 궁금한 사항이 있으시면 게시판을 이용해 질문해 주십시오.




상호 : (주) 로보블럭 사업자등록번호: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