Tengo el PIC16F628A que intento leer desde UART. Sin interrupciones, lee bien los primeros 3 bytes pero golpea un OERR. Para combatir esto, pensé que una interrupción sería buena y cargaría todos los bytes recibidos en una variable de búfer que podría leerse más tarde (búfer de anillo de tipo de matriz). Pero la interrupción no se está activando y me he quedado sin ideas.
CMCON = 0x07; //16F627/8 spcial function reg (RAx is port)
CCP1CON = 0b00000000; //Capt/Comp/PWM off
OPTION_REG = 0b00000000;
T1CON = 0;
INTCON = 0;
PIR1 = 0;
GIE = 0;
PIE1 = 0;
BRGH = 1; /* high baud rate */
SPBRG = 19200; /* set the baud rate */
SYNC = 0; //Async
TXEN = 0; //Disable transmit
TXIE = 0; //Disable transmit interrupt
RCIE = 1; //Enable Receive interrupt
SPEN = 1; //Enable serial pins
CREN = 1; //Enable continuous receive
SREN = 0;
TX9 = ninebits?1:0; /* 8- or 9-bit transmission */
RX9 = ninebits?1:0; /* 8- or 9-bit reception */
PEIE = 1; //Enable external interrupt
GIE = 1; //Enable global interrupt
He simplificado mi interrupción para encender una luz:
extern interrupt isr(void)
{
RB5 = 1;
}
Pero no se está disparando. El proyecto es leer un escáner de código de barras en serie y procesar el código de barras. ¿Alguien puede ofrecer alguna ayuda?
EDIT
Ok, ya que parece que no entiendes. Voy a publicar las rutinas reales:
void initialize()
{
CMCON = 0x07; //16F627/8 spcial function reg (RAx is port)
CCP1CON = 0b00000000; //Capt/Comp/PWM off
OPTION_REG = 0b00000000;
T1CON = 0;
INTCON = 0;
PIR1 = 0;
GIE = 0;
PEIE = 0;
PIE1 = 0;
sci_Init(BAUDRATE ,SCI_EIGHT);// Baud set and Bit set
TMR0 = 1000;
T0IE = 0;
PEIE = 1; //Enable external interrupt
GIE = 1; //Enable global interrupt
//Set inputs to input
SetButtons();
//Set relays to output
SetRelays();
TRISB5 = 0;
LEDStatus = 0;
}
unsigned char sci_Init(unsigned long int baud, unsigned char ninebits)
{
int X;
unsigned long tmp;
/* calculate and set baud rate register */
/* for asynchronous mode */
tmp = 16UL * baud;
X = (int)(FOSC/tmp) - 1;
if((X>255) || (X<0))
{
tmp = 64UL * baud;
X = (int)(FOSC/tmp) - 1;
if((X>255) || (X<0))
{
return 1; /* panic - baud rate unobtainable */
}
else
BRGH = 0; /* low baud rate */
}
else
BRGH = 1; /* high baud rate */
SPBRG = X; /* set the baud rate */
SYNC = 0; //Async
TXEN = 0; //Disable transmit
TXIE = 0; //Disable transmit interrupt
RCIE = 1; //Enable Receive interrupt
SPEN = 1; //Enable serial pins
CREN = 1; //Enable continuous receive
SREN = 0;
TX9 = ninebits?1:0; /* 8- or 9-bit transmission */
RX9 = ninebits?1:0; /* 8- or 9-bit reception */
rxBuffIndex = 0;
rxBuffRead = 0;
return 1;
}
void sci_LoadBuffer(void)
{
rxBuffer[rxBuffIndex] = RCREG;
rxBuffIndex = ++rxBuffIndex % MAXBUFFER;
}
unsigned char sci_ReadBuffer()
{
unsigned char byte;
do
{
byte = rxBuffer[rxBuffRead];
}while( byte == 0 ); //Block until valid data
rxBuffer[rxBuffRead] = 0;
rxBuffRead = (++rxBuffRead) % MAXBUFFER;
return byte;
}
void interrupt isr(void)
{
if(RCIF) sci_LoadBuffer();
LEDStatus = 1;
}
Sé que no es TODO, pero debería ser suficiente para diagnosticar por qué no se activan las interrupciones. ¡ESO ES TODO LO QUE NECESITO! Activando las interrupciones.
Estoy usando MPLab con Hi-Tech C Compiler. El cual, a partir del manual, guarda automáticamente el estado y lo restaura al ingresar / salir de la interrupción.