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.
/Henrik.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
EDIT: Missed the fact that you're using a 12F part. Change TRIS and PORT as needed.




Bookmarks