Estoy intentando diseñar un decodificador de codificación ON-OFF para un proyecto de lector RFID en el que he estado trabajando. A continuación se muestra el código que se ejecuta en un PIC16F887 @ 20MHZ. El compilador es Mikroelektronika mikroC PRO para PIC.
Lo que estaba tratando de hacer es alternar PORTC.1
cada 200 uS. El código se ejecuta como se desea, pero solo durante unos 5,8 ms, como medí con el osciloscopio. Después de eso, PORTC.1
no cambia.
Supongo que de alguna manera está relacionado con el desbordamiento de las variables fiftymicros
y data_time
. Si aumentamos la variable fiftymicros
cada 50 usec; en realidad, esto es lo que hace el programa, se desbordará después de 255 * 50 microsegundos, lo que equivale a 12.75 mseg.
Siempre que cambie el tipo de las variables fiftymicros
y data_time
a entero, el problema disminuye.
¿Podría ayudarme a entender cuál es la razón detrás de este comportamiento?
volatile unsigned char fiftymicros=0;
volatile unsigned char fiftymicroscounter=0;
volatile unsigned char data_time=0;
volatile unsigned int milis=0;
volatile unsigned int milis_ctr=0;
void calculate_data_time()
{
static volatile unsigned char ctr=0;
static volatile unsigned char ind=0;
if(fiftymicros-data_time>3)
{
data_time=fiftymicros;
PORTC.F1=~PORTC.F1;
}
}
void interrupt()
{
if(INTCON.T0IF)
{
TMR0=198;
INTCON.T0IF=0;
fiftymicros++;
if(++fiftymicroscounter==20) { fiftymicroscounter=0; milis++; }
}
if(INTCON.RBIF)
{
//data_time=fiftymicros;
INTCON.RBIF=0;
}
}
void main()
{
ANSEL =0;
ANSELH=0;
TRISA=0; PORTA=0;
TRISB=0x01; PORTB=0;
TRISC=0; PORTC=0;
TRISD=0; PORTD=0;
TRISE=0; PORTE=0;
OPTION_REG.INTEDG=1;
OPTION_REG.T0CS=0;
OPTION_REG.PSA=0;
OPTION_REG.PS0=1;
OPTION_REG.PS1=0;
OPTION_REG.PS2=0;
INTCON.TMR0IE=1;
INTCON.RBIE=1;
INTCON.GIE=1;
UART1_Init(9600);
Delay_ms(100);
milis_ctr=milis;
while(1)
{
calculate_data_time();
}
}