TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: johenrod en 28 de Octubre de 2021, 20:36:23

Título: Como resetear el pic por software?
Publicado por: johenrod 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 >>>>>>>>>>>>>>>>>>>>>>
Título: Re:Como resetear el pic por software?
Publicado por: Robert76 en 28 de Octubre de 2021, 22:45:49
Prueba con reser_cpu(); y el programa volverá a la posición 0h00 de arranque.
Título: Re:Como resetear el pic por software?
Publicado por: remi04 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.

 
Título: Re:Como resetear el pic por software?
Publicado por: DominusDRR 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.
Título: Re:Como resetear el pic por software?
Publicado por: johenrod 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.
Título: Re:Como resetear el pic por software?
Publicado por: DominusDRR 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.
Título: Re:Como resetear el pic por software?
Publicado por: Eduardo2 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 )

Título: Re:Como resetear el pic por software?
Publicado por: johenrod 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.   }
Título: Re:Como resetear el pic por software?
Publicado por: Eduardo2 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
Título: Re:Como resetear el pic por software?
Publicado por: johenrod 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.
Título: Re:Como resetear el pic por software?
Publicado por: DominusDRR 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.
Título: Re:Como resetear el pic por software?
Publicado por: Eduardo2 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.
Título: Re:Como resetear el pic por software?
Publicado por: johenrod 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.
Título: Re:Como resetear el pic por software?
Publicado por: DominusDRR 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.
Título: Re:Como resetear el pic por software?
Publicado por: Eduardo2 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.


Título: Re:Como resetear el pic por software?
Publicado por: johenrod en 08 de Noviembre de 2021, 11:55:20
...
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.

Tal vez no me supe expresar, agradezco la paciencia.
Lo que sucede es que como el 12f508 y el 10f200 no tienen serial propio(lo estoy emulando) tampoco interrupciones, entonces al parecer le estoy pidiendo mucho a este pic y digo que no tengo el TMR0 disponible es por que cuando utilizo el puerto serie no me trabaja el tmr0.
Título: Re:Como resetear el pic por software?
Publicado por: DominusDRR en 08 de Noviembre de 2021, 12:05:26
...
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.

Tal vez no me supe expresar, agradezco la paciencia.
Lo que sucede es que como el 12f508 y el 10f200 no tienen serial propio(lo estoy emulando) tampoco interrupciones, entonces al parecer le estoy pidiendo mucho a este pic y digo que no tengo el TMR0 disponible es por que cuando utilizo el puerto serie no me trabaja el tmr0.

Cuando un microcontrolador no posee un periférico de comunicación serial (I2c, SPI, RS232, etc.) lo que denominas "emulando" se llama Bit banging, esto implica utilizar un temporizador como generador de reloj para la duración del ancho de los pulsos (velocidad de transmisión) y/o generador de señal de reloj externa en un terminal o pin.

Es posible que esa sea la razón del problema del tmr0, sin embargo no he puesto atención a lo que quieres hacer con dicho temporizador.

Tu problema es un mal código escrito que quieres solucionar con un parche que posiblemente no te funcione o sea una solución anodina.
Título: Re:Como resetear el pic por software?
Publicado por: johenrod en 08 de Noviembre de 2021, 12:25:13

Cuando un microcontrolador no posee un periférico de comunicación serial (I2c, SPI, RS232, etc.) lo que denominas "emulando" se llama Bit banging, esto implica utilizar un temporizador como generador de reloj para la duración del ancho de los pulsos (velocidad de transmisión) y/o generador de señal de reloj.

Es posible que esa sea la razón del problema del tmr0, sin embargo no he puesto atención a lo que quieres hacer con dicho temporizador.

Tu problema es una mal código escrito quieres solucionar con un parche que posiblemente no te funcione o sea una solución anodina.
Gracias por sus respuestas,
tiene mucho sentido lo del temporizador que quizá cree problemas al estar emulando el serial y también utilizar el tmr0, no he corregido ese código en su totalidad esperando hacer las pruebas con lo que ustedes me indican, la idea entonces es como necesito si o si el serial, buscare una ayuda externa para resetear el pic cada cierto tiempo.

sin embargo ya tengo la información necesaria para hacerlo en otro diseño,,,, mil gracias.

como ultimo para no abrir otro hilo ( ya que el diseño es para lo mismo) podrían por favor darme una mano con esta ultima duda.

como emulo el serial, estoy leyendo unos datos entrantes por el bluetooth y estoy tratando que el pic me envíe al teléfono un carácter, esto para comprobar que el bluetooth no ha perdido la comunicación, el problema es que cuando envío datos desde el teléfono el pic parece que tiene problemas para leerlos tengo que oprimir repetidamente la tecla para que actúe.
dejo el código a continuación( si debo abrir otro hilo para esto me dicen por favor.
Código: C
  1. #include <12F508.h>
  2.    
  3.    #FUSES NOWDT
  4.    #FUSES NOMCLR
  5.    #FUSES PROTECT
  6.    #byte portb= 0x06
  7.    //#USE standard_IO(B)
  8.    #USE FAST_IO(B)
  9.    #use delay(internal=4MHz)
  10.    //#use RS232 (baud = 9600, bits = 8, parity = N, xmit = pin_b4, rcv = pin_b1)
  11.    #use rs232(baud=9600,xmit=pin_b4,rcv=PIN_B1,bits=8,parity=N,stream=BT,errors)
  12.    //#use RS232 (baud = 9600, bits = 8, parity = N, rcv = pin_b1)
  13.    
  14.    
  15.    #define arriba PIN_B0
  16.    #define abajo PIN_B5
  17.    #define ACC PIN_B2
  18.    #define PUNTILLA PIN_B3
  19.    //------------- variables ---------------
  20.    CHAR dato;
  21.    //int16 i=0;
  22.  
  23. // -------------------------------------
  24.    void main()
  25.    {
  26.     //////// configura  Gp2 como i/s digital y desabilita el tocki (ocs bit-5)
  27.       #asm
  28.       movlw (0B11000000); GPWU = 1, GPPU = 1, T0CS, T0SE, PSA, PS2, PS1, PS0 = 0
  29.       option
  30.       #endasm
  31.    SET_TRIS_b(0B001110);
  32.    portB=0x00;
  33.    
  34.    //int j=0;
  35.    delay_ms(1000);
  36.    output_HIGH(arriba);
  37.    output_HIGH(abajo);
  38.    //var1 =1;
  39.    //var2=1;
  40.    printf("\n\r");
  41.  
  42.    
  43.    while(TRUE)
  44.    {
  45.    
  46.       dato=0;
  47.       if (kbhit(BT))
  48.        {
  49.        dato=getc (BT);
  50.        }
  51.        
  52.    //PRINTF("A");
  53.    putchar ('A');
  54.    
  55.    //Delay_ms(1);
  56.    
  57.    
  58.       if ( dato==';') //
  59.        {  
  60.         output_LOW(arriba);
  61.         dato=0;
  62.        }
  63.  
  64.      //----------------------------------------
  65.       if ( dato==':')  //
  66.        {
  67.         output_high(arriba);          
  68.         dato=0;
  69.        }
  70.      // -----------------
  71.        if ( dato=='¡')  //
  72.         {
  73.         output_low(abajo);
  74.         dato=0;
  75.         }
  76.     //---------------------
  77.  
  78.       if ( dato=='!')  //
  79.        {
  80.         output_HIGH(abajo);
  81.         dato=0;
  82.        }
  83.    // -----------------
  84.  
  85.  
  86.    }
  87.    
  88.    }
Título: Re:Como resetear el pic por software?
Publicado por: DominusDRR en 08 de Noviembre de 2021, 16:39:57
¿Estás en un lazo infinito siempre imprimiendo 'A', es decir utilizado todo el tiempo un uArt por software:?

Código: C
  1. putchar ('A');

¡Qué tal si mejoras tu código así:

Código: C
  1. while(TRUE)
  2. {
  3.     if (kbhit(BT))
  4.     {
  5.                 dato=getc (BT);
  6.                 if (dato > 0)
  7.                 {
  8.                         switch(dato)
  9.                         {
  10.                                 case ';':  output_LOW(arriba);  break;
  11.                                 case ':':  output_high(arriba); break;
  12.                                 case '¡':  output_low(abajo);  break;
  13.                                 case '!':  output_HIGH(abajo);  break;
  14.                                 default: break;
  15.                         }
  16.                 }
  17.     }
  18. }
Título: Re:Como resetear el pic por software?
Publicado por: Eduardo2 en 08 de Noviembre de 2021, 16:49:40
....
Lo que sucede es que como el 12f508 y el 10f200 no tienen serial propio(lo estoy emulando) tampoco interrupciones, entonces al parecer le estoy pidiendo mucho a este pic y digo que no tengo el TMR0 disponible es por que cuando utilizo el puerto serie no me trabaja el tmr0.

No podés reprogramar el timer, pero sí podés leerlo y con eso mantener sincronizados otros conteos por software.
Así como está el ejemplo de comunicación que subiste tenés tiempo y variables libres para conteos de 32bits.

Eso que tenés que pulsar varias veces para que te detecte el kbhit() es porque lo que detecta es solamente el bit de inicio y tenés una ventana de 100us.    Como el putchar que le metiste demora 1ms --> solo una vez cada tanto vas a embocarle al bit de inicio.

Estás programando un micro de pocos recursos de la misma manera que si te sobraran recursos.  O cambiás de micro o programás diferente.
Título: Re:Como resetear el pic por software?
Publicado por: johenrod en 20 de Noviembre de 2021, 12:05:17
Gracias por las respuestas, todas sus observaciones bienvenidas son para aprender.
Título: Re:Como resetear el pic por software?
Publicado por: Eduardo2 en 20 de Noviembre de 2021, 15:59:18
Releyendo esto caigo en que la emulación del puerto serie no usa para nada el TMR0 -->  Podés usarlo, si no te andaba el problema era otro.