retraso de 1 seg usando PIC18F TImer 0

1

Estoy tratando de generar un retraso de 1s usando Timer0 de PIC18F2520 . Estoy usando el oscilador interno de 8MHz. El temporizador funciona con F OSC / 4, así que tengo:

8 Mhz/4 = 2 Mhz
T = 1/2 MHz = 0.5 µs

Ahora, el número de recuentos para reinversión es 0xFFFF (65536) , así que de acuerdo con el retraso que quiero, necesito establecer los valores de TMR0L y TMR0H . Ahora digamos que quiero un retraso de 1000 ms, así que:

65536 - 64536 = 1000 ms
64536 (0xFC18) is the value which I need to put in TMR0L and TMR0H.

Si los cálculos anteriores son correctos, el siguiente código debería funcionar correctamente (utilizando el compilador C18):

#include <p18F2520>

#pragma config WDT = OFF       //Disable watchdog timer
#pragma config OSC = INTIO67   //Internal oscillator
#pragma config LVP = OFF

void main()
{

 //8Mhz oscillator
 OSCCONbits.IRCF0 = 1;
 OSCCONbits.IRCF1 = 1;
 OSCCONbits.IRCF2 = 1;
 OSCCONbits.SCS = 1;

 TRISCbits.TRISC2 = 0;    //output led

 while(1)
 {
    LATCbits.LATC2 = 1;
    DelayMs();
    LATCbits.LATC2 = 0;
    DelayMs();
 }
}

void DelayMs()
{
  T0CONbits.PSA = 0;         //Prescaler assignment bits
  T0CONbits.T0CS=0;          //clock source select bit
  T0CONbits.T0PS = 0x01;     //1:4 prescaler 

  TMR0H= 0xFC;       
  TMR0L=0x18;
  T0CONbits.TMR0ON = 1;       //enable timer1
  while(INTCONbits.TMR0IF==0);
  T0CONbits.TMR0ON = 0;
  INTCONbits.TMR0IF=0;

}

Cuando programé el dispositivo con el código anterior, el LED estaba encendido . No se apagó, incluso después de 4-5 minutos.

    
pregunta S Andrew

1 respuesta

0

De acuerdo con lo que describiste, los relojes del temporizador a 2MHz. Eso es equivalente a 500 nseg por tic del temporizador.

Cuando programa el temporizador a 64536, está especificando que el temporizador debe contar por 1000 ciclos antes de que se agote el tiempo de espera.

1000 ciclos a 500 nseg por ciclo = 500,000 nsec = 500 usec

Por lo tanto, en su bucle while mientras intenta cambiar el pin del puerto para encender el LED, la llamada DelayMs () le está dando a su LED un tiempo de ciclo de 1 ms (500usec apagado + 500 usec encendido).

¡Con el LED parpadeando a una velocidad de 1 mseg (a.k.a 1kHz) el LED aparecerá encendido todo el tiempo!

Si su objetivo real era tener el LED encendido durante 0,5 segundos y apagarlo durante 0,5 segundos, tendrá que aumentar sus retrasos en 1000. Así que ponga cada una de las llamadas a DelayMs () dentro de su bucle while dentro de un bucle for Eso iteraría el retraso 1000 veces.

    
respondido por el Michael Karas

Lea otras preguntas en las etiquetas