Just after a bit of help with TMR0
I have hacked Darrell's SSPWM routine and am now adapting it to use TRM0 instead of TMR1.
Now I note you cant stop/start TMR0 I dont think that's a major issue in my application which is generating a 2khz pwm.
I'm confused with the reloading of the prescaler i'm going to use 1/4 with a preload of 6 and 8mhz int clock to generate an interrupt at 2000hz.
After the interrupt is dealt with and I reload TMR0 with my PWM duty + preload do I have to reassign the prescaler every time?
My hacked start SSPWM code is below.
Config
Code:
'OPTION_REG = %00000001 'Set Option Reg for TMR0 and prescaler 1/4
Start SSPWM
Code:
StartSPWM: 'Set DutyCycle before calling
'For TMR0 2khz pwm and 8mhz clock Ticks = xxx per cycle
GIE = 1
PEIE = 1
TMR0_ON_TICKS = DutyCycle '(DutyCycle must be between 25 - 225 (10-90%)
TMR0_OFF_TICKS = 255 - TMR0_ON_TICKS
TMR0_ON_VAL = 255 - TMR0_ON_TICKS + 6
TMR0_OFF_VAL = 255 - TMR0_OFF_TICKS + 6
TMR0IE = 1 'Enable TMR0 interrupt enable bit (1 = enabled)
TMR0IF = 0 'Clear TMR0 interrupt flag
TMR0 = 255 'Load TMR0 with 255 First tick will cause an interrupt
1/4 Prescaler setup here ?????
return
My hacked Int routine is below
Code:
asm
INT_CODE
if (CODE_SIZE <= 2)
movwf wsave ; copy W to wsave register
swapf STATUS,W ; swap status reg to be saved into W
clrf STATUS ; change to bank 0 regardless of current bank
movwf ssave ; save status reg to a bank 0 register
movf PCLATH,w ; move PCLATH reg to be saved into W reg
movwf psave ;6 ; save PCLATH reg to a bank 0 register
endif
btfss INTCON, TMR0IF ; is TMR0IF set? Timer0 Interrupt Flag
GOTO NoTimerInt ; No. Bypass timer load
btfss _SPWMstate ; Is Output High?
GOTO TurnON ;9/15 ; No.
TurnOFF
bcf _CmdPwr ; Set CmdPwr Low
bcf _SPWMstate ;
MOVF _TMR0_OFF_VAL,W ; 1
ADDWF TMR0,F ; 1 ; reload timer with correct value
GOTO TimerDone ;12/27
TurnON
bsf _CmdPwr ; Set CmdPwr High
bsf _SPWMstate ;
MOVF _TMR0_ON_VAL,W ; 1
ADDWF TMR0,F ; 1 ; reload timer with correct value
TimerDone
1/4 Prescaler setup here ?????
bcf INTCON, TMR0IF ; 1/28 ; Clear Timer0 Interrupt Flag
NoTimerInt
Movf psave,w ; Restore the PCLATH reg
Movwf PCLATH
swapf ssave,w ; Restore the STATUS reg
movwf STATUS
swapf wsave,f
swapf wsave,w ; 6/34 ; Restore W reg
Retfie ; Exit the interrupt routine
endasm
Bookmarks