Funcionamiento:
Introducimos una pila para comprobar su tensión, cuando el sensor inductivo detecta que hay pila entonces hace una lectura del adc. El Test de la pila tiene que medir entre 2,9 y 3,49(de hay variable bajo y alto), si es buena se enciende un Led Verde. Si diera mala se enciende un led Rojo y suena un buzzer hasta que no se pulse un botón de Reset.
Muestro el programa por si alguien me pudiera echar una mano:
¿donde puede haber un problema de blucle infinito?¿o algo que pueda estar mal?
Soy un novato en la programacion de Pics.
Define CONFIG = 0x3f39
Define LCD_LINES = 2
Define LCD_CHARS = 16
Define LCD_BITS = 4 'indicamos que el bus de datos del lcd sera de 4bit(sino meter

Define LCD_DREG = PORTD 'el bus de datos sera el puerto D
Define LCD_DBIT = 4 'el bus de datos seran los 4 bit menos significativos del puerto D
Define LCD_RSREG = PORTC 'el bit de control RS sera del puerto C
Define LCD_RSBIT = 5 'se usara el R7 como RS
Define LCD_EREG = PORTC 'el bit de control E sera del puerto C
Define LCD_EBIT = 7 'se usara el RD5 como E
Define LCD_RWREG = PORTC 'el bit de control RW sera del puerto A (si se suprime el compilador no protesta)
Define LCD_RWBIT = 6 'se usara el RD6 como RW (si se suprime el compilador no protesta)
Define ADC_CLOCK = 3
Define ADC_SAMPLEUS = 50
CMCON = 0x07 'comparador off
Lcdinit
Dim estado As Bit
Dim vm As Word
Dim vd As Word
Dim i As Word
Dim alto As Word
Dim bajo As Word
Dim voltaje As Single
'Dim malas As Byte
'Puerto B
Symbol rojo = RB0
Symbol verde = RB1
Symbol azul = RB2
'Puerto D
Symbol boton = RD0
Symbol resetboton = RD1
Symbol buzzer = RC2
TRISA = %00001
TRISB = 0
TRISE = 0
TRISD = %00001111
TRISC = %00000100
ADCON1 = 0x8e
bajo = 594
alto = 783
vm = 0
vd = 0
i = 0
voltaje = 0
rojo = 0
verde = 0
azul = 0
main:
Gosub test
Gosub funcion
End
-------------
funcion:
Gosub leer
Gosub tomadato
Gosub presenta
Gosub otrodato
Gosub reset
Goto funcion
Return
----------------
leer:
If boton = 0 Then
estado = 0
WaitMs 750
Goto leer
Lcdcmdout LcdClear
Endif
Return
tomadato:
WaitMs 100
For i = 1 To 15
Adcin 0, vd
vm = vm + vd
Next i
vm = vm / 15
voltaje = vm * 5 / 1023
Return
----------------
presenta:
Gosub lcd
If vm >= bajo And vm <= alto Then
verde = 1
Lcdcmdout LcdLine1Pos(

Lcdout " PCB OK"
Else
rojo = 1
Lcdcmdout LcdLine1Pos(

Lcdout " PCB NOK"
While estado = 0
FreqOut buzzer, 5000, 100
WaitMs 50
If resetboton = 1 Then
estado = 1
Else
estado = 0
Endif
Wend
Endif
Return
--------------
otrodato:
If boton = 1 Then
Goto otrodato
Else
WaitMs 1000
Lcdcmdout LcdClear
Endif
Return
----------
reset:
vm = 0
vd = 0
i = 0
rojo = 0
verde = 0
Return
test:
Lcdcmdout LcdClear
Lcdout "Test "
rojo = 1
verde = 0
azul = 1
For i = 1 To 5
WaitMs 50
Toggle rojo
Toggle verde
Toggle azul
Next i
Lcdcmdout LcdLine1Pos(6)
Lcdout "OK"
rojo = 0
verde = 0
azul = 0
i = 0
Return
lcd:
Lcdcmdout LcdClear
Lcdout #voltaje
Lcdout " V"
Lcdcmdout LcdLine2Home
Lcdout "vm="
Lcdout #vm
Un saludo y gracias por su tiempo,

///////Con la practica se alcanza la perfección///////////