; //////////////////////////////////////////////////////////////////// ; 割り込み処理。 ; //////////////////////////////////////////////////////////////////// interrupt movwf w_save ;レジスタ退避(定石) swapf STATUS,w movwf status_save ;;;;;;;;;;;;;;;; T0IF (タイマ) btfss INTCON,T0IF ; T0IF (タイマ) はどうよ goto skip_t0if ; T0IF の処理はしない ;int_t0if movlw SPEED_FLOW_MAX ^ 0ffh addwf speed_flow,0 btfss STATUS,C ; 0km/h と判断したら inc しない incf speed_flow,F ; xx sec パルスが無ければ 0km/h movlw FUEL_ST_FLOW_MAX ^ 0ffh addwf fuel_flow,0 btfss STATUS,C ; fuel cut と判断したら inc しない incf fuel_flow,F ; xx sec パルスが無ければ fuel cut btfsc flag,2 ; 前回値表示中フラグON? goto int_t0if_1 ; on なら inc せず。 incf timer_cn2+0,F ; タイマ(信号間) inc btfsc STATUS,Z incf timer_cn2+1,F btfsc STATUS,Z incf timer_cn2+2,F int_t0if_1 btfsc flag,1 ; お休み中はタイマを inc しない goto skip_t0if incf timer_cn+0,F ; タイマ inc btfsc STATUS,Z incf timer_cn+1,F btfsc STATUS,Z incf timer_cn+2,F skip_t0if ;;;;;;;;;;;;;;;; INTF (RB0/INT) btfss INTCON,INTF ; INTF (RB0/INT) はどうよ goto skip_rb0 ; INTF の処理はしない ;int_rb0 ;とりあえずリセットボタンとして機能する(暫定仕様) ;clrf fuel_cn+0 ;clrf fuel_cn+1 ;clrf fuel_cn+2 ;clrf odometer_cn+0 ;clrf odometer_cn+1 ;clrf odometer_cn+2 skip_rb0 ;;;;;;;;;;;;;;;; RBIF (RB4-7) btfss INTCON,RBIF ; RBIF (RB4-7) はどうよ goto skip_rbif ; 以下 rbif の処理 movf PORTB,W ; 現在の rb をゲット movwf rb_now xorwf rb_save,W ; 変化があったもの andwf rb_now,W ; かつ、現在 1 のもの movwf rb_temp ; 計算tempにコピ ;;;;;;;;;;;;;;;; RB4 btfss rb_temp,4 ; rb4 はどうよ goto skip_rb4 ; rb4 の処理はしない ;int_rb4 incf ndr_cn+0,F ; ドライブプーリー inc btfsc STATUS,Z incf ndr_cn+1,F ;とりあえずリセットボタンとして機能する(暫定仕様) ;clrf fuel_cn+0 ;clrf fuel_cn+1 ;clrf fuel_cn+2 ;clrf odometer_cn+0 ;clrf odometer_cn+1 ;clrf odometer_cn+2 skip_rb4 ;;;;;;;;;;;;;;;; RB5 btfss rb_temp,5 ; rb5 はどうよ goto skip_rb5 ; rb5 の処理はしない ;int_rb5 incf ndn_cn+0,F ; ドリブンプーリー inc btfsc STATUS,Z incf ndn_cn+1,F ;とりあえずリセットボタンとして機能する(暫定仕様) ;clrf fuel_cn+0 ;clrf fuel_cn+1 ;clrf fuel_cn+2 ;clrf odometer_cn+0 ;clrf odometer_cn+1 ;clrf odometer_cn+2 skip_rb5 ;;;;;;;;;;;;;;;; RB6 btfss rb_temp,6 ; rb6 はどうよ goto skip_rb6 ; rb6 の処理はしない int_rb6 incf odometer_cn+0,F ; 車速パルス inc btfsc STATUS,Z incf odometer_cn+1,F btfsc STATUS,Z incf odometer_cn+2,F incf odometer_cn2+0,F ; 車速パルス2 inc btfsc STATUS,Z incf odometer_cn2+1,F btfsc STATUS,Z incf odometer_cn2+2,F movf speed_tm_la+0,W ; 前回タイマ値記憶 movwf speed_tm_lb+0 movf speed_tm_la+1,W movwf speed_tm_lb+1 movf TMR0,W ; 今回タイマ値記憶 movwf speed_tm_la+0 movf timer_cn,W movwf speed_tm_la+1 movlw SPEED_FLOW_MAX ^ 0ffh addwf speed_flow,0 btfsc STATUS,C goto cn2_reset ; 停止状態から動き出したとき ; call にすると、スタックオーバーフローするゾ! clrf speed_flow ; 0km/h チェックフラグクリア goto skip_rb6 cn2_reset bcf flag,2 ; 前回値表示中フラグOFF ; いつもOFFにして冗長な感じだが、ON だったら OFF なんて判断するほうがなんか冗長 clrf odometer_cn2+0 ; 車速パルス2 clrf odometer_cn2+1 clrf odometer_cn2+2 clrf fuel_cn2+0 ; 燃料パルス2 clrf fuel_cn2+1 clrf fuel_cn2+2 clrf timer_cn2+0 ; タイマ(信号間) clrf timer_cn2+1 clrf timer_cn2+2 clrf speed_flow ; 0km/h チェックフラグクリア skip_rb6 ;;;;;;;;;;;;;;;; RB7 btfss rb_temp,7 ; rb7 はどうよ goto skip_rb7 ; rb7 の処理はしない int_rb7 incf fuel_cn+0,F ; 燃料パルス inc btfsc STATUS,Z incf fuel_cn+1,F btfsc STATUS,Z incf fuel_cn+2,F btfsc flag,2 ; 前回値表示中フラグON? goto int_rb7_1 ; on なら inc せず。 incf fuel_cn2+0,F ; 燃料パルス2 inc btfsc STATUS,Z incf fuel_cn2+1,F btfsc STATUS,Z incf fuel_cn2+2,F int_rb7_1 movf fuel_tm_la+0,W ; 前回タイマ値記憶 movwf fuel_tm_lb+0 movf fuel_tm_la+1,W movwf fuel_tm_lb+1 movf TMR0,W ; 今回タイマ値記憶 movwf fuel_tm_la+0 movf timer_cn,W movwf fuel_tm_la+1 movlw 1 movwf fuel_flow ; fuel cut チェックフラグクリア skip_rb7 ;;;;;;;;;;;;;;;; RB(4-7) おわり movf rb_now,W ; 次回のために現在の rb を保存 movwf rb_save ; ★ rb から直接ゲットすると、既に変化している恐れあり。 skip_rbif swapf status_save,W ; Swap nibbles in STATUS_TEMP register ; and place result into W movwf STATUS ; Move W into STATUS register (sets bank to original state) swapf w_save, F ; Swap nibbles in w_save and place result in w_save swapf w_save, W ; Swap nibbles in w_save and place result into W bcf INTCON,T0IF bcf INTCON,INTF bcf INTCON,RBIF retfie ; 割り込み処理終わり