I have a piece of working code using an Interrupt, whereby each time the button is pushed a variable is increased. This routine is going to be the first when the PIC is powered up and the rest of the code, relies on what the variable is set at.
I have also included an LED routine using PWM to visually indicate which stage the Variable is currently at (Variable is between 1 and 9).
How can i add a routine, where if the button is not pushed for 5 seconds, the code continues to the main routines etc. However, during this initial stage, if the button is pushed, the variable counts up (as already catered for) and 5 seconds starts all over again.
I'm sure it has to be added using a WHILE routine within the Interrupt Handlet routine, but i have tried to do it and failed.
Can anyone help please.
Here is the code:
Code:
' I/O definition
'
TRISB = %10000001 ' Set PORTB (0)INPUT (1-5)OUTPUTS
' 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
' 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
On Interrupt Goto ProcedureSwitcher
' Variable initialisation
'
'PORTB = 0 ' Reset all outputs on PORTB
PushHowManyTimes = 0
'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
Goto Mainprocedure
ResetLEDs:
Low PortB.1 ' reset output to PORTB
Low PortB.2
Low PortB.3
Low PortB.4
Low PortB.5
Return
' 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
INTCON.1=0 ' reset RB0 interrupt flag
Resume ' Return to main program
Enable ' Enable interrupts after
' handler
If anyone can also suggest a better way of visually representing at which stage the variable is set at (1-9) using 3 LEDs, then please do.
Many thanks,
Steve
Bookmarks