MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 1 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00001 ;********************************************************************* 00002 ; FIT (GD1) 瞬間燃費計 00003 ; (c)るきへな 2001-2002 00004 ;********************************************************************* 00005 ; 00006 ; 開発開始 2001/12/22 00007 ; 配線決定 2001/12/23 00008 ; ケース組み込み 2001/12/24 00009 ; 中途半端だけどリリース 2002/01/08 00010 ; 割算ルーチン修正 2002/01/14 00011 ; MPASM化など 2002/02/01 00012 ; 信号間燃費など 2002/02/02 00013 ; 4MHz に変更 2002/05/18 00014 ; 表示を大幅に変更 2002/06/06 00015 ; タイムアウトタイマ調整 2002/07/12 00016 ; 掛け算のバグ修正 2002/07/12 00017 ; 00018 ; 使用環境 00019 ; PIC PIC16F84-10/P 00020 ; 液晶 M1632,M1672,SC1602B等 00021 ; クロック 4.0MHz 00022 ; アセンブラ MPASM 00023 ; 00024 ; ピンアサイン: 00025 ; 00026 ; PIC LCD FIT etc. 00027 ; -------------------------------------------------------------------- 00028 ; GND DB0 00029 ; GND DB1 00030 ; GND DB2 00031 ; GND DB3 00032 ; RA0(17) DB4 LED_0 (電流制限抵抗を介してLED_COMへ) 00033 ; RA1(18) DB5 LED_1 (電流制限抵抗を介してLED_COMへ) 00034 ; RA2(17) DB6 LED_2 (電流制限抵抗を介してLED_COMへ) 00035 ; RA3(18) DB7 LED_3 (電流制限抵抗を介してLED_COMへ) 00036 ; RA4(17) LED_COM (LED_0-3 のコモン。計25mAに気をつけよう) 00037 00038 ; GND // R/~W 00039 00040 ; RB0() Switch 1 00041 ; RB1() RS 00042 ; RB2() E(ENABLE) 00043 ; RB3() R/~W //Switch 2 00044 ; RB4() ndr(C7)赤/青 00045 ; RB5() ndn(C15)白 00046 ; RB6() speed(E25)青/黄 00047 ; RB7() fup(E5)緑/白 00048 ; 00049 ; ☆ 電源・クリスタル・コントラスト調整VR等の配線は省略 00050 ; ☆ 対車両IFは、RCフィルタ(R:75,C:0.1u)を通して信号線へ。プルアップはPIC内蔵を使用。 00051 ; ☆ 車両への接続のピンアサインは流動的です。本体プログラム参照のこと。 00052 ; ☆ LED は液晶バスを使っていないときにドライブする。ダイナミック点灯の応用。 00053 ; ☆ でも LED は使ってません。(デバッグ用かも) MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 2 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00054 ; ☆ 変速比計計画のなごりコードが残ってます。 00055 00056 list p=pic16f84 00057 include 00001 LIST 00002 ; P16F84.INC Standard Header File, Version 2.00 Microchip Technology, Inc. 00136 LIST 00058 00059 include "ramdef.asm" 2007 3FF2 00001 __config B'11111111110010' 00002 0000000C 00003 ram set 0ch 0000000C 00004 timer_cn equ ram ; タイマカウンタ 0000000F 00005 ram set ram+3 0000000F 00006 odometer_cn equ ram ; 走行距離カウンタ 00000012 00007 ram set ram+3 00000012 00008 fuel_cn equ ram ; 燃料パルスカウンタ 00000015 00009 ram set ram+3 00000015 00010 ndr_cn equ ram ; ドライブプーリースピード パルスカウンタ 00000017 00011 ram set ram+2 00000017 00012 ndn_cn equ ram ; ドリブンプーリースピード パルスカウンタ 00000019 00013 ram set ram+2 00014 00000019 00015 timer_cn2 equ ram ; タイマカウンタ(信号間) 0000001C 00016 ram set ram+3 0000001C 00017 odometer_cn2 equ ram ; 走行距離カウンタ(信号間) 0000001F 00018 ram set ram+3 0000001F 00019 fuel_cn2 equ ram ; 燃料パルスカウンタ(信号間) 00000022 00020 ram set ram+3 00021 00000022 00022 speed_tm_la equ ram ; スピード・時間 00000024 00023 ram set ram+2 00000024 00024 speed_tm_lb equ ram ; スピード・時間 00000026 00025 ram set ram+2 00000026 00026 speed_tm equ ram ; スピード・時間 00000028 00027 ram set ram+2 00000028 00028 speed_flow equ ram ; スピード・0km/hチェック 00000029 00029 ram set ram+1 00030 00000029 00031 fuel_tm_la equ ram ; 燃料パルス・時間 0000002B 00032 ram set ram+2 0000002B 00033 fuel_tm_lb equ ram ; 燃料パルス・時間 0000002D 00034 ram set ram+2 0000002D 00035 fuel_tm equ ram ; 燃料パルス・時間 0000002F 00036 ram set ram+2 0000002F 00037 fuel_flow equ ram ; 燃料パルス・fuel cut チェック 00000030 00038 ram set ram+1 00039 00000030 00040 w_save equ ram ; 割込 退避用 00000031 00041 ram set ram+1 00000031 00042 status_save equ ram ; 割込 退避用 00000032 00043 ram set ram+1 00044 MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 3 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00000032 00045 ra_save equ ram ; 通常時のPORTA 00000033 00046 ram set ram+1 00047 00000033 00048 rb_now equ ram ; 割込時のrb(割り込み期間だけ保存) 00000034 00049 ram set ram+1 00000034 00050 rb_temp equ ram ; 割込時のrb(処理ワーク) 00051 ;ram set ram+1 00000034 00052 rb_save equ ram ; 割込時のrb(次回まで保存) 00000035 00053 ram set ram+1 00054 00000035 00055 lcd_data_temp equ ram ; LCDデータ(テンポラリ用) 00000036 00056 ram set ram+1 00057 00000036 00058 src1 equ ram ; 計算用 引数 00000039 00059 ram set ram+3 00000039 00060 src2 equ ram ; 計算用 引数 0000003C 00061 ram set ram+3 0000003C 00062 result equ ram ; 計算用 戻り値 0000003F 00063 ram set ram+3 0000003F 00064 mod equ ram ; 計算用 戻り値 00000042 00065 ram set ram+3 00000042 00066 flag equ ram 00067 ;flag,0 : print 時に固定小数点(10倍)だとして表示します。 00068 ;flag,1 : お休み中 00069 ;flag,2 : 前回値表示中フラグ 00070 ;flag,3 : /0 error 00000043 00071 ram set ram+1 00000043 00072 dec equ ram ; 10進格納場所(5バイト) 00000048 00073 ram set ram+5 00000048 00074 dec_top equ ram 00000048 00075 calc_cn equ ram ; カウンタのワーク 00000049 00076 ram set ram+1 00000049 00077 calc_cn2 equ ram ; カウンタのワーク 0000004A 00078 ram set ram+1 0000004A 00079 mode equ ram ; 表示モード 0000004B 00080 ram set ram+1 00081 00082 ; LCD の RS ピン 00083 #define RS PORTB,1 00084 ; LCD の RS ピン 00085 #define E PORTB,2 00086 ; ステータス表示 (@@@予定) 00087 #define LED_COM PORTA,4 00088 00089 ;分係数 00090 ;10*1000*1000/4/128/256*60 = 4577.636719 = 0x11E2 00091 ; 4*1000*1000/4/ 64/256*60 = 3662.109375 = 0x0E4E 00092 #define TIMMINFACT_H 0x0e 00093 #define TIMMINFACT_L 0x4e 00094 00095 ;秒係数 00096 ;10*1000*1000/4/128/256*256 = 19531.25 = 0x4C4B 00097 ; 4*1000*1000/4/ 64/256*256 = 15625 = 0x3D09 MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 4 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00098 #define TIMSECFACT_H 0x3d 00099 #define TIMSECFACT_L 0x09 00100 00101 ;速度係数 00102 ;10*1000*1000/4/128/(2.54*1000/3600) = 27682.087 = 0x6C22 00103 ; 4*1000*1000/4/ 64/(2.54*1000/3600) = 22145.669 = 0x5682 00104 #define SPEEDFACT_H 0x56 00105 #define SPEEDFACT_L 0x82 00106 00107 ;燃料/時間 係数 00108 ;10*1000*1000/4/128/(637*4/1000)*60 = 459919.54 = 0x70490 00109 ; 4*1000*1000/4/ 64/(637*4/1000)*60 = 367935.64 = 0x59D40 00110 #define FUELFACT_H 0x05 00111 #define FUELFACT_M 0x9d 00112 #define FUELFACT_L 0x40 00113 00114 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 00115 ; タイムアウト判断時間 00116 ; 1秒≒61 (@ 4MHz) 00117 00118 ; 停止判断時間 00119 #define SPEED_FLOW_MAX D'160' 00120 00121 ; 燃料停止判断時間 (エンジン停止) 00122 #define FUEL_ST_FLOW_MAX D'254' 00123 00124 ; 燃料停止判断時間 (フューエルカット) 00125 #define FUEL_FC_FLOW_MAX D'150' 00126 00127 00128 ; 4時間止まっていたらオールリセット 00129 ; 4*3600*61 = 878906 = D693A 00130 ; 61について、実際はきちっと計算してるので誤差があります。 00131 ; いや、でも面倒だから最上位バイトだけチェックしよう。 00132 ; 0x0cffff = 3:53 00133 ; 0x0dffff = 4:10 00134 ; ちなみに4時間ってのはベンツのマネ。(参考 http://www.cds.co.jp/ff/r2302.htm) 00135 #define RESET_FLOW_MAX 0x0d 00136 00060 0000 00061 org 0 0000 2805 00062 goto start 00063 0004 00064 org 4 0004 2B6F 00065 goto interrupt 00066 0005 00067 start 00068 0005 2358 00069 call init_pic 0006 2249 00070 call init_lcd 00071 0007 30F8 00072 movlw B'11111000' ; 割り込みレジスタ初期設定 0008 008B 00073 movwf INTCON MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 5 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00074 00075 include "mainloop.asm" 00001 ; //////////////////////////////////////////////////////////////////// 00002 ; メインループ 00003 ; //////////////////////////////////////////////////////////////////// 00004 0009 00005 mainloop 0009 201C 00006 call calccalc ; 各種計算 00007 00008 ; LED 000A 080D 00009 movf timer_cn+1,W 000B 390F 00010 andlw B'00001111' 000C 00B2 00011 movwf ra_save 000D 0085 00012 movwf PORTA 00013 000E 2075 00014 call print ; ////////////// 表示! 00015 000F 00016 loop1 000F 1D8C 00017 btfss timer_cn,3 0010 280F 00018 goto loop1 ; wait 00019 0011 00020 loop2 0011 198C 00021 btfsc timer_cn,3 0012 2811 00022 goto loop2 ; wait 00023 0013 3001 00024 movlw FUEL_ST_FLOW_MAX ^ 0ffh 0014 072F 00025 addwf fuel_flow,0 0015 1C03 00026 btfss STATUS,C ; fuel cut と判断したら skip 0016 281B 00027 goto stopcheck_end ; fuel cut でなければ 通常処理へ 00028 0017 305F 00029 movlw SPEED_FLOW_MAX ^ 0ffh 0018 0728 00030 addwf speed_flow,0 0019 1803 00031 btfsc STATUS,C 001A 2033 00032 call sleeping ; 0km/h と判断されたら お休み 001B 00033 stopcheck_end 00034 001B 2809 00035 goto mainloop ; 無限ループ ////////////// ループ、ココまで /////////// 00036 00037 ; //////////////////////////////////////////////////////////////////// 00038 ; 各種計算 00039 ; //////////////////////////////////////////////////////////////////// 001C 00040 calccalc 001C 118B 00041 bcf INTCON,RBIE ; rb割込禁止 00042 00043 ; 車速パルス間隔計算 001D 0822 00044 movf speed_tm_la+0,W 001E 00A6 00045 movwf speed_tm+0 001F 0823 00046 movf speed_tm_la+1,W 0020 00A7 00047 movwf speed_tm+1 0021 0824 00048 movf speed_tm_lb+0,W 0022 02A6 00049 subwf speed_tm+0,F 0023 1C03 00050 btfss STATUS,C 0024 03A7 00051 decf speed_tm+1,F MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 6 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0025 0825 00052 movf speed_tm_lb+1,W 0026 02A7 00053 subwf speed_tm+1,F 00054 00055 ; 燃料パルス間隔計算 0027 0829 00056 movf fuel_tm_la+0,W 0028 00AD 00057 movwf fuel_tm+0 0029 082A 00058 movf fuel_tm_la+1,W 002A 00AE 00059 movwf fuel_tm+1 002B 082B 00060 movf fuel_tm_lb+0,W 002C 02AD 00061 subwf fuel_tm+0,F 002D 1C03 00062 btfss STATUS,C 002E 03AE 00063 decf fuel_tm+1,F 002F 082C 00064 movf fuel_tm_lb+1,W 0030 02AE 00065 subwf fuel_tm+1,F 00066 0031 158B 00067 bsf INTCON,RBIE ; rb割込許可 0032 0008 00068 return 00069 00070 00071 ; //////////////////////////////////////////////////////////////////// 00072 ; お休み中・・・ 00073 ; //////////////////////////////////////////////////////////////////// 0033 00074 sleeping 0033 1086 00075 bcf RS 0034 3000 00076 movlw 0 0035 0185 00077 clrf PORTA 00078 0036 1506 00079 bsf E ; Eピンを'H' (長時間やると、液晶OFF) 00080 0037 1683 00081 bsf STATUS,RP0 ;セレクトページ1 00082 ;movlw B'11111111' ; 全部IN (9mA) 00083 ;movlw B'11111011' ; Eを出力 (15mA) 0038 30F5 00084 movlw B'11110101' ; RS,R/~W を出力 (4mA) 0039 0086 00085 movwf TRISB-0x80 003A 1283 00086 bcf STATUS,RP0 ;セレクトページ0 00087 003B 14C2 00088 bsf flag,1 ; お休み中フラグON 00089 003C 0199 00090 clrf timer_cn2+0 ; タイマ(信号間) 003D 019A 00091 clrf timer_cn2+1 003E 019B 00092 clrf timer_cn2+2 00093 00094 ; パルスがこない間、無限ループ --> 003F 00095 sleep_loop 003F 3001 00096 movlw FUEL_ST_FLOW_MAX ^ 0ffh 0040 072F 00097 addwf fuel_flow,0 0041 1803 00098 btfsc STATUS,C 0042 283F 00099 goto sleep_loop ; fuel cut と判断されたら 00100 ; パルスがこない間、無限ループ <-- 00101 00102 ; 一定時間停車していた? 0043 300D 00103 movlw RESET_FLOW_MAX 0044 021B 00104 subwf timer_cn2+2,W MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 7 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0045 1C03 00105 btfss STATUS,C 0046 2864 00106 goto reset_flow_check_1 ; 一定時間に満たないので信号間だけリセット 00107 00108 ; 前回値を信号間の方にコピってからリセット 0047 1542 00109 bsf flag,2 ; 前回値表示中フラグON 00110 00111 ; コピ 0048 080C 00112 movf timer_cn+0,W 0049 0099 00113 movwf timer_cn2+0 004A 080D 00114 movf timer_cn+1,W 004B 009A 00115 movwf timer_cn2+1 004C 080E 00116 movf timer_cn+2,W 004D 009B 00117 movwf timer_cn2+2 00118 004E 080F 00119 movf odometer_cn+0,W 004F 009C 00120 movwf odometer_cn2+0 0050 0810 00121 movf odometer_cn+1,W 0051 009D 00122 movwf odometer_cn2+1 0052 0811 00123 movf odometer_cn+2,W 0053 009E 00124 movwf odometer_cn2+2 00125 0054 0812 00126 movf fuel_cn+0,W 0055 009F 00127 movwf fuel_cn2+0 0056 0813 00128 movf fuel_cn+1,W 0057 00A0 00129 movwf fuel_cn2+1 0058 0814 00130 movf fuel_cn+2,W 0059 00A1 00131 movwf fuel_cn2+2 00132 00133 ; リセ 005A 018C 00134 clrf timer_cn+0 005B 018D 00135 clrf timer_cn+1 005C 018E 00136 clrf timer_cn+2 005D 018F 00137 clrf odometer_cn+0 005E 0190 00138 clrf odometer_cn+1 005F 0191 00139 clrf odometer_cn+2 0060 0192 00140 clrf fuel_cn+0 0061 0193 00141 clrf fuel_cn+1 0062 0194 00142 clrf fuel_cn+2 0063 286D 00143 goto reset_flow_check_end 00144 0064 00145 reset_flow_check_1 ; 一定時間に満たないので信号間だけリセット 0064 0199 00146 clrf timer_cn2+0 0065 019A 00147 clrf timer_cn2+1 0066 019B 00148 clrf timer_cn2+2 0067 019C 00149 clrf odometer_cn2+0 0068 019D 00150 clrf odometer_cn2+1 0069 019E 00151 clrf odometer_cn2+2 006A 019F 00152 clrf fuel_cn2+0 006B 01A0 00153 clrf fuel_cn2+1 006C 01A1 00154 clrf fuel_cn2+2 00155 006D 00156 reset_flow_check_end 00157 MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 8 LOC OBJECT CODE LINE SOURCE TEXT VALUE 006D 1683 00158 bsf STATUS,RP0 ;セレクトページ1 006E 30F1 00159 movlw B'11110001' ; RB1-RB3ピンをOUT 006F 0086 00160 movwf TRISB-0x80 0070 1283 00161 bcf STATUS,RP0 ;セレクトページ0 00162 0071 1106 00163 bcf E ; Eピンを'L' (長時間やると、液晶ON) 0072 2249 00164 call init_lcd ; 液晶初期化 0073 10C2 00165 bcf flag,1 ; お休み中フラグOFF 0074 0008 00166 return 00076 00077 include "print.asm" 00001 ; ------------------------------------------------------------------- 00002 ; 表示 00003 ; ------------------------------------------------------------------- 00004 00005 ; 瞬間系 信号間 起動から 00006 ; 00007 ; 燃費 燃費 燃費 00008 ; 速度 平均速度 平均速度 00009 ; 燃料 距離 距離 00010 ; 時間 時間 00011 ; 00012 ; 000 00.0 00.0 00013 ; 000 000.0 000.0 00014 ; 000.00 000.00 00015 ; 000 000:00 000:00 00016 00017 ; 01234567890123456789 00018 0075 00019 print 00020 00021 ; カーソルを1行目に移動 0075 1086 00022 bcf RS ; RS='L' 0076 3080 00023 movlw B'10000000' 0077 2233 00024 call write_lcd_data 0078 1486 00025 bsf RS ; RS=1 : 以後のコマンドは文字表示 00026 0079 1942 00027 btfsc flag,2 ; 前回値表示中フラグON? 007A 2880 00028 goto print_1 ; ON なら prev表示 00029 ; OFF なら 通常表示 00030 007B 20DA 00031 call fu_print ; 瞬間燃費表示 00032 007C 3020 00033 movlw ' ' 007D 2233 00034 call write_lcd_data 007E 2233 00035 call write_lcd_data 007F 288A 00036 goto print_2 00037 0080 00038 print_1 ; ON なら prev 表示 0080 3070 00039 movlw 'p' 0081 2233 00040 call write_lcd_data 0082 3072 00041 movlw 'r' 0083 2233 00042 call write_lcd_data MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 9 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0084 3065 00043 movlw 'e' 0085 2233 00044 call write_lcd_data 0086 3076 00045 movlw 'v' 0087 2233 00046 call write_lcd_data 0088 3020 00047 movlw ' ' 0089 2233 00048 call write_lcd_data 00049 008A 00050 print_2 008A 2133 00051 call futs_print ; 区間燃費表示(信号間) 00052 008B 3020 00053 movlw ' ' 008C 2233 00054 call write_lcd_data 008D 2233 00055 call write_lcd_data 008E 2233 00056 call write_lcd_data 00057 008F 2119 00058 call fut_print ; 区間燃費表示 00059 00060 ; カーソルを2行目に移動 0090 1086 00061 bcf RS ; RS='L' 0091 30C0 00062 movlw B'11000000' 0092 2233 00063 call write_lcd_data 0093 1486 00064 bsf RS ; RS=1 : 以後のコマンドは文字表示 00065 0094 20B5 00066 call speed_print ; 速度表示 00067 0095 3020 00068 movlw ' ' 0096 2233 00069 call write_lcd_data 00070 0097 21DB 00071 call avgsps_print ; 平均速度表示(信号間) 00072 0098 3020 00073 movlw ' ' 0099 2233 00074 call write_lcd_data 009A 2233 00075 call write_lcd_data 00076 009B 21B3 00077 call avgsp_print ; 平均速度表示 00078 00079 00080 ; カーソルを3行目に移動 009C 1086 00081 bcf RS ; RS='L' 009D 3094 00082 movlw B'10010100' 009E 2233 00083 call write_lcd_data 009F 1486 00084 bsf RS ; RS=1 : 以後のコマンドは文字表示 00085 00A0 3020 00086 movlw ' ' 00A1 2233 00087 call write_lcd_data 00A2 2233 00088 call write_lcd_data 00A3 2233 00089 call write_lcd_data 00A4 2233 00090 call write_lcd_data 00091 00A5 2189 00092 call odds_print ; 走行距離表示(信号間) 00093 00A6 3020 00094 movlw ' ' 00A7 2233 00095 call write_lcd_data MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 10 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00096 00A8 2180 00097 call odd_print ; 走行距離表示 00098 00099 ; カーソルを4行目に移動 00A9 1086 00100 bcf RS ; RS='L' 00AA 30D4 00101 movlw B'11010100' 00AB 2233 00102 call write_lcd_data 00AC 1486 00103 bsf RS ; RS=1 : 以後のコマンドは文字表示 00104 00AD 20D1 00105 call fu_print_time ; 燃費cc/min表示 00106 00AE 3020 00107 movlw ' ' 00AF 2233 00108 call write_lcd_data 00109 00B0 2156 00110 call times_print ; 時間表示(信号間) 00111 00B1 3020 00112 movlw ' ' 00B2 2233 00113 call write_lcd_data 00114 00B3 214D 00115 call time_print ; 時間表示 00116 00117 ;call spcout_print ; 車速パルスカウント表示 00118 ;call fuelcout_print ; 燃料パルスカウント表示 00119 00B4 0008 00120 return 00121 00122 ;■瞬間系 --> 00123 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 00124 ; 速度表示 00B5 00125 speed_print 00B5 305F 00126 movlw SPEED_FLOW_MAX ^ 0ffh 00B6 0728 00127 addwf speed_flow,0 00B7 1803 00128 btfsc STATUS,C 00B8 28CA 00129 goto sp_print_0 ; 0km/h と判断されたら、計算しない 00130 00131 ; 速度計算(通常走行時) 00B9 0827 00132 movf speed_tm+1,W 00BA 00BA 00133 movwf src2+1 00BB 0826 00134 movf speed_tm+0,W 00BC 00B9 00135 movwf src2+0 00BD 3056 00136 movlw SPEEDFACT_H ;係数 00BE 00B7 00137 movwf src1+1 00BF 3082 00138 movlw SPEEDFACT_L ;係数 00C0 00B6 00139 movwf src1+0 00C1 22A8 00140 call div16 00141 00C2 083D 00142 movf result+1,W 00C3 00B7 00143 movwf src1+1 00C4 083C 00144 movf result+0,W 00C5 00B6 00145 movwf src1+0 00C6 2267 00146 call bin16tobcd 00147 00C7 1042 00148 bcf flag,0 MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 11 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00C8 2228 00149 call print_dec3 00150 ;movlw 'k' 00151 ;call write_lcd_data 00152 ;movlw 'm' 00153 ;call write_lcd_data 00154 ;movlw '/' 00155 ;call write_lcd_data 00156 ;movlw 'h' 00157 ;call write_lcd_data 00158 00C9 28D0 00159 goto sp_print_e 00CA 00160 sp_print_0 00161 ; idle 00CA 3020 00162 movlw ' ' 00CB 2233 00163 call write_lcd_data 00CC 3020 00164 movlw ' ' 00CD 2233 00165 call write_lcd_data 00CE 3030 00166 movlw '0' 00CF 2233 00167 call write_lcd_data 00168 ;movlw 'e' 00169 ;call write_lcd_data 00170 ;movlw ' ' 00171 ;call write_lcd_data 00172 ;call write_lcd_data 00173 ;call write_lcd_data 00D0 00174 sp_print_e 00D0 0008 00175 return 00176 00177 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 00178 ; 瞬間燃費表示 (000cc/m or f-c) 00D1 00179 fu_print_time 00D1 305F 00180 movlw SPEED_FLOW_MAX ^ 0ffh 00D2 0728 00181 addwf speed_flow,0 00D3 1803 00182 btfsc STATUS,C 00D4 28F3 00183 goto fu_print_ccpmin ; 停止中は必ず cc/min 表示 00184 00D5 3069 00185 movlw FUEL_FC_FLOW_MAX ^ 0ffh 00D6 072F 00186 addwf fuel_flow,0 00D7 1803 00187 btfsc STATUS,C 00D8 2907 00188 goto fu_print_fc ; 走行中で fuel cut と判断されたら f-c 00189 00D9 28F3 00190 goto fu_print_ccpmin ; 通常時? は cc/min 表示 00191 00192 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 00193 ; 瞬間燃費表示 (000km/l or stp or f-c) 00DA 00194 fu_print 00DA 305F 00195 movlw SPEED_FLOW_MAX ^ 0ffh 00DB 0728 00196 addwf speed_flow,0 00DC 1803 00197 btfsc STATUS,C 00DD 2912 00198 goto fu_print_stop ; 0km/h と判断されたら 00199 00DE 3069 00200 movlw FUEL_FC_FLOW_MAX ^ 0ffh 00DF 072F 00201 addwf fuel_flow,0 MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 12 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00E0 1803 00202 btfsc STATUS,C 00E1 2907 00203 goto fu_print_fc ; fuel cut と判断されたら 00204 00205 ; 瞬間燃費計算 00206 00E2 082E 00207 movf fuel_tm+1,W 00E3 00B7 00208 movwf src1+1 00E4 082D 00209 movf fuel_tm+0,W 00E5 00B6 00210 movwf src1+0 00E6 0827 00211 movf speed_tm+1,W 00E7 00BA 00212 movwf src2+1 00E8 0826 00213 movf speed_tm+0,W 00E9 00B9 00214 movwf src2+0 00EA 22A8 00215 call div16 00216 00EB 083D 00217 movf result+1,W 00EC 00B7 00218 movwf src1+1 00ED 083C 00219 movf result+0,W 00EE 00B6 00220 movwf src1+0 00EF 2267 00221 call bin16tobcd 00222 00F0 1042 00223 bcf flag,0 00F1 2228 00224 call print_dec3 00225 ;movlw 'k' 00226 ;call write_lcd_data 00227 ;movlw 'm' 00228 ;call write_lcd_data 00229 ;movlw '/' 00230 ;call write_lcd_data 00231 ;movlw 'l' 00232 ;call write_lcd_data 00F2 2918 00233 goto fu_print_e 00F3 00234 fu_print_ccpmin 00235 ; cc/min 表示 00F3 3005 00236 movlw FUELFACT_H ;係数 00F4 00B8 00237 movwf src1+2 00F5 309D 00238 movlw FUELFACT_M ;係数 00F6 00B7 00239 movwf src1+1 00F7 3040 00240 movlw FUELFACT_L ;係数 00F8 00B6 00241 movwf src1+0 00242 00243 ;movlw 0 00F9 01BB 00244 clrf src2+2 00FA 082E 00245 movf fuel_tm+1,W 00FB 00BA 00246 movwf src2+1 00FC 082D 00247 movf fuel_tm+0,W 00FD 00B9 00248 movwf src2+0 00FE 22EB 00249 call div24 00250 00FF 083D 00251 movf result+1,W 0100 00B7 00252 movwf src1+1 0101 083C 00253 movf result+0,W 0102 00B6 00254 movwf src1+0 MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 13 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0103 2267 00255 call bin16tobcd 00256 0104 1042 00257 bcf flag,0 0105 2228 00258 call print_dec3 00259 00260 ;movlw 'c' 00261 ;call write_lcd_data 00262 ;movlw 'c' 00263 ;call write_lcd_data 00264 ;movlw '/' 00265 ;call write_lcd_data 00266 ;movlw 'm' 00267 ;call write_lcd_data 0106 2918 00268 goto fu_print_e 0107 00269 fu_print_fc 0107 305F 00270 movlw SPEED_FLOW_MAX ^ 0ffh 0108 0728 00271 addwf speed_flow,0 0109 1803 00272 btfsc STATUS,C 010A 2912 00273 goto fu_print_stop ; 0km/h と判断されたら 00274 00275 ; f-c 表示 010B 3066 00276 movlw 'f' 010C 2233 00277 call write_lcd_data 010D 302D 00278 movlw '-' 010E 2233 00279 call write_lcd_data 010F 3063 00280 movlw 'c' 0110 2233 00281 call write_lcd_data 00282 ;movlw ' ' 00283 ;call write_lcd_data 00284 ;call write_lcd_data 00285 ;call write_lcd_data 00286 ;call write_lcd_data 0111 2918 00287 goto fu_print_e 0112 00288 fu_print_stop 00289 ; stop 表示 0112 302D 00290 movlw '-' 0113 2233 00291 call write_lcd_data 0114 302D 00292 movlw '-' 0115 2233 00293 call write_lcd_data 00294 ;movlw '-' 00295 ;call write_lcd_data 0116 302D 00296 movlw '-' 0117 2233 00297 call write_lcd_data 00298 ;movlw ' ' 00299 ;call write_lcd_data 00300 ;call write_lcd_data 00301 ;call write_lcd_data 00302 ;goto fu_print_e 0118 00303 fu_print_e 0118 0008 00304 return 00305 00306 ;■瞬間系 <-- 00307 MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 14 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00308 00309 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 00310 ; 区間燃費表示 0119 00311 fut_print 00312 ; 区間燃費計算 0119 118B 00313 bcf INTCON,RBIE ; rb割込禁止 011A 0811 00314 movf odometer_cn+2,W 011B 00BB 00315 movwf src2+2 011C 0810 00316 movf odometer_cn+1,W 011D 00BA 00317 movwf src2+1 011E 080F 00318 movf odometer_cn+0,W 011F 00B9 00319 movwf src2+0 0120 158B 00320 bsf INTCON,RBIE ; rb割込許可 0121 2288 00321 call mul10_24 00322 0122 118B 00323 bcf INTCON,RBIE ; rb割込禁止 0123 0814 00324 movf fuel_cn+2,W 0124 00BB 00325 movwf src2+2 0125 0813 00326 movf fuel_cn+1,W 0126 00BA 00327 movwf src2+1 0127 0812 00328 movf fuel_cn+0,W 0128 00B9 00329 movwf src2+0 0129 158B 00330 bsf INTCON,RBIE ; rb割込許可 012A 22EB 00331 call div24 00332 00333 ; 区間燃費表示 012B 083D 00334 movf result+1,W 012C 00B7 00335 movwf src1+1 012D 083C 00336 movf result+0,W 012E 00B6 00337 movwf src1+0 012F 2267 00338 call bin16tobcd 00339 0130 1442 00340 bsf flag,0 0131 2228 00341 call print_dec3 00342 ;movlw 'k' 00343 ;call write_lcd_data 00344 ;movlw 'm' 00345 ;call write_lcd_data 00346 ;movlw '/' 00347 ;call write_lcd_data 00348 ;movlw 'l' 00349 ;call write_lcd_data 0132 0008 00350 return 00351 00352 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 00353 ; 区間燃費(信号間)表示 0133 00354 futs_print 00355 ; 区間燃費計算 0133 118B 00356 bcf INTCON,RBIE ; rb割込禁止 0134 081E 00357 movf odometer_cn2+2,W 0135 00BB 00358 movwf src2+2 0136 081D 00359 movf odometer_cn2+1,W 0137 00BA 00360 movwf src2+1 MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 15 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0138 081C 00361 movf odometer_cn2+0,W 0139 00B9 00362 movwf src2+0 013A 158B 00363 bsf INTCON,RBIE ; rb割込許可 013B 2288 00364 call mul10_24 00365 013C 118B 00366 bcf INTCON,RBIE ; rb割込禁止 013D 0821 00367 movf fuel_cn2+2,W 013E 00BB 00368 movwf src2+2 013F 0820 00369 movf fuel_cn2+1,W 0140 00BA 00370 movwf src2+1 0141 081F 00371 movf fuel_cn2+0,W 0142 00B9 00372 movwf src2+0 0143 158B 00373 bsf INTCON,RBIE ; rb割込許可 0144 22EB 00374 call div24 00375 00376 ; 区間燃費表示 0145 083D 00377 movf result+1,W 0146 00B7 00378 movwf src1+1 0147 083C 00379 movf result+0,W 0148 00B6 00380 movwf src1+0 0149 2267 00381 call bin16tobcd 00382 014A 1442 00383 bsf flag,0 014B 2228 00384 call print_dec3 00385 ;movlw 'k' 00386 ;call write_lcd_data 00387 ;movlw 'm' 00388 ;call write_lcd_data 00389 ;movlw '/' 00390 ;call write_lcd_data 00391 ;movlw 'l' 00392 ;call write_lcd_data 014C 0008 00393 return 00394 00395 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 00396 ; 時間表示 014D 00397 time_print 014D 118B 00398 bcf INTCON,RBIE ; rb割込禁止 00399 014E 080E 00400 movf timer_cn+2,W 014F 00B8 00401 movwf src1+2 0150 080D 00402 movf timer_cn+1,W 0151 00B7 00403 movwf src1+1 0152 080C 00404 movf timer_cn+0,W 0153 00B6 00405 movwf src1+0 00406 0154 158B 00407 bsf INTCON,RBIE ; rb割込許可 00408 0155 295E 00409 goto time_print_1 00410 00411 ;;;;;;;;;;;;;;;;;;;;;; 00412 ; 時間(信号間)表示 0156 00413 times_print MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 16 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0156 118B 00414 bcf INTCON,RBIE ; rb割込禁止 00415 0157 081B 00416 movf timer_cn2+2,W 0158 00B8 00417 movwf src1+2 0159 081A 00418 movf timer_cn2+1,W 015A 00B7 00419 movwf src1+1 015B 0819 00420 movf timer_cn2+0,W 015C 00B6 00421 movwf src1+0 00422 015D 158B 00423 bsf INTCON,RBIE ; rb割込許可 00424 00425 ;goto time_print_1 00426 015E 00427 time_print_1 00428 00429 ;movlw 0 015E 01BB 00430 clrf src2+2 015F 300E 00431 movlw TIMMINFACT_H ; 係数 0160 00BA 00432 movwf src2+1 0161 304E 00433 movlw TIMMINFACT_L ; 係数 0162 00B9 00434 movwf src2+0 0163 22EB 00435 call div24 00436 0164 083D 00437 movf result+1,W 0165 00B7 00438 movwf src1+1 0166 083C 00439 movf result+0,W 0167 00B6 00440 movwf src1+0 0168 2267 00441 call bin16tobcd 00442 0169 1042 00443 bcf flag,0 016A 2228 00444 call print_dec3 00445 016B 303A 00446 movlw ':' 016C 2233 00447 call write_lcd_data 00448 00449 ; 余りから秒を計算! 016D 0840 00450 movf mod+1,W 016E 00B8 00451 movwf src1+2 016F 083F 00452 movf mod+0,W 0170 00B7 00453 movwf src1+1 00454 ;movlw 0 0171 01B6 00455 clrf src1+0 00456 00457 ;movlw 0 0172 01BB 00458 clrf src2+2 0173 303D 00459 movlw TIMSECFACT_H ; 係数 0174 00BA 00460 movwf src2+1 0175 3009 00461 movlw TIMSECFACT_L ; 係数 0176 00B9 00462 movwf src2+0 00463 0177 22EB 00464 call div24 00465 0178 083D 00466 movf result+1,W MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 17 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0179 00B7 00467 movwf src1+1 017A 083C 00468 movf result+0,W 017B 00B6 00469 movwf src1+0 017C 2267 00470 call bin16tobcd 00471 017D 1042 00472 bcf flag,0 017E 222A 00473 call print_dec2 ; 秒2桁表示 00474 017F 0008 00475 return 00476 00477 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 00478 ; 走行距離表示 (0000.00km) 0180 00479 odd_print 0180 118B 00480 bcf INTCON,RBIE ; rb割込禁止 00481 0181 0811 00482 movf odometer_cn+2,W 0182 00B8 00483 movwf src1+2 0183 0810 00484 movf odometer_cn+1,W 0184 00B7 00485 movwf src1+1 0185 080F 00486 movf odometer_cn+0,W 0186 00B6 00487 movwf src1+0 00488 0187 158B 00489 bsf INTCON,RBIE ; rb割込許可 00490 0188 2991 00491 goto odd_print_1 00492 00493 ;;;;;;;;;;;;;;;;;;;;;; 00494 ; 走行距離(信号間)表示 (0000.00km) 0189 00495 odds_print 0189 118B 00496 bcf INTCON,RBIE ; rb割込禁止 00497 018A 081E 00498 movf odometer_cn2+2,W 018B 00B8 00499 movwf src1+2 018C 081D 00500 movf odometer_cn2+1,W 018D 00B7 00501 movwf src1+1 018E 081C 00502 movf odometer_cn2+0,W 018F 00B6 00503 movwf src1+0 00504 0190 158B 00505 bsf INTCON,RBIE ; rb割込許可 00506 00507 ;goto odd_print_1 00508 0191 00509 odd_print_1 00510 ;movlw 0 0191 01BB 00511 clrf src2+2 0192 3009 00512 movlw 0x9 ;637*4 = 2548 = 0x9f4 0193 00BA 00513 movwf src2+1 0194 30F4 00514 movlw 0xf4 ;637*4 = 2548 = 0x9f4 0195 00B9 00515 movwf src2+0 00516 0196 22EB 00517 call div24 00518 0197 083D 00519 movf result+1,W MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 18 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0198 00B7 00520 movwf src1+1 0199 083C 00521 movf result+0,W 019A 00B6 00522 movwf src1+0 019B 2267 00523 call bin16tobcd 00524 019C 1042 00525 bcf flag,0 019D 2228 00526 call print_dec3 ; まずは整数部3桁 00527 019E 302E 00528 movlw '.' 019F 2233 00529 call write_lcd_data 00530 00531 ; 余りから小数2桁を計算! 01A0 0840 00532 movf mod+1,W 01A1 00B8 00533 movwf src1+2 01A2 083F 00534 movf mod+0,W 01A3 00B7 00535 movwf src1+1 00536 ;movlw 0 01A4 01B6 00537 clrf src1+0 00538 00539 ;movlw 0 01A5 01BB 00540 clrf src2+2 01A6 3019 00541 movlw 0x19 ;637*4*256/100=0x197b 01A7 00BA 00542 movwf src2+1 01A8 307B 00543 movlw 0x7b ;637*4*256/100=0x197b 01A9 00B9 00544 movwf src2+0 00545 01AA 22EB 00546 call div24 00547 01AB 083D 00548 movf result+1,W 01AC 00B7 00549 movwf src1+1 01AD 083C 00550 movf result+0,W 01AE 00B6 00551 movwf src1+0 01AF 2267 00552 call bin16tobcd 00553 01B0 1042 00554 bcf flag,0 01B1 222A 00555 call print_dec2 ; 小数2桁表示 00556 00557 ;movlw 'k' 00558 ;call write_lcd_data 00559 ;movlw 'm' 00560 ;call write_lcd_data 00561 01B2 0008 00562 return 00563 00564 00565 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 00566 ; 平均速度表示 (000km) 00567 ; 00568 ; 距離パルス数 ÷ 時間 × 86.235 = 平均速度 00569 ; 86.23491464=1/(0.637*4)*3600/64*1000/256 01B3 00570 avgsp_print 01B3 118B 00571 bcf INTCON,RBIE ; rb割込禁止 00572 MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 19 LOC OBJECT CODE LINE SOURCE TEXT VALUE 01B4 080E 00573 movf timer_cn+2,W 01B5 00B8 00574 movwf src1+2 01B6 080D 00575 movf timer_cn+1,W 01B7 00B7 00576 movwf src1+1 01B8 080C 00577 movf timer_cn+0,W 01B9 00B6 00578 movwf src1+0 00579 01BA 158B 00580 bsf INTCON,RBIE ; rb割込許可 00581 01BB 01BB 00582 clrf src2+2 01BC 01BA 00583 clrf src2+1 01BD 3056 00584 movlw D'86' 01BE 00B9 00585 movwf src2+0 00586 01BF 22EB 00587 call div24 00588 01C0 083E 00589 movf result+2,W 01C1 00BB 00590 movwf src2+2 01C2 083D 00591 movf result+1,W 01C3 00BA 00592 movwf src2+1 01C4 083C 00593 movf result+0,W 01C5 00B9 00594 movwf src2+0 00595 01C6 118B 00596 bcf INTCON,RBIE ; rb割込禁止 00597 01C7 0811 00598 movf odometer_cn+2,W 01C8 00B8 00599 movwf src1+2 01C9 0810 00600 movf odometer_cn+1,W 01CA 00B7 00601 movwf src1+1 01CB 080F 00602 movf odometer_cn+0,W 01CC 00B6 00603 movwf src1+0 00604 01CD 158B 00605 bsf INTCON,RBIE ; rb割込許可 00606 01CE 22EB 00607 call div24 01CF 083D 00608 movf result+1,W 01D0 00B7 00609 movwf src1+1 01D1 083C 00610 movf result+0,W 01D2 00B6 00611 movwf src1+0 00612 01D3 2267 00613 call bin16tobcd 00614 01D4 1042 00615 bcf flag,0 01D5 2228 00616 call print_dec3 00617 01D6 302E 00618 movlw '.' 01D7 2233 00619 call write_lcd_data 01D8 3030 00620 movlw '0' 01D9 2233 00621 call write_lcd_data ; ダミー 00622 01DA 0008 00623 return 00624 00625 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 20 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00626 ; 平均速度表示 (000km) 00627 ; 00628 ; 距離パルス数 ÷ 時間 × 86.235 = 平均速度 00629 ; 86.23491464=1/(0.637*4)*3600/64*1000/256 01DB 00630 avgsps_print 01DB 118B 00631 bcf INTCON,RBIE ; rb割込禁止 00632 01DC 081B 00633 movf timer_cn2+2,W 01DD 00B8 00634 movwf src1+2 01DE 081A 00635 movf timer_cn2+1,W 01DF 00B7 00636 movwf src1+1 01E0 0819 00637 movf timer_cn2+0,W 01E1 00B6 00638 movwf src1+0 00639 01E2 158B 00640 bsf INTCON,RBIE ; rb割込許可 00641 01E3 01BB 00642 clrf src2+2 01E4 01BA 00643 clrf src2+1 01E5 3056 00644 movlw D'86' 01E6 00B9 00645 movwf src2+0 00646 01E7 22EB 00647 call div24 00648 01E8 083E 00649 movf result+2,W 01E9 00BB 00650 movwf src2+2 01EA 083D 00651 movf result+1,W 01EB 00BA 00652 movwf src2+1 01EC 083C 00653 movf result+0,W 01ED 00B9 00654 movwf src2+0 00655 01EE 118B 00656 bcf INTCON,RBIE ; rb割込禁止 00657 01EF 081E 00658 movf odometer_cn2+2,W 01F0 00B8 00659 movwf src1+2 01F1 081D 00660 movf odometer_cn2+1,W 01F2 00B7 00661 movwf src1+1 01F3 081C 00662 movf odometer_cn2+0,W 01F4 00B6 00663 movwf src1+0 00664 01F5 158B 00665 bsf INTCON,RBIE ; rb割込許可 00666 01F6 22EB 00667 call div24 01F7 083D 00668 movf result+1,W 01F8 00B7 00669 movwf src1+1 01F9 083C 00670 movf result+0,W 01FA 00B6 00671 movwf src1+0 00672 01FB 2267 00673 call bin16tobcd 00674 01FC 1042 00675 bcf flag,0 01FD 2228 00676 call print_dec3 00677 01FE 302E 00678 movlw '.' MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 01FF 2233 00679 call write_lcd_data 0200 3030 00680 movlw '0' 0201 2233 00681 call write_lcd_data ; ダミー 00682 0202 0008 00683 return 00684 00685 ;■ デバッグ系 --> 00686 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 00687 ; 車速パルスカウント表示 0203 00688 spcout_print 00689 ; 上位.中位下位(255.65535) と表示します 00690 ; デバッグ用なので手抜き。 0203 0811 00691 movf odometer_cn+2,W 0204 00B6 00692 movwf src1+0 00693 ;movlw 0 0205 01B7 00694 clrf src1+1 0206 2267 00695 call bin16tobcd 0207 1042 00696 bcf flag,0 0208 2228 00697 call print_dec3 00698 0209 302E 00699 movlw '.' 020A 2233 00700 call write_lcd_data 00701 020B 0810 00702 movf odometer_cn+1,W 020C 00B7 00703 movwf src1+1 020D 080F 00704 movf odometer_cn+0,W 020E 00B6 00705 movwf src1+0 020F 2267 00706 call bin16tobcd 0210 1042 00707 bcf flag,0 0211 2224 00708 call print_dec5 00709 0212 0008 00710 return 00711 00712 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 00713 ; 燃料パルスカウント表示 0213 00714 fuelcout_print 00715 ; 上位.中位下位(255.65535) と表示します 00716 ; デバッグ用なので手抜き。 0213 0814 00717 movf fuel_cn+2,W 0214 00B6 00718 movwf src1+0 0215 3000 00719 movlw 0 0216 00B7 00720 movwf src1+1 0217 2267 00721 call bin16tobcd 0218 1042 00722 bcf flag,0 0219 2228 00723 call print_dec3 00724 021A 302E 00725 movlw '.' 021B 2233 00726 call write_lcd_data 00727 021C 0813 00728 movf fuel_cn+1,W 021D 00B7 00729 movwf src1+1 021E 0812 00730 movf fuel_cn+0,W 021F 00B6 00731 movwf src1+0 MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 22 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0220 2267 00732 call bin16tobcd 0221 1042 00733 bcf flag,0 0222 2224 00734 call print_dec5 00735 0223 0008 00736 return 00737 ;■ デバッグ系 <-- 00078 include "lcd.asm" 00001 ; ------------------------------------------------------------------- 00002 ; dec をLCDに表示 00003 ; 呼び出しアドレスにより、適当な桁から表示できま。 00004 ; flag,0 を立てておくと、固定小数点(10倍)だとして表示します。 00005 ; ------------------------------------------------------------------- 0224 00006 print_dec5 0224 0843 00007 movf dec+0,W 0225 2233 00008 call write_lcd_data 0226 00009 print_dec4 0226 0844 00010 movf dec+1,W 0227 2233 00011 call write_lcd_data 0228 00012 print_dec3 0228 0845 00013 movf dec+2,W 0229 2233 00014 call write_lcd_data 022A 00015 print_dec2 022A 0846 00016 movf dec+3,W 022B 2233 00017 call write_lcd_data 00018 00019 ; 小数点表示 022C 1C42 00020 btfss flag,0 022D 2A30 00021 goto print_dec1 022E 302E 00022 movlw '.' 022F 2233 00023 call write_lcd_data 0230 00024 print_dec1 0230 0847 00025 movf dec+4,W 0231 2233 00026 call write_lcd_data 00027 0232 0008 00028 return 00029 00030 ; ------------------------------------------------------------------- 00031 ; 液晶ライト 00032 ; IN W キャラクタ or コマンド 00033 ; 破壊 lcd_data_temp 00034 ; ------------------------------------------------------------------- 0233 00035 write_lcd_data 0233 00B5 00036 movwf lcd_data_temp 0234 0E35 00037 swapf lcd_data_temp,W ; まず上位データを 0235 223A 00038 call write_lcd_raw ; 出力 00039 0236 0835 00040 movf lcd_data_temp,W ; 次に下位データを 0237 223A 00041 call write_lcd_raw ; 出力 0238 0835 00042 movf lcd_data_temp,W ; 連続表示に備えて。 0239 0008 00043 return 00044 00045 ; ------------------------------------------------------------------- 00046 ; 液晶ライト(生) MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 23 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00047 ; IN W キャラクタ or コマンド 00048 ; 破壊 W 00049 ; ------------------------------------------------------------------- 023A 00050 write_lcd_raw 00051 ;bsf LED_COM ; LED コモン 消灯 (「ますく」で代用) 023A 390F 00052 andlw B'00001111' ; ますく 023B 3810 00053 iorlw B'00010000' ; ますく 023C 0085 00054 movwf PORTA ; RAポートへ出力 023D 0000 00055 nop ; ちょこっとwait 023E 1506 00056 bsf E ; Eピンを'H' 023F 0000 00057 nop ; ちょこっとLOVE 0240 1106 00058 bcf E ; Eピンを'L' 0241 0000 00059 nop ; ぷっち以下略 00060 0242 0832 00061 movf ra_save,W ; RA の出力を元に戻す 0243 0085 00062 movwf PORTA 00063 0244 3028 00064 movlw D'40' ; wait 0245 00C8 00065 movwf calc_cn 00066 0246 1205 00067 bcf LED_COM ; LED コモン 点灯 00068 0247 2355 00069 call wait_us 00070 0248 0008 00071 return 00072 00073 00074 ; ------------------------------------------------------------------- 00075 ; 液晶初期化 00076 ; ------------------------------------------------------------------- 0249 00077 init_lcd 0249 300F 00078 movlw D'15' 024A 00C8 00079 movwf calc_cn ; wait 15ms 024B 2348 00080 call wait_ms 00081 024C 1086 00082 bcf RS ; RS='L' 024D 3003 00083 movlw B'00000011' 024E 223A 00084 call write_lcd_raw 024F 3005 00085 movlw D'5' 0250 00C8 00086 movwf calc_cn ; wait 4.1ms 0251 2348 00087 call wait_ms 00088 0252 3003 00089 movlw B'00000011' 0253 223A 00090 call write_lcd_raw 0254 3064 00091 movlw D'100' 0255 00C8 00092 movwf calc_cn ; wait 100us 0256 2355 00093 call wait_us 00094 0257 3000 00095 movlw B'00000000' 0258 223A 00096 call write_lcd_raw 00097 0259 3002 00098 movlw B'00000010' 025A 223A 00099 call write_lcd_raw ; 0 0 0010 (4bit) MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 24 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00100 025B 3028 00101 movlw B'00101000' ; duty,font set9 025C 2233 00102 call write_lcd_data 00103 025D 3001 00104 movlw B'00000001' ; クリアコマンド 025E 2233 00105 call write_lcd_data 025F 3002 00106 movlw D'2' 0260 00C8 00107 movwf calc_cn 0261 2348 00108 call wait_ms 00109 0262 3006 00110 movlw B'00000110' ; entry mode set 0263 2233 00111 call write_lcd_data 00112 0264 300C 00113 movlw B'00001100' ; display on,cursor off 0265 2233 00114 call write_lcd_data 00115 0266 0008 00116 return 00079 include "math.asm" 00001 00002 ; ------------------------------------------------------------------- 00003 ; 16ビットバイナリ→10進変換サブルーチン 00004 ; 1997 by M.Ochiai 00005 ; ------------------------------------------------------------------- 00006 ; in src1 16ビットデータ 00007 ; (src1+1:src1+0) 00008 ; out dec 00009 ; (dec+4:dec+3:...:dec+0) 00010 ; dec+0が最下位桁でdec+4が最上位桁です。 00011 ; 00012 ; 変換後src1は破壊されます。(必要なら、コールする前に待避して下さい) 00013 ; 00014 ; sample: 00015 ; src1 = 00:00:04:D2 h 00016 ; dec = 00:00:00:00:00:00:01:02:03:04 00017 0267 00018 bin16tobcd 0267 3048 00019 movlw dec_top ; 格納場所初期値 0268 0084 00020 movwf FSR 0269 2275 00021 call devideby10 ; 最下位変換 026A 2275 00022 call devideby10 026B 2275 00023 call devideby10 026C 2275 00024 call devideby10 026D 2275 00025 call devideby10 ; 最上位変換 00026 026E 3030 00027 movlw '0' 026F 07C3 00028 addwf dec+0,F 0270 07C4 00029 addwf dec+1,F 0271 07C5 00030 addwf dec+2,F 0272 07C6 00031 addwf dec+3,F 0273 07C7 00032 addwf dec+4,F 00033 0274 0008 00034 return 00035 MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 25 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00036 ; 00037 ; ÷10サブルーチン 00038 ; 10で除算します 00039 ; 0275 00040 devideby10 0275 3010 00041 movlw D'16' ; 16ビットくり返し 0276 00C8 00042 movwf calc_cn 00043 0277 01B8 00044 clrf src1+2 0278 00045 devideby10_0 0278 1003 00046 bcf STATUS,C 0279 0DB6 00047 rlf src1+0,F 027A 0DB7 00048 rlf src1+1,F 027B 0DB8 00049 rlf src1+2,F 00050 027C 300A 00051 movlw D'10' 027D 0238 00052 subwf src1+2,W 027E 1803 00053 btfsc STATUS,C 027F 00B8 00054 movwf src1+2 0280 1803 00055 btfsc STATUS,C 0281 0AB6 00056 incf src1+0,F 00057 0282 0BC8 00058 decfsz calc_cn,F 0283 2A78 00059 goto devideby10_0 00060 0284 0384 00061 decf FSR,F 0285 0838 00062 movf src1+2,W ; 余り 0286 0080 00063 movwf INDF 0287 0008 00064 return 00065 00066 ;--------------------------------------------------------------------- 0288 00067 mul10_24 00068 ; 24bit 10倍ルーチン 00069 ; 呼び出し側の都合により、src2 が入力で、src1 が出力です。 00070 0288 083B 00071 movf src2+2,W 0289 00B8 00072 movwf src1+2 028A 083A 00073 movf src2+1,W 028B 00B7 00074 movwf src1+1 028C 0839 00075 movf src2+0,W ; src2 => src1 028D 00B6 00076 movwf src1+0 00077 028E 1003 00078 bcf STATUS,C ; src1 を 2倍 028F 0DB6 00079 rlf src1+0,F 0290 0DB7 00080 rlf src1+1,F 0291 0DB8 00081 rlf src1+2,F 00082 0292 1003 00083 bcf STATUS,C ; src1 を さらに2倍 で4倍 0293 0DB6 00084 rlf src1+0,F 0294 0DB7 00085 rlf src1+1,F 0295 0DB8 00086 rlf src1+2,F 00087 00088 ; src1 に src2 を足して 5倍 MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 26 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0296 0839 00089 movf src2+0,W ;下位バイトの加算 0297 07B6 00090 addwf src1+0,F 0298 3001 00091 movlw 1 0299 1803 00092 btfsc STATUS,C 029A 07B7 00093 addwf src1+1,F 029B 1803 00094 btfsc STATUS,C 029C 07B8 00095 addwf src1+2,F 00096 029D 083A 00097 movf src2+1,W ;中位バイトの加算 029E 07B7 00098 addwf src1+1,F 029F 1803 00099 btfsc STATUS,C 02A0 0AB8 00100 incf src1+2,F 00101 02A1 083B 00102 movf src2+2,W ;上位バイトの加算 02A2 07B8 00103 addwf src1+2,F 00104 02A3 1003 00105 bcf STATUS,C ; src1 を さらに2倍 で10倍 02A4 0DB6 00106 rlf src1+0,F 02A5 0DB7 00107 rlf src1+1,F 02A6 0DB8 00108 rlf src1+2,F 00109 02A7 0008 00110 return 00111 00112 ;********************************************************************* 00113 ;--------------------------------------------------------------------- 00114 02A8 00115 div16 ;16ビットの割り算ルーチン 00116 ;参考 http://www.sikasenbey.or.jp/~enaga/pic/pic.html 00117 00118 ;-------------------- div16 での使用変数 00119 00120 ;src1 2 ;割られる数 (終了時には0になって戻る) 00121 ;src2 2 ;割る数 (変化せず戻る) 00122 ;result 2 ;答え    (答えが返る) 00123 ;mod 2 ;余り    (余りが返る、内部ワークにも使用) 00124 ;calc_cn 1 ;内部ループ用 00125 ;calc_cn2 1 ;内部ループ用 00126 ;diverr 1 ;割る数が0であった場合に1をセットして戻る 00127 00128 ;-------------------- 主ルーチン 00129 02A8 3010 00130 movlw D'16' 02A9 00C8 00131 movwf calc_cn 02AA 0839 00132 movf src2+0,W ;割る数下位をワークにコピー 02AB 00BF 00133 movwf mod+0 02AC 083A 00134 movf src2+1,W ;割る数上位をワークにコピー 02AD 00C0 00135 movwf mod+1 02AE 01BC 00136 clrf result+0 ;答え用変数のクリア 02AF 01BD 00137 clrf result+1 02B0 1003 00138 bcf STATUS,C 02B1 00139 di1601 02B1 0DBF 00140 rlf mod+0,F ;左シフトする 02B2 0DC0 00141 rlf mod+1,F MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 27 LOC OBJECT CODE LINE SOURCE TEXT VALUE 02B3 1803 00142 btfsc STATUS,C ;キャリフラグを見る 02B4 2ABB 00143 goto di1602 ;割る数の上位ビット位置検索 02B5 0BC8 00144 decfsz calc_cn,F 02B6 2AB1 00145 goto di1601 02B7 15C2 00146 bsf flag,3 ;割る数が0である。エラーコードをセット 02B8 01BF 00147 clrf mod+0 ;ワーク用変数のクリア 02B9 01C0 00148 clrf mod+1 02BA 0008 00149 return ;戻る 02BB 00150 di1602 02BB 01BF 00151 clrf mod+0 ;ワーク用変数のクリア 02BC 01C0 00152 clrf mod+1 02BD 3010 00153 movlw D'16' 02BE 00C9 00154 movwf calc_cn2 02BF 0848 00155 movf calc_cn,W 02C0 02C9 00156 subwf calc_cn2,F ;残り、実ループの回数 02C1 00157 di1603 02C1 1003 00158 bcf STATUS,C ;キャリフラグを0に 02C2 0DB6 00159 rlf src1+0,F 02C3 0DB7 00160 rlf src1+1,F 02C4 0DBF 00161 rlf mod+0,F 02C5 0DC0 00162 rlf mod+1,F 02C6 0BC8 00163 decfsz calc_cn,F ;割られる数を初期位置までシフト 02C7 2AC1 00164 goto di1603 02C8 00165 di1604 ;現位置での減算が可能かチェック 02C8 083A 00166 movf src2+1,W 02C9 0240 00167 subwf mod+1,W 02CA 1C03 00168 btfss STATUS,C 02CB 2ADC 00169 goto di1606 02CC 0840 00170 movf mod+1,W 02CD 023A 00171 subwf src2+1,W 02CE 1C03 00172 btfss STATUS,C 02CF 2AD4 00173 goto di1605 02D0 0839 00174 movf src2+0,W 02D1 023F 00175 subwf mod+0,W 02D2 1C03 00176 btfss STATUS,C 02D3 2ADC 00177 goto di1606 02D4 00178 di1605 02D4 0839 00179 movf src2+0,W 02D5 02BF 00180 subwf mod+0,F ;ワークから下位を引く 02D6 1C03 00181 btfss STATUS,C ;キャリフラグが 1(正)なら次をスキップ 02D7 03C0 00182 decf mod+1,F ;上位 -1 02D8 083A 00183 movf src2+1,W 02D9 02C0 00184 subwf mod+1,F ;ワークから上位を引く 02DA 1403 00185 bsf STATUS,C ;キャリフラグを1に 02DB 2ADD 00186 goto di1607 02DC 00187 di1606 02DC 1003 00188 bcf STATUS,C ;キャリフラグを0に 02DD 00189 di1607 02DD 0DBC 00190 rlf result+0,F ;キャリフラグの内容を答えにシフト 02DE 0DBD 00191 rlf result+1,F 02DF 08C9 00192 movf calc_cn2,F ;calc_cn2 が 0 か検査 02E0 1903 00193 btfsc STATUS,Z 02E1 2AE9 00194 goto di1608 ;最下位まで処理したなら終了 MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 28 LOC OBJECT CODE LINE SOURCE TEXT VALUE 02E2 03C9 00195 decf calc_cn2,F ;ビット位置を1つ下げる(右へ) 02E3 1003 00196 bcf STATUS,C ;キャリフラグを0に 02E4 0DB6 00197 rlf src1+0,F ;ワークへ1ビット左シフト 02E5 0DB7 00198 rlf src1+1,F 02E6 0DBF 00199 rlf mod+0,F 02E7 0DC0 00200 rlf mod+1,F 02E8 2AC8 00201 goto di1604 02E9 00202 di1608 02E9 11C2 00203 bcf flag,3 ;正常終了 00204 02EA 0008 00205 return 00206 00207 ;--------------------------------------------------------------------- 00208 00209 ;********************************************************************* 00210 ;--------------------------------------------------------------------- 00211 02EB 00212 div24 ;24÷24ビット=24ビットの割り算ルーチン 00213 ;秋月 PA (PICアセンブラ) 用 00214 ;src1+3 ÷ src1+3 = 結果 result+3 余り mod+3 00215 ;演算後、式の左項(割られる数)は壊れる 00216 ;割る数が0(エラー)なら diverr に1を代入して戻る 00217 ;エラーの場合、引き数は変化しない 00218 ;正常終了の場合は diverr=0 で戻る 00219 ;24ビットで扱える数の最大は 16777216 (1677万7216) 00220 00221 ;-------------------- div24 での使用変数 00222 00223 ;src1 ds 3 ;割られる数 (終了時には0になって戻る) 00224 ;src2 ds 3 ;割る数 (変化せず戻る) 00225 ;result ds 3 ;答え    (答えが返る) 00226 ;mod ds 3 ;余り    (余りが返る、内部ワークにも使用) 00227 ;calc_cn ds 1 ;内部ループ用 00228 ;calc_cn2 ds 1 ;内部ループ用 00229 ;diverr ds 1 ;割る数が0であった場合に1をセットして戻る 00230 00231 ;-------------------- 主ルーチン 00232 02EB 3018 00233 movlw D'24' 02EC 00C8 00234 movwf calc_cn 02ED 0839 00235 movf src2+0,W ;割る数をワークにコピー 02EE 00BF 00236 movwf mod+0 02EF 083A 00237 movf src2+1,W 02F0 00C0 00238 movwf mod+1 02F1 083B 00239 movf src2+2,W 02F2 00C1 00240 movwf mod+2 02F3 1003 00241 bcf STATUS,C 02F4 01BC 00242 clrf result+0 ;答えのクリア 02F5 01BD 00243 clrf result+1 02F6 01BE 00244 clrf result+2 02F7 00245 di2401 02F7 0DBF 00246 rlf mod+0,F ;左シフトする 02F8 0DC0 00247 rlf mod+1,F MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 29 LOC OBJECT CODE LINE SOURCE TEXT VALUE 02F9 0DC1 00248 rlf mod+2,F 02FA 1803 00249 btfsc STATUS,C 02FB 2B03 00250 goto di2402 ;割る数の上位ビットが見付かったなら di3202 へ 02FC 0BC8 00251 decfsz calc_cn,F 02FD 2AF7 00252 goto di2401 02FE 15C2 00253 bsf flag,3 ;割る数が0である、エラーコードをセット 02FF 01BF 00254 clrf mod+0 ;ワークのクリア(ワークには余りが残る) 0300 01C0 00255 clrf mod+1 0301 01C1 00256 clrf mod+2 0302 0008 00257 return ;戻る 0303 00258 di2402 0303 01BF 00259 clrf mod+0 ;ワークのクリア(ワークには余りが残る) 0304 01C0 00260 clrf mod+1 0305 01C1 00261 clrf mod+2 0306 3018 00262 movlw D'24' 0307 00C9 00263 movwf calc_cn2 0308 0848 00264 movf calc_cn,W 0309 02C9 00265 subwf calc_cn2,F ;残り、実ループの回数 030A 00266 di2403 030A 1003 00267 bcf STATUS,C ;キャリフラグを0に 030B 0DB6 00268 rlf src1+0,F ;有効位置までシフトする 030C 0DB7 00269 rlf src1+1,F 030D 0DB8 00270 rlf src1+2,F 030E 0DBF 00271 rlf mod+0,F ;押し出されたビットをワークに 030F 0DC0 00272 rlf mod+1,F 0310 0DC1 00273 rlf mod+2,F 0311 0BC8 00274 decfsz calc_cn,F ;割られる数を初期位置までシフト 0312 2B0A 00275 goto di2403 0313 00276 di2404 0313 083B 00277 movf src2+2,W 0314 0241 00278 subwf mod+2,W 0315 1903 00279 btfsc STATUS,Z 0316 2B1A 00280 goto di2406 0317 1803 00281 btfsc STATUS,C 0318 2B27 00282 goto di2410 00283 ;btfss STATUS,C 0319 2B36 00284 goto di2411 031A 00285 di2406 031A 083A 00286 movf src2+1,0 031B 0240 00287 subwf mod+1,0 031C 1903 00288 btfsc STATUS,Z 031D 2B21 00289 goto di2407 031E 1803 00290 btfsc STATUS,C 031F 2B27 00291 goto di2410 00292 ;btfss STATUS,C 0320 2B36 00293 goto di2411 0321 00294 di2407 0321 0839 00295 movf src2+0,W 0322 023F 00296 subwf mod+0,W 0323 1903 00297 btfsc STATUS,Z 0324 2B27 00298 goto di2410 0325 1C03 00299 btfss STATUS,C 0326 2B36 00300 goto di2411 MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 30 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0327 00301 di2410 0327 0839 00302 movf src2+0,W 0328 02BF 00303 subwf mod+0,F ;ワークから下位を引く 0329 3001 00304 movlw 1 ;ワークには余りが残る 032A 1C03 00305 btfss STATUS,C 032B 02C0 00306 subwf mod+1,F 032C 1C03 00307 btfss STATUS,C 032D 02C1 00308 subwf mod+2,F 032E 083A 00309 movf src2+1,W 032F 02C0 00310 subwf mod+1,F ;ワークから2位を引く 0330 1C03 00311 btfss STATUS,C 0331 03C1 00312 decf mod+2,F ;上位 -1 0332 083B 00313 movf src2+2,W 0333 02C1 00314 subwf mod+2,F ;ワークから上位を引く 0334 1403 00315 bsf STATUS,C ;キャリフラグを1に 0335 2B37 00316 goto di2412 00317 0336 00318 di2411 0336 1003 00319 bcf STATUS,C ;キャリフラグを0に 0337 00320 di2412 0337 0DBC 00321 rlf result+0,F ;キャリフラグの内容を答えにシフトしてゆく 0338 0DBD 00322 rlf result+1,F 0339 0DBE 00323 rlf result+2,F 033A 08C9 00324 movf calc_cn2,F ;calc_cn2 が 0 か検査 033B 1903 00325 btfsc STATUS,Z 033C 2B46 00326 goto di2413 ;最下位まで処理したなら終了 033D 03C9 00327 decf calc_cn2,F ;ビット位置を1つ下げる(右へ) 033E 1003 00328 bcf STATUS,C ;キャリフラグを0に 033F 0DB6 00329 rlf src1+0,F ;ワークへ1ビット左シフト 0340 0DB7 00330 rlf src1+1,F 0341 0DB8 00331 rlf src1+2,F 0342 0DBF 00332 rlf mod+0,F 0343 0DC0 00333 rlf mod+1,F 0344 0DC1 00334 rlf mod+2,F 0345 2B13 00335 goto di2404 0346 00336 di2413 0346 11C2 00337 bcf flag,3 ;正常終了 0347 0008 00338 return 00339 ;--------------------------------------------------------------------- 00340 ;********************************************************************* 00080 include "pic.asm" 00001 00002 ; //////////////////////////////////////////////////////////////////// 00003 ; //////////////////////////////////////////////////////////////////// 00004 ; msオーダーのウェイト 00005 ; //////////////////////////////////////////////////////////////////// 0348 00006 wait_ms 0348 00007 wait_ms0 0348 01C9 00008 clrf calc_cn2 0349 00009 wait_ms1 0349 0000 00010 nop 034A 0000 00011 nop 034B 0000 00012 nop MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 31 LOC OBJECT CODE LINE SOURCE TEXT VALUE 034C 0000 00013 nop 034D 0000 00014 nop 034E 0000 00015 nop 034F 0000 00016 nop 0350 0BC9 00017 decfsz calc_cn2,F 0351 2B49 00018 goto wait_ms1 0352 0BC8 00019 decfsz calc_cn,F 0353 2B48 00020 goto wait_ms0 0354 0008 00021 return 00022 00023 ; //////////////////////////////////////////////////////////////////// 00024 ; μsオーダーのウェイト 00025 ; //////////////////////////////////////////////////////////////////// 0355 00026 wait_us 0355 00027 wait_us0 0355 0BC8 00028 decfsz calc_cn,F 0356 2B55 00029 goto wait_us0 0357 0008 00030 return 00031 00032 ; //////////////////////////////////////////////////////////////////// 00033 ; PIC 初期化 00034 ; //////////////////////////////////////////////////////////////////// 0358 00035 init_pic 0358 1683 00036 bsf STATUS,RP0 ;セレクトページ1 00037 00038 ;[OPTIONレジスタの設定] 00039 ;7 RBPU   0 :PORTBのPullUp = 0:あり 1:なし 00040 ;6 INTEDGE  1 :INT割込み信号のエッジ = 0:立ち下がり 1:立ち上がり 00041 ;5 TOCS 0 :TMR0ソース選択 = 0:RA4ピン 1:内部 00042 ;4 TOSE 0 :TMR0のカウントエッジ = 0:立ち上がり 1:立ち下がり 00043 ;3 PSA 0 :プリスケーラ割当 = 0:TMR0 1:WDT 00044 ;2 PS0〜2 5 :プリスケーラ値 = (TMR0)0:2 1:4 2:8 3:16 4:32 5:64 6:128 7:256 00045 ; PS0〜2 :プリスケーラ値 = (WDT )0:1 1:2 2:4 3:8 4:16 5:32 6:64 7:128 0359 3045 00046 movlw B'01000101' 035A 0081 00047 movwf OPTION_REG-0x80 ;OPTION REG に書き込み 00048 035B 3000 00049 movlw B'00000000' ; RA? は全部OUT 035C 0085 00050 movwf TRISA-0x80 00051 035D 30F1 00052 movlw B'11110001' ; RB1-RB3ピンをOUT 035E 0086 00053 movwf TRISB-0x80 00054 035F 1283 00055 bcf STATUS,RP0 ;セレクトページ0 00056 0360 0185 00057 clrf PORTA 0361 0186 00058 clrf PORTB 00059 00060 ; RAM初期化 00061 ; 0c 〜 3f クリア 0362 300C 00062 movlw 0x0c 0363 0084 00063 movwf FSR 0364 00064 ram_init_loop1 0364 0180 00065 clrf INDF MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 32 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0365 0A84 00066 incf FSR,F 0366 1F04 00067 btfss FSR,6 0367 2B64 00068 goto ram_init_loop1 00069 ; 続いて 40 〜 4f クリア 0368 00070 ram_init_loop2 0368 0180 00071 clrf INDF 0369 0A84 00072 incf FSR,F 036A 1E04 00073 btfss FSR,4 036B 2B68 00074 goto ram_init_loop2 00075 036C 30FF 00076 movlw 0xff 036D 00B4 00077 movwf rb_save 00078 036E 0008 00079 return 00080 00081 include "int.asm" 00001 ; //////////////////////////////////////////////////////////////////// 00002 ; 割り込み処理。 00003 ; //////////////////////////////////////////////////////////////////// 036F 00004 interrupt 036F 00B0 00005 movwf w_save ;レジスタ退避(定石) 0370 0E03 00006 swapf STATUS,w 0371 00B1 00007 movwf status_save 00008 0372 190B 00009 btfsc INTCON,T0IF ; T0IF (タイマ) はどうよ 0373 238F 00010 call int_t0if ; T0IF の処理 00011 0374 188B 00012 btfsc INTCON,INTF ; INTF (RB0/INT) はどうよ 0375 23A6 00013 call int_rb0 ; INTF の処理 00014 0376 1C0B 00015 btfss INTCON,RBIF ; RBIF (RB4-7) はどうよ 0377 2B87 00016 goto skip_rbif 00017 00018 ; 以下 rbif の処理 0378 0806 00019 movf PORTB,W ; 現在の rb をゲット 0379 00B3 00020 movwf rb_now 037A 0634 00021 xorwf rb_save,W ; 変化があったもの 037B 0533 00022 andwf rb_now,W ; かつ、現在 1 のもの 037C 00B4 00023 movwf rb_temp ; 計算tempにコピ 00024 037D 1A34 00025 btfsc rb_temp,4 ; rb4 はどうよ 037E 23A7 00026 call int_rb4 ; rb4 の処理 037F 1AB4 00027 btfsc rb_temp,5 ; rb5 はどうよ 0380 23AB 00028 call int_rb5 ; rb5 の処理 0381 1B34 00029 btfsc rb_temp,6 ; rb6 はどうよ 0382 23AF 00030 call int_rb6 ; rb6 の処理 0383 1BB4 00031 btfsc rb_temp,7 ; rb7 はどうよ 0384 23D3 00032 call int_rb7 ; rb7 の処理 00033 0385 0833 00034 movf rb_now,W ; 次回のために現在の rb を保存 0386 00B4 00035 movwf rb_save ; ★ rb から直接ゲットすると、既に変化している恐れあり。 00036 0387 00037 skip_rbif MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 33 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00038 0387 0E31 00039 swapf status_save,W ; Swap nibbles in STATUS_TEMP register 00040 ; and place result into W 0388 0083 00041 movwf STATUS ; Move W into STATUS register (sets bank to original state) 0389 0EB0 00042 swapf w_save, F ; Swap nibbles in w_save and place result in w_save 038A 0E30 00043 swapf w_save, W ; Swap nibbles in w_save and place result into W 038B 110B 00044 bcf INTCON,T0IF 038C 108B 00045 bcf INTCON,INTF 038D 100B 00046 bcf INTCON,RBIF 038E 0009 00047 retfie ; 割り込み処理終わり 00048 00049 ; //////////////////////////////////////////////////////////////////// 00050 ; 割り込み処理のサブルーチン各種 00051 ; //////////////////////////////////////////////////////////////////// 038F 00052 int_t0if 038F 305F 00053 movlw SPEED_FLOW_MAX ^ 0ffh 0390 0728 00054 addwf speed_flow,0 0391 1C03 00055 btfss STATUS,C ; 0km/h と判断したら inc しない 0392 0AA8 00056 incf speed_flow,F ; xx sec パルスが無ければ 0km/h 00057 0393 3001 00058 movlw FUEL_ST_FLOW_MAX ^ 0ffh 0394 072F 00059 addwf fuel_flow,0 0395 1C03 00060 btfss STATUS,C ; fuel cut と判断したら inc しない 0396 0AAF 00061 incf fuel_flow,F ; xx sec パルスが無ければ fuel cut 00062 0397 1942 00063 btfsc flag,2 ; 前回値表示中フラグON? 0398 2B9E 00064 goto int_t0if_1 ; on なら inc せず。 00065 0399 0A99 00066 incf timer_cn2+0,F ; タイマ(信号間) inc 039A 1903 00067 btfsc STATUS,Z 039B 0A9A 00068 incf timer_cn2+1,F 039C 1903 00069 btfsc STATUS,Z 039D 0A9B 00070 incf timer_cn2+2,F 039E 00071 int_t0if_1 039E 18C2 00072 btfsc flag,1 ; お休み中はタイマを inc しない 039F 0008 00073 return 00074 03A0 0A8C 00075 incf timer_cn+0,F ; タイマ inc 03A1 1903 00076 btfsc STATUS,Z 03A2 0A8D 00077 incf timer_cn+1,F 03A3 1903 00078 btfsc STATUS,Z 03A4 0A8E 00079 incf timer_cn+2,F 00080 03A5 0008 00081 return 00082 03A6 00083 int_rb0 00084 ;とりあえずリセットボタンとして機能する(暫定仕様) 00085 ;clrf fuel_cn+0 00086 ;clrf fuel_cn+1 00087 ;clrf fuel_cn+2 00088 ;clrf odometer_cn+0 00089 ;clrf odometer_cn+1 00090 ;clrf odometer_cn+2 MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 34 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00091 03A6 0008 00092 return 03A7 00093 int_rb4 03A7 0A95 00094 incf ndr_cn+0,F ; ドライブプーリー inc 03A8 1903 00095 btfsc STATUS,Z 03A9 0A96 00096 incf ndr_cn+1,F 00097 00098 ;とりあえずリセットボタンとして機能する(暫定仕様) 00099 ;clrf fuel_cn+0 00100 ;clrf fuel_cn+1 00101 ;clrf fuel_cn+2 00102 ;clrf odometer_cn+0 00103 ;clrf odometer_cn+1 00104 ;clrf odometer_cn+2 00105 03AA 0008 00106 return 03AB 00107 int_rb5 03AB 0A97 00108 incf ndn_cn+0,F ; ドリブンプーリー inc 03AC 1903 00109 btfsc STATUS,Z 03AD 0A98 00110 incf ndn_cn+1,F 00111 00112 ;とりあえずリセットボタンとして機能する(暫定仕様) 00113 ;clrf fuel_cn+0 00114 ;clrf fuel_cn+1 00115 ;clrf fuel_cn+2 00116 ;clrf odometer_cn+0 00117 ;clrf odometer_cn+1 00118 ;clrf odometer_cn+2 00119 03AE 0008 00120 return 03AF 00121 int_rb6 03AF 0A8F 00122 incf odometer_cn+0,F ; 車速パルス inc 03B0 1903 00123 btfsc STATUS,Z 03B1 0A90 00124 incf odometer_cn+1,F 03B2 1903 00125 btfsc STATUS,Z 03B3 0A91 00126 incf odometer_cn+2,F 00127 03B4 0A9C 00128 incf odometer_cn2+0,F ; 車速パルス2 inc 03B5 1903 00129 btfsc STATUS,Z 03B6 0A9D 00130 incf odometer_cn2+1,F 03B7 1903 00131 btfsc STATUS,Z 03B8 0A9E 00132 incf odometer_cn2+2,F 00133 03B9 0822 00134 movf speed_tm_la+0,W ; 前回タイマ値記憶 03BA 00A4 00135 movwf speed_tm_lb+0 03BB 0823 00136 movf speed_tm_la+1,W 03BC 00A5 00137 movwf speed_tm_lb+1 00138 03BD 0801 00139 movf TMR0,W ; 今回タイマ値記憶 03BE 00A2 00140 movwf speed_tm_la+0 03BF 080C 00141 movf timer_cn,W 03C0 00A3 00142 movwf speed_tm_la+1 00143 MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 35 LOC OBJECT CODE LINE SOURCE TEXT VALUE 03C1 305F 00144 movlw SPEED_FLOW_MAX ^ 0ffh 03C2 0728 00145 addwf speed_flow,0 03C3 1803 00146 btfsc STATUS,C 03C4 2BC7 00147 goto cn2_reset ; 停止状態から動き出したとき 00148 ; call にすると、スタックオーバーフローするゾ! 00149 03C5 01A8 00150 clrf speed_flow ; 0km/h チェックフラグクリア 03C6 0008 00151 return 00152 03C7 00153 cn2_reset 03C7 1142 00154 bcf flag,2 ; 前回値表示中フラグOFF 00155 ; いつもOFFにして冗長な感じだが、ON だったら OFF なんて判断するほうがなんか冗長 00156 03C8 019C 00157 clrf odometer_cn2+0 ; 車速パルス2 03C9 019D 00158 clrf odometer_cn2+1 03CA 019E 00159 clrf odometer_cn2+2 03CB 019F 00160 clrf fuel_cn2+0 ; 燃料パルス2 03CC 01A0 00161 clrf fuel_cn2+1 03CD 01A1 00162 clrf fuel_cn2+2 03CE 0199 00163 clrf timer_cn2+0 ; タイマ(信号間) 03CF 019A 00164 clrf timer_cn2+1 03D0 019B 00165 clrf timer_cn2+2 00166 03D1 01A8 00167 clrf speed_flow ; 0km/h チェックフラグクリア 03D2 0008 00168 return 00169 00170 03D3 00171 int_rb7 03D3 0A92 00172 incf fuel_cn+0,F ; 燃料パルス inc 03D4 1903 00173 btfsc STATUS,Z 03D5 0A93 00174 incf fuel_cn+1,F 03D6 1903 00175 btfsc STATUS,Z 03D7 0A94 00176 incf fuel_cn+2,F 00177 03D8 1942 00178 btfsc flag,2 ; 前回値表示中フラグON? 03D9 2BDF 00179 goto int_rb7_1 ; on なら inc せず。 00180 03DA 0A9F 00181 incf fuel_cn2+0,F ; 燃料パルス2 inc 03DB 1903 00182 btfsc STATUS,Z 03DC 0AA0 00183 incf fuel_cn2+1,F 03DD 1903 00184 btfsc STATUS,Z 03DE 0AA1 00185 incf fuel_cn2+2,F 00186 03DF 00187 int_rb7_1 00188 03DF 0829 00189 movf fuel_tm_la+0,W ; 前回タイマ値記憶 03E0 00AB 00190 movwf fuel_tm_lb+0 03E1 082A 00191 movf fuel_tm_la+1,W 03E2 00AC 00192 movwf fuel_tm_lb+1 00193 03E3 0801 00194 movf TMR0,W ; 今回タイマ値記憶 03E4 00A9 00195 movwf fuel_tm_la+0 03E5 080C 00196 movf timer_cn,W MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 36 LOC OBJECT CODE LINE SOURCE TEXT VALUE 03E6 00AA 00197 movwf fuel_tm_la+1 00198 03E7 3001 00199 movlw 1 03E8 00AF 00200 movwf fuel_flow ; fuel cut チェックフラグクリア 00201 03E9 0008 00202 return 00203 00082 00083 end MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 37 SYMBOL TABLE LABEL VALUE C 00000000 DC 00000001 E PORTB,2 EEADR 00000009 EECON1 00000088 EECON2 00000089 EEDATA 00000008 EEIE 00000006 EEIF 00000004 F 00000001 FSR 00000004 FUELFACT_H 0x05 FUELFACT_L 0x40 FUELFACT_M 0x9d FUEL_FC_FLOW_MAX D'150' FUEL_ST_FLOW_MAX D'254' GIE 00000007 INDF 00000000 INTCON 0000000B INTE 00000004 INTEDG 00000006 INTF 00000001 IRP 00000007 LED_COM PORTA,4 NOT_PD 00000003 NOT_RBPU 00000007 NOT_TO 00000004 OPTION_REG 00000081 PCL 00000002 PCLATH 0000000A PORTA 00000005 PORTB 00000006 PS0 00000000 PS1 00000001 PS2 00000002 PSA 00000003 RBIE 00000003 RBIF 00000000 RD 00000000 RESET_FLOW_MAX 0x0d RP0 00000005 RP1 00000006 RS PORTB,1 SPEEDFACT_H 0x56 SPEEDFACT_L 0x82 SPEED_FLOW_MAX D'160' STATUS 00000003 T0CS 00000005 T0IE 00000005 T0IF 00000002 T0SE 00000004 TIMMINFACT_H 0x0e TIMMINFACT_L 0x4e MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 38 SYMBOL TABLE LABEL VALUE TIMSECFACT_H 0x3d TIMSECFACT_L 0x09 TMR0 00000001 TRISA 00000085 TRISB 00000086 W 00000000 WR 00000001 WREN 00000002 WRERR 00000003 Z 00000002 _CP_OFF 00003FFF _CP_ON 0000000F _HS_OSC 00003FFE _LP_OSC 00003FFC _PWRTE_OFF 00003FFF _PWRTE_ON 00003FF7 _RC_OSC 00003FFF _WDT_OFF 00003FFB _WDT_ON 00003FFF _XT_OSC 00003FFD __16F84 00000001 avgsp_print 000001B3 avgsps_print 000001DB bin16tobcd 00000267 calc_cn 00000048 calc_cn2 00000049 calccalc 0000001C cn2_reset 000003C7 dec 00000043 dec_top 00000048 devideby10 00000275 devideby10_0 00000278 di1601 000002B1 di1602 000002BB di1603 000002C1 di1604 000002C8 di1605 000002D4 di1606 000002DC di1607 000002DD di1608 000002E9 di2401 000002F7 di2402 00000303 di2403 0000030A di2404 00000313 di2406 0000031A di2407 00000321 di2410 00000327 di2411 00000336 di2412 00000337 di2413 00000346 div16 000002A8 div24 000002EB flag 00000042 MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 39 SYMBOL TABLE LABEL VALUE fu_print 000000DA fu_print_ccpmin 000000F3 fu_print_e 00000118 fu_print_fc 00000107 fu_print_stop 00000112 fu_print_time 000000D1 fuel_cn 00000012 fuel_cn2 0000001F fuel_flow 0000002F fuel_tm 0000002D fuel_tm_la 00000029 fuel_tm_lb 0000002B fuelcout_print 00000213 fut_print 00000119 futs_print 00000133 init_lcd 00000249 init_pic 00000358 int_rb0 000003A6 int_rb4 000003A7 int_rb5 000003AB int_rb6 000003AF int_rb7 000003D3 int_rb7_1 000003DF int_t0if 0000038F int_t0if_1 0000039E interrupt 0000036F lcd_data_temp 00000035 loop1 0000000F loop2 00000011 mainloop 00000009 mod 0000003F mode 0000004A mul10_24 00000288 ndn_cn 00000017 ndr_cn 00000015 odd_print 00000180 odd_print_1 00000191 odds_print 00000189 odometer_cn 0000000F odometer_cn2 0000001C print 00000075 print_1 00000080 print_2 0000008A print_dec1 00000230 print_dec2 0000022A print_dec3 00000228 print_dec4 00000226 print_dec5 00000224 ra_save 00000032 ram 0000004B ram_init_loop1 00000364 ram_init_loop2 00000368 rb_now 00000033 MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 40 SYMBOL TABLE LABEL VALUE rb_save 00000034 rb_temp 00000034 reset_flow_check_1 00000064 reset_flow_check_end 0000006D result 0000003C skip_rbif 00000387 sleep_loop 0000003F sleeping 00000033 sp_print_0 000000CA sp_print_e 000000D0 spcout_print 00000203 speed_flow 00000028 speed_print 000000B5 speed_tm 00000026 speed_tm_la 00000022 speed_tm_lb 00000024 src1 00000036 src2 00000039 start 00000005 status_save 00000031 stopcheck_end 0000001B time_print 0000014D time_print_1 0000015E timer_cn 0000000C timer_cn2 00000019 times_print 00000156 w_save 00000030 wait_ms 00000348 wait_ms0 00000348 wait_ms1 00000349 wait_us 00000355 wait_us0 00000355 write_lcd_data 00000233 write_lcd_raw 0000023A MEMORY USAGE MAP ('X' = Used, '-' = Unused) 0000 : X---XXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0040 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0080 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 00C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0100 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0140 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0180 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 01C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX MPASM 03.00 Released FITMETER.ASM 7-27-2002 5:52:44 PAGE 41 MEMORY USAGE MAP ('X' = Used, '-' = Unused) 0200 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0240 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0280 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 02C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0300 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0340 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0380 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 03C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXX------ ---------------- 2000 : -------X-------- ---------------- ---------------- ---------------- All other memory blocks unused. Program Memory Words Used: 999 Program Memory Words Free: 25 Errors : 0 Warnings : 0 reported, 0 suppressed Messages : 0 reported, 0 suppressed