PDA

View Full Version : 12f675 to latch output while it does something else



AVGuru
- 19th September 2014, 04:49
Hi every1,

I'm very new to programming PIC micro controllers. I've been banging my head against the wall the last few days, is there any way I can get an output to stay on while the processor does something else...? here is the deivce:

1 input (button)
2 outputs (relay and led)

light flashes when on stand by (easy)
when the button is pressed high relay (easy)
at the same time flash LED to show process(.....not so easy as the relay shuts down)
after 30s led stays on and relay stays on (...........again I can only get 1 output to come on at a time)
while waiting for button to be pressed again, led stays on and relay stays on
when button is pressed again flash led 1minute (to allow proper shutdown)
relay goes LOW and led goes back to standby mode.

I can't seem to get th erelay to LATCH ON. I gone thro the manual cover to cover. cant seem to find anything to solve this problem.
can someone help....?:D

AVGuru
- 19th September 2014, 04:56
Ohhhh.... yes I need the relay to stay on indefinitely from HIG RELAY command until a LOW RELAY command is executed

EarlyBird2
- 19th September 2014, 07:36
Post your code and schematic then I can help.

HenrikOlsson
- 19th September 2014, 07:50
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.



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.

AVGuru
- 19th September 2014, 08:39
this is the prog:

INIT:

PAUSE 1000 'INTERNAL CLOCK RESET 75ms
clear 'SET REGISTER TO ZERO

FOR TIMES = 3 TO 1 STEP -1
HIGH LED 'INDICATOR FOR MCU POWER-UP
PAUSE 50 'INDICATOR FOR MCU POWER-UP
LOW LED 'INDICATOR FOR MCU POWER-UP
PAUSE 750 'INDICATOR FOR MCU POWER-UP
NEXT TIMES


Start:

clear 'SET REGISTER TO ZERO

Standby: 'WAIT FOR BUTTON TO STARTUP
Button SWITCH,1,255,0,b1,1,STARTUP 'Check Button 1 (Skip to heartbeat if Not Pressed)

Heartbeat:
'HEART BEAT INDICATOR ON LED
For DUTYCYCLE = 0 to 255 STEP 3 'THIS IS THE DELAY 255 MAX. COUNT LESS FASTER
PWM LED, DUTYCYCLE, 1 'THE NUMBER WILL DETERMINE SPEED SMALLER FASTER
Next
For DUTYCYCLE = 255 to 0 Step -2
PWM LED, DUTYCYCLE, 1 'THE NUMBER WILL DETERMINE SPEED SMALLER FASTER
Next

GOTO STANDBY


startup:

HIGH relay ' SWITCH ON POWER TO PROJECTOR
' OPTION TO SEND IR TO PROJECTOR
' OPTION TO SEND RS232 TO PROJECTOR

'TESTING WITH TIME =20
FOR TIMES = 20 TO 1 STEP -1 '1m FOR PROJECTOR WARMUP
HIGH LED 'INDICATOR FOR SYSTEM START-UP
PAUSE 250 'INDICATOR FOR SYSTEM START-UP
LOW LED 'INDICATOR FOR SYSTEM START-UP
PAUSE 250 'INDICATOR FOR SYSTEM START-UP
NEXT TIMES


running: 'WAIT FOR INTERUPT TO SHUTDOWN
Button SWITCH,1,255,0,B1,1,SHUTDOWN 'Check Button 1 (Skip to ledup if Not Pressed)
'SHUTDOWN IF BUTTON IS PRESSED
ledup:
HIGH LED 'INDICATOR FOR SYSTEM RUNNING
GOTO RUNNING 'LOOP UNTIL BUTTON IS PRESSED



shutdown:

' OPTION TO SEND IR TO PROJECTOR
' OPTION TO SEND RS232 TO PROJECTOR
'TESTING WITH TIME =20
FOR TIMES = 20 TO 1 STEP -1 '120s (2m) FOR PROJECTOR COOLDOWN
HIGH LED 'INDICATOR FOR SYSTEM START-UP
PAUSE 250 'INDICATOR FOR SYSTEM START-UP
LOW LED 'INDICATOR FOR SYSTEM START-UP
PAUSE 250
NEXT TIMES
LOW RELAY 'SHUT OFF POWER TO PROJECTOR


GOTO STANDBY





END

regards

AVGuru
- 19th September 2014, 09:12
Hi Henrik,

i tried it, but the relay will not stay ON.

EarlyBird2
- 19th September 2014, 09:22
Check your wiring for a short between LED and RELAY

AVGuru
- 19th September 2014, 09:27
tried various ports on the MCU. it is sitting on the PICEasy5 board

EarlyBird2
- 19th September 2014, 09:38
My thinking is that flashing the LED pin affects the RELAY pin therefore they must be connected in some way.

AVGuru
- 19th September 2014, 10:14
My thinking is that flashing the LED pin affects the RELAY pin therefore they must be connected in some way.

it seems it is not possible to have 2 outputs HIGH at the same time....? i tried to lite up 2 leds:

HIGH LED1
HIGH LED2

only LED22 lights up, then i did:

HIGH LED1
PAUSE 1000
HIGH LED2

i see led1 light up (1s, as expected) then it goes off and led 2 lights up is there any LATCH ON command (maybe LATCH ON LED1) to set it high indefinitely led1 while we send another command to light up LED2....? how can we high LED1 until we send a LOW LED1, in the mean time we are doing other things like flash LED2, send IR/ RS232, etcetc..........?

I'm new at this please excuse some of my silly questions.

Ioannis
- 19th September 2014, 10:23
When LED2 is ON, does it stay ON for ever?

Ioannis

AVGuru
- 19th September 2014, 10:35
When LED2 is ON, does it stay ON for ever?

Ioannis

yes that does. I initially thought maybe there was a problem with the out put pin., i swap to other pins, same result, still not satisfied, i ran my scope on the the pins, yup, th efirst led switches ON briefly and then OFF as the second led lights up.

hhhhhmmmmmmmmmm (rubbing chin........) how do i get it to stay ON..............?

Ioannis
- 19th September 2014, 10:46
OK, this is not logic at all.

Please post all the test code that you used to light the two led's.

There is something that we are missing here.

Ioannis

AVGuru
- 19th September 2014, 11:06
OK, this is not logic at all.

Please post all the test code that you used to light the two led's.

There is something that we are missing here.

Ioannis

Standby: 'WAIT FOR BUTTON TO STARTUP
Button SWITCH,1,255,0,b1,1,STARTUP 'Check Button 1 (Skip to heartbeat if Not Pressed)

Heartbeat:
'HEART BEAT INDICATOR ON LED
For DUTYCYCLE = 0 to 255 STEP 3 'THIS IS THE DELAY 255 MAX. COUNT LESS FASTER
PWM LED, DUTYCYCLE, 1 'THE NUMBER WILL DETERMINE SPEED SMALLER FASTER
Next
For DUTYCYCLE = 255 to 0 Step -2
PWM LED, DUTYCYCLE, 1 'THE NUMBER WILL DETERMINE SPEED SMALLER FASTER
Next

GOTO STANDBY


startup:

HIGH relay ' SWITCH ON POWER TO PROJECTOR
' OPTION TO SEND IR TO PROJECTOR
' OPTION TO SEND RS232 TO PROJECTOR

'TESTING WITH TIME =20
FOR TIMES = 20 TO 1 STEP -1 '1m FOR PROJECTOR WARMUP
HIGH LED 'INDICATOR FOR SYSTEM START-UP
PAUSE 250 'INDICATOR FOR SYSTEM START-UP
LOW LED 'INDICATOR FOR SYSTEM START-UP
PAUSE 250 'INDICATOR FOR SYSTEM START-UP
NEXT TIMES


running: 'WAIT FOR INTERUPT TO SHUTDOWN
Button SWITCH,1,255,0,B1,1,SHUTDOWN 'Check Button 1 (Skip to ledup if Not Pressed)
'SHUTDOWN IF BUTTON IS PRESSED
ledup:
HIGH LED 'INDICATOR FOR SYSTEM RUNNING
GOTO RUNNING 'LOOP UNTIL BUTTON IS PRESSED



shutdown:

' OPTION TO SEND IR TO PROJECTOR
' OPTION TO SEND RS232 TO PROJECTOR
'TESTING WITH TIME =20
FOR TIMES = 20 TO 1 STEP -1 '120s (2m) FOR PROJECTOR COOLDOWN
HIGH LED 'INDICATOR FOR SYSTEM START-UP
PAUSE 250 'INDICATOR FOR SYSTEM START-UP
LOW LED 'INDICATOR FOR SYSTEM START-UP
PAUSE 250
NEXT TIMES
LOW RELAY 'SHUT OFF POWER TO PROJECTOR

GOTO STANDBY

END

you see I'm tring to create a delay power switch, to allow for projector to cool down before the power is cut off. normally in my office, they just hit the power button on the remote control and throw the switch as they leave the room, usually done in the same breath. i want to create a delay so.... the power will be cut off only after 2m, to allow for cooling of the lamp, this will make the lamp last longer before the next change is required.
so here we have 3 states:
standby: power realy is OFF, LED gives a heartbeat light
startup: power relay is ON, LED Flashes for 30s (does not allow you to switch OFF the power)
running: power relay is ON, LED is ON
shutdown: LED flashes (2m to allow cooling) relay OFF
go to standby wait for next cycle

very simple requirement, but I cannot get the relay to go 'ON' at the same time LED to go "ON"

HenrikOlsson
- 19th September 2014, 12:34
Hi,

it seems it is not possible to have 2 outputs HIGH at the same time....? i tried to lite up 2 leds:


Sounds like you're getting bit by the ever so clasic read-modify-write issue caused by not having analog functionallity on related pins turned off.


CMCON = 7 ' Turn off comparator on 12F675
ANSEL = 0 ' None of the I/O connected to the ADC


/Henrik.

Ioannis
- 19th September 2014, 12:44
What Henrik stated must be placed on top of your program.

Try it and reply the results.

Ioannis

AVGuru
- 19th September 2014, 14:14
What Henrik stated must be placed on top of your program.

Try it and reply the results.

Ioannis

Ok will do that we are out of the office already, GMT +8 here. That will be the first thing I try on Monday. Will keep you posted. Thanks Philip. Have a great weekend guys

AVGuru
- 19th September 2014, 14:16
Thanks henrik, Ill try that on Monday. Have a great weekend..!

Philip

Amoque
- 19th September 2014, 15:51
How do i get it to stay ON..............?

I don't think there's anything of substance I can add here, only chiming in to answer implicitly: There is no command or statement to make a pin or port "stay" on. Pin states are "set and forget" in that they go high or low only as commanded - and remain so, until commanded to change. Some statements include changing input/ output or high/ low as part of the assembly (documented), but port state is a switch and commanded - at some level.

So, for anyone following on after looking for a solution to a similar problem: check your code, check your configuration, check your power supply; the pin will remain set (or cleared) as initially commanded unless some other influence holds sway.

mark_s
- 19th September 2014, 16:59
In addition to what others suggested. Are you using a transistor to buffer the pic
output from the relay coil? If not you may be exceeding the current capacity of
the output pin. This could cause heating and result in the pic resetting. Also inductive
voltage spikes can cause resets. A simple schematic would help of your relay connection.

AVGuru
- 22nd September 2014, 03:31
Hi,


Sounds like you're getting bit by the ever so clasic read-modify-write issue caused by not having analog functionallity on related pins turned off.


CMCON = 7 ' Turn off comparator on 12F675
ANSEL = 0 ' None of the I/O connected to the ADC


/Henrik.


Henrik, thanks a million, we managed to get it to work. Alto port 1 out does not light the led. It ok I already know why. I can't see how I missed out the config for comparator. Thanks again....!

AVGuru
- 22nd September 2014, 04:21
Hi henrik, I seem to have lost A.0 & A.1 & A.3 as outputs....? I tried to swap the led around the port, but they won't light up.

A.2 is the LED
A.4 is the RELAY and
A.5 is the Button

AVGuru
- 22nd September 2014, 04:23
In addition to what others suggested. Are you using a transistor to buffer the pic
output from the relay coil? If not you may be exceeding the current capacity of
the output pin. This could cause heating and result in the pic resetting. Also inductive
voltage spikes can cause resets. A simple schematic would help of your relay connection.

Hi mark, thanks for the heads up on that, Yes I'm using a 2N2222 for the output to relay on open emitter, as well as a diode across the relay to stop it from chattering.

HenrikOlsson
- 22nd September 2014, 08:21
Hi,

Hi henrik, I seem to have lost A.0 & A.1 & A.3 as outputs....? I tried to swap the led around the port, but they won't light up.
Not sure I understand what this means.
On the 12F675 you have GPIO.0 etc. Make sure you reference that and make sure you set/clear TRISIO accordingly.

/Henrik.

AVGuru
- 24th September 2014, 03:55
Hi mark, thanks for the heads up on that, Yes I'm using a 2N2222 for the output to relay on open emitter, as well as a diode across the relay to stop it from chattering.

THANK YOU all. got it to work on the PICEASY board, now to put it in a box and on the wall.


thanks again:D