Intenté configurar Timer0 en un Microchip PIC18F46K22 para que dispare una interrupción y un LED. Sin embargo, se necesitan al menos 42 µs para que el LED se encienda.
A una tasa de incremento de Fosc / 4 (= 8 MHz / 4 = 2 MHz), una precarga de TMR0 de 0xFF y una pérdida de dos ciclos al escribir en TMR0 espero una interrupción cada 1.5 µs, al menos en papel . Incluso si tomo en cuenta algunos ciclos de instrucción para mis operaciones de LED, no puedo entender por qué toma 42 µs. ¿Qué está mal aquí?
Aquí está mi código:
volatile unsigned char ledStatus;
void greenLEDon(void)
{
LATCbits.LATC5 = 0;
}
void greenLEDoff(void)
{
LATCbits.LATC5 = 1;
}
void interrupt isr(void)
{
if(TMR0IE && TMR0IF)
{
if(ledStatus == 0)
{
ledStatus = 1;
greenLEDon();
}
else
{
ledStatus = 0;
greenLEDoff();
}
TMR0IF = 0; // Clear interrupt flag
TMR0 = 0xFF; // preset for timer register
}
}
void setup(void)
{
OSCCON = 0b01100010; // 8 MHz, internal
// General outputs
TRISCbits.TRISC5 = 0; // RC5 (green LED)
INTCON = 0b01000000; // PEIE on (Peripheral Interrupt Enable)
INTCONbits.GIE = 1; // General Interrupt Enable
// Timer0 Registers
T0CONbits.T0CS = 0; // TMR0 Clock Source Select bit: 0 = Internal Clock (CLKO)
T0CONbits.T0SE = 0; // TMR0 Source Edge Select bit: 0 = low/high
T0CONbits.PSA = 1; // Prescaler Assignment bit: 0 = No Prescaler is assigned to the Timer0
TMR0 = 0xFF; // preset for timer register
T0CONbits.TMR0ON = 1;
T0CONbits.T08BIT = 1;
INTCONbits.TMR0IE = 1;
}
void main(void)
{
setup();
while (1)
{
}
}