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.