TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: patxarin en 04 de Febrero de 2015, 15:08:57
-
Buenas Tardes,
Tengo diseñado un pequeño sistema para leer el voltage de una pila de aproximadamente 3V.
Aleatoriamente el sistema se queda colgado. Tengo la duda de que esto ocurra porque al leer la pila, no haga buen contacto y pueda estar generando mas tension que la que los 5 voltios que admite el ADC.
¿Puede ser por esto?
Sugerencias,
Gracias.
-
me suena mas un problema del programa mas que eso. Alguna condicion que lo deje en un loop infinito.
-
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 8)
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(8)
Lcdout " PCB OK"
Else
rojo = 1
Lcdcmdout LcdLine1Pos(8)
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///////////
-
Comprobaste que tienes bien polarizado el pin MCLR?.
-
Yo tengo un par de preguntas... que no se me ocurrieron antes
Aleatoriamente el sistema se queda colgado.
Imagino que si es aleatoriamente mi putno es invalido y todo lo que ponga sobre el soft es invalido, o se queda colgado en un punto en particular?
Ej. siempre se queda colgado cuando se borra la pantalla.
Introducimos una pila para comprobar su tensión, cuando el sensor inductivo detecta que hay pila entonces hace una lectura del adc.
Yo no utilizaria un sensor inductivo, directamente leeria con el ADC y si esta bajo o detecta 0, ponerle que esta bajo... En fin asumo que hay algo que condiciona la lectura.
Mirando el codigo lo unico que condiciona la lectura es: Symbol boton = RD0, que si asumo que es la entrada del sensor inductivo el programa se quedaria colgado para siempre en:
otrodato:
If boton = 1 Then
Goto otrodato
A no ser que estes quitando y volviendo a poner la bateria para una nueva lectura. Pero puede que sea un boton y no un sensor inductivo. Lo cual el programa andaria bien.
Cosa que cambiaria, a pesar que no es tema del problema es esto:
vm = vm / 15
por que hacerlo con 15 cuando podes hacerlo por 16 y la traduccion directa a codigo maquina serian unos simple dezplazamientos.
Y
Goto leer
Lcdcmdout LcdClear
Endif
Lcdcmdout LcdClear no se ejecutaria nunca, esta por demas.
Y como dice dogflu66
Empeza a revisar el hardware.
-
Reviso los puntos sugeridos y os comento,
Muchas gracias,
un saludo
-
Yo te aconsejaria el uso de funciones y no programar todo el codigo en un solo archivo, ademas de identar el codigo para mayor comprension.