주의 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비트 밖에 주소에 반영되지 않는다.