;=====================================================================================================================================================
;========== nyemipwmcomcdi. Nyemi CDI ignition program.  PIC 16F628 4Mhz or PIC 16f628A.                                                    ==========
;========== 2011.05.27.                                            ---O---                                                                  ==========
;========== Reference voltage output 2,41 voltage(servicing)--RA2 o       o RA1-- Comparator module input (PWM ouput On<< 2,41Voltage <<Off)==========
;==========                                                   RA3 o       o RA0--   4Mhz                                                    ==========
;==========                                                   RA4 o       o RA7--   Quartz or ceramic resonator.                            ==========
;==========               5V--{10Kohm}--MCLR     Pin1 ICSP  --RA5 o       o RA6                                                             ==========
;==========                                      Pin3 ICSP  --VSS o       o VDD-- Pin2 ICSP                                                 ==========
;==========                    SCR (thyristor) ouput (300uS)--RB0 o       o RB7-- Pin4 ICSP     ICSP pin PICkit2 programmer.                ==========
;==========             5V--{4,7Kohm}--Hall input (unipolar)--RB1 o       o RB6-- Pin5 ICSP                                                 ==========
;==========                                                   RB2 o       o RB5-- Inverted output (TCI ignition)                            ==========
;==========                 PWM ouput 27Khz 49% duty cycle  --RB3 o       o RB4-- Strobelight ouput (300uS) Rb0 the RB4 and the equivalent. ==========
;==========     (high voltage TLP250-IRFZ44,flyback converter)     -------                                                                  ==========
;=====================================================================================================================================================
            LIST      P=16F628, F=INHX8M
            include "P16F628.inc"
            ORG     0x0000    
            GOTO    Label_0001
            ORG     0x0004             
            MOVWF   0x70
            SWAPF   STATUS    , W
            CLRF    STATUS
            MOVWF   0x71
            INCF    0x27      , F      ;TMR0 interrupt  0x27=TMR0 overflow registers
            BCF     INTCON    , T0IF    
            CLRF    CCPR1L             ;pwm  off RB3 ouput (high voltage)
            SWAPF   0x71      , W
            MOVWF   STATUS
            SWAPF   0x70      , F
            SWAPF   0x70      , W
            RETFIE
            NOP                        ;ignition advance table 917 RPM--468750 RPM
            RETLW	0000
            RETLW	0000
            RETLW	0000
            RETLW	0000
            RETLW	0000
            RETLW	0000
            RETLW	0000
            RETLW	0001
            RETLW	0001
            RETLW	0002
            RETLW	0002
            RETLW	0002
            RETLW	0003
            RETLW	0003
            RETLW	0004
            RETLW	0004
            RETLW	0005
            RETLW	0005
            RETLW	0006
            RETLW	0006
            RETLW	0006
            RETLW	0007
            RETLW	0007
            RETLW	0007
            RETLW	0007
            RETLW	0007
            RETLW	0007
            RETLW	0007
            RETLW	0007
            RETLW	0007
            RETLW	0007
            RETLW	0007
            RETLW	0007
            RETLW	0007
            RETLW	0007
            RETLW	0007
            RETLW	0006
            RETLW	0006
            RETLW	0006
            RETLW	0006
            RETLW	0007
            RETLW	0007
            RETLW	0007
            RETLW	0007
            RETLW	0007
            RETLW	0007
            RETLW	0007
            RETLW	0007
            RETLW	0007
            RETLW	0009
            RETLW	0009
            RETLW	0009
            RETLW	0009
            RETLW	000A
            RETLW	000A
            RETLW	000A
            RETLW	000A
            RETLW	000B
            RETLW	000B
            RETLW	000B
            RETLW	000B
            RETLW	000B
            RETLW	000B
            RETLW	000B
            RETLW	000B
            RETLW	000D
            RETLW	000D
            RETLW	000D
            RETLW	000D
            RETLW	000E
            RETLW	000E
            RETLW	000F
            RETLW	000F
            RETLW	0010
            RETLW	0010
            RETLW	0011
            RETLW	0011
            RETLW	0012
            RETLW	0012
            RETLW	0012
            RETLW	0012
            RETLW	0014
            RETLW	0014
            RETLW	0015
            RETLW	0015
            RETLW	0016
            RETLW	0016
            RETLW	0017
            RETLW	0017
            RETLW	0018
            RETLW	0018
            RETLW	0019
            RETLW	001A
            RETLW	001A
            RETLW	001A
            RETLW	001A
            RETLW	001C
            RETLW	001D
            RETLW	001D
            RETLW	001E
            RETLW	001E
            RETLW	001F
            RETLW	0020
            RETLW	0020
            RETLW	0021
            RETLW	0022
            RETLW	0022
            RETLW	0023
            RETLW	0023
            RETLW	0024
            RETLW	0025
            RETLW	0025
            RETLW	0026
            RETLW	0027
            RETLW	0028
            RETLW	0028
            RETLW	0028
            RETLW	002A
            RETLW	002A
            RETLW	002B
            RETLW	002C
            RETLW	002D
            RETLW	002D
            RETLW	002E
            RETLW	002F
            RETLW	0030
            RETLW	0030
            RETLW	0031
            RETLW	0032
            RETLW	0033
            RETLW	0033
            RETLW	0034
            RETLW	0035
            RETLW	0036
            RETLW	0037
            RETLW	0037
            RETLW	0038
            RETLW	0038
            RETLW	003A
            RETLW	003B
            RETLW	003C
            RETLW	003C
            RETLW	003D
            RETLW	003E
            RETLW	003F
            RETLW	0040
            RETLW	0041
            RETLW	0042
            RETLW	0043
            RETLW	0043
            RETLW	0044
            RETLW	0045
            RETLW	0046
            RETLW	0047
            RETLW	0048
            RETLW	0049
            RETLW	004A
            RETLW	004B
            RETLW	004C
            RETLW	004D
            RETLW	004E
            RETLW	004F
            RETLW	0050
            RETLW	0051
            RETLW	0052
            RETLW	0053
            RETLW	0054
            RETLW	0054
            RETLW	0056
            RETLW	0057
            RETLW	0058
            RETLW	0059
            RETLW	005A
            RETLW	005B
            RETLW	005C
            RETLW	005D
            RETLW	005E
            RETLW	005F
            RETLW	0060
            RETLW	0061
            RETLW	0062
            RETLW	0063
            RETLW	0064
            RETLW	0065
            RETLW	0066
            RETLW	0067
            RETLW	0069
            RETLW	006A
            RETLW	006B
            RETLW	006C
            RETLW	006D
            RETLW	006E
            RETLW	006F
            RETLW	0070
            RETLW	0072
            RETLW	0073
            RETLW	0074
            RETLW	0074
            RETLW	0076
            RETLW	0077
            RETLW	0079
            RETLW	007A
            RETLW	007B
            RETLW	007C
            RETLW	007D
            RETLW	007F
            RETLW	0080
            RETLW	0081
            RETLW	0082
            RETLW	0083
            RETLW	0085
            RETLW	0086
            RETLW	0087
            RETLW	0088
            RETLW	008A
            RETLW	008B
            RETLW	008C
            RETLW	008E
            RETLW	008F
            RETLW	0090
            RETLW	0091
            RETLW	0093
            RETLW	0094
            RETLW	0095
            RETLW	0097
            RETLW	0098
            RETLW	0099
            RETLW	009B
            RETLW	009C
            RETLW	009D
            RETLW	009F
            RETLW	00A0
            RETLW	00A1
            RETLW	00A3
            RETLW	00A4
            RETLW	00A5
            RETLW	00A6
            RETLW	00A6
            RETLW	00A7
            RETLW	00A8
            RETLW	00A8
            RETLW	00A9
            RETLW	00AA
            RETLW	00AB
            RETLW	00AB
            RETLW	00AC
            RETLW	00AC
            RETLW	00AC
            RETLW	00AE
            RETLW	00AF
            RETLW	00B0
            RETLW	00B0
            RETLW	00B1
            RETLW	00B2
            RETLW	00B2
            RETLW	00B3
            RETURN
Label_0006  BCF     STATUS    , RP1
            BCF     STATUS    , RP0
            MOVF    0x22      , W
            MOVWF   PCLATH
            MOVF    0x21      , W
            MOVWF   PCL
            RETURN
Label_0001  BCF     STATUS    , RP1
            BCF     STATUS    , RP0
            MOVLW   0x25
            MOVWF   CMCON               ;comparator module Initialization
            BCF     STATUS    , RP1
            BSF     STATUS    , RP0
            MOVLW   0x26                ;RA1=comparator module input 
            MOVWF   TRISA               ;high voltage on(pwm output RB3)<< 2,41Voltage <<high voltage off (pwm output RB3)
            MOVLW   0xC8
            MOVWF   VRCON               ;RA2=Reference voltage output  2,41 voltage (servicing output)
            MOVLW   0x02
            MOVWF   TRISB               ;RB1= HALL sensor input. RB0, RB2-RB7 ouput
            MOVLW   0x07
            MOVWF   OPTION_REG          ;OPTION_REG 07=256uS prescaler TMR0 counter  
            MOVLW   0x24
            MOVWF   PR2
            BCF     STATUS    , RP1
            BCF     STATUS    , RP0
            CLRF    PORTA
            MOVLW   0x20
            MOVWF   PORTB
            CLRF    TMR2
            MOVLW   0x04
            MOVWF   T2CON
            MOVLW   0x12  
            MOVWF   CCPR1L              ;RB3=PWM 27Khz 49% duty cycle  Alterable!! 
            MOVLW   0x0C
            MOVWF   CCP1CON
            CLRF    0x24
            CLRF    0x27
            CLRF    TMR0                ;clear TMR0
            MOVLW   0xA0
            MOVWF   INTCON              ;interrupt Initialization 
Label_0003  BTFSC   CMCON     , C2OUT   ;Comparator module input. High Voltage Monitoring
            CLRF    CCPR1L              ;pwm off (high voltage off)RB3 ouput
            BTFSC   PORTB     , 01      ;BTFSC = wait for high pulse on Hall switch. 
            GOTO    Label_0002          ;BTFSS = wait for low pulse on Hall switch (inverted input) Alterable!! 
            MOVLW   0x01
            MOVWF   0x24
            GOTO    Label_0003 
Label_0002  MOVF    0x24      , F
            BTFSC   STATUS    , Z
            GOTO    Label_0003
            CLRF    INTCON              ;interrupt clear
            CLRF    CCPR1L              ;pwm off (high voltage off)
            MOVF    TMR0      , W
            MOVWF   0x25
            CLRF    TMR0
            MOVLW   0x01
            SUBWF   0x27      , W       ;interrupt registers(0x27) value inspection
            BTFSC   STATUS    , Z            
            GOTO    Label_0011          ;458--917 RPM Yes (~15°degree)
            BTFSC   STATUS    , C 
            GOTO    Label_0007          ;no spark< 458RPM
            GOTO    Label_0005          ;917RPM< Table values
Label_0011  NOP
            NOP                         ;delay time value=458-917RPM~15°degree Initialization 
            NOP                               
            NOP                         ;delay time
            NOP                         ;((5NOP)11uS × TMR0 value)+RETLW 255 at current value (00B3=15degree)Alterable!! Excel table
            MOVF    0x25      , F
            BTFSC   STATUS    , Z
            GOTO    Label_0010
            DECF    0x25      , F
            GOTO    Label_0011
Label_0010  MOVLW   0xFF
            MOVWF   0x25
Label_0005  MOVF    0x25      , W
            ADDLW   00E8                ;RPM limiter   ED=12669 RPM     Alterable!! Excel table
            BTFSS   STATUS    , C
            GOTO    Label_0012
            MOVF    0x25      , W
            ADDLW   0x11
            MOVWF   0x21
            MOVLW   0x00
            BTFSC   STATUS    , C
            ADDLW   0x01
            MOVWF   0x22
            MOVF    PCLATH    , W 
            MOVWF   0x20
            CALL    Label_0006
            MOVWF   0x23
            MOVF    0x20      , W
            MOVWF   PCLATH
            MOVF    0x23      , F
            BTFSC   STATUS    , Z
            GOTO    Label_0007
Label_0008  NOP
            NOP
            NOP
            NOP
            NOP
            NOP                        ;RETLW value(0x23 registers) x 15uS=12 NOP    Alterable!! Excel table
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            DECFSZ  0x23      , F
            GOTO    Label_0008
Label_0007  MOVLW   0x31
            XORWF   PORTB     , F      ;Output: RB0,RB4, (on)
            MOVLW   0x32               ;Output reverse: RB5,(off)
            MOVWF   0x26                   
Label_0009  NOP                        ;Output time(dwell):(3NOP)= 6uS x 0x26 registers (6x(32=50)=300uS) Alterable!!
            NOP
            NOP
            DECFSZ  0x26      , F
            GOTO    Label_0009
            MOVLW   0x31               ;Output: RB0,RB4, (off)
            XORWF   PORTB     , F      ;Output reverse: RB5,(on)
            CLRF    TMR2               ;TMR2 counter clear
            MOVLW   0x12
            MOVWF   CCPR1L             ;PWM Initialization (high voltage on)
Label_0012  CLRF    0x24               ;Imput registers (0x24) clear
            CLRF    0x27               ;TMR0 counter overflow registers(0x27) clear
            MOVLW   0xA0
            MOVWF   INTCON             ;interrupt Initialization 
            GOTO    Label_0003
            GOTO    Label_0001    

            ORG     0x2007
            DATA    3F50               ;Config Bytes:3F61=(Oscillator=XT, WDT=OFF, PWRT=ON, MCLR=ON, BODEN=ON, LVP=OFF, CPD=OFF, CP=OFF,)    
                                       ;Or: 3F70=(Oscillator=IntRC I/O, WDT=OFF, PWRT=ON, MCLR=ON, BODEN=ON, LVP=OFF, CPD=OFF, CP=OFF,)
            END                        ;Or: 3F50=(Oscillator=IntRC I/O, WDT=OFF, PWRT=ON, MCLR=OFF, BODEN=ON, LVP=OFF, CPD=OFF, CP=OFF,)             
