Autor Tema: Como resetear el pic por software?  (Leído 6927 veces)

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

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Como resetear el pic por software?
« en: 28 de Octubre de 2021, 20:36:23 »
Cordial saludo, realice un circuito con el pic 10f200 y he programado un temporizador para 1 hora con un for y 2 variables auxiliares le realizo varias pruebas y trabaja bien pero en ocasiones se cuelga, se que es mejor realizarlo con el tmr0 pero quiero saber que puede estar pasando. cualquiera que fuera la respuesta de esto, aún deseo saber como puedo hacer para realizar un reset o no se si con el whatch dog timer( nunca lo he utilizado y tampoco se en que ocaciones deba hacerlo, podrian orientarme por favor?
Gracias de antemano.
Código: C
  1. #include <10F200.h>
  2.    #FUSES NOWDT,NOMCLR                  //No Watch Dog Timer
  3.    #FUSES PROTECT                    // codigo protegido
  4.    //#use delay(crystal=4000000)      // oscilador con cristal
  5.    #use delay(CLOCK=4000000)      // oscilador interno
  6.    
  7.    #DEFINE rele PIN_B1      // le doy un nombre al pin
  8.    #define accesorios PIN_B2
  9.    #define puntilla PIN_B3
  10.    #BYTE PORTB=0X06            // lugar de memoria del puerto A ( muy importante )
  11.    #USE standard_IO (B)           // Optimizamos E/S del PORTB ( muy importante para ahorrar memoria )
  12.    //#ORG 0x50, 0XFF         // proteger el codigo a  partir de la linea 50
  13.    
  14.    
  15.    unsigned int16 i=0;       // variable para el for temporizacion que es mayos a 256
  16.    unsigned int x=0;
  17.    int retencion;       // mantiene activado el rele cuando temporiza
  18.    //int n=0;              // variable para el buzzer
  19.        
  20.        
  21.        // prototipos funciones
  22.        //void sonido (); // funcion de buzzer
  23.        //xxxxxxxxxxxxxxxxxxxxxxxxx
  24.       //
  25.              
  26.                              
  27.    void main()
  28.    {
  29.    
  30.    //////// configura  Gp2 como i/s digital y desabilita el tocki (ocs bit-5)
  31.    #asm
  32.    movlw (0B11000000); GPWU = 1, GPPU = 1, T0CS, T0SE, PSA, PS2, PS1, PS0 = 0
  33.    option
  34.    #endasm
  35.   /////////////////////////////////////////////////////////////////////////////
  36.  
  37.    SET_TRIS_B(0B1100);    //set_options (0B000000);
  38.    PORTB=0;                // limpio el puerto
  39.    delay_ms(1000);
  40.    output_high(rele);
  41.   i=0;       // variable para el for temporizacion que es mayos a 256
  42.   x=0;
  43.  retencion=1;  
  44.    
  45.     //Example blinking LED program
  46.      while(true)
  47.     {
  48.    
  49.  
  50.  
  51.     if ((!input(accesorios)) && (input(puntilla))&& (retencion==1))// si es uno llamo funcion sonido
  52.     {
  53.        for (i=0;i<6000;i++)
  54.        {
  55.           if ((input(accesorios)) || (!input(puntilla)))
  56.           {
  57.            retencion=0;
  58.            output_high(rele);
  59.            i=0;
  60.            x=0;
  61.            break;
  62.           }    
  63.        
  64.        delay_ms(10);
  65.        }
  66.     x++;
  67.        if (x==1)
  68.        {
  69.        retencion =0;
  70.        i=0;
  71.        x=0;
  72.        output_low(rele);
  73.        }  
  74.    
  75.     }
  76.  
  77.    
  78.    
  79.    
  80.     while((input(accesorios)) || (!input(puntilla)))
  81.     {
  82.     retencion=1;
  83.     output_high(rele);
  84.     }
  85.  
  86.  
  87.      
  88.     } // while tru
  89.     } // main
  90.  
  91.  
  92. //>>>>>>>>>>>>> funcion >>>>>>>>>>>>>>>>>>>>>>
Si algo parece complicado... es por que esta mal explicado.

Desconectado Robert76

  • PIC24F
  • *****
  • Mensajes: 577
Re:Como resetear el pic por software?
« Respuesta #1 en: 28 de Octubre de 2021, 22:45:49 »
Prueba con reser_cpu(); y el programa volverá a la posición 0h00 de arranque.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Como resetear el pic por software?
« Respuesta #2 en: 29 de Octubre de 2021, 19:05:46 »
Para lo que quieres, lo mejor que puedes usar es watch dog.  Sin duda.

 Reset_cpu(); no te servirá de mucho por que si se cuelga el programa, ¿como lo llamas?. Tendrías que programar una interrupción con un timer, y para eso, ya está Watch dog.

 

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Como resetear el pic por software?
« Respuesta #3 en: 30 de Octubre de 2021, 15:27:59 »
Cordial saludo, realice un circuito con el pic 10f200 y he programado un temporizador para 1 hora con un for y 2 variables auxiliares le realizo varias pruebas y trabaja bien pero en ocasiones se cuelga, se que es mejor realizarlo con el tmr0 pero quiero saber que puede estar pasando. cualquiera que fuera la respuesta de esto, aún deseo saber como puedo hacer para realizar un reset o no se si con el whatch dog timer( nunca lo he utilizado y tampoco se en que ocaciones deba hacerlo, podrian orientarme por favor?
Gracias de antemano.
Código: C
  1. #include <10F200.h>
  2.    #FUSES NOWDT,NOMCLR                  //No Watch Dog Timer
  3.    #FUSES PROTECT                    // codigo protegido
  4.    //#use delay(crystal=4000000)      // oscilador con cristal
  5.    #use delay(CLOCK=4000000)      // oscilador interno
  6.    
  7.    #DEFINE rele PIN_B1      // le doy un nombre al pin
  8.    #define accesorios PIN_B2
  9.    #define puntilla PIN_B3
  10.    #BYTE PORTB=0X06            // lugar de memoria del puerto A ( muy importante )
  11.    #USE standard_IO (B)           // Optimizamos E/S del PORTB ( muy importante para ahorrar memoria )
  12.    //#ORG 0x50, 0XFF         // proteger el codigo a  partir de la linea 50
  13.    
  14.    
  15.    unsigned int16 i=0;       // variable para el for temporizacion que es mayos a 256
  16.    unsigned int x=0;
  17.    int retencion;       // mantiene activado el rele cuando temporiza
  18.    //int n=0;              // variable para el buzzer
  19.        
  20.        
  21.        // prototipos funciones
  22.        //void sonido (); // funcion de buzzer
  23.        //xxxxxxxxxxxxxxxxxxxxxxxxx
  24.       //
  25.              
  26.                              
  27.    void main()
  28.    {
  29.    
  30.    //////// configura  Gp2 como i/s digital y desabilita el tocki (ocs bit-5)
  31.    #asm
  32.    movlw (0B11000000); GPWU = 1, GPPU = 1, T0CS, T0SE, PSA, PS2, PS1, PS0 = 0
  33.    option
  34.    #endasm
  35.   /////////////////////////////////////////////////////////////////////////////
  36.  
  37.    SET_TRIS_B(0B1100);    //set_options (0B000000);
  38.    PORTB=0;                // limpio el puerto
  39.    delay_ms(1000);
  40.    output_high(rele);
  41.   i=0;       // variable para el for temporizacion que es mayos a 256
  42.   x=0;
  43.  retencion=1;  
  44.    
  45.     //Example blinking LED program
  46.      while(true)
  47.     {
  48.    
  49.  
  50.  
  51.     if ((!input(accesorios)) && (input(puntilla))&& (retencion==1))// si es uno llamo funcion sonido
  52.     {
  53.        for (i=0;i<6000;i++)
  54.        {
  55.           if ((input(accesorios)) || (!input(puntilla)))
  56.           {
  57.            retencion=0;
  58.            output_high(rele);
  59.            i=0;
  60.            x=0;
  61.            break;
  62.           }    
  63.        
  64.        delay_ms(10);
  65.        }
  66.     x++;
  67.        if (x==1)
  68.        {
  69.        retencion =0;
  70.        i=0;
  71.        x=0;
  72.        output_low(rele);
  73.        }  
  74.    
  75.     }
  76.  
  77.    
  78.    
  79.    
  80.     while((input(accesorios)) || (!input(puntilla)))
  81.     {
  82.     retencion=1;
  83.     output_high(rele);
  84.     }
  85.  
  86.  
  87.      
  88.     } // while tru
  89.     } // main
  90.  
  91.  
  92. //>>>>>>>>>>>>> funcion >>>>>>>>>>>>>>>>>>>>>>

Si tu código se cuelga es porque está escrito erróneamente.

Generalmente pasa en los lazos while, porque ahí tienes uno al final a parte del principal.

¿Cómo puede solucionarlo? Si puedes debugar con el hardware, en el momento que se cuelga, puedes poner pausa a al depuración y ver donde se queda.

Si no puedes hacerlo, usa un led.


Por ejemplo en ese lazo while que menciono, activa un led, y cuando salgas de ahí apagado, si se cuelga tu microcontrolador y permanece encendido el led, es porque ahí una de las dos condiciones permanecen (o las dos) siempre regresan un valor verdadero.

Un led te puede ayudar a rastrear hasta donde llega tu código.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:Como resetear el pic por software?
« Respuesta #4 en: 01 de Noviembre de 2021, 11:22:13 »
gracias por sus respuestas,, me queda un poco dificil la prueba del diodo ya que la temporizacion la estoy haciendo para 1 o 2 horas y lo pruebo unas 3 veces y trabaja bien, cuando lo ensamblo pueden pasar dias y en algun momento ya no temporiza,  y no desconecta la carga y me descarga la bateria ( la temporizacion es para desconectar la bateria que tiene como carga una bobina, el pic nunca se queda sin alimentacion)tal vez podria cambiar la forma de temporizacion con el tmr0 pero deseo buscar una opcion para resetear el pic por software y tambien externamente. hay una linea que se pone en positivo siempre que se inicia el proceso pero no se como implemtarla con un transistor para que puetee el negativo solo un instante(un pulso) pero como el voltaje permanece mucho tiempo el reset permanece, necesito algo asi como lograr un pulso por un condensador.
tambien he pensado en el whatchdog pero segun he leido hay que repetir una rutinqa constantemente, nunca lo he usado agradezco alguna orientacion.
Si algo parece complicado... es por que esta mal explicado.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Como resetear el pic por software?
« Respuesta #5 en: 01 de Noviembre de 2021, 13:11:46 »
gracias por sus respuestas,, me queda un poco dificil la prueba del diodo ya que la temporizacion la estoy haciendo para 1 o 2 horas y lo pruebo unas 3 veces y trabaja bien, cuando lo ensamblo pueden pasar dias y en algun momento ya no temporiza,  y no desconecta la carga y me descarga la bateria ( la temporizacion es para desconectar la bateria que tiene como carga una bobina, el pic nunca se queda sin alimentacion)tal vez podria cambiar la forma de temporizacion con el tmr0 pero deseo buscar una opcion para resetear el pic por software y tambien externamente. hay una linea que se pone en positivo siempre que se inicia el proceso pero no se como implemtarla con un transistor para que puetee el negativo solo un instante(un pulso) pero como el voltaje permanece mucho tiempo el reset permanece, necesito algo asi como lograr un pulso por un condensador.
tambien he pensado en el whatchdog pero segun he leido hay que repetir una rutinqa constantemente, nunca lo he usado agradezco alguna orientacion.

Para mi ese código que está escrito está mal, ese while que utilizas al final debe se la causa que se queda ahí se queda sin salir el contador de programa:

Código: [Seleccionar]
while((input(accesorios)) || (!input(puntilla)))
    {
    retencion=1;
    output_high(rele);
    }

Muchos de los problemas con los que escriben código en un microcontrolador (y también en software) es que no siguen una norma o proceso, escriben el código como mas puedan y es por eso que tienen la idea que los microcontroladores son inestables o poco confiables para algo profesional.

Yo te recomendaría escribas en tareas independientes en estados de máquina.

Si no sabes eso, por lo menso diseña un diagrama de flujo de todo lo que quieres hacer y ahí escribe tu código.

Nuevamente, ese while es un absurdo, debe existe una mejor manera de hacer lo que deseas  sin recurrir a eso.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Como resetear el pic por software?
« Respuesta #6 en: 01 de Noviembre de 2021, 13:24:16 »
...
tambien he pensado en el whatchdog pero segun he leido hay que repetir una rutinqa constantemente...

El watchdog no "vigila" el código,  es un temporizador que hay que resetear antes que alcance un límite que te resetea el micro.  Los puntos de reseteo se deben elegir astutamente, no existen instrucciones a prueba de centennials. 

En tu caso es modificar:
Código: [Seleccionar]
#FUSES WDT,NOMCLR               //Watch Dog Timer, no Master Clear


Código: [Seleccionar]
    //////// configura  Gp2 como i/s digital y desabilita el tocki (ocs bit-5)
    #asm
        movlw (0B11001111); GPWU = 1, GPPU = 1, T0CS, T0SE=0 , PSA, PS2, PS1, PS0 = 1
        option
    #endasm
Si no se resetea el WDT cada 2" (2304ms) te resetea el micro.

Después, al iniciar el bucle hacés un restart_wdt() , otro durante durante cada loop.
El     while((input(accesorios)) || (!input(puntilla)))   que se lo ve medio peligroso porque si no cambian accesorios y puntilla queda ahí hasta el fin de los tiempos.

Código: [Seleccionar]
    restart_wdt();   //<<<<<<<<<<<<<<<<<<<<<<<<

    //Example blinking LED program
     while(true)
    {   

    if ((!input(accesorios)) && (input(puntilla)) && (retencion==1))    // si es uno llamo funcion sonido
    {
       
       for (i=0;i<6000;i++)
       {
          if ((input(accesorios)) || (!input(puntilla)))
          {
           retencion=0;
           output_high(rele);
           i=0;
           x=0;
           break;
          }             
       
       delay_ms(10);
       }
       
       x++;
       if (x==1)
       {
           retencion =0;
           i=0;
           x=0;
           output_low(rele);
       } 

    }
                   
    restart_wdt();    //<<<<<<<<<<<<<<<<<<<<<<<<
   
    while((input(accesorios)) || (!input(puntilla)))
    {
        retencion=1;
        output_high(rele);
    }
                   
     
    } // while tru

restart_wdt() se inserta sin complejos pues es una instrucción de 1 ciclo (C: restart_wdt()  ==  ASM:  CLRWDT )


Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:Como resetear el pic por software?
« Respuesta #7 en: 01 de Noviembre de 2021, 14:04:41 »
perfecto voy entendiendo , antes de implemetar un mejor codigo tengo estas dudas..
# segun veo el whatchdog actua cada 2304 milisegundos, viene asi por defecto o hay que configurar algo?
# si estoy haciendo un contador, cada que reinicie el watchdog el contador se reiniciara - entonces perdera el valor de lo que tenia
# como estoy en 12f508 este no tiene interrupciones entonces como lo detengo cuado haga el conteo que necesito?
# tengo entendido que no se puede utiza el tmr0 y el whatchdod al tiempo?
Gracias por su tiempo.

Código: C
  1. #include <12F508.h>
  2.    #FUSES NOWDT                    //No Watch Dog Timer
  3.    #FUSES NOPROTECT                 // codigo protegido
  4.    #FUSES MCLR                  
  5.    // #use delay(crystal=4000000) // oscilador con cristal
  6.    #use delay(internal=4000000) // oscilador interno
  7.    
  8.    //#DEFINE SW PORTB,1       // le doy un nombre al pin
  9.    // #define LED PIN_B0          // llamamos led al pin b0
  10.    // #define LED2 PIN_B2          // llamamos led al pin b0  
  11.    
  12.    #define pulsador pin_b1 //Nombra a delay_ms() como Retardo
  13.   // #define pulsador2 pin_b2
  14.    // #define pulsador3 pin_b4
  15.    #DEFINE LED PIN_b0
  16.    //#DEFINE LED2 PIN_b2
  17.    #BYTE PORTB=0X06       // lugar de memoria del puerto A ( muy importante )
  18.    #USE FAST_IO (B)      // Optimizamos E/S del PORTB ( muy importante para ahorrar memoria )
  19.    #ORG 0x50, 0X01FF        // proteger el codigo a  partir de la linea 50
  20.    // #USE STANDARD_IO (B)
  21.    //#use FIXED_IO( B_outputs=PIN_B5,PIN_B4,PIN_B2,PIN_B1,PIN_B0 )
  22.    //#define set_options (value) {#ASM \
  23.                               // value \
  24.                               //OPTION \
  25.                               //#ENDASM}
  26.         int  cont;
  27.         int  cont2;
  28.         int  cont3;
  29.        //int SEGUNDOS=0;
  30.  
  31.  
  32.       // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  33.           VOID TEMPO();   // PROTOTIPO DE LA FUNCION
  34.       // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  35.                              
  36.       void main()
  37.       {    
  38.       SET_TRIS_B(0B001010);
  39.       //set_options (0B000000);
  40.       #asm
  41.       movlw 0xC0 ; GPWU = 1, GPPU = 1, T0CS, T0SE, PSA, PS2, PS1, PS0 = 0
  42.      option#endasm
  43.      PORTB=0;
  44.       // fin configuracion *************
  45.    
  46.  
  47.    
  48.    //SETUP_TIMER_0(RTCC_INTERNAL|RTCC_DIV_128|RTCC_8_bit); // GENERALMENTE VA AQUI SI MANTENGO EL PREESCALER FIJO
  49.    
  50.   //se pueden modificar en el transcurso del programa las configuraciones del tmr0 y los registros para altere los tempos
  51.  
  52.  
  53.    
  54.  
  55.      while( true)
  56.          {
  57.          
  58.          if (input(pulsador))
  59.          {
  60.          SETUP_TIMER_0(RTCC_INTERNAL|RTCC_DIV_128|RTCC_8_bit); // LO COLOCO AQUI POR SI DESEO MODIFICAR EL PREESCALER EN ALGUN MOMENTO
  61.          cont2=126;
  62.          cont3=194;        
  63.          tempo();
  64.  
  65.          }
  66.  
  67.          }
  68.      
  69.            
  70.      }      
  71.  
  72.  
  73.  
  74.   //======================================
  75.  
  76.  
  77.  
  78.     VOID tempo()
  79.    
  80.    
  81.   {
  82.          //SETUP_TIMER_0(RTCC_INTERNAL|RTCC_DIV_128|RTCC_8_bit); // LO COLOCO AQUI POR SI DESEO MODIFICAR EL PREESCALER EN ALGUN MOMENTO
  83.          Cont=cont2;                // =126
  84.          output_high(LED);         //cargo el contador
  85.          while(Cont>0)             //hasta que el contador sea 217(1ms*217=217ms)
  86.          {
  87.          set_timer0(cont3);         //se carga el timer para 1s
  88.          while(get_timer0());     //se espera aqui hasta que el timer valga 0 osea que se ha desbordado y ha pasado 1s  
  89.          {
  90.      
  91.  
  92.          Cont--;                 //Cada ms se incrementa contador
  93.          }
  94.          }
  95.        
  96.          
  97.          Cont=cont2;                //pasado los 10ms en alto pasamos el contador a 0
  98.          output_low(LED);  //pone en bajo el pin b0
  99.          while(Cont>0)        //hara lo siguiente hasta que contador sea =10
  100.          {
  101.          set_timer0( cont3);      //se carga el timer para 1ms
  102.          while(get_timer0()); //se espera hasta que se desborde el timer0
  103.          Cont--;               //incrementamos el contador cada ms
  104.          }
  105.                         //al finalizar los 10ms en bajo se pone a 0 el contador
  106.   }
« Última modificación: 01 de Noviembre de 2021, 14:07:44 por johenrod »
Si algo parece complicado... es por que esta mal explicado.

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Como resetear el pic por software?
« Respuesta #8 en: 01 de Noviembre de 2021, 15:10:14 »
...
# segun veo el whatchdog actua cada 2304 milisegundos, viene asi por defecto o hay que configurar algo?
Se configura un prescaler con los bits PSA, PS2, PS1, PS0
PSA: habilita el prescaler
PS2PS1PS0:  Elige entre 18,32,72,144,288,576,1152,2304 milisegundos

Citar
# si estoy haciendo un contador, cada que reinicie el watchdog el contador se reiniciara - entonces perdera el valor de lo que tenia
Es que el WDT es para usarse cuando debido a un evento anormal como ruido en alimentación, entradas, interferencia EM o lo que sea, el micro salta del recorrido normal y pasa a ejecutar en cualquier parte o con los registros alterados.
Cuando pasa eso, el micro ya hace varios milisegundos que está haciendo cualquier cosa, por lo que ningún contenido es confiable.

No es para usarse como temporizador "normal" por el simple hecho que salta a la dirección 0000 pero no sabés desde donde. Salvo casos particulares no se puede retomar el programa.

Citar
# tengo entendido que no se puede utiza el tmr0 y el whatchdod al tiempo?
Tiene un  solo prescaler, se asigna al WDT o al Timer0

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:Como resetear el pic por software?
« Respuesta #9 en: 03 de Noviembre de 2021, 11:44:01 »
Basicamente seria..
se configuraria el WDT como si fuese el tmr0
# si ambos al tiempo no pueden utilizarse se podrian ir intercalando a medida que avanza el programa?
# Entonces el wdt se deber utilizar dendro de un bucle para garantizar que siempre este haciendo lo requerido?
# como sabe el WDT que hay interferencias o que se quedo colgado.

no me queda claro donde y cuando lo debo implementar.
Si algo parece complicado... es por que esta mal explicado.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Como resetear el pic por software?
« Respuesta #10 en: 03 de Noviembre de 2021, 11:52:21 »
Basicamente seria..
se configuraria el WDT como si fuese el tmr0
# si ambos al tiempo no pueden utilizarse se podrian ir intercalando a medida que avanza el programa?
# Entonces el wdt se deber utilizar dendro de un bucle para garantizar que siempre este haciendo lo requerido?
# como sabe el WDT que hay interferencias o que se quedo colgado.

no me queda claro donde y cuando lo debo implementar.

Suponiendo que logras implementar el WDT, cuando se quede "colgado", reinicia el CPU del micro, ejecuta el proceso inicial y otra vez va a "colgarse" el micro. para otra vez reiniciarse. Al final desde el punto de vista del usuario seguirá viendo como que se queda colgado siempre.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Como resetear el pic por software?
« Respuesta #11 en: 03 de Noviembre de 2021, 13:36:13 »
se configuraria el WDT como si fuese el tmr0
No, además son para usos diferentes, cosa que no estás dispuesto a aceptar.

Citar
# si ambos al tiempo no pueden utilizarse se podrian ir intercalando a medida que avanza el programa?
Poder se puede, que tenga sentido hacerlo es otro tema.

Citar
# Entonces el wdt se deber utilizar dendro de un bucle para garantizar que siempre este haciendo lo requerido?
Se el restart_wdt() debe colocarse en aquellos puntos donde si se deja de pasar por determinado tiempo es porque se perdió el control y hay que resetear para retomarlo.

Citar
# como sabe el WDT que hay interferencias o que se quedo colgado.
No lo sabe, solo sabe que dejaste de resetearlo.

Citar
no me queda claro donde y cuando lo debo implementar.
Releé las respuestas con mejor luz.

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:Como resetear el pic por software?
« Respuesta #12 en: 03 de Noviembre de 2021, 15:53:15 »
Gracias por sus respuestas ya tomo comienza a tener sentido para mi,,,
por los ruidos que al parecer tengo y me estan bloqueando el pic debere implementar entonces  el WDT, como no tengo disponible el tmr0 necesito realizar una temporizacion de 2 horas, generalmente lo hago con "for" y variables auxiliares, podrian recomendarme algo que no este teniendo en cuenta?
gracias de antemano.
Si algo parece complicado... es por que esta mal explicado.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Como resetear el pic por software?
« Respuesta #13 en: 03 de Noviembre de 2021, 16:05:22 »
Gracias por sus respuestas ya tomo comienza a tener sentido para mi,,,
por los ruidos que al parecer tengo y me estan bloqueando el pic debere implementar entonces  el WDT, como no tengo disponible el tmr0 necesito realizar una temporizacion de 2 horas, generalmente lo hago con "for" y variables auxiliares, podrian recomendarme algo que no este teniendo en cuenta?
gracias de antemano.

Si te refieres a "ruidos" a ruidos eléctricos por arranque de cargas de alta corriente (motores, bobinas, etc.), ese tipo de señales generalmente no cuelgan al microcontrolador, lo que producen un reinicio del mismo y es lo que mas preguntan aquellos que tienen ese problema, es decir preguntan ("Porque cuando activo un motor el PIC se reinicia?")

Es posible dichos ruidos produzcan que el contador de programa salte a una región sin programa o alteren un registro y produzcan algún tipo de excepción, ahí es donde entra el WDT , pero son muy poco probables, muy diferente al problema que tu indicas.

También puede que sea un mal diseño de hardware trabajando en un ambiente muy ruidoso.

Si no corriges el código, hagas lo que hagas siempre te estará dando problemas ese while infinito.

Si deseas verificar que tan bueno es tu hardware a ruido externo, utiliza una lámpara fluorescente ya acércala a tu placa y ve si se reinicia tu microcontrolador o si realiza cosas "raras", las lámparas fluorescentes son una buena fuente de ruido eléctrico.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Como resetear el pic por software?
« Respuesta #14 en: 03 de Noviembre de 2021, 23:26:36 »
...
por los ruidos que al parecer tengo y me estan bloqueando el pic debere implementar entonces  el WDT, como no tengo disponible el tmr0
Te dije mas de una vez que lo no tenés disponible es el prescaler, porque hay uno solo, pero si podés usar el timer0 y el wdt. Obviamente escribiendo un código que tenga en cuenta las limitaciones.


Si el prescaler se asigna al timer0, el WDT será de 18ms --> Por lo tanto hay que resetearlo en menos de 18ms.

El el ejemplo que subiste para el 12F508 los intervalos entre cada decremento de Cont son casi 8ms, luego podés insertar un restart_wdt() sin problemas.

Código: [Seleccionar]
..................
#FUSES WDT                     
..................

     while( true)
     {
         restart_wdt();   // para cuando no está pulsado
         if (input(pulsador))

..................

   while(Cont>0)             
    {
        set_timer0(cont3);     
        while(get_timer0());     
        restart_wdt();     //<<<<<<<  lo mismo en el siguiente bucle
        Cont--;                 
    }     

..................

Si en cambio, debido a usar otros valores para el prescaler o cont3 el lapso fuera mayor de 18ms --> pues deberás modificar esa parte.