Just setup Timer1 with a variable to count Timer1 over-flows.
No need for interrupts on the timer, just monitor TMR1IF overflow
interrupt flag bit, and let Timer1 do everything for you in the
background.
This gives you roughly 5 seconds at 20MHz.
Code:
DEFINE OSC 20
' I/O definition
'
TRISB = %10000001 ' Set PORTB (0)INPUT (1-5)OUTPUTS
T1CON = %00110000 ' Timer1 1:8 prescale. Timer1 off
' Variable Definition
'
Switch VAR PORTB.0
Red VAR PORTB.1
Green VAR PORTB.2
Blue VAR PORTB.3
PushHowManyTimes VAR Byte
PWMVariable VAR Byte ' PWM Variable 1-9
PWMVariableTimeOut VAR Byte ' 5 second Timeout (100 loops of 50mS)
storedloop VAR Byte
onled VAR Byte
Timer VAR BYTE ' Holds timer ticks. 1 tick = 65,536*Tosc*prescale
Timer = 0 ' Clear on start
' register and interrupt definition
'
CMCON = 7 ' Disable analog comparator on PORTA... not needed as now
OPTION_REG=0 ' enable pull-up resistor on PORTb
' Interrupt on falling edge of RB0
INTCON = %10010000 ' Enable RB0 interrupt
PORTC.0=1 ' NOTE: Just for visual test | LED blinking every 5 S
TRISC.0 = 0
On Interrupt Goto ProcedureSwitcher
' Variable initialisation
'
'PORTB = 0 ' Reset all outputs on PORTB
PushHowManyTimes = 0
ReStart:
TMR1H = 0
TMR1L = 0 ' Clear time counts before Timer1 re-start
PIR1.0 = 0 ' CLear over-flow flag before enable
T1CON.0 = 1 ' Turn Timer1 back on before entry into MainProcedure
'Main Procedure
MainProcedure:
Select Case PushHowManyTimes
case 1
Gosub resetleds
PWMVariable = 1
PWM BLue,1,100
Case 2
Gosub resetleds
PWMVariable = 2
PWM blue,25,100
Case 3
Gosub resetleds
PWMVariable = 3
PWM blue,255,100
Case 4
Gosub resetleds
PWMVariable = 4
PWM green,1,100
Case 5
Gosub resetleds
PWMVariable = 5
PWM green,25,100
Case 6
Gosub resetleds
PWMVariable = 6
PWM green,255,100
Case 7
Gosub resetleds
PWMVariable = 7
PWM red,1,100
Case 8
Gosub resetleds
PWMVariable = 8
PWM red,25,100
Case 9
Gosub resetleds
PWMVariable = 9
PWM red,255,100
End Select
' IF PIR1.0 = 1 TMR1 register overflowed (must be cleared in software)
IF PIR1.0 THEN ' IF Timer1 has over-flowed then
Timer = Timer + 1 ' Increment Timer variable
PIR1.0 = 0 ' Clear over-flow/int flag
' @20MHz 200nS * 65,536 * 8 = 0.1048576 seconds per over-flow
' 0.1048576 * 48 = ~5.033 seconds before jump to NextStage
IF Timer >= 48 THEN NextStage
ENDIF
Goto Mainprocedure
ResetLEDs:
Low PortB.1 ' reset output to PORTB
Low PortB.2
Low PortB.3
Low PortB.4
Low PortB.5
Return
NextStage: ' Dont really know what you need here. Just a visual test
' T1CON.0 = 0 ' Turn off Timer1 if you need to here
Timer = 0 ' Clear Timer var on entry here
' TMR1H = 0
' TMR1L = 0 ' CLear timer count registers as required
PORTC.0 = PORTC.0 ^ 1 ' Toggle LED for test
' Do something here, etc,,
GOTO ReStart ' When you're ready to start all over
' Interrupt handler stuff here
'
Disable ' Disable interrupts in handler
ProcedureSwitcher:
PushHowManytimes = PushHowManytimes + 1 ' Changing task
If PushHowManytimes = 10 Then PushHowManytimes=1
Here:
While SWITCH = 0 ' waiting until
wend ' push-button is release
pause 100 ' debounce time
If switch = 0 then here
PIR1.0 = 0 ' Clear Timer1 over-flow flag
Timer = 0 ' Clear Timer counts before return
INTCON.1=0 ' reset RB0 interrupt flag
Resume ' Return to main program
Enable ' Enable interrupts after
' handler
END
Bookmarks