自作イグナイタ その11

プログラム編の最終です。
 
これまで簡単な説明と共にプログラムを紹介してきました。今回はプログラムのみをすべて紹介します。
 
一度紹介しておりますが、少し変更があったので・・・
 
これで「自作イグナイタシリーズ」も終わりかと思いましたが、先日久々にCB-Fに乗ったとこを失火の嵐???
 
終いには走行不能に・・・
 
ノーマルイグナイタを搭載していたので事なきを得ましたが、今のところ原因が解らず(涙
 
ハードなのかソフトなのか???もうしばらく連載は続くようです(笑
 
 
 
ここからプログラムソース↓
 
;**************************************************************;
;PIC12F683;
;コンパレーター;
;GP0アナログ入力、GP2出力;
;GP1アナログ入力、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-5)をデジタルI/Oに設定
 MOVLW  B'00011110'  
 MOVWF  CMCON0  ;GP0,1コンパレーター入力; 
 BSF  STATUS,RP0 ;バンク1;
 MOVLW  B'01110000' ;内部クロックを8MHzに設定;
 MOVWF  OSCCON  ;CLOCK=8MHz;
 MOVLW  B'10000101' ;10100010;
 MOVWF  VRCON  ;基準電圧の設定 低電圧2.03V;
 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,1は入力;
 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'10000101'   ;
 MOVWF  VRCON  ;基準電圧の設定 低電圧2.03V;
 BCF  STATUS,RP0 ;バンク0;
 MOVLW  B'00100001' ;B'00110001'  ;プリスケーラ4倍 2us;
 MOVWF  T1CON  ;4us1カウント、LOW1024us、HI262.144ms、229rpm;
 BCF  INTCON,5 ;TMR0割り込み禁止;
 BCF  OV_F,1
 CLRWDT
 BCF  CMCON0,3 ;GP1選択;
;***********************
;オープニングデモ;
;***********************

 BTFSC  OPNF,0  
 GOTO  LOW700  ;1だったらスキップ;
 BSF  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'10001111' ;10100010;
 MOVWF  VRCON  ;基準電圧の設定 低電圧3.59V;
 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'10001111' 
 MOVWF  VRCON  ;基準電圧の設定 低電圧3.59V;
 BCF  STATUS,RP0 ;バンク0;
 MOVLW  B'00100001' ;B'00110001'  ;プリスケーラ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
;***********************************  
;通常点火 Aシリンダー&タコメーター;
;***********************************
MAINST
 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
 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選択;
 CALL  T03mS  ;1ms待つ;
 CALL  T03mS  ;2ms待つ;
 GOTO  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カウント;
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選択;
 CALL  T03mS  ;1ms待つ;
 CALL  T03mS  ;2ms待つ;
 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'     ; 5
 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'       ; ループ回数249を
 MOVWF  T50mCNT     ;  セット
T10mLP
 CALL  T05mS                ; 何もせず1サイクル消費
 DECFSZ  T50mCNT,F   ; ループ回数-1して0になったら次の命令をスキップ
 GOTO  T10mLP      ;
  RETURN              ; このサブルーチン呼出し元に戻る
       
  END