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

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

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:Como resetear el pic por software?
« Respuesta #15 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.
« Última modificación: 08 de Noviembre de 2021, 11:58:04 por johenrod »
Si algo parece complicado... es por que esta mal explicado.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Como resetear el pic por software?
« Respuesta #16 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.
« Última modificación: 08 de Noviembre de 2021, 12:11:24 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:Como resetear el pic por software?
« Respuesta #17 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.    }
« Última modificación: 08 de Noviembre de 2021, 12:27:52 por johenrod »
Si algo parece complicado... es por que esta mal explicado.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Como resetear el pic por software?
« Respuesta #18 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. }
« Última modificación: 08 de Noviembre de 2021, 16:43:01 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Como resetear el pic por software?
« Respuesta #19 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.

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:Como resetear el pic por software?
« Respuesta #20 en: 20 de Noviembre de 2021, 12:05:17 »
Gracias por las respuestas, todas sus observaciones bienvenidas son para aprender.
Si algo parece complicado... es por que esta mal explicado.

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Como resetear el pic por software?
« Respuesta #21 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.