TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: aitorsp en 08 de Octubre de 2014, 14:06:43
-
Hola:
Llevo un rato con este código y no consigo ver donde está el error. No consigo que entre la interrupción para la recepción serie. Se queda todo el rato en el main. El código es para programar comandos AT con el bluetooth HC05 o HC06. Una vez que se le envía un comando AT, el Bluetooth responde OK o un String con la información del comando AT. En este caso le programo el nombre del dispositivo. Debería recibir OK pero no entra la interrupción.
#include <16f88.h>
#device adc=10
#fuses INTRC_IO,NOWDT,NOPROTECT,NOLVP,NOWRT,NODEBUG,NOMCLR
#use delay(internal=8M)
#use rs232(baud=38400,xmit=PIN_B5,rcv=PIN_B2)
#include "flex_lcd420.c"
#byte TRISA = 0x85
#byte TRISB = 0x86
#byte OPTION_REG = 0x81
#bit RBPU = OPTION_REG.7
char BLUE_BUFFER[20];
int aux=0;
#int_RDA //vector de interrupción al recibir por la UART
void RDA_isr(){
BLUE_BUFFER[0]=getc();
BLUE_BUFFER[1]=getc();
BLUE_BUFFER[2]=getc();
BLUE_BUFFER[3]=getc();
aux=1;
}
void main(){
RBPU = 0; // Pull-up enabled
setup_adc_ports(SAN2|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
enable_interrupts(INT_RDA); //habilita interrupción por recepción
enable_interrupts(global);
set_adc_channel(2);
lcd_init();
lcd_gotoxy(1,1);
printf(lcd_putc,"AT commands...");
delay_ms(2000);
printf("AT+NAME=HC05");
putc('\r'); //Transmite CR
putc('\n'); //Transmite avance de linea
delay_ms(500);
while(1){
if(aux){
lcd_gotoxy(1,1);
printf(lcd_putc,"\fBT Answer:");
lcd_gotoxy(1,2);
printf(lcd_putc,"BT: %2c",BLUE_BUFFER);
delay_ms(100);
}else{
lcd_gotoxy(1,1);
printf(lcd_putc,"\fWaiting BT...");
delay_ms(100);
}
}
}
-
Veo que trabajas constantemente con el LCD, ya sea que aux sea 0 o 1. ¿No será que las funciones de LCD, deshabilitan la interrupción?
-
si no entra la interrupción de recepción de datos seriales, podría ser que en realidad no esté recibiendo nada. quita el modulo Bluetooth y prueba la comunicación serial del pic con hyperterminal.
-
tienes conectado el TX del bluetooth con el RX del micro
RX del bluetooth con el TX del micro ?
:mrgreen:
-
Veo que trabajas constantemente con el LCD, ya sea que aux sea 0 o 1. ¿No será que las funciones de LCD, deshabilitan la interrupción?
Sí pero también he probado a habilitar las interrupciones después de llamar a las funciones LCD y no funciona.
-
si no entra la interrupción de recepción de datos seriales, podría ser que en realidad no esté recibiendo nada. quita el modulo Bluetooth y prueba la comunicación serial del pic con hyperterminal.
imposible. Cuando envias un comando AT, el bluetooth responde OK o una serie de caracteres de información. En cualquier caso debería entrar la interrupción
-
tienes conectado el TX del bluetooth con el RX del micro
RX del bluetooth con el TX del micro ?
:mrgreen:
Sí, eso está correcto.
-
realiza algo sencillo, prende un led dentro de la interrupcion
-
realiza algo sencillo, prende un led dentro de la interrupcion
El LED es la variable aux. Si entra la interrupción se ejecuta el bloque del main. Pero nunca entra la interrupción.
-
si no entra la interrupción de recepción de datos seriales, podría ser que en realidad no esté recibiendo nada. quita el modulo Bluetooth y prueba la comunicación serial del pic con hyperterminal.
imposible. Cuando envias un comando AT, el bluetooth responde OK o una serie de caracteres de información. En cualquier caso debería entrar la interrupción
no entiendo, ¿cómo sabes que la variable BUFFER[n] recibe el OK del bluetooth, si no entra a la interrupción?
-
realiza algo sencillo, prende un led dentro de la interrupcion
El LED es la variable aux. Si entra la interrupción se ejecuta el bloque del main. Pero nunca entra la interrupción.
Realiza la prueba con un led real, no con una variable. De esa forma confirmas que el micro entra a la interrupción al menos una vez, posterior a eso te daras cuenta si el problema radica en el hard o en soft
PD. ahora que observo mas el codigo, incluye los caracteres de \n\r en el printf y miras que tal va. Sino estoy mal ese putc no esta enviando 0D 0A
-
Declaras TRISA y TRISB, pero no veo que inicialices si son de entrada o salida los pines
-
Declaras TRISA y TRISB, pero no veo que inicialices si son de entrada o salida los pines
Eso no importa. Lo puse para usarlo en otros códigos donde explícitamente configuro los tris de ese modo. En este caso, el compilador se encarga de configurar los TRIS automáticamente.
He probado a cambiar el código sin usar las interrupciones y mas o menos me funciona. Ahora mismo sigo sin saber por que no funciona usando interrupciones. Podria ser por el uso de la librería LCD pero no lo tengo muy claro. Lo que si he detectado es que estos bluetooth (los HC05 y HC06) dan problemas con los retardos al enviar los comandos AT
-
Y siempre recibes 4 bytes o múltiplos de 4? Digo, porque si no fuese el caso, los getc() te bloquearían el código y daría el aspecto de que algunos datos no llegan. También te recomiendo agregar el modificador ERRORS a la declaración del #use RS232.
-
Y siempre recibes 4 bytes o múltiplos de 4? Digo, porque si no fuese el caso, los getc() te bloquearían el código y daría el aspecto de que algunos datos no llegan. También te recomiendo agregar el modificador ERRORS a la declaración del #use RS232.
No, recibes caracteres que varian en longitud dependiendo de la información que tengan. Por ejemplo, AT\r\n recibe OK pero hay otros comandos que reciben caracteres de información y creo que devuelve al final el carácter fin de línea.