Autor Tema: Reseteo Aleatorio Lectura ADC Pic 16f877A  (Leído 3227 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado patxarin

  • PIC10
  • *
  • Mensajes: 3
Reseteo Aleatorio Lectura ADC Pic 16f877A
« 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.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Reseteo Aleatorio Lectura ADC Pic 16f877A
« Respuesta #1 en: 04 de Febrero de 2015, 18:24:01 »
me suena mas un problema del programa mas que eso. Alguna condicion que lo deje en un loop infinito.

Desconectado patxarin

  • PIC10
  • *
  • Mensajes: 3
Re: Reseteo Aleatorio Lectura ADC Pic 16f877A
« Respuesta #2 en: 05 de Febrero de 2015, 18:39:12 »
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///////////

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Reseteo Aleatorio Lectura ADC Pic 16f877A
« Respuesta #3 en: 06 de Febrero de 2015, 11:55:06 »
Comprobaste que tienes bien polarizado el pin MCLR?.
Saludos desde Granada, España.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Reseteo Aleatorio Lectura ADC Pic 16f877A
« Respuesta #4 en: 06 de Febrero de 2015, 12:21:33 »
Yo tengo un par de preguntas... que no se me ocurrieron antes

Citar
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.

Citar
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.

Desconectado patxarin

  • PIC10
  • *
  • Mensajes: 3
Re: Reseteo Aleatorio Lectura ADC Pic 16f877A
« Respuesta #5 en: 08 de Febrero de 2015, 17:59:57 »
Reviso los puntos sugeridos y os comento,

Muchas gracias,
un saludo

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re: Reseteo Aleatorio Lectura ADC Pic 16f877A
« Respuesta #6 en: 09 de Junio de 2015, 18:50:17 »
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.


 

anything