Estoy programación de un microcontrolador PIC16F877A en C, compilar con Microchip XC8 1.44.
He creado una interrupción de TMR0 para cada 800 microsegundos que explora a través de una matriz de LED, iluminación de cada uno de los 8 LED de columna a través de la configuración de la siguiente manera:
OPTION_REG = 0x04; // TMR0 prescaler (1:32)
GIE = 1;
TMR0IE = 1;
Y este es mi ISR:
void interrupt isr()
{
static const uint16_t divs[4] = { 1000, 100, 10, 1 };
if (TMR0IF)
{
PORTB = 0x00; // PORTB is the 8 LED column
if (i)
{
PORTAbits.RA0 = 1; // pin that clocks CD4017 for next column
__nop(); // give a brief delay just for good measure
PORTAbits.RA0 = 0;
}
else
{
PORTAbits.RA1 = 1; // pin that resets CD4017 to first column
__nop();
PORTAbits.RA1 = 0;
}
// pattern to be displayed
PORTB = font[i % 8U + 8U * ((c / divs[i / 8U]) % 10U)];
i = (i + 1U) % 31U; // increment i for next iteration
TMR0 = TMR0_OFFSET; // 240 for 4MHz crystal for 800us delay according to my calculations (I am bad at calculations)
TMR0IF = 0;
}
}
Básicamente c
('contador') llevará a cabo un número entre 0 y 9999, y el 31 de columna de la matriz de LED muestra el uso de los datos en font
a dibujar los números.
Ahora, este código funciona a la derecha. Pero si me muevo TMR0IF = 0;
al inicio del bloque, algo extraño sucede:
El programa parece ser lenta, como si el reloj se redujo en un factor de 100 o más, y el bucle principal del programa se bloquea y por eso puedo dejar de recibir las señales externas que puedo utilizar para aumentar o restablecer el valor de c
, sólo el ISR sigue siendo llamados y mantener la matriz de LED iluminada, pero el parpadeo debido a que el reloj de la gota.
Si me muevo TMR0IF = 0;
a la final como en el código anterior aunque, todo parece funcionar normalmente, y el mundo es perfecto. Pero, ¿por qué?
Todo el mundo me vea el código de referencia para el Timer 0 interrumpir el uso conjunto de personas TMR0IF = 0;
de inmediato, ¿por qué está causando todo ese molestia en mi código?