Hi,
This project opens a valve if it's closed and has 5V at the A/D input, and closes it if it is open and has a 0V at the A/D input, going to sleep after 10s. It wakes if the GP5 input goes high. This is OK except that it hangs if powered up in the closed position. Could anyone advise if my logic in the code is wrong or if the A/D reading is set up wrong? The ADCON0.0 = 0 doesn't seem to deactivate the A/D converter either. Here is the code: Thanks


@ device pic12F675, intrc_osc_noclkout, wdt_off, pwrt_on, mclr_on, protect_off, bod_off
CMCON = %00000111 'CMCON = 7 comparators off
trisio = %00101001 'INPUTS =1 OUTPUTS=0 (GP3 always i/p)
DEFINE OSCCAL_1K 1 'Set OSCCAL for 1K device (tunes to exactly 4MHz)
ANSEL = %01010001 '16tosc, gpio0 analogue input
ADCON0 = %10000000 'right just , Vref=Vdd , ch.0 , A/D off
INTCON=%10001000 'Interrupt Control Register
ioc = %00100000 'Set interrupt on change to GP5

'variables
POTVALUE VAR word 'POTENTIOMETER VALUE VARIABLE
ValveState var bit 'ValveState: 0 = Valve closed 1 = Valve open
TimeOut var byte 'variable to countup timeout

'Start up procedure
pause 1000
GPIO = %00010100 'IN1 and enable Dir1 (close) for start condition
pause 2000
GPIO = %00000000
let valvestate = 0
let timeout = 0

'loop
START:
pause 1000 'loop time (determines timeout)
GPIO = %00000000 'keeps o/ps off, also clears interrupt GPIF
adcon0.0 = 1 'turn on a/d
pause 10
ADCON0.1 = 1 'start A/D
while ADCON0.1 = 1 'do until A/D finished (use GO/DONE bit?)
wend
potvalue.highbyte = adresh 'high byte of 10bit value
potvalue.lowbyte = adresl 'low byte of 10bit value
'Is this formatting the result correctly?

If (POTvalue < 250) and (valvestate = 1) THEN
GPIO = %00010100 'IN1 and enable Dir1 (close)
pause 3000
valvestate = 0
adcon0.0 = 0 'turn off a/d until next loop
endif

IF (POTvalue >= 250) and (valvestate = 0) THEN
GPIO = %00000110 'IN2 and enable Dir (open)
pause 3000
valvestate = 1
adcon0.0 = 0 'turn off a/d until next loop
endif

if (valvestate = 0) then timeout = timeout +1
if (valvestate = 1) then timeout = 0
if (timeout > 10) then goto SLEEP_IT 'timeout value * loop time
goto start

'subroutines
SLEEP_IT: 'use asm code for sleep as pbp has a fixed period
GPIO = %00000000
pause 1000
INTCON.0 = 0 'clear interrupt flag if set (GPIO should do this)
@ sleep
@ nop
goto start

end