PIC 사용법의 요령

1. 하드웨어에 관한 것

주의 1: 동작은 하고 있는 것 같지만 불안정하고, 손에 닿으면 멈추거나 동작한다
MCLR 단자의 pull-up을 잊어버린 경우이다. MCLR은 저항으로 풀업하지 않아도 동작하는 경우도 있지만, 원래 다이오드로 Vss에 클램프되어 있으므로 풀업(5K∼20KΩ)이 필수이다.

주의 2: RA4 핀은 입력으로 사용하는 경우에도 풀업이 필요하다.
RA4는 Schmitt 버퍼로 받는 내부회로로 되어 있기 때문에 언뜻 보기에 입력시에는 그대로 접속해도 될 것 같지만, 실수로, 반드시 풀업을 하지 않으면 항상 L레벨에서의 입력으로 되고 만다(5K∼20KΩ).

주의 3: PORTB를 입력에 사용할 때에는 내부 풀업을 ON으로 한다.
내부 풀업을 ON으로 하기 위해서는 OPTION 레지스터의 Bit 7에 "0"를 세트한다. 지정은 8 포트분 일괄이다.
그러나 출력으로 지정한 포트는 자동적으로 내부 풀업은 OFF로 되기 때문에 지장이 없다.

주의 4: PORT A, B의 각 포트 입력/출력의 지정은 레지스터 TRIS A, B로 지정한다.
"0"에서 출력, "1"에서 입력.
주의 3, 4를 실제로 프로그램으로 실행하려면 하기와 같이 한다.

        BSF    STATUS,RP0                     ;페이지 1을 지정
        CLRF   TRISA                               ;PortA는 모두 출력
        MOVLW  0F0H                              ;PortB의 상위는 입력
        MOVWF  TRISB                            ;하위는 출력
        BCF    OPTION_REG,NOT_RBPU  ;PORTB 풀업 ON
        BCF    STATUS,RP0                     ;페이지 0으로 돌아간다


주의 5: EEPROM의 rewirte 회수 수명.
프로그램 에리어는 최저 100회, 데이터 에리어는 최저 10만회 보증이다. 그러나 데이터 에리어를 통상적인 프로그램 변수 영역으로 사용하면 10만회는 바로 다 사용해 버리므로, 특별히 전원 차단후 다음 번 기동시에 그 데이터를 이용하려고 하는 목적으로 사용하는 것이 원래의 사용법이다.


주의 6: ROM 써넣기시에는 Config의 써넣기도 잊지말고
프로그램을 ROM 라이터로 PIC에 써넣을 때, Config의 레지스터도 잊지말고 써넣지 않으면 수정 발진자가 정상으로 발진하지 않는 등의 불안정한 상태로 되고 만다.

 

2.소프트웨어에 관한 것

      OPTION_REG  EQU   H'0081'        H'0001
      TRISA             EQU    H'0085'        H'0005
      TRISB             EQU    H'0086'  →   H'0006
      EECON1          EQU    H'0088'        H'0008
      EECON2          EQU    H'0089'        H'0009


주의 4: 인터럽트 처리에서 플래그의 대피를 잊지말 것.
인터럽트 처리에 들어간 곳에서 플래그를 대피해 두지 않으면 인터럽트할 때마다 결과가 변한다고 하는 불안정한 현상으로 나타난다.
플래그의 대피에 대한 구체적 프로그래밍 방법은 하기와 같다.

INT_ROUTINE
        movwf      WORK_REG        ;W레지스터의 대피
        swapf      STATUS,W
        movwf      WORK_STATE     ;스테이터스 레지스터의 대피
            ‥‥‥
            ‥‥‥(인터럽트에 관한 처리)
            ‥‥‥
        swapf      WORK_STATE,W
        movwf      STATUS              ;스테이터스 레지스터의 복귀
        swapf      WORK_REG
        swapf      WORK_REG,W     ;W레지스터의 복귀
        retfie                                   ;인터럽트 처리 완료 리턴


주의 5: 프로그램중의 변수로 사용할 수 있는 레지스터 에리어는 페이지 0의 어드레스 $0C∼$2F까지의 36바이트.
어드레스 $00∼$0B까지는 각종 설정용의 레지스터로 확보되어 있기 때문에 범용의 변수 영역으로 사용할 수 있는 것은 상기 범위에서만. 보통은 프로그램의 최초에 변수 영역으로 하기와 같이 정의해 둔다.

        WORK1    EQU    $0C    ;WORK1의 어드레스 정의
        WORK2    EQU    $0D    ;WORK2의 어드레스 정의
        ‥‥‥


주의 6: EEPROM 데이터 메모리 에리어에의 리드/라이트
PIC16C84에는 64바이트의 EEPROM 데이터 메모리가 내장되어 있다. 여기에 쓰여진 데이터는 전원이 OFF로 되더라도 지워지는 일은 없다.
그러나 주의할 필요가 있는 것은 read/write에 특별한 순서가 필요하다는 점과, 라이트에는 약 10msec로 시간이 많이 걸린다는 점이다.
read/write의 구체적인 코딩은 하기와 같이 한다.
서브루틴 형식으로 하고 있기 때문에 그대로 사용해도 충분하다.

;*********************************
; Read/Write to EEPROM
;*********************************
RD_EEPROM
        MOVF        E_ADRS,W         ;데이터 에리어의 어드레스 지정
        MOVWF     EEADR               ;Set address register
        BSF          STATUS,RP0      ;Set to page 1
        BSF          EECON1,RD        ;Start read
        BCF          STATUS,RP0      ;Return to page 0
        MOVF        EEDATA,W         ;W레지스터에 데이터 꺼내기
        RETURN
WR_EEPROM
        BCF          STATUS,RP0      ;Set to page 0
        MOVF        E_ADRS,W         ;데이터 에리어의 어드레스 지정
        MOVWF     EEADR               ;Address set
        MOVF        E_DATA,W         ;써넣는 데이터
        MOVWF     EEDATA             ;Data set
        BSF          STATUS,RP0      ;Set to Page 1
        BSF          EECON1,WREN   ;Set WR Enable
        MOVLW     55H                    ;Write Sequence
        MOVWF     EECON2             ;Start write
        MOVLW     0AAH
        MOVWF     EECON2
        BSF          EECON1,WR        ;Go write
WR_LP                                        ;써넣기 확인 대기 루프
        BTFSC      EECON1,WR        ;Check Write end
        GOTO       WR_LP
        BCF          STATUS,RP0       ;Return to page 0
        RETURN
        (주) E_ADRS와 E_DATA는 변수이다.


주의 7: 스택의 깊이는 8레벨까지.
이것은 CALL 명령과 인터럽트에 의한 점프시에 stack area에 복귀번지를 보존한다.
따라서, 점프하는 곳 중에서 다시 CALL 명령을 사용한다고 하는 nesting은 8레벨까지라고 하는 제한이 있으므로 주의.


주의 8: 바이너리 코드에서 7세그먼트로의 변환
7세그먼트 LED를 직접 PIC의 포트로부터 드라이브하는 경우에 내부 연산을 binary로 실행하여 결과를 출력할 때의 변환 서브루틴이다.
본 예는 포트 B의 비트 1부터 7에 출력하고 비트 0은 사용하지 않는 것으로 하고 있다.
서브루틴을 부르기 전에 W레지스터에 값을 로드해 둔다.
복귀에는 W 레지스터에 7세그먼트용의 출력 데이터가 나온다.
그리고, 데이터가 0이고 게다가 blanking의 지정이 있는 경우에는 전 비트 OFF, 즉 blank를 돌려주게 된다.
         _______
        |  PB0  |--- NOT USE
        |  PB1  |--- a
        |    |    |     |    7SEGMENT LED
        |  PB7  |--- g
        |______|

;*************************************************
; Convert Binary to 7SEG Code
; Display PORT B is shifted 1 bit to left,
; then data is shifted 1 bit left
;*************************************************
GET_7SEG
            BTFSS        BLANK,0            ;BLANK flag check
            GOTO         NOTBLNK
            ANDLW        0FH                  ;Mask upper 4bits
            BTFSC        STATUS,Z         ;0 check
            RETLW        0                      ;BLANK return
            BCF            BLANK,0            ;BLANK flag reset
NOTBLNK
            ANDLW        0FH                  ;Mask upper 4bits
            ADDWF        PCL,F               ;Add to PC reg
            RETLW        B'01111110'      ;Code 0
            RETLW        B'00001100'      ;Code 1
            RETLW        B'10110110'      ;Code 2
            RETLW        B'10011110'      ;Code 3
            RETLW        B'11001100'      ;Code 4
            RETLW        B'11011010'      ;Code 5
            RETLW        B'11111010'      ;Code 6
            RETLW        B'00001110'      ;Code 7
            RETLW        B'11111110'      ;Code 8
            RETLW        B'11001110'      ;Code 9
            RETLW        B'10000000'      ;Code A
            RETLW        B'10000000'      ;Code B
            RETLW        B'10000000'      ;Code C
            RETLW        B'10000000'      ;Code D
            RETLW        B'10000000'      ;Code E
            RETLW        B'10000000'      ;Code F


주의 9: BSF, BCF 명령 사용법의 주의
BSF, BCF로 포트의 출력을 하는 경우, 예를 들면 BSF  POTRB,RB0라는 명령을 실행하면 실제 동작은 하기 순서로 실행된다.
·우선 포트 B의 전 비트를 CPU에 읽어들인다
·CPU에서 비트 0에 1을 세트하는 연산을 한다
·연산 결과를 포트 B에 출력한다

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


주의 10: 간접 어드레스 지정 사용법의 주의
간접 어드레스를 사용할 때, 어드레스를 연산으로 구할 때에는 연산 결과는 8비트밖에 어드레스에 반영되지 않는다.


목차 화면