Hi,
As with most things there are more than one way to do it. Personally I like to code things like this using a state machine since it allows you divide the code into easily identifiable "blocks" (or states).
The following compiles without errors but I don't have access to any hardware to actually test it at the moment.
Code:
LED VAR PortB.0 ' Output for LED
Relay VAR PortB.1 ' Outpur for relays
Btn VAR PortB.2 ' Input for button
Pushed CON 1 ' Logic level when button is pressed
Standby CON 0 ' States for the state machine...
Delay CON 1 ' ...which helps us keep track...
Engaged CON 2 ' ...of what we're doing.
Shutdown CON 3
State VAR BYTE ' State machine variable
Time VAR BYTE ' To keep track of time
TRISB = %11111100 ' Tow outputs at the bottom.
Main:
Select Case State
'-----------------------------------------------------------------
Case Standby
' In standby mode we blink the LED at 1Hz while checking
' if the button is pressed. Note that the response time
' for the button will be up to 1 second. This can be fixed
' later if needed.
' When the button is pressed we turn on the relay and
' prepare our 30 second timer.
LED = 1
PAUSE 500
LED = 0
PAUSE 500
IF Btn = Pushed THEN
Relay = 1
Time = 30
State = Delay
ENDIF
'-----------------------------------------------------------------
Case Delay
' Now we're supposed to blink the LED for 30 seconds
' while the relay is ON. The LED blinks at 1Hz, each cycle
' we decrement the Time variable. When it reaches 0 the
' 30 seconds delay is complete, the LED is turned on solid
' and we switch to next state.
LED = 1
PAUSE 500
LED = 0
PAUSE 500
Time = Time - 1
IF Time = 0 THEN
Led = 1
State = Engaged
ENDIF
'-----------------------------------------------------------------
Case Engaged
' Now the relay is on, the LED is on.
' We're supposed to wait for the button to be pressed.
' At which time there should be 60 seconds delay.
If Btn = Pushed THEN
Time = 60
State = Shutdown
ENDIF
'-----------------------------------------------------------------
Case Shutdown
' Now the LED should blink for 60 seconds after which the
' relay is turned OFF and the whole thing starts over.
LED = 1
PAUSE 500
LED = 0
PAUSE 500
Time = Time - 1
If Time = 0 THEN
Relay = 0
State = Standby
ENDIF
'-----------------------------------------------------------------
END SELECT
GOTO Main
/Henrik.
EDIT: Missed the fact that you're using a 12F part. Change TRIS and PORT as needed.
Bookmarks