;************************************************************************************************************************************ ;* * ;* Inverter * ;* version 1.0.01 16 Aug 2012 * ;* Using devicde type PIC12F509 * ;* * ;* (pin 1) Vdd +5vDC. (pin 8) Vss 0v/Gnd. * ;* (pin 2) GPIO_b5 (pin 7) GPIO_b0 (Drive 0) * ;* (pin 3) GPIO_b4 (pin 6) GPIO_b1 (Drive 1) * ;* (pin 4) GPIO_b3 (pin 5) GPIO_b2 (Heartbeat) * ;* * ;************************************************************************************************************************************ list p=12F509, f=inhx8m ; microcontroller & base. include "P12F509.inc" ; register memory mapping file. __CONFIG _CP_OFF & _WDT_ON & _MCLRE_OFF & _IntRC_OSC ; _CONFIG options available: ; Code protect _CP_ON _CP_OFF. ; Oscillator _LP_OSC _XT_OSC _IntRC_OSC _ExtRC_OSC. ; Watch Dog Timer _WDT_ON _WDT_OFF. ; MasterCLR MCLRE_ON MCLRE_OFF. ;************************************************************************************************************************************ ;* System variables * ;************************************************************************************************************************************ FIVE_mSEC_COUNT equ H'0013' ; 5 MiliSecond counter. FIVEHUN_mSEC_COUNT equ H'0015' ; 500 MiliSecond counter. drive_count equ H'0016' ; drive counter FLAGS equ H'0018' ; General purpose flag ; b0 - 5mS marker flag. ; b1 - 500mS marker flag. ; b2 - ; b3 - ; b4 - ; b5 - ; b6 - ; b7 - ;************************************************************************************************************************************ ;* System constants * ;************************************************************************************************************************************ W equ H'0000' ; destination W - Working register. f equ H'0001' ; destination f - File. Five_mS_marker equ H'0001' ; 5mS timing marker (F2/1). Fivehun_mS_marker equ H'0002' ; 500mS timing marker (F2/2). b0 equ H'0000' ; Bit 0 b1 equ H'0001' ; Bit 1 b2 equ H'0002' ; Bit 2 b3 equ H'0003' ; Bit 3 b4 equ H'0004' ; Bit 4 b5 equ H'0005' ; Bit 5 b6 equ H'0006' ; Bit 6 b7 equ H'0007' ; Bit 7 Drive_0 equ H'0000' ; Drive 0 Drive_1 equ H'0001' ; Drive 1 Heartbeat equ H'0002' ; Heartbeat ;************************************************************************************************************************************ ;* reset vector * ;************************************************************************************************************************************ RESET org H'0000' ; reset vector address goto INITIALISE ; start program execution ;************************************************************************************************************************************ ;* system initialisation * ;************************************************************************************************************************************ INITIALISE bcf STATUS,PA0 ; goto bank0 movlw b'11000101' ; /GPWU off, /GPPU off, TOCS fOSC/4, TOSE TE, PSA TMR0, ; Ratio 64:1 (b'11000101') OPTION ; OPTION REGISTER setup... ; b7 - /GPWU wake up on change (GP1,GP2,GP3) 0=enabled, 1=disabled ; b6 - /GPPU weak pull up resistors (GP1,GP2,GP3) 0=enabled, 1=disabled ; b5 - TOCS TMR0 timer scourse 0=fOCS/4 pin 1=TOCKI ; b4 - TOSE TMRO edge select 0=leading edge 1= trailing edge ; b3 - PSA 0=TMR0 1=WDT ; b2-b0 - Preescaler ratio clrwdt ; clear watchdog timer clrf TMR0 ; clear TMR0 clrf GPIO ; portb configuration (all output where available)... movlw b'111000' ; b0 - (OUTPUT) Drive 0 TRIS GPIO ; b1 - (OUTPUT) Drive 1 ; b2 - (OUTPUT) Heartbeat ; b3 - (INPUT) ; b4 - (INPUT) ; b5 - (INPUT) movlw H'0003' movwf FIVE_mSEC_COUNT ; 5mS counter. movlw H'0064' movwf FIVEHUN_mSEC_COUNT ; 500mS counter. movlw H'0004' ; movwf drive_count ; 500mS counter. clrf FLAGS ; Clear all working flags. ;************************************************************************************************************************************ ;* Main program loop * ;************************************************************************************************************************************ MAIN_LOOP movlw h'00E6' ; Timer service... addwf TMR0,W ; - " - btfsc STATUS,C ; - " - call SOFT_TIMING ; - " - btfsc FLAGS,Five_mS_marker ; Heartbeat service... call M_SINE ; - " - btfsc FLAGS,Fivehun_mS_marker ; Heartbeat service... call HEARTBEAT ; - " - goto MAIN_LOOP ; Return to beginning of MAIN_LOOP ;************************************************************************************************************************************ ;* Heartbeat * ;************************************************************************************************************************************ HEARTBEAT bcf FLAGS,Fivehun_mS_marker ; Heartbeat processor... btfss GPIO,Heartbeat ; goto HB#1 ; bcf GPIO,Heartbeat ; turn on heartbeat LED retlw H'0000' ; HB#1 bsf GPIO,Heartbeat ; turn off heartbeat LED retlw H'0000' ; ;************************************************************************************************************************************ ;* Modified Sine * ;************************************************************************************************************************************ M_SINE bcf FLAGS,Five_mS_marker ; Sine processor... movf drive_count,w ; addwf PCL,f ; goto M_SINE#1 ; goto M_SINE#2 ; goto M_SINE#3 ; goto M_SINE#4 ; M_SINE#1 bcf GPIO,Drive_1 ; turn off phase 2 goto M_SINE#5 ; M_SINE#2 bsf GPIO,Drive_1 ; turn on phase 2 goto M_SINE#5 ; M_SINE#3 bcf GPIO,Drive_0 ; turn off phase 1 goto M_SINE#5 ; M_SINE#4 bsf GPIO,Drive_0 ; turn on phase 1 goto M_SINE#5 ; M_SINE#5 decfsz drive_count ; retlw H'0000' ; movlw H'0004' ; movwf drive_count ; retlw H'0000' ; ;************************************************************************************************************************************ ; Master clock & timing signal generator routine * ;************************************************************************************************************************************ SOFT_TIMING clrwdt ; Cleear Watchdog timer. clrf TMR0 ; 1.67mS timimg... decfsz FIVE_mSEC_COUNT,F ; 5mS timing... retlw H'0000' ; RETLW H'0000' as there is no RETURN on PIC12F509 movlw H'0003' ; movwf FIVE_mSEC_COUNT ; ...and finally arives here every 5mS. bsf FLAGS,Five_mS_marker ; generate 5mS timing marker decfsz FIVEHUN_mSEC_COUNT,F ; 500mS timing... retlw H'0000' ; RETLW H'0000' as there is no RETURN on PIC12F509 movlw H'0064' ; movwf FIVEHUN_mSEC_COUNT ; ...and finally arives here every 500mS. bsf FLAGS,Fivehun_mS_marker ; generate 500mS timing marker retlw H'0000' ; RETLW H'0000' as there is no RETURN on PIC12F509 - return to main program loop... end ; End of program.