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.
Name:  dispenser_schematic.jpg
Views: 845
Size:  83.0 KB