自作イグナイタ その2

回路設計は出来たので次はプログラムです。
 
これまで作ったプログラムソースをコピペしながら作ってみました。
 
仕様は
・ドエルタイムは7ms(14msサイクル以下はその半分)
・入力信号のコンパレータ基準電圧は2.03V(低回転制御時は0.42V)
・10000rpmでレブリミッター作動
タコメーターのオープニングデモ:IGスイッチON時に10000rpmを3秒間保持
・916rpm以下は低回転制御
・低回転制御中はドエルタイム制御なし
 
ザックリこんな感じで、机上のテストではうまく出来ました(^^)
 
次はハードの組み付けかな!?
 
ではプログラムを公開します。相変わらずアセンブラですが・・・
 
**ここから**~**ここまで**をコピペすれば作動するはずですが???
 
変なところがあったら教えてね(なんせ素人ですから・・・)
 
;******ここから*******;
;1CH GP1入力:GP2出力;
;2CH GP0入力:GP4出力;
;GP5:タコメーター出力;
 
  errorlevel -302 ; Suppress message 302
  errorlevel -305 ; Suppress message 305

       LIST    P=12f683
        #INCLUDE <p12f683.inc>
        __CONFIG _CP_OFF & _CPD_OFF & _WDT_ON & _BOD_ON & _IESO_OFF& _PWRTE_ON & _INTOSCIO & _MCLRE_OFF
 CBLOCK 020h
 W_TEMP    ;割り込み時Wレジスタセーブ用;
 STATUS_TEMP   ;ステータスセーブ用;
 PCLATH_TEMP   ;PCLATHセーブ用;
 T05mCNT            ;1mSループカウンタ;
 T1mCNT    ;100msループカウンタ;
 T50mCNT    ;20msループカウンタ;
 TH    ;TIM1HIカウンター;
 TL    ;TIM1LOWカウンター;
 LMHI    ;リミッターHIカウンター;
 LMLO    ;リミッターLOカウンター;
 OV_F    ;タイマー1オーバーフロー用;
 DETIM    ;ドエルタイム設定用;
 DETIM2    ;ドエルタイム計算用;
 DETIM4    ;気等判別フラグ;
 OPNF    ;オープニングデモフラグ;
 OPN    ;オープニングデモカウンタ1;
 OPN2    ;オープニングデモカウンタ2;
 ENDC

 ORG  0  ;Reset Start;
 GOTO  INIT
 
;*************************;
; 割込み制御;
;*************************;
 ORG  0X4
 MOVWF  W_TEMP  ;Wレジスタセーブ;
 SWAPF  STATUS,W
 CLRF  STATUS
 MOVWF  STATUS_TEMP
 MOVFW  PCLATH
 MOVWF  PCLATH_TEMP 
 CLRF  PCLATH
 BTFSC  PIR1,0
 GOTO  T1
 GOTO  T0  
T1
 BCF  PIR1,0  ;TMR1割り込みフラグリセット;
 BSF  OV_F,1
 GOTO  WA

T0
 BCF  INTCON,2 ;TMR0割り込みフラグリセット;
 BTFSC  DETIM4,0 
 GOTO  TT100
 BSF  GPIO,2
 BSF  GPIO,5
 BCF  INTCON,5 ;TMR0割り込み禁止;
 BTFSC  DETIM4,7 
 GOTO  TTT1
 GOTO  WA
TT100
 BSF  GPIO,4
 BCF  DETIM4,0
 BCF  INTCON,5 ;TMR0割り込み禁止;
 BTFSC  DETIM4,7 
 GOTO  TTT1
 GOTO  WA
TTT1
 BCF  GPIO,2
 BCF  GPIO,4
 BCF  DETIM4,7
 GOTO  WA
WA
 MOVFW  PCLATH_TEMP
 MOVWF  PCLATH
 SWAPF  STATUS_TEMP,W
 MOVWF  STATUS
 SWAPF  W_TEMP,F
 SWAPF  W_TEMP,W
 RETFIE

;**************************
; PICの初期化
;**************************
INIT
    ; GPIO(GP2-0)をデジタルI/Oに設定
 MOVLW  B'00011110'  
 MOVWF  CMCON0  ;GP0コンパレーター入力; 
 BSF  STATUS,RP0 ;■バンク1;
 MOVLW  B'01110000' ;60h 内部クロックを8MHzに設定;
 MOVWF  OSCCON  ;CLOCK=8MHz;
 MOVLW  B'10100010' ;
 MOVWF  VRCON  ;基準電圧の設定 低電圧0.42V;
 MOVLW  B'00000001' ;
 MOVWF  PIE1  ;TMR1割り込み許可;
 MOVLW  B'11100000' ;
 MOVWF  INTCON   ;割り込み許可;
 MOVLW  B'11010111' ;
 MOVWF  OPTION_REG  ;
  CLRF   ANSEL
 MOVLW  B'00000011'  ;1=入力;
 MOVWF  TRISIO  ;GP0は入力;
 BCF  STATUS,RP0 ;■バンク0;
 MOVLW  B'00010100'
 MOVWF  WDTCON  ;ウォッチドッグON 1024ms;
 MOVLW  D'23'  ;256*23=5888;
 MOVWF  LMHI  ;リミッター設定HI;
 MOVLW  D'112'  ;112+5888=6000us=10000rpm;
 MOVWF  LMLO  ;リミッター設定LOW;
 MOVLW  D'54'  ;128*54=6912us;
 MOVWF  DETIM  ;ドエルタイム設定;
 BCF  PIR1,3
 BCF  GPIO,2
 BCF  GPIO,4
 BCF  GPIO,5
LOWST
 BSF  STATUS,RP0 ;■バンク1;
 MOVLW  B'10100010'   ;
 MOVWF  VRCON  ;基準電圧の設定 低電圧0.42V;
 BCF  STATUS,RP0 ;■バンク0;
 MOVLW  B'00100001' ;プリスケーラ4倍 2us;
 MOVWF  T1CON  ;4us1カウント、LOW1024us、HI262.144ms、229rpm;
 BCF  INTCON,5 ;TMR0割り込み禁止;
 BCF  OV_F,1
 CLRWDT
 BCF  CMCON0,3 ;GP1選択;
 
;******************************;
; オープニングデモ;
;******************************;

 BTFSS  OPNF,0
 GOTO  LOW700  ;1だったらスキップ;
 BCF  OPNF,0
 MOVLW  D'3'  ;オープニングデモ10000rpm 3秒間;
 MOVWF  OPN
OPENING
 MOVLW  D'166'  
 MOVWF  OPN2
OPENING2
 BSF  GPIO,5
 CALL  T03mS  ;1ms待つ;
 CALL  T03mS  ;2ms待つ;
 CALL  T03mS  ;3ms待つ;
 BCF  PIR1,3 
 BCF  CMCON0,3
 BTFSC  PIR1,3 
 GOTO  LOW50
 BCF  PIR1,3 
 BSF  CMCON0,3
 BTFSC  PIR1,3 
 GOTO  LOW500

 BCF  GPIO,5
 CALL  T03mS  ;1ms待つ;
 CALL  T03mS  ;2ms待つ;
 CALL  T03mS  ;3ms待つ;
 CLRWDT
 BCF  PIR1,3 
 BCF  CMCON0,3
 BTFSC  PIR1,3 
 GOTO  LOW50
 BCF  PIR1,3 
 BSF  CMCON0,3
 BTFSC  PIR1,3 
 GOTO  LOW500
 BTFSC  PIR1,3 
 GOTO  LOW1
 DECFSZ  OPN2
 GOTO  OPENING2
 DECFSZ  OPN
 GOTO  OPENING
 BCF  GPIO,5
LOW700
 BCF  PIR1,3 
 BCF  CMCON0,3 ;GP1選択;
 BTFSC  PIR1,3 
 GOTO  LOW50
 BCF  PIR1,3 
 BSF  CMCON0,3 ;GP0選択;
 BTFSC  PIR1,3 
 GOTO  LOW500
 GOTO  LOW700
;**************************;
; 低回転用;
;**************************;
LOW50
 BSF  STATUS,RP0 ;■バンク1;
 MOVLW  B'10100010'   ;
 MOVWF  VRCON  ;基準電圧の設定 低電圧0.42V;
 BCF  STATUS,RP0 ;■バンク0;
 MOVLW  B'00100001' ;プリスケーラ4倍 2us;
 MOVWF  T1CON  ;4us1カウント、LOW1024us、HI262.144ms、229rpm;
 BCF  INTCON,5 ;TMR0割り込み禁止;
 BCF  OV_F,1
 CLRWDT
 BCF  CMCON0,3 ;GP1選択;
LOW1
 BTFSS  PIR1,3   
 GOTO  LOW1
 BSF  GPIO,2
 BSF  GPIO,5
 CLRWDT
LOW2
 BTFSS  PIR1,3    
 GOTO  LOW3
 BCF  PIR1,3
 GOTO  LOW2
LOW3
 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  LOW4
 MOVLW  D'62'  ;62*512us*2=63.488ms 945rpm
 BCF  STATUS,C
    SUBWF  TH,0
 BTFSS  STATUS,C
 GOTO  MAINST200
LOW4
 BCF  OV_F,1
 CALL  T50mS  ;20ms待つ
 BSF  GPIO,4
 BSF  CMCON0,3 ;GP0選択;
 GOTO  LOW100  

LOW500
 BSF  STATUS,RP0 ;■バンク1;
 MOVLW  B'10100010'   ;
 MOVWF  VRCON  ;基準電圧の設定 低電圧0.42V;
 BCF  STATUS,RP0 ;■バンク0;
 MOVLW  B'00100001' ;プリスケーラ4倍 2us;
 MOVWF  T1CON  ;4us1カウント、LOW1024us、HI262.144ms、229rpm;
 BCF  INTCON,5 ;TMR0割り込み禁止;
 BCF  OV_F,1
 CLRWDT
 BSF  CMCON0,3 ;GP0選択;
LOW100
 BTFSS  PIR1,3   
 GOTO  LOW100
 BSF  GPIO,4
 CLRWDT
LOW200
 BTFSS  PIR1,3    
 GOTO  LOW300
 BCF  PIR1,3
 GOTO  LOW200
LOW300
 BCF  GPIO,4
 BCF  PIR1,3 
 MOVFW  TMR1L 
 MOVWF  TL
 MOVFW  TMR1H 
 MOVWF  TH
 CLRF  TMR1L
 CLRF  TMR1H
 BTFSC  OV_F,1
 GOTO  LOW400
 MOVLW  D'62'  ;62*512us*2=63.488ms 945rpm
 BCF  STATUS,C
    SUBWF  TH,0
 BTFSS  STATUS,C
 GOTO  MAINST
LOW400
 BCF  OV_F,1
 CALL  T50mS  ;20ms待つ
 BSF  GPIO,2
 BSF  GPIO,5
 BCF  CMCON0,3 ;GP1選択;
 GOTO  LOW1
;**************************; 
; 通常点火;
;**************************;
MAINST
 BSF  STATUS,RP0 ;■バンク1;
 MOVLW  B'10000101'   ;
 MOVWF  VRCON  ;基準電圧の設定 高電圧2.03V;
 BCF  STATUS,RP0 ;■バンク0;
 MOVLW  B'00000001' ;プリスケーラ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カウント; 
MAIN
 BCF  CMCON0,3 ;GP1選択;
MAIN1
 BTFSS  PIR1,3   
 GOTO  MAIN1
 BSF  GPIO,2
 BSF  GPIO,5
 CLRWDT
MAIN2
 BTFSS  PIR1,3    
 GOTO  MAIN3
 BCF  PIR1,3
 GOTO  MAIN2
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
;リミッター判定;
 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

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
;リミッター制御ここまで;
;ドエルタイム設定;
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  
 BSF  DETIM4,0
  COMF  DETIM2,W
 MOVWF  TMR0
 BCF  INTCON,2 ;TMR0割り込みフラグリセット;
 BSF  INTCON,5 ;TMR0割り込み許可 128usで1カウント; 
 GOTO  MAIN6  ;リミッター制御はじめからここまで18us;
MAIN5
 BSF  GPIO,4
 BSF  DETIM4,0
MAIN6
 BSF  CMCON0,3 ;GP0選択;
 GOTO  MAIN100
;**************************;
2CH GP0&GP4;
;**************************;
MAINST200
 BSF  STATUS,RP0 ;■バンク1;
 MOVLW  B'10000101'   ;
 MOVWF  VRCON  ;基準電圧の設定 高電圧2.03V;
 BCF  STATUS,RP0 ;■バンク0;
 MOVLW  B'00000001' ;プリスケーラ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カウント;
MAIN002
 BSF  CMCON0,3 ;GP0選択;
MAIN100
 BTFSS  PIR1,3   
 GOTO  MAIN100
 BSF  GPIO,4
 CLRWDT
MAIN200
 BTFSS  PIR1,3    
 GOTO  MAIN300
 BCF  PIR1,3
 GOTO  MAIN200
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  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

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
;リミッター制御ここまで;
;ドエルタイム設定;
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 
 BCF  DETIM4,0
  COMF  DETIM2,W
 MOVWF  TMR0
 BCF  INTCON,2 ;TMR0割り込みフラグリセット;
 BSF  INTCON,5 ;TMR0割り込み許可 128usで1カウント; 
 GOTO  MAIN600  ;リミッター制御はじめからここまで18us;
MAIN500
 BSF  GPIO,2
 BSF  GPIO,5
MAIN600 
 BCF  CMCON0,3 ;GP1選択;
 GOTO  MAIN1
;***************************
;タイマサブルーチン
;***************************
   ; << 162.5uS待つサブルーチン >>
T05mS
 MOVLW  D'80'
 MOVWF  T05mCNT
T05mLP 
 NOP                   ; 何もせず1サイクル消費;
  DECFSZ  T05mCNT,F  ; ループ回数-1して0になったら次の命令をスキップ;
 GOTO  T05mLP
  RETURN    ; このサブルーチン呼出し元に戻る;
    ; << 1mS待つサブルーチン >>
T03mS
 MOVLW   D'6'
 MOVWF  T50mCNT
T03mLP
 CALL  T05mS  ; 何もせず1サイクル消費;
 DECFSZ  T50mCNT ,F ; ループ回数-1して0になったら次の命令をスキップ;
 GOTO  T03mLP
 GOTO  $+1
 GOTO  $+1
 GOTO  $+1
 GOTO  $+1
 GOTO  $+1
 GOTO  $+1
 GOTO  $+1
 GOTO  $+1
 GOTO  $+1
 GOTO  $+1
 GOTO  $+1
 GOTO  $+1
 GOTO  $+1
 NOP
      RETURN    ; このサブルーチン呼出し元に戻る;
      
   ; << 20mS待つサブルーチン >>
T50mS
 MOVLW  D'122'  ; ループ回数249を;
 MOVWF  T50mCNT  ;  セット;
T50mLP
 CALL  T05mS  ; 何もせず1サイクル消費;
 DECFSZ  T50mCNT,F ; ループ回数-1して0になったら次の命令をスキップ;
 GOTO  T50mLP
  RETURN    ; このサブルーチン呼出し元に戻る;
   ; << 10mS待つサブルーチン >>
T10mS
 MOVLW  D'61'  ; ループ回数を;
 MOVWF  T50mCNT  ;  セット;
T10mLP
 CALL  T05mS   ; 何もせず1サイクル消費;
 DECFSZ  T50mCNT,F ; ループ回数-1して0になったら次の命令をスキップ;
 GOTO  T10mLP
  RETURN   ; このサブルーチン呼出し元に戻る;
       
  END
;******ここまで*******;