Now I use this DT routine -> http://darreltaylor.com/DT_INTS-14/TimerTemplate.html
Hurray, I can set my desired interrupt frequency, so I can get my desired output frequency. It's the same principle of your code above.
But I've a little problem :
I like to define this ASM variable (@Freq = 10 ) to a PBP variable (for modify it in PBP and display it on the LCD for example).
I've tried this :
intfreq VAR WORD
intfreq=5000
@Freq = _intfreq
But it doesn't work at all.
Here's the DT timer template code :
Code:; Initialize your hardware first DEFINE OSC 20 INCLUDE "DT_INTS-14.bas" ; Base Interrupt System INCLUDE "ReEnterPBP.bas" ; Include if using PBP interrupts ASM INT_LIST macro ; IntSource, Label, Type, ResetFlag? INT_Handler TMR1_INT, ReloadTMR1, ASM, no ; MUST be first INT_Handler TMR1_INT, _T1handler, PBP, yes endm INT_CREATE ; Creates the interrupt processor ENDASM ;--- Change these to match the desired interrupt frequency ------------------- ;--- See http://DarrelTaylor.com/DT_INTS-14/TimerTemplate.html for more Info. @Freq = 10 ; Frequency of Interrupts in Hz @Prescaler = 8 ; Timers Prescaler setting T1CON = $30 ; $30 = Prescaler 1:8, TMR1 OFF ; $00=1:1, $10=1:2, $20=1:4, $30=1:8 -- Must match @Prescaler value @ INT_ENABLE TMR1_INT ; enable Timer 1 interrupts GOSUB StartTimer ; Start the Timer ;____Your Main Program goes here______________________________________________ Main: ; ---- Your Main Program goes here ---- GOTO Main ;____This routine is Called on each TMR1 Interrupt____________________________ T1handler: ; ---- Your interrupt routine goes here ---- @ INT_RETURN ;---[TMR1 reload - interrupt handler]----------------------------------------- ASM ; Calculate Timer Reload Constant ReloadInst = 8 ; # of Intructions used to reload timer if ((Prescaler == 1)||(Prescaler == 2)||(Prescaler == 4)||(Prescaler == 8)) MaxCount = 65536 + (ReloadInst / Prescaler) TimerReload = MaxCount - (OSC*1000000/4/Prescaler/Freq) if ((TimerReload < 0) || (TimerReload > (65535-ReloadInst))) error Invalid Timer Values - check "OSC", "Freq" and "Prescaler" endif else error Invalid Prescaler endif ENDASM @Timer1 = TMR1L ; map timer registers to a word variable Timer1 VAR WORD EXT TimerReload CON EXT ; Get the External Constant TMR1ON VAR T1CON.0 ; Alias the Timers ON/OFF bit ;---Reload Timer1------ ASM ReloadTMR1 MOVE?CT 0, T1CON, TMR1ON ; 1 stop timer MOVLW LOW(TimerReload) ; 1 Add TimerReload to the ADDWF TMR1L,F ; 1 value in Timer1 BTFSC STATUS,C ; 1/2 INCF TMR1H,F ; 1 MOVLW HIGH(TimerReload) ; 1 ADDWF TMR1H,F ; 1 MOVE?CT 1, T1CON, TMR1ON ; 1 start timer INT_RETURN ENDASM ;---Start/Stop controls ----- StartTimer: Timer1 = TimerReload ; Load Timer TMR1ON = 1 ; start timer RETURN StopTimer: TMR1ON = 0 ; stop timer RETURN




Bookmarks