I get a 100Hz output frequency on PORTD.7.
Yes, but you still need to keep the reloading code in the interrupt routine otherwise the timer will "freewheel" again.
In your code, as the very first thing in the ISR, you are currently overwriting the TMR1 register with the value of a variable called timer.
Code:
' PWM calculation and update interrupt (Timer 1)
pwmint:
' Timer 1 update
TMR1L=timer.lowbyte '<---This is overwriting the TMR1 registers!
TMR1H=timer.highbyte
So, once the code gets to "copying" the TMR1 registers and adding the reload value to it you have overwritten it with something else.
I've just tested the following code here:
Code:
DEFINE LOADER_USED 1
DEFINE OSC 20
INCLUDE "DT_INTS-18.bas"
INCLUDE "ReEnterPBP-18.bas"
INCLUDE "IncPID.pbp"
TMRCopy VAR WORD
TimerReloadValue VAR WORD
TimerReloadValue = 63000
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler TMR1_INT, _TimezUp, PBP, yes
endm
INT_CREATE ; Creates the interrupt processor
ENDASM
@ INT_ENABLE TMR1_INT ; enable Timer 1 interrupts
TRISB.0 = 1 ' +button
TRISA.4 = 1 ' -button
TRISB.3 = 0 ' Output to measure interrupt frequency
CMCON = 7
ADCON1 = %00001111 ' No analog inputs.
T1CON.0 = 1 ' Start TMR1
Main:
If PortB.0 = 0 then
TimerReloadValue = TimerReloadValue + 1
LCDOUT $FE,1,#TimerReloadValue
ENDIF
If PortA.4 = 0 then
TimerReloadValue = TimerReloadValue - 1
LCDOUT $FE,1,#TimerReloadValue
ENDIF
Pause 20
Goto Main
' ---------- Interrupt handler ------------
TimezUp:
T1CON.0 = 0 ' Stop TMR1
TMRCopy.HighByte = TMR1H ' Copy value of TMR1 registers
TMRCopy.LowByte = TMR1L
TMRCopy = TMRCopy + TimerReloadValue ' Add reload value (compensates for overhead)
TMR1H = TMRCOPY.HighByte ' And back to TMR1
TMR1L = TMRCopy.LowByte
T1CON.0 = 1 ' Restart Timer
Toggle PortB.3
@ INT_RETURN
And it works fine. Pushing the buttons connected to PortB.0 and PortA.4 increases/decreases the reload value for the timer and the interrupt frequency.
But, again, a change of 1 at the "top" will not result in the same change in interrupt frequency as a change of 1 at the "botton".
Bookmarks