前回同様プログラムの簡単な説明の続きです。
説明している私も頭が痛くなってきました(笑
前回はエンジンスタート直後&低回転(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
BCF CMCON0,3 ;GP1選択;
MAIN1
BTFSS PIR1,3
GOTO MAIN1
BSF GPIO,2
BSF GPIO,5
CLRWDT
Aシリンダー用のピックアップ信号の入力待ち。
信号が入力される(ONになる)まで待つ。
信号が入力される(ONになる)まで待つ。
MAIN2
BTFSS PIR1,3
GOTO MAIN3
BCF PIR1,3
GOTO MAIN2
BTFSS PIR1,3
GOTO MAIN3
BCF PIR1,3
GOTO MAIN2
Aシリンダー用のピックアップ信号がOFFになるまで待つ。
MAIN3
BCF GPIO,2
BCF GPIO,5
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
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
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ラベル)へ飛ぶ。
入力があったら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 ;;
goto MAIN5 ;小さかったら通電;
BTFSC STATUS,Z ;1だったらgoto;
goto MAIN5 ;;
タイマー1HI値がドエルタイム設定値より小さかったらドエル制御なし(MAIN5ラベル)へ飛ぶ。
大きかったら、タイマー1HI値-ドエル設定値をドエルカウント変数に記録。
大きかったら、タイマー1HI値-ドエル設定値をドエルカウント変数に記録。
BSF DETIM4,0
COMF DETIM2,W
MOVWF TMR0
BCF INTCON,2 ;TMR0割り込みフラグリセット;
BSF INTCON,5 ;TMR0割り込み許可 128usで1カウント;
GOTO MAIN6 ;リミッター制御はじめからここまで18us;
COMF DETIM2,W
MOVWF TMR0
BCF INTCON,2 ;TMR0割り込みフラグリセット;
BSF INTCON,5 ;TMR0割り込み許可 128usで1カウント;
GOTO MAIN6 ;リミッター制御はじめからここまで18us;
Bシリンダー選択後、タイマー0にドエルカウント変数値を記録させ、タイマー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
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 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カウント;
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になる)まで待つ。
信号が入力される(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
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
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
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ラベル)へ飛ぶ。
入力があったらAシリンダー制御(MAIN2ラベル)へ飛ぶ。
;ドエルタイム設定;
MAIN400
BCF STATUS,C ;
BCF STATUS,Z ;
MOVFW DETIM ;
SUBWF TH,W
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 ;;
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;
COMF DETIM2,W
MOVWF TMR0
BCF INTCON,2 ;TMR0割り込みフラグリセット;
BSF INTCON,5 ;TMR0割り込み許可 128usで1カウント;
GOTO MAIN600 ;リミッター制御はじめからここまで18us;
Aシリンダー選択後、タイマー0にドエルカウント変数値を記録させ、タイマー0スタート。
後はタイマー0にてドエル制御。
後はタイマー0にてドエル制御。
MAIN500
BSF GPIO,2
BSF GPIO,5
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)へ飛ぶ(元に戻る)