¿Puede alguien revisar éste código?

Simulado en proteus va perfecto, pero en "real" no corre bien.
¿Sujerencias?. Muchas gracias.

// PROYECTO DIMMER DIGITAL para DESPERTADOR ////////////////////////////////
#include <12F675.h>
#device ADC=10
#fuses INTRC_IO,WDT,PUT,NOPROTECT,NOCPD,NOMCLR,BROWNOUT
#use delay(clock=4000000,restart_wdt)
#ROM 0x3ff = {0x3478}
#define GP0 PIN_A0
#define GP1 PIN_A1 // Triac
#define GP2 PIN_A2
#define GP3 PIN_A3
#define GP4 PIN_A4
#define GP5 PIN_A5
#ZERO_RAM
set_tris_a( 0b000010001 );
int j=1; int valor=110; long i=0; long k=0;
void init()
{
disable_interrupts(GLOBAL);
disable_interrupts(INT_EXT);
disable_interrupts(INT_TIMER0);
disable_interrupts(INT_TIMER1);
output_low(GP1);
setup_comparator(NC_NC_NC_NC);
setup_adc_ports( NO_ANALOGS ); // disable analog inputs
delay_ms(750);
}
/// Interrupción del TIMER0, provoca el retardo deseado antes de la excitación
#INT_TIMER0
void tempo()
{
output_high(GP1); // Ha transcurrido el tiempo, activo la salida
}
// Interrupción Externa, provocada por el paso por 0V de la señal de entrada
#INT_EXT
void externa()
{
set_timer0(valor);
enable_interrupts(INT_TIMER0);
output_low(GP1);
if (j==0)
{
output_high(GP4);
j=1;
ext_int_edge(H_TO_L); // Cambio la detección del flanco, para que la
} // proxima sea de bajada
else if(j==1)
{
output_low(GP4);
j=0;
ext_int_edge(L_TO_H); // La próxima interrupción será de subida
}
}
void main()
{
init();
enable_interrupts(INT_EXT);
ext_int_edge(L_TO_H);
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_64);
enable_interrupts(GLOBAL);
do{
if (input (GP3))
{
for(i=0;i<1999;i++)
{
delay_ms(1);
k=k+1;
If(k>=1999)
{
k=0;
valor=valor+1;
}
if (valor >= 252) valor=252;
if(!input(GP3)) break;
}
}
else
{
disable_interrupts(INT_TIMER0);
valor=110;
output_low(GP1);
output_low(GP4);
i=0;
k=0;
}
}while(true);
}