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