kuroの覚え書き

96の個人的覚え書き

PIC温度計プログラムを改良



温度計算を5段階に分割する


;水温測定(AD変換)
;RB2で充電、RB3でカウントする
;RB2は出力に設定
;AD変換値以降受け渡されるデータは変数WIDTH1に格納
BSF PORTB,2 ;充電しておく
CALL TIME50M
WATER_TEMP
MOVLW 084H ;LCD表示位置固定
CALL LCD_CMD ;
CALL ADCNV1 ;まずAD変換1
MOVLW 0DAH ;218をロードして
SUBWF WIDTH1,W ;AD変換値(WIDTH1)から引く
BTFSC STATUS,C ;マイナスかどうか
GOTO LOWTEMP ;プラスならLOW表示へ
CALL TEMP_CALC1 ;マイナスなら温度計算ルーチンへ
CALL DISP_DIGIT
CALL TIME1S
GOTO END_WTR
END_WTR RETURN

TEMP_CALC1
MOVLW 0D2H ;210をロードして
SUBWF WIDTH1,W ;AD変換値(WIDTH1)から引く
BTFSC STATUS,C ;マイナスかどうか
GOTO TEMP1 ;プラスなら計算式1へ
MOVLW 0BBH ;187をロードして
SUBWF WIDTH1,W ;AD変換値(WIDTH1)から引く
BTFSC STATUS,C ;マイナスかどうか
GOTO TEMP2 ;プラスなら計算式2へ
MOVLW 098H ;152をロードして
SUBWF WIDTH1,W ;AD変換値(WIDTH1)から引く
BTFSC STATUS,C ;マイナスかどうか
GOTO TEMP3 ;プラスなら計算式3へ
GOTO TEMP4 ;マイナスなら計算式4へ

TEMP1 ;y=-1.7x+400
MOVF WIDTH1,W ;WIDTH1をWにコピー
MOVWF CALC2B ;CALC2BにWを格納
MOVLW 0AAH ;乗算数値(170)をWに入れる
MOVWF CALC2A ;CALC2AにW格納
CALL MUL88 ;MUL88を呼び出し
MOVF CALC1B,W ;計算結果(上位)をWに入れる
MOVWF CALC2B ;CALC2BにW格納
MOVF CALC1A,W ;計算結果(下位)をWに入れる
MOVWF CALC2A ;BCALC2AにW格納
MOVLW 00H ;割る数上位(0)
MOVWF CALC1B
MOVLW 064H ;割る数下位(100)
MOVWF CALC1A
CALL DIV16 ;答えはCALC3B,A、余りはCALC4B,Aに返る
MOVLW 0FFH ;255をロード
MOVWF WIDTH1 ;WIDTH1にW格納
MOVF CALC3A,W ;割り算結果(下位のみ)をWに格納
SUBWF WIDTH1,F ;割り算結果を255から引いてWIDTH1に戻す
MOVLW 091H ;145をロード
ADDWF WIDTH1,F ;足し算結果をWIDTH1に戻す
GOTO ENDCALC

TEMP2 ;y=-1.03x+260
MOVF WIDTH1,W ;WIDTH1をWにコピー
MOVWF CALC2B ;CALC2BにW格納
MOVLW 067H ;乗算数値(103)をWに入れる
MOVWF CALC2A ;CALC2AにW格納
CALL MUL88 ;MUL88を呼び出し
MOVF CALC1B,W ;計算結果(上位)をWに入れる
MOVWF CALC2B ;CALC2BにW格納
MOVF CALC1A,W ;計算結果(下位)をWに入れる
MOVWF CALC2A ;BCALC2AにW格納
MOVLW 00H ;割る数上位(0)
MOVWF CALC1B
MOVLW 064H ;割る数下位(100)
MOVWF CALC1A
CALL DIV16 ;答えはCALC3B,A、余りはCALC4B,Aに返る
MOVLW 0FFH ;255をロード
MOVWF WIDTH1 ;WIDTH1にW格納
MOVF CALC3A,W ;割り算結果(下位のみ)をWに格納
SUBWF WIDTH1,F ;割り算結果を255から引いてWIDTH1に戻す
MOVLW 05H ;5をロード
ADDWF WIDTH1,F ;足し算結果をWIDTH1に戻す
GOTO ENDCALC

TEMP3 ;y=-0.66x+190
MOVF WIDTH1,W ;WIDTH1をWにコピー
MOVWF CALC2B ;CALC2BにW格納
MOVLW 042H ;乗算数値(66)をWに入れる
MOVWF CALC2A ;CALC2AにW格納
CALL MUL88 ;MUL88を呼び出し
MOVF CALC1B,W ;計算結果(上位)をWに入れる
MOVWF CALC2B ;CALC2BにW格納
MOVF CALC1A,W ;計算結果(下位)をWに入れる
MOVWF CALC2A ;BCALC2AにW格納
MOVLW 00H ;割る数上位(0)
MOVWF CALC1B
MOVLW 064H ;割る数下位(100)
MOVWF CALC1A
CALL DIV16 ;答えはCALC3B,A、余りはCALC4B,Aに返る
MOVLW 0BEH ;190をロード
MOVWF WIDTH1 ;WIDTH1にW格納
MOVF CALC3A,W ;割り算結果(下位のみ)をWに格納
SUBWF WIDTH1,F ;割り算結果を190から引いてWIDTH1に戻す
GOTO ENDCALC

TEMP4 ;y=-0.86x+220
MOVF WIDTH1,W ;WIDTH1をWにコピー
MOVWF CALC2B ;CALC2BにW格納
MOVLW 056H ;乗算数値(86)をWに入れる
MOVWF CALC2A ;CALC2AにW格納
CALL MUL88 ;MUL88を呼び出し
MOVF CALC1B,W ;計算結果(上位)をWに入れる
MOVWF CALC2B ;CALC2BにW格納
MOVF CALC1A,W ;計算結果(下位)をWに入れる
MOVWF CALC2A ;BCALC2AにW格納
MOVLW 00H ;割る数上位(0)
MOVWF CALC1B
MOVLW 064H ;割る数下位(100)
MOVWF CALC1A
CALL DIV16 ;答えはCALC3B,A、余りはCALC4B,Aに返る
MOVLW 0DCH ;220をロード
MOVWF WIDTH1 ;WIDTH1にW格納
MOVF CALC3A,W ;割り算結果(下位のみ)をWに格納
SUBWF WIDTH1,F ;割り算結果を220から引いてWIDTH1に戻す
GOTO ENDCALC
ENDCALC RETURN

LOWTEMP1
MOVLW 'L'
CALL LCD_DATA
MOVLW 'O'
CALL LCD_DATA
MOVLW 'W'
CALL LCD_DATA
GOTO END_WTR