PIC의 사용법의 「요령」

【하드웨어에 관한 것】

 주의 1:동작은 하고 있는 것 같지만 불안정, 손으로 손대면(자) 멈추거나 움직이거나.
     MCLR 단자의 pull-up 잊고. MCLR는 저항으로 pull-up
     하지 않아도 움직여 버리는 일도 있지만, 본래 다이오드로 Vss
     에 클램프 되고 있으므로 pull-up(5 K~20 K)가 필수.

 주의 2:RA4 핀은 입력으로 사용할 때에도 pull-up가 필요.
     RA4는 슈미트 버퍼로 받는 내부 회로가 되어 있으므로
     일견 입력때에는 그대로 접속해도 좋은 것처럼 보입니다만 틀림
     있고로, 반드시 pull-up를 하지 않으면 항상 L레벨에서의 입력이 되어
     끝냅니다. (5 K~20 K오옴)

 주의 3:PORT B를 입력에 사용할 때에는 내부 pull-up를 ON로 한다.
     내부 pull-up를 ON로 하려면 , OPTION 레지스터의
     Bit7에”0”을 세트 한다. 지정은 8 포토분 일괄이다.
     그러나 출력으로 지정한 포토는 자동적으로 내부 pull-up는 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 pull-up ON
    BCF  STATUS, RP0      ;페이지 0으로 돌아온다

 주의 5:EEPROM의 개서 회수 수명.
     프로그램 에리어는 최저 100회, 데이터 에리어는 최저 10만회
     의 보증이다. 그러나 데이터 에리어를 통상의 프로그램 변수 영역
     (으)로서 사용하면(자) 10만회는 곧 다 사용해 끝수명이 와 버린다
     의로, 특별히 전원단 후의 다음번 기동시에 그 데이터를 사용하고 싶으면 있고
     같은 목적으로 사용하는 것이 본래의 사용법입니다.

 주의 6:ROM 기록시에는 Config의 기록도 잊지 않고
     프로그램을 ROM 라이터로 PIC에 기입할 때, Config의 레지스터도
     잊지 않고 기입하지 않으면 수정 발진자가 정상적으로 발진하지 않는등의
     불안정한 상태가 되어 버립니다.

【소프트웨어에 관한 것


주의 1:정수 감산 명령 「SUBLW k」는 「k-w->w」를 실행한다.
     Z80등의 어셈블러와 역이므로 요주의.
     덧붙여서 「SUBWF f, d」는 「f-w->d」를 실행한다.
     실컷 고민한 결과가 이것이기도 하는 엄중 주의.
     한층 더 결과의 C플래그는"0" 때 부로"1"의 시정이며 통상과
     이것도 역이므로 요주의.

 주의 2:「MOVF f, d」는 Z플래그에 영향을 준다.
     레지스터 내용을 가져올 뿐(만큼)의 예정이, Z플래그도 바뀌어
     끝낸다. Z플래그를 분기 판정에 사용할 때에는 엄중 주의.
     반대로 d를"1"그렇다면 f레지스터의 제로 테스트를 할 수 있고 편리합니다.

 주의 3:TRIS나 OPTION 레지스터의 지정시의 어셈블러의
     WARNING 메세지가 나오지 않게 하려면.

     어셈블러에서 IMPORT 하는 표준 라이브러리(P16c84.inc)의 일부를
     아래와 같은님이 고쳐 쓴다.

   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의 주소$0 C~$2 F까지의 36바이트.
     주소$00~$0 B까지는 각종 설정용의 레지스터로서
     확보되고 있으므로, 범용의 변수 영역으로서 사용할 수 있는 것은 상기
     범위만. 보통은 프로그램의 최초로 변수 영역으로서 아래와 같은
     님이 정의해 둔다.
      WORK1  EQU  $0C  ;WORK1의 주소 정의
      WORK2  EQU  $0D  ;WORK2의 주소 정의
      ······

 주의 6:EEPROM 데이터 메모 리에 리어에의 리드/라이트
     PIC16C84에는 64바이트의 EEPROM 데이타메모리가 내장
     되고 있다. 여기에 쓰여진 데이터는 전원이 OFF가 되어도
     사라지는 것은 없다. 그러나 주의가 필요한 것은, 리드/라이트
     에 특별한 순서가 필요한 것과 라이트에게는 약 10 msec
     그렇다고 하는 시간이 걸리는 일입니다.
     리드/라이트의 구체적인 코딩은 아래와 같이 합니다.
     써브루틴 형식으로서 있으므로 그대로 사용해도 괜찮습니다.

;*********************************
; 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 명령과 새치기에 의한 점프시에 스택 에리어
     에 귀가 번지를 보존합니다. 따라서, 나는 일처 중(안)에서 한층 더 CALL
     명령을 사용한다고 하는 상자는 8 레벨까지라고 하는 제한이 있으므로
     주의. (요점은 써브루틴으로부터 한층 더 써브루틴으로 하는 것
     (을)를 남아 깊게 하지 말아라 라고 하는 것)

 주의 8:바이너리코드에서 7 세그먼트(segment)에의 변환
     7 세그먼트(segment) LED를 직접 PIC의 포토로부터 드라이브 하는 경우에
     내부 연산을 바이너리로 실행해 결과를 출력할 때의 변환 써브루틴입니다.
     본례는 포토 B의 비트 1에서 7에 출력해 비트 0은 사용하지 않는 것과
     하고 있습니다.
     써브루틴을 부르기 전에 W레지스터에 값을 로드해 둡니다.
     오는 길에는 W레지스터에 7 세그먼트(segment)용의 출력 데이터가 나옵니다.
     또 데이터가 0으로 게다가 blanking의 지정이 있는 경우에는 전비트
     OFF 즉 공백이 돌려주어집니다.
     __________
    | 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.7 V정도 밖에 되지 않기 때문에, 그
     포토를 입력하면(자) Low로 간주해 버립니다. 따라서, 연산 결과
     (을)를 출력할 때에 Low로서 재세트 하기 위한(해), High를 출력하고 있었다
     직접 관계 없는 비트가 돌연 Low 가 되어 버린다고 하는 오동작과
     (이)라고 끝냅니다.
     이것을 피하려면 , MOVWF 명령으로 항상 의식해 동시에 출력해 준다
     일이 필요합니다.

 주의 10:간접 주소 지정의 사용법의 주의

간접 주소를 사용할 때, 주소를 연산으로 요구할 때에는, 연산 결과는
8비트 밖에 주소에 반영되지 않는다.


목차 페이지로