I am using a PIC16F819 and I am using a Timer1 interrupt on it. I now need to add a second (Timer2) interrupt into my program. I have printed and read the following files of Darrel Taylor's to try and wrap my head around the concept of how to make this happen. I have spent two days reading a lot of posts and examples from others on this forum, but being a rookie is weighing heavy on my progress. I hope someone can shed some light on what I am not understanding on this issue.
.bas files:
DT_INTS-14.bas
ReEnterPBP.bas
Here is what I am currently attempting to do, please review and let me know what to do. I am sure mine is incorrect, but I am trying none the less. TMR2 has no TMR2L or TMR2H according to data sheet. But not sure what to do.
Code:
OSCCON = %00000000 '32kHz
ADCON1=7 'Digital
TRISA = %01010100
TRISB = %01000000
PORTA = %00000000
PORTB = %00000010
TICK1 VAR BYTE
TOCK1 VAR BYTE
TICK2 VAR BYTE
TOCK2 VAR BYTE
TICK1=0:TOCK1=0:TICK2=0:TOCK2=0
INCLUDE "DT_INTS-14.bas"
INCLUDE "ReEnterPBP.bas"
ASM
INT_LIST macro
INT_Handler TMR1_INT, ReloadTMR1, ASM, no
INT_Handler TMR1_INT, _T1handler, PBP, yes
INT_Handler TMR2_INT, ReloadTMR2, ASM, no
INT_Handler TMR2_INT, _T2handler, PBP, yes
endm
INT_CREATE
ENDASM
@Freq = 10
@Prescaler = 8
T1CON = $00
TMR1 OFF
T2CON = $00
TMR2 OFF
@ INT_ENABLE TMR1_INT
@ INT_ENABLE TMR2_INT
Main:
IF TOCK1 = 3 then
PULSOUT PORTA.0,20 'RED LED BLINKS ONCE
GOSUB StopTimer1
ENDIF
IF TOCK2 = 9 then
PULSOUT PORTA.1,20 'GREEN LED BLINKS ONCE
GOSUB StopTimer2
ENDIF
GOTO Main
''''''''''''''''''''TIMER INTERRUPTS''''''''''''''''''''''''''''''''''''''''
T1handler:
TICK1 = TICK1 + 1
If TICK1 = 46 then
TOCK1 = TOCK1 + 1
TICK1 = 0
ENDIF
@ INT_RETURN
T2handler:
TICK2 = TICK2 + 1
If TICK2 = 46 then
TOCK2 = TOCK2 + 1
TICK2 = 0
ENDIF
@ INT_RETURN
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
ASM
ReloadInst = 8
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
Timer1 VAR WORD EXT
TimerReload CON EXT
TMR1ON VAR T1CON.0
@Timer2 = TMR2L
Timer2 VAR WORD EXT
Timer2Reload CON EXT
TMR2ON VAR T2CON.0
'''''''''''''''''''''''RELOAD TIMER1''''''''''''''''''''''''''''''''''
ASM
ReloadTMR1
MOVE?CT 0, T1CON, TMR1ON
MOVLW LOW(TimerReload)
ADDWF TMR1L,F
BTFSC STATUS,C
INCF TMR1H,F
MOVLW HIGH(TimerReload)
ADDWF TMR1H,F
MOVE?CT 1, T1CON, TMR1ON
INT_RETURN
ENDASM
'''''''''''''''''''''''RELOAD TIMER2''''''''''''''''''''''''''''''''''
ASM
ReloadTMR2
MOVE?CT 0, T2CON, TMR2ON
MOVLW LOW(TimerReload)
ADDWF TMR2L,F
BTFSC STATUS,C
INCF TMR2H,F
MOVLW HIGH(TimerReload)
ADDWF TMR2H,F
MOVE?CT 1, T2CON, TMR2ON
INT_RETURN
ENDASM
'''''''''''''''''''''''''''TIMER STARTS''''''''''''''''''''''''''''''
StartTimer1:
Timer1 = TimerReload
TMR1ON = 1
RETURN
StartTimer2:
Timer2 = TimerReload
TMR2ON = 1
RETURN
'''''''''''''''''''''''''''TIMER STOPS'''''''''''''''''''''''''''''''
StopTimer1:
TMR1ON = 0
RETURN
StopTimer2:
TMR2ON = 0
RETURN
Thanks in advance for the help,
ronbo
Bookmarks