Buenas!
Estoy intentando programar en CSS (aunque mi problema es de interrupciones, así que espero no haberme equivocado de subforo) un encoder/decoder para código Manchester. Ya lo tengo funcionando, pero quiero lograr mayor precisión tanto en recepción como en transmisión, por lo que me he metido con el tema de las interrupciones.
Las pruebas las estoy haciendo sobre un PIC12F683, y estoy utilizando el Timer 1 (sin prescaler, para simplificar -> 1 ciclo = 1us). De momento he configurado la rutina de interrupciones, y trato de que se ejecute cada 100 us. Para ello, cargo el Timer1 con el valor (65536-100), de modo que se desbordará cada 100 ciclos = 100us. Debería obtener un pulso cada 100us, pero lo obtengo cada ~137us. Me parece un error bastante grande tratándose de interrupciones. Si realizo una corrección y cargo el timer con (65536-100+37), todo perfecto, 100us clavados, a pesar de ser una chapuza. No lo he probado con otros PICs.
A lo que voy... ¿Es normal este comportamiento, o alguien sabe a qué podría deberse y cómo corregirlo?
Muchas gracias!!
Mi código:
#include <12F683.h>
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES INTRC
#use delay(clock=4M)
#use fast_io(A)
#bit PIN0 = 0x05.0
#int_TIMER1
void TIMER1_isr(void) //Función de interrupción por desbordamiento TMR1
{
set_timer1(65536-100+37); // Carga del TMR1 -> Con este valor, las interrupciones se disparan cada 100us
PIN0 = 1;
PIN0 = 0;
}
void main()
{
set_tris_a(0x00);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); // TIMER1: Clock Interno, Prescaler 1 (Para 4MHZ -> Incrementos cada 1us)
enable_interrupts(INT_TIMER1); // Habilito interrupción particular del TIMER1
enable_interrupts(GLOBAL); // Habilito interrupciones globales
set_timer1(65536-100); // Carga del TMR1 -> Con este valor, la primera interrupción se dispara 137us después
while(1);
}