自作イグナイタ その9

前回同様プログラムの簡単な説明の続きです。
 
説明している私も頭が痛くなってきました(笑
 
前回はエンジンスタート直後&低回転(945rpm以下)の制御でした、今回はいよいよ通常回転域での制御となります。
 
低回転時と比較すると、ドエル制御やリミッター制御があるので少し複雑になります。
 
太文字がプログラムソースです。

;************************************  
;通常点火 Aシリンダー&タコメーター;
;************************************
MAINST
 BSF  STATUS,RP0 ;バンク1;
 MOVLW  B'10001111'   ;
 MOVWF  VRCON  ;基準電圧の設定 高電圧3.59V;
 BCF  STATUS,RP0 ;バンク0;
 MOVLW  B'00000001' ;B'00010001';プリスケーラ1倍 0.5us;
 MOVWF  T1CON  ;0.5us1カウント、LOW128us、HI32.768ms、*2=65.536ms=916rpm;
 CLRWDT
 BCF  OV_F,1
 MOVLW  D'140'  
 MOVWF  TMR0
 BSF  INTCON,5 ;TMR0割り込み許可 128usで1カウント; 
 
低回転制御から移行してきた時のPICの設定変更。
ピックアップ信号基準電圧を3.59Vへ上げてノイズ対策&タイマー1の速度を上げ最大32ms(916rpm)サイクルで
 
制御&タイマー0の割り込み許可しドエル制御開始。
 
 
 
 
MAIN
 BCF  CMCON0,3 ;GP1選択;
MAIN1
 BTFSS  PIR1,3   
 GOTO  MAIN1
 BSF  GPIO,2
 BSF  GPIO,5
 CLRWDT
 
 
Aシリンダー用のピックアップ信号の入力待ち。
信号が入力される(ONになる)まで待つ。
 
 
 
 
MAIN2
 BTFSS  PIR1,3    
 GOTO  MAIN3
 BCF  PIR1,3
 GOTO  MAIN2
 
Aシリンダー用のピックアップ信号がOFFになるまで待つ。
 
 
 
 
MAIN3
 BCF  GPIO,2
 BCF  GPIO,5
 BCF  PIR1,3 
 MOVFW  TMR1L 
 MOVWF  TL
 MOVFW  TMR1H 
 MOVWF  TH
 CLRF  TMR1L
 CLRF  TMR1H
 BTFSC  OV_F,1
 GOTO  LOW500
 
 
Aシリンダー点火、タイマー1LOWとHIの値を変数に記録。
オーバーフローしていたら低回転制御へ飛ぶ。
 
 
 
 

;リミッター判定;
 BCF  STATUS,C ;
 BCF  STATUS,Z ;
 MOVFW  LMHI  ;   
 SUBWF  TH,W
 BTFSS  STATUS,C ;0だったらgoto;
 goto  LIGO  ;設定より小さいのでリミッター制御開始;
 BTFSS  STATUS,Z ;0だったらgoto;
 goto  MAIN4   ;;
 BCF  STATUS,C ;
 MOVFW  LMLO  ;   
 SUBWF  TL,W
 BTFSC  STATUS,C ;0だったらgoto;
 goto  MAIN4
 
設定したリミット値(10000rpm)以上ならリミッター制御へ、それ以下ならMAIN4ラベルへ飛ぶ。
 
 
 
 

LIGO
 CALL  T03mS  ;1ms待つ;
 BCF  GPIO,4
 CLRF  DETIM4
 CALL  T03mS  ;2ms待つ;
 BSF  GPIO,5
 BSF  CMCON0,3 ;GP0選択;
LIGO2
 BCF  INTCON,5 ;TMR0割り込み禁止;
 BTFSS  PIR1,3   
 GOTO  LIGO2
 BCF  OV_F,1
 CLRWDT
 GOTO  MAIN200

;リミッター制御ここまで;
リミッター制御、Bシリンダー用コイルに通電せずに、2msまってBシリンダーピックアップ信号入力待ち。
入力があったらBシリンダー制御(MAIN200ラベル)へ飛ぶ。
 
 
 
 

;ドエルタイム設定;
MAIN4
 BCF  STATUS,C ;
 BCF  STATUS,Z ;
 MOVFW  DETIM  ;   
 SUBWF  TH,W
 MOVWF  DETIM2
 BTFSS  STATUS,C ;0だったらgoto;
 goto  MAIN5  ;小さかったら通電;
 BTFSC  STATUS,Z ;1だったらgoto;
 goto  MAIN5   ;;
 
タイマー1HI値がドエルタイム設定値より小さかったらドエル制御なし(MAIN5ラベル)へ飛ぶ。
大きかったら、タイマー1HI値-ドエル設定値をドエルカウント変数に記録。
 
 
 
 
 BSF  DETIM4,0
  COMF  DETIM2,W
 MOVWF  TMR0
 BCF  INTCON,2  ;TMR0割り込みフラグリセット;
 BSF  INTCON,5 ;TMR0割り込み許可 128usで1カウント; 
 GOTO  MAIN6  ;リミッター制御はじめからここまで18us;
 
Bシリンダー選択後、タイマー0にドエルカウント変数値を記録させ、タイマー0スタート。
後はタイマー0にてドエル制御。
 
 
 
 

MAIN5
 BSF  GPIO,4
 BSF  DETIM4,0
 
1サイクルがドエルタイム以下なので、Bシリンダー用コイル通電。
 
 
 
MAIN6  
 BSF  CMCON0,3   ;GP0選択;
 CALL  T03mS  ;1ms待つ;
 CALL  T03mS  ;2ms待つ;
 GOTO  MAIN100
 
 
ピックアップ入力をBシリンダー用ピックアップに変更後、2ms待って(ノイズ対策)Bシリンダー制御(MAIN100)へ飛ぶ。
 
 
 

;**************************
;Bシリンダー GP0&GP4;
;**************************
MAINST200
 BSF  STATUS,RP0 ;バンク1;
 MOVLW  B'10000101'   ;
 MOVWF  VRCON  ;基準電圧の設定 高電圧2.03V;
 BCF  STATUS,RP0 ;■バンク0;
 MOVLW  B'00000001'  ;B'00010001';プリスケーラ1倍 0.5us;
 MOVWF  T1CON  ;0.5us1カウント、LOW128us、HI32.768ms、*2=65.536ms=916rpm;
 CLRWDT
 BCF  OV_F,1
 BSF  DETIM4,0
 MOVLW  D'140'  
 MOVWF  TMR0
 BSF  INTCON,5 ;TMR0割り込み許可 128usで1カウント;

低回転制御から移行してきた時のPICの設定変更。

ピックアップ信号基準電圧を3.59Vへ上げてノイズ対策&タイマー1の速度を上げ最大32ms(916rpm)サイクルで
 
制御&タイマー0の割り込み許可しドエル制御開始。
 
 
 

MAIN002
 BSF  CMCON0,3 ;GP0選択;
MAIN100
 BTFSS  PIR1,3   
 GOTO  MAIN100
 BSF  GPIO,4
 CLRWDT
 
Bシリンダー用のピックアップ信号の入力待ち。
信号が入力される(ONになる)まで待つ。
 
 
 
 

MAIN200
 BTFSS  PIR1,3    
 GOTO  MAIN300
 BCF  PIR1,3
 GOTO  MAIN200
 
Bシリンダー用のピックアップ信号がOFFになるまで待つ。
 
 
 
 
MAIN300
 BCF  GPIO,4
 BCF  PIR1,3 
 MOVFW  TMR1L 
 MOVWF  TL
 MOVFW  TMR1H 
 MOVWF  TH
 CLRF  TMR1L
 CLRF  TMR1H
 BTFSC  OV_F,1
 GOTO  LOW50

Bシリンダー点火、タイマー1LOWとHIの値を変数に記録。
オーバーフローしていたら低回転制御へ飛ぶ。
 
 
 

;リミッター判定;
 BCF  STATUS,C ;
 BCF  STATUS,Z ;
 MOVFW  LMHI  ;   
 SUBWF  TH,W
 BTFSS  STATUS,C ;0だったらgoto;
 goto  LIGO100  ;設定より小さいのでリミッター制御開始;
 BTFSS  STATUS,Z ;0だったらgoto;
 goto  MAIN400  ;;
 BCF  STATUS,C ;
 MOVFW  LMLO  ;   
 SUBWF  TL,W
 BTFSC  STATUS,C ;0だったらgoto;
 goto  MAIN400
 
設定したリミット値(10000rpm)以上ならリミッター制御へ、それ以下ならMAIN400ラベルへ飛ぶ。
 
 
 
 
LIGO100
 CALL  T03mS  ;1ms待つ;
 BCF  GPIO,2
 CLRF  DETIM4
 CALL  T03mS  ;2ms待つ;
 BCF  CMCON0,3 ;GP1選択;
LIGO200
 BCF  INTCON,5 ;TMR0割り込み禁止;
 BTFSS  PIR1,3   
 GOTO  LIGO200
 BCF  OV_F,1
 CLRWDT
 GOTO  MAIN2

;リミッター制御ここまで;
リミッター制御、Aシリンダー用コイルに通電せずに、2msまってBシリンダーピックアップ信号入力待ち。
入力があったらAシリンダー制御(MAIN2ラベル)へ飛ぶ。
 
 
 
 
 
;ドエルタイム設定;
MAIN400
 BCF  STATUS,C ;
 BCF  STATUS,Z ;
 MOVFW  DETIM  ;   
 SUBWF  TH,W
 MOVWF  DETIM2
 BTFSS  STATUS,C ;0だったらgoto;
 goto  MAIN500  ;小さかったら通電;
 BTFSC  STATUS,Z ;1だったらgoto;
 goto  MAIN500   ;;

タイマー1HI値がドエルタイム設定値より小さかったらドエル制御なし(MAIN500ラベル)へ飛ぶ。
大きかったら、タイマー1HI値-ドエル設定値をドエルカウント変数に記録。
 
 
 
 
 BCF  DETIM4,0
  COMF  DETIM2,W
 MOVWF  TMR0
 BCF  INTCON,2  ;TMR0割り込みフラグリセット;
 BSF  INTCON,5 ;TMR0割り込み許可 128usで1カウント; 
 GOTO  MAIN600  ;リミッター制御はじめからここまで18us;
 
Aシリンダー選択後、タイマー0にドエルカウント変数値を記録させ、タイマー0スタート。
後はタイマー0にてドエル制御。
 
 
 
 
MAIN500
 BSF  GPIO,2
 BSF  GPIO,5
 
1サイクルがドエルタイム以下なので、Aシリンダー用コイル通電。
 
 

MAIN600
 BCF  CMCON0,3 ;GP1選択;
 CALL  T03mS  ;1ms待つ;
 CALL  T03mS  ;2ms待つ;
 GOTO  MAIN1
 

ピックアップ入力をAシリンダー用ピックアップに変更後、2ms待って(ノイズ対策)Aシリンダー制御(MAIN1)へ飛ぶ(元に戻る)