Autor Tema: Pic falla cada 3 semanas.  (Leído 3229 veces)

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

Desconectado Eduardo Rodas

  • PIC12
  • **
  • Mensajes: 62
    • Kit electronica
Pic falla cada 3 semanas.
« en: 19 de Noviembre de 2021, 17:38:22 »
Hola a todos. Hice un protector y ahorrador de energía con un PIC 12f1822, el cual siempre esta encendido ("nunca se desconecta") todo funciona correctamente, pero después de probarlo por unos 4 meses noto que de repente desconecta el relé que activa la carga (la carga es un tv y modem de tv) lo reactivo a control remoto y vuelve a fallar ...y así cuantas veces lo quiera reactivar.

La única forma de recuperar el funcionamiento normal es simplemente desconectándolo y volviendo a conectar (imagino que el reset al encender soluciona el problema). Esto pasa cada 3 semanas aproximadamente.

El Pic esta al 95% de su memoria flash ¿creen que eso pueda incidir? también sospecho de la memoria RAM, pues en algún lado  leí que había que refrescar los datos, y pues en mi programa no pasa eso.

El PIC entra en una rutina pequeña que espera la señal del control remoto y ahí se la pasa mientras esta apagado. A quien me pueda ayudar, de antemano muchas gracias.



Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Pic falla cada 3 semanas.
« Respuesta #1 en: 19 de Noviembre de 2021, 18:19:35 »
La mayoría de esos problemas es un código escrito de mala manera y/o un hardware mal diseñado que le afecta la activación de cargas de alta corriente.

Pero por lo que describes parece ser lo primero.

Deberías tratar de compartir el código que estás utilizando y el esquemático hardware.

Respecto a que ocupas el 95% de la memoria de programa, no debería ser problema, también he llegado a esos límites y no he tenido problemas.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Eduardo Rodas

  • PIC12
  • **
  • Mensajes: 62
    • Kit electronica
Re:Pic falla cada 3 semanas.
« Respuesta #2 en: 19 de Noviembre de 2021, 20:08:22 »
La mayoría de esos problemas es un código escrito de mala manera y/o un hardware mal diseñado que le afecta la activación de cargas de alta corriente.

Entiendo, pero es raro que falle después de tanto tiempo de funcionar correctamente. Si el hardware o el programa están mal, debería fallar al poco tiempo de estar encendido.

Sigo investigando. Gracias.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Pic falla cada 3 semanas.
« Respuesta #3 en: 19 de Noviembre de 2021, 20:15:33 »
La mayoría de esos problemas es un código escrito de mala manera y/o un hardware mal diseñado que le afecta la activación de cargas de alta corriente.

Entiendo, pero es raro que falle después de tanto tiempo de funcionar correctamente. Si el hardware o el programa están mal, debería fallar al poco tiempo de estar encendido.

Sigo investigando. Gracias.

Tu problema es lo que se denomina condición de secuencia y sucede cuando dos o mas procesos acceden a un recurso compartido y la salida o estado de ese proceso es dependiente de una secuencia de eventos que se ejecutan en orden arbitrario.

Los errores en una condición de secuencia son difíciles de descubrir y solucionar ya que no son repetitivos y ocurren pocas veces o luego de largos periodos de tiempo. También e denominan errores  Heisenbug.

Muy difícil que alguien te ayude si no compartes el código que has hecho.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Robert76

  • PIC24F
  • *****
  • Mensajes: 577
Re:Pic falla cada 3 semanas.
« Respuesta #4 en: 19 de Noviembre de 2021, 20:43:29 »
Hola, por lo que comentas, parece un problema de ruido eléctrico que hace "colgar al MCU"
En principio, hay que mejorar el sistema de filtrado en la alimentación del PIC.
Hay muchas formas de hacerlo.
Empezando por el diseño del PCB y sus planos de GND.
La ficha técnica, recomenda conectar un condensador de 100nF, directamente sobre los terminales de Vdd y GND de dicho MCU.
2do. Punto, si el problema NO es debido al diseño del soft como comenta Dominus.
Entonces puedes añadir la opción de WatchDog.
Que consiste en resetear al PIC, cuándo cae en un bucle infinito.
« Última modificación: 19 de Noviembre de 2021, 20:45:53 por Robert76 »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Pic falla cada 3 semanas.
« Respuesta #5 en: 20 de Noviembre de 2021, 05:50:04 »
Si falla con regularidad a las 3 semanas, a mi me suena a algún desbordamiento de un contador.
3 semanas = 18 144 000 décimas de segundo, cercano al desbordamiento de una variable de 24 bits (16 777 216)
3 semanas = 1 814 400 000 milésimas de segundo, cercano al desbordamiento de una variable signed long (2 147 483 648)
¿Puede ser algo así?

Desconectado Eduardo Rodas

  • PIC12
  • **
  • Mensajes: 62
    • Kit electronica
Re:Pic falla cada 3 semanas.
« Respuesta #6 en: 20 de Noviembre de 2021, 14:55:54 »
Gracias a todos por sus respuestas. El circuito lo dibuje a mano y desde entonces he cambiado algunas cosas, en cuanto lo haga bien se los muestro. Lo que hace el proyecto es que vigila la tensión de la red AC y si el voltaje sube de 140v, la carga se apaga y si baja de 95 también se apaga.

Además cuando la carga entra en standby, el proyecto la desconecta de la red AC (ese es el ahorrador). Todo funciona bien, hasta que pasa 3 semanas y falla. Lo he probado durante unas tormentas muy fuertes con rayos y el equipo funciono perfectamente, por lo que no me parece que sea por ruidos eléctricos.

El programa hace lo siguiente:

Hay una rutina que espera la señal del control remoto, cuando llega entonces:

- Hace conversión AD, muestrea, saca valor RMS para leer la corriente desde un modulo ACS712.
- Hace conversión AD, muestrea, saca voltaje P-P del AC y obtiene RMS.
- Luego obtiene el consumo de la carga para saber si esta ON o en Standby.
- Compara voltajes altos y bajos y valor  de corriente, si todo esta dentro de los rangos deja conectada la carga, sino:
- Apaga la carga y entra en la rutina de control remoto, para reactivar todo si se pulsa el botón desde el mando a distancia.
- También se apaga la carga si esta consume 4.75 A aprox. (protección de sobrecarga).

No hay contadores (solo los del muestreo pero se borran después de hacer AD). Uso variables float porque necesito los
decimales.

La ansiedad de verlo funcionar me gano, y entonces lo hice en una placa universal ... uso de fuente un adaptador de 12v 1A.
Y por otro lado conecto el AC (tiene 2 alimentaciones pero la idea es que tenga una sola). El circuito esta feíto, pero todo esta
bien conectado ...incluso tiene 2 fusibles para el DC y el AC.

Gracias.



Desconectado Eduardo Rodas

  • PIC12
  • **
  • Mensajes: 62
    • Kit electronica
Re:Pic falla cada 3 semanas.
« Respuesta #7 en: 24 de Noviembre de 2021, 12:07:38 »
Creo que encontré la falla del programa. Leyendo la datasheet del PIC, dice que el stack puede desbordarse por el uso de múltiples RETURN y RETFIE y del primero si tengo varios en el programa, pues hago llamados a subrutinas constantemente.

Lo que hice es reorganizar el programa para evitar el uso de esos RETURN (solo deje una subrutina, que se ejecuta en condiciones especiales). También creo haber abusado de los GOTO, ya que la rutina de espera en donde atiendo el control remoto hacia uso constante de este comando ... ahora lo cambie por un while --wend.

También habilite el reset por desbordamiento del STACK desde los Fuses; si falla nuevamente por ahí, al menos el micro se va a reiniciar y ya no se tendrá que desconectar y volver a conectar.

Ya casi termino el esquemático y termino de organizar el programa.

Muchas gracias a PICUINO que me indico que algo podría estar desbordándose.


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Pic falla cada 3 semanas.
« Respuesta #8 en: 24 de Noviembre de 2021, 17:47:22 »
Creo que encontré la falla del programa. Leyendo la datasheet del PIC, dice que el stack puede desbordarse por el uso de múltiples RETURN y RETFIE y del primero si tengo varios en el programa, pues hago llamados a subrutinas constantemente.

Si ese es tu problema entonces esta mal programado... Siempre hay un par de CALL/RETURN, y solo un RETFIE que se debe a la interrupción.
Si lo planteas a eso como tu problema, lo raro es que no ocurra antes.. A la velocidad que funciona el micro, si tenes ese error, y al tener solo 12 niveles de stack, seguramente ocurra antes.

Desconectado Eduardo Rodas

  • PIC12
  • **
  • Mensajes: 62
    • Kit electronica
Re:Pic falla cada 3 semanas.
« Respuesta #9 en: 24 de Noviembre de 2021, 18:48:15 »
Creo que encontré la falla del programa. Leyendo la datasheet del PIC, dice que el stack puede desbordarse por el uso de múltiples RETURN y RETFIE y del primero si tengo varios en el programa, pues hago llamados a subrutinas constantemente.

Si ese es tu problema entonces esta mal programado... Siempre hay un par de CALL/RETURN, y solo un RETFIE que se debe a la interrupción.
Si lo planteas a eso como tu problema, lo raro es que no ocurra antes.. A la velocidad que funciona el micro, si Tenes ese error, y al tener solo 12 niveles de stack, seguramente ocurra antes.

Si, entonces no se que esta pasando. Ahí se ve la estructura del programa. Gracias.
Código: [Seleccionar]
Device = 12F1822
Declare Reminders = OFF
Config1 FOSC_INTOSC, WDTE_OFF, PWRTE_ON, IESO_OFF, FCMEN_OFF, MCLRE_OFF, CP_ON, CPD_ON
Config2 WRT_OFF, PLLEN_OFF, LVP_OFF, STVREN_ON
Declare Reminders = On
'**************************************************
DelayMS 500 'Espero a que se estabilice.
'**************************************************
Declare Xtal = 4Mhz
'**************************************************
Declare Adin_Res = 10
Declare Adin_Tad FRC
Declare Adin_Stime = 50
'*************************************************
Declare Float_Display_Type = Fast
Declare Float_Rounding = Off
'*************************************************
OSCCON = %11101000 ' 4mhz Osc interno.
OSCTUNE = %00000000                               
ANSELA = %00000011 'ADC 0 y 1 activado
TRISA = %00001011
ADCON0 = %01111100
ADCON1 = %11110011 'FRC y FVR
FVRCON = %10000011 'VREF 4.096V
APFCON = %11000000 'Cambia funciones de pin
CM1CON0 = %00000000
CM1CON1 = %00000000
INTCON = %000000000
OPTION_REG = %10000000 'pullups deshabilitadas.
WPUA = %00000000
'********************************************
'VARIABLES
'********************************************
Dim VOLT As Word
Dim ACVOLT As Float
Dim TIEMPO As Word
Dim TIEMPOL As Word
Dim CORRIENTE As Float
Dim ENCENDIDO As Float
Dim VMIN As Float
Dim VMAX As Float
Dim VPP As Float
Dim CUENTAS As Byte
Dim A As Byte
Dim B As Byte
'********************************************
'ALIAS
'********************************************
Symbol LED = PORTA.2
Symbol INFRA = PORTA.3
Symbol RELE = PORTA.4
'********************************************
'RESET
'********************************************
Low RELE
VOLT = 0
ACVOLT = 0
ENCENDIDO = 0
CORRIENTE = 0
CUENTAS = 0
A = 0
B = 0
VMIN = ((5.0 * 1.4142)  / 3.1415)
VMAX = 5.0
MAXIMO = 2.5
TIEMPO = 2
TIEMPOL = 100
'********************************************
High LED
DelayMS 500
Toggle LED
'********************************************
STANDBY:
If INFRA = 1 Then GoTo STANDBY
For A = 1 To 10
For B = 1 To 100
DelayMS 1
If INFRA = 0 Then TIEMPO = ((TIEMPO + 1) << 8)
Next
Next
If PCON.7 = 1 Or PCON.6 = 1 Then High LED
If TIEMPO >= 100 Then High LED : DelayMS 500 : High RELE : TIEMPO = 0 : DelayMS 15000 : Else : TIEMPO = 0 : GoTo STANDBY
'*********************************************
While 1 = 1
GoSub CAPTURA
'*************************************************
'Fusible
'*************************************************
If CORRIENTE >= 4.700 Then Low RELE : High LED : GoTo STANDBY
'*************************************************
Select CORRIENTE
Case ((0.000 To 0.200) / 2.0)
If CORRIENTE > ENCENDIDO Then ENCENDIDO = (((CORRIENTE * 3.1415) / 80 ) ^ 2)
Case ((0.400 To 0.600) / 1.8)
If CORRIENTE > ENCENDIDO Then ENCENDIDO = (((CORRIENTE * 3.1415) / 70 ) ^ 2)
Case ((0.700 To 1.000) / 1.6)
If CORRIENTE > ENCENDIDO Then ENCENDIDO = (((CORRIENTE * 3.1415) / 60 ) ^ 2)
Case > 1.000
If CORRIENTE > ENCENDIDO Then ENCENDIDO = (((CORRIENTE * 3.1415) / 50) ^ 2)
Case Else
If CORRIENTE < ENCENDIDO Then CORRIENTE = fabs((CORRIENTE * 3.1415) <<  3)
EndSelect
'*********************************************
MAIN:
Select ACVOLT
Case > 137.00  '137.00
DelayMS 100 : GoSub CAPTURA : If ACVOLT > 137.00 Then Low RELE : TIEMPOL = 80 : GoSub REPORTE : GoTo STANDBY
Case < 100.00  '100.00
DelayMS 100 : GoSub CAPTURA : If ACVOLT < 95.00 Then Low RELE : TIEMPOL = 500 : GoSub REPORTE : GoTo STANDBY
Case 125.00 To 137.00 '125 - 137VAC
TIEMPOL = 80
Case 110.00 To 124.00 '110 - 124VAC
TIEMPOL = 150
Case 95.00 To 109.00 '95 - 109VAC
TIEMPOL = 500
EndSelect
'*********************************************
'Fusible
'*********************************************
If CORRIENTE >= 4.700 Then Low RELE : High LED : GoTo STANDBY
If CORRIENTE < ENCENDIDO Then DelayMS 5000 : Low RELE : GoTo STANDBY
Wend
'*********************************************
'Lectura corriente
'*********************************************
CAPTURA:
CUENTAS = 0
VOLT = 0
CORRIENTE = 0
For CUENTAS = 1 To 200
VOLT = ADIn 0
CORRIENTE = (VOLT / 249.755) - 2.500) *  ((fabs 1.4142) ^ 2) ' /1023
If CORRIENTE <= VMIN Then VMIN = CORRIENTE
If CORRIENTE >= VMAX Then VMAX = CORRIENTE
Next
VPP = VMAX - VMIN
CORRIENTE = fAbs((2.659875 * VPP) / 1.4142)
VMIN = 5.0
VMAX = 2.5
'*********************************************
'Lectura tensiòn
'*********************************************
For CUENTAS = 1 To 200
ACVOLT = ADIn 1
ACVOLT = (ACVOLT / 249.755) - 2.500 ' /1023
If ACVOLT >= VMAX Then VMAX = ((ACVOLT * 1.4142) / 2)
If ACVOLT <= VMIN Then VMIN = ((ACVOLT / 1.4142) << 2)
Next
VMIN = fAbs VMIN
ACVOLT = (VMAX + VMIN)
ACVOLT = (ACVOLT / 1.4142) * (VPP /  2)
ACVOLT = fabs ((ACVOLT * 216.000) / 4.096)
VMAX = 2.5
VMIN = 5.00
High LED
DelayMS TIEMPOL
Low LED
DelayMS TIEMPOL
Return
'********************************************
REPORTE:
For CUENTAS = 1 To 10
High LED
DelayMS TIEMPOL
Low LED
DelayMS TIEMPOL
Next
Return
'********************************************
End
'********************************************

Desconectado Eduardo Rodas

  • PIC12
  • **
  • Mensajes: 62
    • Kit electronica
Re:Pic falla cada 3 semanas.
« Respuesta #10 en: 08 de Diciembre de 2021, 13:40:01 »
Ya hice algunos cambios en el programa; elimine los gosub y los goto lo que hace ver mejor el programa. También elimine algunos if redundantes con lo que recupere un 10% de la memoria de programa.

Además descubrí una conexión floja desde el modulo de corriente ACS712 ...era una bornera a la cual uno de los tornillos se había aflojado y esto generaba picos de corriente, lo que hacia que "el fusible electrónico" del programa se activara y apagara todo.

Lo descubrí simplemente haciendo prender el led permanentemente cuando se activaba el fusible. También hay una rutina que llame reporte, la cual me indica cual de las protecciones se activo y esto me ayudo a depurar el programa.

Por ahora todo marcha bien y nada ha fallado. Gracias.

Nota: No se como se sube una imagen al foro, por lo  que no pude subir el diagrama del proyecto.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Pic falla cada 3 semanas.
« Respuesta #11 en: 08 de Diciembre de 2021, 13:47:39 »
Ya hice algunos cambios en el programa; elimine los gosub y los goto lo que hace ver mejor el programa. También elimine algunos if redundantes con lo que recupere un 10% de la memoria de programa.

Además descubrí una conexión floja desde el modulo de corriente ACS712 ...era una bornera a la cual uno de los tornillos se había aflojado y esto generaba picos de corriente, lo que hacia que "el fusible electrónico" del programa se activara y apagara todo.

Lo descubrí simplemente haciendo prender el led permanentemente cuando se activaba el fusible. También hay una rutina que llame reporte, la cual me indica cual de las protecciones se activo y esto me ayudo a depurar el programa.

Por ahora todo marcha bien y nada ha fallado. Gracias.

Nota: No se como se sube una imagen al foro, por lo  que no pude subir el diagrama del proyecto.

Aunque no lo creas, es muy buena idea levantar un diagrama de flujo de tu código, te ayuda muchas veces a encontrar posibles errores que podrían suceder en algún momento o te ayuda a optimizar tu código.

Yo utilizo una herramienta gratuita denominada DIA en la cual documento el firmware que desarrollo.

https://wiki.gnome.org/action/show/Apps/Dia?action=show&redirect=Dia

Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Eduardo Rodas

  • PIC12
  • **
  • Mensajes: 62
    • Kit electronica
Re:Pic falla cada 3 semanas.
« Respuesta #12 en: 09 de Diciembre de 2021, 12:03:32 »
Ya hice algunos cambios en el programa; elimine los gosub y los goto lo que hace ver mejor el programa. También elimine algunos if redundantes con lo que recupere un 10% de la memoria de programa.

Además descubrí una conexión floja desde el modulo de corriente ACS712 ...era una bornera a la cual uno de los tornillos se había aflojado y esto generaba picos de corriente, lo que hacia que "el fusible electrónico" del programa se activara y apagara todo.

Lo descubrí simplemente haciendo prender el led permanentemente cuando se activaba el fusible. También hay una rutina que llame reporte, la cual me indica cual de las protecciones se activo y esto me ayudo a depurar el programa.

Por ahora todo marcha bien y nada ha fallado. Gracias.

Nota: No se como se sube una imagen al foro, por lo  que no pude subir el diagrama del proyecto.

Aunque no lo creas, es muy buena idea levantar un diagrama de flujo de tu código, te ayuda muchas veces a encontrar posibles errores que podrían suceder en algún momento o te ayuda a optimizar tu código.

Yo utilizo una herramienta gratuita denominada DIA en la cual documento el firmware que desarrollo.

https://wiki.gnome.org/action/show/Apps/Dia?action=show&redirect=Dia

Si, algunas veces lo hago pero en este caso no. Interesante herramienta. Gracias.