SOLUCIONADO: cambié el receptor de infrarrojos y todo funcionó correctamente, estoy usando el TSOP4838.
EDITAR: He modificado el código, he estado probando el programa más a fondo y he encontrado algo extraño. Estoy usando un receptor de código infrarrojo como este:
CuandoelPORTB
estávinculadoaGND,elmicrocontroladorcomienzaaenviarcadasegundoelmensaje"while", pero cuando lo vinculo al VOUT
el microcontrolador deja de enviarlo (cuando no debería detenerse) y parpadea el led Cuando presiono algún botón en el control remoto infrarrojo. Realmente no tengo idea de lo que está pasando aquí, espero que alguien pueda ayudarme con esto.
Estoy creando un programa para leer un código de un transmisor de infrarrojos remoto. Lo he probado en Proteus y parece que funciona, pero no lo hace físicamente. El uso de mi microcontrolador (PIC18F2520) parece no entrar en la interrupción.
Te muestro el siguiente código:
#include <xc.h>
#define _XTAL_FREQ 4433619
char infrared_code[6];
unsigned char UART1Config = 0, baud;
char MensajeTx[] = "Probando ";
int counter = 0;
void main(void) {
//Infrared entry.
TRISBbits.RB0 = 1;
TRISBbits.RB1 = 1;
TRISBbits.RB2 = 1;
TRISBbits.RB3 = 1;
TRISBbits.RB4 = 1;
TRISBbits.RB5 = 1;
TRISBbits.RB6 = 1;
TRISBbits.RB7 = 1;
//State LED
TRISCbits.RC2 = 0;
UART1Config = USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_BRGH_HIGH;
baud = 28;
OpenUSART(UART1Config,baud);
ADCON1 |= 0b1111;
EnablePullups();
RCIF = 0; //reset RX pin flag
RCIE = 1; //Enable RX interrupt
IPEN = 0;
INTCONbits.RBIE = 1; //Enable Interrupt per change on PORTB
INTCONbits.PEIE = 1; // Enable Peripherial Interrupt
INTCONbits.GIE = 1; // Enable Global Interrupt
INTEDG0 = 1;
ei(); //remember the master switch for interrupt?
while(1){
for(int i=0; i<10; i++)
__delay_ms(100);
putsUSART("While: /n");
}
}
void interrupt low_priority myIsr(void){
//If is interrupted by change on portB
if (INTCONbits.RBIF){
__delay_ms(14);
__delay_us(224);
for(int i=0;i<6;i++)
{
if(PORTBbits.RB0)
{
infrared_code[i] = 1;
}
else{
infrared_code[i] = 0;
}
__delay_ms(1);
__delay_us(778);
}
while(BusyUSART());
putsUSART("Interrupcion: ");
//for(int i=0;i<6;i++)
//{
//WriteUSART(infrared_code[i]);
// putsUSART(infrared_code[i]);
// }
putsUSART(infrared_code);
putsUSART("/n");
if(counter == 0)
{
PORTCbits.RC2 = 1;
counter = 1;
}
else if(counter == 1)
{
PORTCbits.RC2 = 0;
counter = 0;
}
INTCONbits.GIE = 1;
INTCONbits.RBIF = 0;
if (PORTB) {
asm("nop");
}
for(int i=0;i<20;i++)
__delay_ms(100);
}
}
Realmente estoy trabajando en ello, pero no encuentro la causa, agradecería que me ayudaras.
Por cierto, cuando lo he probado en Proteus, no sé por qué, pero para poder leer algunos cambios en PORTB0
tengo que conectarlos todos (de PORTB0
a PORTB7
) incluso cuando acabo de especificar PORTB0
como entrada digital.
Saludos!