Hi ! Both of my dispensers stopped working. So I thought of making a module with PIC. However, I encounter problems when implementing the function @Sleep in the program. I need your advice .... Thansk !
Code:
@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _BODEN_ON
DEFINE OSCCAL_1K 1
DEFINE OSC 4
CMCON = 7
TRISIO = %00000001
INTCON = 0
IOC = 0
GPIO = 0
ANSEL = %00110001
GIE var intcon.7 ' global interrupt enable 1=on ; 0=off
GPIE var intcon.3 ' port change interrupt enable 1=0n ; 0=off
GPIF var intcon.0 ' port change interrupt flag bit
DataW var word
last_b_level var byte
b_level var byte
b_cnt var byte
b_act var byte
GIE=0
GPIE=1
IOC.0=1 ' int-on-change for GPIO.0 enabled
Clear
GPIO.2 = 0
ADCON0 = %10000001
Pauseus 100 ' Wait for channel to setup
;============================================================================
Main:
ADCON0.1 = 1 ' Start conversion
@ SLEEP
While ADCON0.1=1:Wend ' Wait for conversion
DataW.HighByte=ADRESH ' Read variable from ADC and save
DataW.LowByte=ADRESL
if DataW < 600 then
b_level=1
if b_level=last_b_level then
b_cnt=b_cnt+1
pauseus 50
if b_cnt > 10 then b_act = 1 'TO AVOID FALSE READING
endif
last_b_level=b_level
endif
if b_act = 1 then gosub comanda
goto main
;============================================================================
comanda:
GPIO.2 = 1
PAUSE 4000
GPIO.2 = 0
b_act=0
last_b_level=0
b_cnt=0
GPIF=0 'Clear or change interrupt flag
Return
END
It's the first test ... simulating IR detector by resistor and reading the ADC.
Bookmarks