kuroの覚え書き

96の個人的覚え書き

タコプログラム一応完成



とりあえず完成。アセンブルはエラーなくできたけど、ちゃんと表示されるだろうか。

液晶パネルがVmaxについたままなので試してみる事ができない。

やっぱり開発用にもう一個液晶要るなあ。


LIST P=PIC16F84
INCLUDE "P16F84.INC"

__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_OFF & _CP_OFF

;FLAG定義部

BYTE0 EQU 0DH ;Counter 0
BYTE1 EQU 0EH ;Counter 1
BYTE2 EQU 0FH ;Counter 2
DPDT EQU 10H ;LCD output data
DIGIT12 EQU 11H ;Digit12
DIGIT34 EQU 12H ;Digit34
DIGIT56 EQU 13H ;Digit56
DIGIT78 EQU 14H ;Digit78
SHIFT EQU 15H
CNT1 EQU 16H ;Timer counter
CNT2 EQU 17H
CNT3 EQU 18H
CNT4 EQU 19H
WORK1 EQU 1AH ;work
LPCNT1 EQU 1BH ;Loop Counter
LPCNT2 EQU 1CH ;Loop Counter
OVERFLW EQU 1DH ;Over Flow Flag
TEMP EQU 20H ;tempolary work
ZFLG EQU 22H ;zero supress flag

;****************
; Jumping Vector
;****************

ORG 0
GOTO MAIN

ORG 4
GOTO INTPROC
INTPROC RETURN

ORG 08H

;*****
;MAIN
;*****
MAIN
;初期設定
BSF STATUS,RP0
MOVLW 018H ;00011000
MOVWF TRISA ;only RA3,4 input
CLRF TRISB ;PORTB=OUTPUT
MOVLW 0E8H ;プリスケーラなし
MOVWF OPTION_REG ;
BCF STATUS,RP0
CLRF TMR0
CLRF PORTB
;
MAINLP
CALL MEA ;MEASUREMENT
CALL CONVRT ;TARANSLATE BINARY TO BCD
; CALL LCD_CLR ;clear display 温度計と併用のためここではクリアしない
CALL DISP ;Display data;使用するFLAGは
GOTO MAINLP



;*****************************
;タコ用計測実行サブルーチン
;ゲートタイムは0.6秒
;PORTAのRA4がゲート制御用ピン
;
;使用するFLAGは
;OVERFLW
;TEMP
;LPCNT1
;LPCNT2
;BYTE0
;BYTE1
;BYTE2
;
;
;初期設定は以下のようなものを使う
; BSF STATUS,RP0
; MOVLW 0E8H ;プリスケーラなし
; MOVWF OPTION_REG
; BCF STATUS,RP0
; CLRF TMR0
;******************************
;カウンタルーチン
MEA
;まずはGATEの初期化
CLRF TMR0 ;COUNTER RESET
BCF PORTA,4 ;GATE CLOSE
;計測開始
BSF PORTA,4 ;GATE OPEN
CLRF OVERFLW ;CLEAR OVERFLOW FLAG
MOVLW 03H
MOVWF TEMP ;4STEP
LP1 CALL MEALOOP ;(249998STEP)
DECFSZ TEMP,F
GOTO LP1 ;250001*3-1STEP
CALL MEALOOP ;249998STEP
CALL MEALOOP ;249998STEP
CALL MEALOOP ;249998STEP
BCF PORTA,4 ;GATE CLOSE (250000*6)
RETURN

;計測実行ループ
MEALOOP MOVLW 08DH
MOVWF LPCNT1
;
MEALP1 MOVLW 088H
MOVWF LPCNT2
;
MEALP2 BTFSS INTCON,T0IF ;13 STEP LOOP
GOTO DUMMY1
BCF INTCON,T0IF ;RESET T0IF FLAG
MOVLW 1
GOTO NEXT
DUMMY1 NOP
NOP
MOVLW 0
NEXT ADDWF BYTE1,F ;
RLF BYTE1,W
ANDLW 1
ADDWF BYTE2,F
DECFSZ LPCNT2,F
GOTO MEALP2
;
NOP
MEALP3 DECFSZ LPCNT1,F
GOTO MEALP1
RETURN
;
;**********************
; Convert Binay to BCD
;**********************
CONVRT MOVF TMR0,W ;get TMR0 to BYTE0
MOVWF BYTE0
GOTO CONV1
;
;**** Convert 3 bytes binary to BCD ******
; This routine is refered to
; application notes.
; BYTE3 is not used
;使用するFLAGは
;DIGIT12
;DIGIT34
;DIGIT56
;DIGIT78
;WORK1
;TEMP


CONV1
BCF STATUS,C ;reset carry
MOVLW 018H ;Shift bit counter
MOVWF SHIFT ;shift 32 times
CLRF DIGIT12 ;clear BCD
CLRF DIGIT34
CLRF DIGIT56
CLRF DIGIT78
LOOP
RLF BYTE0,F ;shift BYTE to DIGIT
RLF BYTE1,F
RLF BYTE2,F
RLF DIGIT12,F
RLF DIGIT34,F
RLF DIGIT56,F
RLF DIGIT78,F
DECFSZ SHIFT,F ;end check
GOTO ADJST ;adjust to BCD
RETURN
ADJST
MOVF DIGIT12,W ;DIGIT12 adjust TO BCD
CALL ADJBCD
MOVWF DIGIT12
MOVF DIGIT34,W ;DIGIT34 adjust to BCD
CALL ADJBCD
MOVWF DIGIT34
MOVF DIGIT56,W ;DIGIT56 adjust to BCD
CALL ADJBCD
MOVWF DIGIT56
MOVF DIGIT78,W ;DIGIT78 adjust to BCD
CALL ADJBCD
MOVWF DIGIT78
GOTO LOOP

;**** Each digit adjust to BCD ****
ADJBCD
MOVWF WORK1 ;save
MOVLW 3 ;W+3
ADDWF WORK1,W
MOVWF TEMP
BTFSC TEMP,3 ;Test W+3>7
MOVWF WORK1 ;>7 then W+3 else W

MOVLW 030H ;W+30
ADDWF WORK1,W
MOVWF TEMP
BTFSC TEMP,7 ;Test W+30>7*
MOVWF WORK1 ;>70 then W+30 else W
MOVF WORK1,W
RETURN

;******************************************
; Display 8 digits with zero supress
; and display dumy "o" by gate time
; Display "k" by prescaler
;使用するFLAGは
;ZFLAG
;WORK1
;TEMP
;*****************************************
DISP
BCF ZFLG,0 ;reset zero flag
; MOVF DIGIT78,W ;この桁は使わないはず
; CALL DISP_D ;display 1,2digitS
; MOVF DIGIT56,W ;この桁は使わないはず
; CALL DISP_D ;display 3,4digits
MOVLW 0C7H ;表示位置を指定
CALL LCD_CMD
MOVF DIGIT34,W
CALL DISP_D ;display 5,6digits
MOVF DIGIT12,W
CALL DISP_D ;display 7,8 digits

MOVLW "0" ;add "0"
CALL LCD_DATA
MOVLW "0" ;add "0"
CALL LCD_DATA

SKIPC MOVLW "R" ;display rpm
CALL LCD_DATA
MOVLW "P"
CALL LCD_DATA
MOVLW "M"
CALL LCD_DATA
RETURN

;**** Display 1 byte Data(2 digits) *****
DISP_D
MOVWF WORK1 ;save
MOVF WORK1,W ;get 1,2digit
SWAPF WORK1,W ;upper digit
ANDLW 0FH ;
MOVWF TEMP ;save
BTFSS ZFLG,0 ;check zero flag
CALL ZEROSUP ;zero supress
MOVF TEMP,W
SUBLW 0FH ;Check blank
BTFSS STATUS,Z
GOTO NUM1 ;not blank
MOVLW 020H ;blank data
GOTO DISP1
NUM1 MOVF TEMP,W ;restore
IORLW 030H ;convert to ASCII
DISP1 CALL LCD_DATA

MOVF WORK1,W ;
ANDLW 0FH ;lower digit
MOVWF TEMP ;save
BTFSS ZFLG,0
CALL ZEROSUP ;zero supress
MOVF TEMP,W
SUBLW 0FH
BTFSS STATUS,Z ;check blank data
GOTO NUM2
MOVLW 020H
GOTO DISP2
NUM2 MOVF TEMP,W
IORLW 030H ;change to ASCII code
DISP2 CALL LCD_DATA
RETURN

;**** Check zero subroutine ****
ZEROSUP
ANDLW 0FH ;check zero
BTFSS STATUS,Z
GOTO ZEND ;not zero
MOVLW 0FH
MOVWF TEMP ;set blank
BCF ZFLG,0 ;zero flag off
RETURN
ZEND BSF ZFLG,0 ;not zero flag on
MOVF TEMP,W
RETURN



;***************************************************
; LCD control routines
;使用するFLAGは
;DPDT
;
;***************************************************

;**** LCD Data Write ****
LCD_DATA
MOVWF DPDT ;save dat
ANDLW 0F0H ;mask lower
MOVWF PORTB
BCF PORTA,1 ;R/W
BSF PORTA,2 ;RS high
BSF PORTA,0 ;E high
BCF PORTA,0 ;E low
SWAPF DPDT,W ;get data lower
ANDLW 0F0H
MOVWF PORTB
BSF PORTA,0
BCF PORTA,0
CALL LCD_BUSY
RETURN

;**** LCD command out *****
LCD_CMD
MOVWF DPDT ;save dat
ANDLW 0F0H ;mask lower
MOVWF PORTB
BCF PORTA,1 ;R/W
BCF PORTA,2 ;RS low
BSF PORTA,0 ;E high
BCF PORTA,0 ;E low
SWAPF DPDT,W ;get data lower
ANDLW 0F0H
MOVWF PORTB
BSF PORTA,0
BCF PORTA,0
CALL LCD_BUSY
RETURN

;**** LCD Display Clear ****
LCD_CLR
MOVLW 01H ;clear command
CALL LCD_CMD
RETURN

;**** Initialize *****
LCD_INI
CALL TIME5M ;wait
MOVLW 030H ;Function set 8bits
MOVWF PORTB
BCF PORTA,1 ;R/W
BCF PORTA,2 ;RS
BSF PORTA,0 ;E high
BCF PORTA,0 ;E low
CALL TIME5M ;wait
MOVLW 030H ;Function reset 8bits
MOVWF PORTB
BCF PORTA,1 ;R/W
BCF PORTA,2 ;RS
BSF PORTA,0 ;E high
BCF PORTA,0 ;E low
CALL TIME100
MOVLW 030H ;Function reset 8bits
MOVWF PORTB
BCF PORTA,1
BCF PORTA,2
BSF PORTA,0
BCF PORTA,0
CALL TIME100
MOVLW 020H ;Function set 4bits mode
MOVWF PORTB ;under the 8bits mode
BCF PORTA,1
BCF PORTA,2
BSF PORTA,0
BCF PORTA,0
CALL TIME100 ;From here 4bits mode

MOVLW 02CH ;function DL=0 4bit mode
CALL LCD_CMD
MOVLW 08H ;Display off D=C=B=0
CALL LCD_CMD
MOVLW 0CH ;Display on D=1 C=B=0
CALL LCD_CMD
MOVLW 06H ;Entry I/D=1 S=0
CALL LCD_CMD
RETURN


;**** LCD Busy Check ************
LCD_BUSY
CLRF DPDT
BSF STATUS,RP0 ;Bank 1
BSF OPTION_REG,7 ;Turn off PORTB pull up
MOVLW 0FEH ;PORTB input
MOVWF TRISB
BCF STATUS,RP0 ;Bank 0
BCF PORTA,2 ;RS low
BSF PORTA,1 ;R/W high
BSF PORTA,0 ;E high
MOVF PORTB,W ;get upper
BCF PORTA,0 ;E low
ANDLW 0F0H ;Mask out lower
MOVWF DPDT
BSF PORTA,0 ;E high
SWAPF PORTB,W ;get lower
BCF PORTA,0 ;E low
ANDLW 0FH ;Mask out upper
IORWF DPDT,F ;upper+lower
BTFSC DPDT,7 ;BUSY flag check
GOTO LCD_BUSY ;retry

BCF PORTA,1 ;R/W low
BSF STATUS,RP0 ;Bank 1
MOVLW 0EH ;RB1,2,3 input
MOVWF TRISB ;PORTB
BCF STATUS,RP0 ;Bank 0
RETURN

;*********************************
; Timer Routine
; TIME10 :10usec
; TIME100 :100usec
; TIME1M :1msec
; TIME5M :5msec
;使用するFLAGは
;CNT1
;CNT2
;CNT3
;CNT4
;*********************************

TIME100 ;100usec
MOVLW 9H
MOVWF CNT1
T_LP1 CALL TIME10 ;2+(25+3)*9-1=253
DECFSZ CNT1,F
GOTO T_LP1
RETURN ;254*0.4=100usec(about)

TIME10 ;10usec
MOVLW 7H
MOVWF CNT2
T_LP2 DECFSZ CNT2,F ;2+3*7-1=22
GOTO T_LP2
RETURN ;22+1=23

TIME1M ;1msec(about)
MOVLW 0AH
MOVWF CNT3
T_LP3 CALL TIME100 ;2+(254+3)*10-1=2541
DECFSZ CNT3,F
GOTO T_LP3
RETURN ;2542

TIME5M ;5msec(about)
MOVLW 3BH
MOVWF CNT4
T_LP4 CALL TIME100 ;2+(254+3)*59-1=15164
DECFSZ CNT4,F
GOTO T_LP4
RETURN ;15165

END



パルス入力なし状態で動作チェックしてみたところ、全くだめ。

LCDに表示すら出なかった。

見直しせねば・・・