Autor Tema: Pic deja de responder  (Leído 2629 veces)

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

Desconectado Briang

  • PIC10
  • *
  • Mensajes: 3
Pic deja de responder
« en: 29 de Noviembre de 2023, 15:59:57 »
Buen día querida comunidad. El día de hoy vengo a solicitar de su ayuda y de su amplio conocimiento. No soy experto en programación de Pic's soy estudiante y me han enseñado lo básico.
Pasa que en este momento me encuentro desarrollando un proyecto para un geriátrico sin embargo, tiene algunas fallas.

El programa es básico, a grandes rasgos, simplemente, en el momento en que recibe el pulso de un botón activa unas luces y unas alarmas dependiendo de quién solicite la ayuda .  El sistema inicialmente funciona bien, sin embargo, si permanece inactivo por unas horas  ya no hace nada, el recibe los pulsos pero no hace nada de nada, me toca hacer recet para que vuelva a funcionar. No sé si entra en algún sueño o algo así. Si alguien sabe que podría ser agradecería mucho de su ayuda.


Estoy programando con Pic c compiler y usando el Pic 16f877A


Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re:Pic deja de responder
« Respuesta #1 en: 29 de Noviembre de 2023, 16:20:36 »
Comparte tu programa a ver si vemos algo raro. Sería muy conveniente también ver el esquema del circuito.

Desconectado Briang

  • PIC10
  • *
  • Mensajes: 3
Re:Pic deja de responder
« Respuesta #2 en: 29 de Noviembre de 2023, 16:29:46 »
Muchas gracias por responder Este es el código:
 
#include <16f877a.h>
#use delay(clock=20000000,crystal)
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOWRT,NOBROWNOUT
#byte port_a = 5
#byte port_b = 6
#byte port_c = 7
#byte port_d = 8
#byte port_e = 9


// D2 OUT
int BTN_ENT_PORT1, BTN_ENT_PORT2, BTN_ENT_PORT3, BTN_ENT_PORT4;
int LEC_ENT_PORT1, LEC_ENT_PORT2, LEC_ENT_PORT3, LEC_ENT_PORT4;
int EST_ALARMA = 0;
int estado = 1;

//Inicializacion funciones//
void Lectura (void);
void PORT1 (void);
void PORT2 (void);
void PORT3 (void);
void PORT4 (void);

#INT_RB          //Funcion de la Interrupcion



void main (void){

 
   SET_TRIS_B(0B11111111); // Entradas
   SET_TRIS_C(0B10000000); // Salidas
   SET_TRIS_D(0B00000000); // Salidas 
   port_c = 0; // INICIAMOS PUERTO C EN LOW
   port_d = 0; // INICIAMOS PUERTO D EN LOW
   port_b = 0;

   
 
   while(true){
     
     
     Lectura();
     PORT1();
     PORT2();
     PORT3();
     PORT4();
   
 
 }
     
}//main

void Lectura (void){
   ///// Botones ////
   BTN_ENT_PORT1 = input(pin_b0);
   BTN_ENT_PORT2 = input(pin_b1);
   BTN_ENT_PORT3 = input(pin_b2);
   BTN_ENT_PORT4 = input(pin_b3);
   //////LECTORAS///
   LEC_ENT_PORT1 = input(pin_b4);
   LEC_ENT_PORT2 = input(pin_b5);
   LEC_ENT_PORT3 = input(pin_b6);
   LEC_ENT_PORT4 = input(pin_b7);       
}

void PORT1 (void){
 
  if(BTN_ENT_PORT1 == 1 && LEC_ENT_PORT1 == 0){
            EST_ALARMA = 1;
            if(EST_ALARMA == 1){
               output_high(pin_d2);
            }
      }else{
         if(EST_ALARMA == 1 && LEC_ENT_PORT1 == 1){
            EST_ALARMA = 0;
            if(EST_ALARMA == 0){
               output_low(pin_d2);
               
               }
               
            }
           
      }
   
}

void PORT2 (void){
   
  if(BTN_ENT_PORT2 == 1 && LEC_ENT_PORT2 == 0){
            EST_ALARMA = 1;
            if(EST_ALARMA == 1){
               output_high(pin_d3);
            }
      }else{
         if(EST_ALARMA == 1 && LEC_ENT_PORT2 == 1){
            EST_ALARMA = 0;
            if(EST_ALARMA == 0){
            output_low(pin_d3);
           
            }
          }
      }

}

void PORT3 (void){

  if(BTN_ENT_PORT3 == 1 && LEC_ENT_PORT3 == 0){
            EST_ALARMA = 1;
            if(EST_ALARMA == 1){
               output_high(pin_d4);
             
            }
      }else{
         if(EST_ALARMA == 1 && LEC_ENT_PORT3 == 1){
            EST_ALARMA = 0;
            if(EST_ALARMA == 0){output_low(pin_d4);}
            }
      }
     
}

void PORT4 (void){

  if(BTN_ENT_PORT4 == 1 && LEC_ENT_PORT4 == 0){
            EST_ALARMA = 1;
            if(EST_ALARMA == 1){
               output_high(pin_d5);
               
            }
      }else{
         if(EST_ALARMA == 1 && LEC_ENT_PORT4 == 1){
            EST_ALARMA = 0;
            if(EST_ALARMA == 0).
                 {
                   output_low(pin_d5);
                }           
            }
      }
}

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Pic deja de responder
« Respuesta #3 en: 29 de Noviembre de 2023, 16:43:42 »
....
El programa es básico, a grandes rasgos, simplemente, en el momento en que recibe el pulso de un botón activa unas luces y unas alarmas dependiendo de quién solicite la ayuda .  El sistema inicialmente funciona bien, sin embargo, si permanece inactivo por unas horas  ya no hace nada, el recibe los pulsos pero no hace nada de nada, me toca hacer recet para que vuelva a funcionar. No sé si entra en algún sueño o algo así....
Lo mas probable es que se te esté metiendo ruido por los cables de los pulsadores y te termina colgando el micro -->  La primer medida fácil es usar el Watchdog

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re:Pic deja de responder
« Respuesta #4 en: 29 de Noviembre de 2023, 16:48:24 »
Efectivamente, te iba a decir lo mismo.

Cambia los fuses por estos:
#fuses HS,WDT,NOPROTECT,NOLVP,NOWRT,NOBROWNOUT

Y mete este comando en el bucle principal del programa:
restart_wdt();

Desconectado Briang

  • PIC10
  • *
  • Mensajes: 3
Re:Pic deja de responder
« Respuesta #5 en: 29 de Noviembre de 2023, 16:58:05 »
Listo compañeros Muchas gracias. Probaré con lo que me están indicando y estaré informando si con el Watchdog deja de pegarse. Mil gracias y bendiciones.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Pic deja de responder
« Respuesta #6 en: 29 de Noviembre de 2023, 17:24:49 »
Listo compañeros Muchas gracias. Probaré con lo que me están indicando y estaré informando si con el Watchdog deja de pegarse. Mil gracias y bendiciones.

El perro guardián debería reiniciar al CPU en casos muy excepcionales, como cuando el ruido EMI produce que el contador de programa salte a una región donde no hay código y se queda "colgado".

En tu caso, parecería, posiblemente que tu código está mal estructurado y en alguna parte se queda en un bucle infinito.

Por el momento sería una solución, pero el uso del WDT para solucionar una mala escritura de código, podría decirse que no es algo de un buen programador.

También si es culpa por algún ruido externo y no por el código, eso implica un mal diseño del hardware.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Pic deja de responder
« Respuesta #7 en: 29 de Noviembre de 2023, 17:32:08 »
Está raro tu código, por ejemplo en la función PORT1

Código: C
  1. void PORT1 (void)
  2. {
  3.    if(BTN_ENT_PORT1 == 1 && LEC_ENT_PORT1 == 0)
  4.    {
  5.        EST_ALARMA = 1;
  6.        if(EST_ALARMA == 1)
  7.        {
  8.          output_high(pin_d2);
  9.         }
  10.    }
  11.    else
  12.    {
  13.        if(EST_ALARMA == 1 && LEC_ENT_PORT1 == 1)
  14.        {
  15.           EST_ALARMA = 0;
  16.           if(EST_ALARMA == 0)
  17.          {
  18.              output_low(pin_d2);
  19.           }
  20.     }
  21. }
  22.    
  23. }

No tiene sentido el if(EST_ALARMA == 1) o el if(EST_ALARMA == 0), ya que previamente lo pones en 1 o en 0, es decir sería así:

Código: C
  1. void PORT1 (void)
  2. {
  3.    if(BTN_ENT_PORT1 == 1 && LEC_ENT_PORT1 == 0)
  4.    {
  5.        EST_ALARMA = 1;
  6.        //if(EST_ALARMA == 1)
  7.        //{
  8.          output_high(pin_d2);
  9.         //}
  10.    }
  11.    else
  12.    {
  13.        if(EST_ALARMA == 1 && LEC_ENT_PORT1 == 1)
  14.        {
  15.           EST_ALARMA = 0;
  16.           //if(EST_ALARMA == 0)
  17.          //{
  18.              output_low(pin_d2);
  19.           //}
  20.       }
  21.   }
  22.    
  23. }


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