Interrupción por Timer0 tarda más de lo calculado

Hola compañeros. Empecé con este tema de los PIC hace una semana siguiendo los temas de este foro pero me trabé cuando llegué a la parte de temporizadores.
No sé sinceramente si estoy entendiendo mal el concepto o simplemente le estoy errando en la programación, es por ello que les pido una mano.

Tengo un PIC18F4550 con cristal de 20 Mhz y la intención es hacer un cronometro, pero para hacer pruebas de tiempo empecé simplemente encendiendo y apagando un led cada 1 segundo.
Para esto utilizo el TIMER0 del PIC configurado como 16 bits y con preescaler de 256. Los calculos que hice son:

1s = 4 . (1/20MHz) . (65536 - TMR0) . 256

TMR0 = 65536 - 19531.25 -----------> TMR0 = 46005

Cosas a tener en cuenta: para simular use proteus tarda unos 4 segundos en prender y apagar el led.
Hace lo que tiene que hacer pero tarda 4 segundos en vez de 1.
Monté el circuito en una protoboard y, si bien funciona, lo hace aún más lento que en proteus; aproximadamente unos 8 segundos para cambiar de estado el led.

El código en C para CCS es:
C:
#include <18f4550.h>                                                   ////
#fuses hs,nowdt,nowrt,noprotect,noput,nolvp             //// ///DIRECTIVAS///
#use delay(clock=20000000)                                       ////

int segundo=0;                                                             //// ///DECLARACIÓN DE VARIABLES///

#int_Timer0
void interrupcion_timer0(void)
{
segundo++; //Cada 1 segundo llama a la interrupcion y aumenta 1 segundo
set_timer0(46005);
}

void main()
{
set_tris_d(0x00);
SETUP_TIMER_0(RTCC_INTERNAL|RTCC_DIV_256);        //Configuro timer0
set_timer0(46005);                                                         //Valor inicial del timer0
enable_interrupts(global);
enable_interrupts(int_Timer0);


while(TRUE)
{
if(segundo==1){output_d(0b00000100);}                    //Segun el valor de segundo, prende o apaga el led
if(segundo==2){output_d(0b00000000);}
if(segundo==3){output_d(0b00000100);}
if(segundo==4){output_d(0b00000000);}
if(segundo==5){output_d(0b00000100);}
if(segundo==6){output_d(0b00000000);}
if(segundo==7){output_d(0b00000100);}
}
}

Desde ya, les agradezco mucho su ayuda.
No sé por qué sale todo tachado. Pido disculpas por eso.
 
Sale tachado porque en tu código has puesto "1(s)" con corchetes en lugar de con nada porque "un segundo" se escribe "1s" y corchete s corchete significa tachar todo lo que sigue.

Vuelve a pegar tu código insertando código para que sea legible en los tres puntitos verticales de la derecha
 
Arriba