kuroの覚え書き

96の個人的覚え書き

タコなプログラミングその2



まだまだ未完+バグだらけと思われるが


;
LIST P=PIC16F84
INCLUDE "P16F84.INC"

__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_OFF & _CP_OFF

;FLAG定義部
OVERFLW
LPCNT1
LPCNT2
BYTE0
BYTE1
BYTE2
DIGIT12
DIGIT34
DIGIT56
DIGIT78
WORK1
TEMP


;****************
; 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 CONVERT ;TARANSLATE BINARY TO BCD
CALL LCD_CLR ;clear display LCDを使用する場合
CALL DISP ;Display data
CALL DISP_RPM ;DISPLAY 00RPMまだできてない
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 TMRO ;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

;***************************************************
; LCD control routines
;***************************************************

;**** 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
;*********************************

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