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