Estoy tratando de escribir una implementación serie de software y tengo problemas con el tiempo. Estoy usando Timer0 en un PIC18F242 y por alguna razón no parece ser muy preciso.
He estado tratando de solucionar el problema activando un pin en el microcontrolador y observando la frecuencia en mi osciloscopio. El osciloscopio muestra que el período es mayor de lo que debería ser, y no sé por qué.
Con mi código completo, el período fue algo así como 10us demasiado largo, si recuerdo bien, pero incluso con un ejemplo muy simple, como el que se muestra a continuación, el tiempo está apagado.
Aquí hay un ejemplo:
#include <p18f242.h>
// fuse configurations
#pragma config OSC = HSPLL
#pragma config OSCS = OFF
#pragma config PWRT = OFF
#pragma config BOR = OFF
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config CP0 = OFF
// CALCULATIONS:
// 8Mhz crystal with PLL enabled
// FOSC = 4*8Mhz = 32MHz
// TOSC = 1/FOSC = 31.25ns
// TCY = 4*TOSC = 125 ns
// timer has 1:8 prescaler, therefore timer increments every 8*TOSC = 1us.
main(void)
{
// port configuration
TRISBbits.RB1 = 0; // make RB1 an output
// configure Timer0
T0CONbits.TMR0ON = 0; // disable (stop) the timer
T0CONbits.T08BIT = 0; // 16-bit timer
T0CONbits.T0CS = 0; // use internal instruction clock
T0CONbits.PSA = 0; // use prescaler (prescaler assigned below)
T0CONbits.T0PS0 = 0; // 010 = 1:8 prescaler
T0CONbits.T0PS1 = 1;
T0CONbits.T0PS2 = 0;
T0CONbits.TMR0ON = 1; // enable (start) the timer
while(1)
{
if(TMR0L >= 100)
{
PORTBbits.RB1 ^= 1;
// reset the timer
TMR0H = 0; // MUST SET TMR0H FIRST
TMR0L = 0;
}
}
}
Mi osciloscopio dice que el período de esta señal es 204.0us, lo que significa que el pin está alternando cada 102.0us. Si mi osciloscopio es correcto, entonces el pin está alternando dos veces demasiado tarde cada vez.
Es interesante que al cambiar if(TMR0L >= 100)
a if(TMR0L >= 102)
en el mismo período, pero al ir por debajo de 100
o por encima de 102
, el período disminuye y aumenta, respectivamente.
¿Por qué sucede esto?
También, como mencioné, tener un código adicional en el bucle principal parece exacerbar el problema. ¿Por qué sería eso?