saludos.
Tengo un problema con el timer0 como temporizador de 0ms a 8ms, se retrasa al hacer un delay_ms en el void main() del programa.
Anteriormente hice un programa para controlar un triac usando el timer1 y no tuve inconvenientes, pero ahora lo quise hacer con el timer0, porque el timer1 lo usare para otro propósito, y no puedo hacerlo funcionar
He simplificado el código para encontrar en que estaba fallando y encontré que cuando pongo algún delay de cualquier valor en void main(), el timer0 deja de trabajar como debería.
Si quito los delay y lo simulo en el proteus funciona bien.
He leído que el timer0 es independiente del programa principal y es por eso que, no sé que estoy haciendo mal
Gracias por su atención
#include <16F876A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#use delay(crystal=4000000)
#use FIXED_IO( B_outputs=PIN_B4,PIN_B3,PIN_B2 )
#INT_EXT
void EXT_isr(void)
{ //uso la interrupcion por pin_b0 para el cruce por cero de la red
set_timer0(120); // aqui cargo el valor del timer0 para el desbordamiento
enable_interrupts (INT_TIMER0); // que sera de 0ms a 8ms para un control de 0º a 180º +-
}
#INT_TIMER0
void TIMER0_isr(void)
{
DISable_interrupts (INT_TIMER0);
output_high(pin_b4); // cuando se desborde el timer0 activa al triac
delay_ms(1); // y espera a la interrupcion externa para activar y cargar
output_low(pin_b4); // nuebamente al timer0
}
void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32|RTCC_8_bit); //8.1 ms overflow
enable_interrupts(INT_TIMER0);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
while(TRUE)
{
output_high(pin_b4); //activo una salida para que aga algo el programa
delay_ms(1); //el problema es cuando pongo un delay de cualquier valor
output_low(pin_b4); //el timer0 deja de funcionar periodicamente (hace cualquier cosa)
delay_ms(1);
}
}
adjunto dos imagenes de la simulacion en proteus

1.jpg(102.38 kB, 1024x576 - visto 374 veces)