PIC의 사용법(프로그램편)

1. 기본 사항

(1) 사용할 수 있는 메모리와 크기

  • 프로그램 ROM 1K워드(PIC16C84, PIC16F84))
    1000개까지의 명령을 쓸 수 있다.
    ROM 라이터로 써넣는다.
  • 레지스터:36 바이트(PIC16C84) / 68바이트(PIC16F84)
    변수로 이용할 수 있는 메모리로 Register File로 독립적인 에리어가 확보되어 있다.
    데이터의 취급은 바이트(8비트) 단위이므로 주의.
  • Special Register 16종류
    PIC 전체의 동작 모드를 지정하기 위한 레지스터류로 독립의 Register File로 준비되어 있다.
  • EEPROM 데이터 64바이트(PIC16C84, PIC16F84)
    전원을 OFF 해도 지워지지 않는 메모리에 데이터를 써 넣을 수 있다.
    단, 동작이 느리다는 점과, 써넣기 회수에 제한이 있기 때문에
    일반적인 프로그램 변수로서는 사용할 수 없다.
    사용법으로는 파라미터로 기억해 두려는 것을 써넣어 두고,
    재스타트시에 레지스터에 호출하여 사용한다.
  • Configration Bits
    프로그램 메모리의 어드레스 2007H번지에 있는 특별한 메모리로 PIC의 기본적인 조건을 설정한다.
    이 메모리는 프로그래밍할 때에만 Read/Write할 수 있다.
    설정 내용은 프로그램 보호의 유무, 전원 ON시의 RESET 조건, Watchdog Timer의 유무, 발진자의 종류이다.

(2) Register File을 보는 방법과 Bank(Page)의 전환

  • PIC에는 범용의 레지스터 이외에, 각종 동작 모드를 설정하기 위한 Special Register라 부르는 것이 준비되어 있다.
    PIC를 동작시키기 위해서는 우선 이 Special Register의 설정부터 시작한다.
    그리고 그들은 모두, Register File이라 부르는 메모리로서 준비되어 있다.
    그 Register File은 Bank0(Page0) 과Bank1(Page1)이라 부르는 2 페이지로 되어 있기 때문에 다소 액세스 방법이 번거롭다.
    즉, RESET 후 통상적으로는 Bank0(Page0)으로 되어 있기 때문에 Bank1(Page1)측의 레지스터에 액세스할 때는 Bank(Page)를 전환한 후가 된다.
    또한 Bank0(Page0)과 Bank1(Page1)에 같은 것이 있을 때에는 어느쪽이나 같은 형태로 사용할 수 있다.
    더구나, 표준 Include File을 사용한 경우에는 아랫 그림에 의한 레이블로 어셈블러 리스트에 쓸 수 있다.

    [예] Bank(Page)를 전환하는 방법

Special Register인 "STATUS" 레지스터의 "RP0" 비트를 다시 기입함으로써 전환한다.

BSF STATUS,RP0 ;STATUS 레지스터의 RP0 비트를 1로하고
;Bank1(Page1)로 전환한다.
CLRF TRISA ;PORTA를 모두 출력 모드로 설정한다
MOVLW 0F0H ;11110000을 세트
MOVWF TRISB ;PORTB는 상위 4포트를 입력으로 설정
BCF Bank(Page)는STATUS,RP0 ;Bank0(Page0)으로 돌아간다

아랫 그림에 Register File의 내용을 나타낸다.

(3) 프로그램은 어디부터 시작되는가?
PIC는 전원이 들어갔을 때, 자동적으로 "RESET"된다. RESET되면 프로그램은 어드레스 0번지부터 실행된다.
따라서, 프로그램의 최초는 0번지라는 것이다.
이에 대해, 프로그램이 실행중에 '인터럽트'가 허가되어 있으면 이 인터럽트가 들어갔을 때에는 강제적으로 어드레스 4번지로 점프한다.
따라서, 인터럽트에 관한 프로그램은 4번지부터 실행된다.
그래서, 보통 프로그램을 작성할 때에는 아래와 같이 하여 8번지 이후에 실제 프로그램을 작성하도록 한다.

ORG 0 ;RESET으로 0번지부터 시작된다
GOTO MAIN ;0번지는 GOTO에 의해 MAIN 처리로 점프
ORG 4 ;인터럽트로 4번지부터 시작된다
GOTO INTERRUPT ;4번지는 GOTO에 의해 INTR 처리로 점프
ORG 8 ;8번지를 지정
MAIN ---- 이후, 실제의 MAIN 프로그램
INTR ---- 이후, 실제의 인터럽트 처리부

(4) I/O 포트의 프로그래밍 방법

PIC16C/F84에는 입출력 포트(I/O 포트라고 한다)가 A와 B 모두 합쳐 13 포트가 준비되어 있다. 게다가 각각 독립적으로 입력으로 할 것인지, 출력으로 할 것인지는 프로그램으로 정할 수 있다.
다음에 구체적인 프로그래밍 방법을 예를 들어 설명한다.
입출력의 설정 방법
입출력은 TRISA, TRISB라는 Special Register로 설정한다.
이 각 비트가 PORTA와 PORTB의 각 포트에 대응하여, 입력: "1" 출력: "0"으로 지정한다.
그리고, 전원 ON 후나 RESET 후에는 모두 "입력"으로 설정되어 있다.

BSF STATUS, RP0 ;STATUS 레지스터의 RP0비트를 1로 하고
;Bank1(Page1)로 전환한다
CLRF TRISA ;PORTA를 모두 출력 모드로 설정한다
BSF TRISA, 1 ;PORTA의 RA1만 입력으로 한다
MOVLW 0F0H ;11110000을 세트
MOVWF TRISB ;PORTB의 상위 4포트를 입력, 하위는
;출력으로 설정
BCF STATUS, RP0 ;Bank0(Page0)으로 돌아간다

출력 방법
(PORTB의 하위 4 포트가 출력으로 한다)

BSF PORTB,1 ;PORTB의 RB1을 High로 세트
BCF PORTB,0 ;PORTB의 RB0을 Low로 세트
MOVLW 0CH ;00001100을 로드
MVWF PORTB ;PORTB의 하위에 1100을 세트
;즉 RB0, RB1이 Low, RB2, RB3이 High
CLRF PORTB ;모든 PORTB의 포트를 Low로 세트


입력 방법
(PORTB의 상위 4 포트가 입력으로 한다)

MOVF PORTB,W ;PORTB를 W 레지스터에 입력
MOVWF DATA ;입력한 PORTB의 데이터를 DATA에 저장
BTFSC POTRB, RB7 ;RB7를 테스트하여 Low이면 skip한다
GOTO HIGHWAY ;RB7이 High일 때 HIGHWAY에 점프
??? ;RB7이 Low일 때에 여기로 스킵한다
BTFSS PORTB, RB6 ;RB6를 테스트하여 High이면 skip한다
GOTO LOWWAY ;RB6이 Low일 때 LOWWAY로 점프한다
??? ;RB6이 High일 때 여기로 skip한다

[주의] BSF, BCF로 포트의 출력을 하는 경우
BSF, BCF에서 출력을 할 때,예를 들면 "BSF POTRB,RB0"라고 하는 명령을 실행하면 실제 동작은 아래의 순서로 실행된다.
·우선 포트 B의 전체 비트를 CPU에 읽어들인다
·CPU에서 비트 0에 1을 세트하는 연산을 한다
·연산 결과를 포트 B에 출력한다

즉, 출력하기 전에 입력을 실행한다. 그때, 가끔 출력전압이 낮은 부하일 경우(트랜지스터의 직접 드라이브와 같은 경우)에는 출력에 High를 내고 있어도 약 0.7V 정도 밖에 되지 않으므로 그 포트를 입력하면 Low로 간주해 버린다.
따라서, 연산 결과를 출력할 때에 Low로 재세트하기 때문에 High를 출력하고 있던 직접 관계없는 비트가 갑자기 Low로 되어 버리는 오동작으로 되고 만다.
이것을 피하기 위해서는 포트를 입력 출력 혼재해서 사용하는 경우에는 MOVWF 명령으로 항상 전체 포트를 의식하고 동시에 출력해 줄 필요가 있다.
출력이 어중간한 출력전압으로 될 우려가 없을 경우에는 걱정하지 않아도 된다.

2. 프로그램을 작성한다

다음에는 실제 프로그램의 서식을 설명한다.
과제는 하드웨어편에서 만든 LED 점멸 회로를 실제로 동작시키는 프로그램으로 한다.

(1) 플로차트의 작성
자작 하드웨어에 필요한 기능을 생각하여, 우선 전체의 플로차트를 그려 본다.

[예제] LED 점멸 프로그램

START

PORT의 초기 설정 A, B 모두 모두 출력
|----→↓
|PORTA에 1을 출력 LED의 점등
|↓
|0.5초간 대기 루프
|↓
| PORTA에 0을 출력 LED의 소등
|↓
|0.5초간 대기
|_______|

(2) 프로그램을 작성한다
다음에 실제로 editor를 이용하여 프로그램을 작성한다.
사용하는 editor에는 특히 제한이 없다. 고속으로 프로그램 리스트 작성에 적합한 에디터로는 다음과 같은 것이 있다.
"MPLAB"라고 하는 MicroChip Technology사가 제공하고 있는 통합 개발 환경을 이용하면 에디터도 포함되어 있어, 그대로, 즉 어셈블이나 debug도 할 수 있으므로 편리하다. 게다가 프리 소프트웨어이다. 단, Windows 환경에서만 사용할 수 있다.

(3) 프로그램 작성법
전체의 구성은 다음과 같이 하면 이해하기 쉬울 것으로 생각한다.
헤더 부분 :CPU 칩의 종류를 지정한다
예: LIST P=PIC16F84
include 파일을 정의
언제나 공통으로 사용하는 변수를 종합하여 정의한다
어셈블러에 표준으로 첨부되어 있다.
예: INCLUDE "P16F84.INC"
변수 정의 :변수명을 레지스터 메모리에 할당한다
예: DATA EQU 0DH
개시번지 정의 :프로그램의 스타트 번지를 정의한다
예: ORG0 MAIN(main program)
메인 프로그램 :같은 반복 부분은 서브루틴으로 한다
예: CALL SECTIM
서브루틴 :몇회라도 메인 프로그램에서 사용하는 부분을
서브루틴으로 정리한다.
예: 0.5초 대기 루틴
(4) 프로그램 리스트의 예
다운로드하여 압축을 풀고, 일반적인 에디터로 보기 바란다.
LED 점멸 제어 프로그램 리스트
[명령 일람표] 편리한 도구
PIC16C84/PIC16F84의 명령을 A4용지 1장의 일람표로 종합한 것인데, 프로그래밍할 때에 편리하다.
MS-WORD의 문장로 되어 있다. 압축을 푼 후에 MS-WORD에서 인쇄하기 바란다.
명령 일람표


3. 어셈블한다

프로그램 작성을 끝마쳤으면 다음은 어셈블 작업이다. 어셈블이란 사람이 작성한 기호의 리스트에서, 기계어로 변환하여 ROM에 써 넣을수 있는 데이터로 변환하는 작업을 말한다.

(1) 개발용 소프트웨어를 입수한다
개발용 소프트웨어는 Microchip technology사의 www에서 다운로드하는 것이 가장 최신판을 입수할 수 있는 길이며, 또한 무료 프리 소프트웨어이므로 가장 편리하다고 생각한다.
현재 입수할 수 있는 것으로는 다음과 같은 개발 tool이 있다.

* MPLAB-IDE3.12.14 MPLAB Integrated Development Environment
* MPASM 1.40.00 Assembler software for Windows
* MPSIM 5.20.00 Software Simulator for DOS

MPLAB가 버전업되었다.
* MPLAB-IDE 3.40
* MPASM 2.13

여기서 MPLAB는 Windows상에서 실행되는 에디터 어셈블러, 시뮬레이터를 일체화한 것이므로 편리하다.
그리고, 이들 설명서는 다음 사이트에서 다운로드할 수 있다.

* MPLAB-IDE3.12.14 MPLAB Integrated Development Environment
* MPASM 1.40.00 Assembler software for Windows
* MPSIM 5.20.00 Software Simulator for DOS
* MPLAB Integrated Development Environment User's Guide
* MPASM Assembler User's Guide
* MPSIM DOS simulator User's Guide

(2) 어셈블한다
앞에서 입수한 MPLAB(어셈블러를 포함한다)를 이용하여, 작성한 프로그램을 어셈블한다.
MPASM의 경우에는 어셈블러를 기동하면 설정 화면이 나타나므로 CPU의 종류와, CASE Sensitive를 off, 출력 포맷을 INHX8M으로 설정한다.
이 어셈블 결과가 "error 0"가 될 때까지 반복한다. 에러가 나오는 것은 리스트에 무엇인가 잘못이 있다는 것이다. 끈질기게 추적하여 바로잡기 바란다.
오류를 수정했으면 자동적으로 object file(*.hex)이 작성된다. 이 파일이 PIC의 프로그램 메모리에 써넣을 프로그램의 데이터로 된다.
(3) 시뮬레이션한다
어셈블이 "error 0"으로 되었다면 다음은 퍼스널컴퓨터상에서 시뮬레이션하면서 실제로 실행시켜 본다.
이 시뮬레이션에는 상기 개발 tool 중에서 "MPSIM"이나 "MPLAB"를 사용한다.
이 시뮬레이션에는 상당히 "요령"이 필요하고 프로그램을 만드는 것보다 더 어렵게 느껴질지도 모른다. 그러나, 실제 기기에 실장하여 동작하지 않을 때는 허급지급 찾게 되므로 이 시뮬레이터에 의해 확인하는 편이 동작하지 않는 원인을 신속히 발견할 수 있다. 이 debug의 세부적인 사항에 대해서는 "MPLAB의 사용법"을 참조하기 바란다.
(4) 프로그램 써넣기
완성된 object file을 실제 PIC의 칩에 써넣기 위해서는 ROM 라이터와 써넣기 프로그램이 필요하게 된다.
이 세부적인 사항은 "ROM 라이터의 제작"에서 자세히 설명하고 있다.

다음은 개발 방법에 대해 자세히 설명한다.

+ Recent posts