PIC16f627a trasmision de datos via bluetooth

Hola buen dia tenga todo el que lea este tema, es mi primer mensaje en este foro y acudo a ustedes por que tengo cerca de 1 mes intentando un proyecto para la facultad de ingenieria, se trata de un PÎC16f627a conectado a un Bluetooth el cual envia y recibe informacion de imperterminal, necesito que el pic al momento de recibir un dato ejemplo un "1" me encienda un led en el pin b3 o cualquier pin la verdad no importa, tengo un mes intentandolo pero no lo logro, lo raro es que en proteus si hace bien la simulacion, el bluetooth funciona bien es especial para microcontroladores es un Bluesmirf se consigue en la pagina de sparkfun.com, hago la conexion de la computadora al bluetooth por hyperterminal y si se conecta al pic correctamente pero al enviar un dato nisiquiera me aparece en la pantalla lo que escribo ni enciende ningun led el pic, espero me puedan ayudar y dejo aqui el codigo en C, lo compilo en PIC C, muchas gracias de nuevo.




#include <16F627A.h>
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8)

#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#byte trisb = 0x86
#byte portb = 0x06

void main()
{
char valor;
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
setup_oscillator( OSC_4MHZ );

trisb=0x0F;
printf("presiona una tecla: \r");

while(1)
{
valor=getch();

if(valor=='1') //si el valor es uno enciende o apaga el led
{

if(bit_test(portb,4)!=1) //prueba si esta apagado o encendido el led
{

printf("Foco enpuerto B4 encendido\r");
bit_set(portb,4); //enciende

}

else

{

printf("Foco enpuerto B4 Apagado\r");
bit_clear(portb,4); //apaga

}


}

}
}
 
Hola, yo utilizo la interrupcion para la puerta serie, te paso el codigo que utilizo habitualmenete para recibir un dato por hiperterminal.
Debes habilitar las int serie.

#int_RDA
RDA_isr()
{
rcvchar=0x00; // Inicializo caracter recibido
if(kbhit()){ // Si hay algo pendiente de recibir ...
rcvchar=getc(); // lo descargo y ...
rcvchar = toupper(rcvchar); // Lo transf. en mayuscula
printf("%u\n\r",rcvchar); // Devuelvo el caracter recibido
}
}

Luego el resto quedaria asi:

do {

if(rcvchar==1) {
bit_set(portb,4);
}
else {
bit_clear(portb,4); //apaga

}

} while (TRUE);

}
 
Gracias por tu ayuda, implemente lo que comentabas de la siguiente manera, solo que sigue sin funcionar, cuando presiono una tecla en hyperterminal sigue sin pasar nada pongo el codigo por si estoy mal en algo, muchas gracias de de vdd por tu ayuda, estoy algo desesperado porque llevo mucho intentando esto y no he tenido resultado.


#include <PIC16f627a.h>
#byte trisb = 0x86
#byte portb = 0x06
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8)

char rcvchar;
#int_RDA
RDA_isr()
{
rcvchar=0x00; // Inicializo caracter recibido
if(kbhit()){ // Si hay algo pendiente de recibir ...
rcvchar=getc(); // lo descargo y ...
rcvchar = toupper(rcvchar); // Lo transf. en mayuscula
printf("%u\n\r",rcvchar); // Devuelvo el caracter recibido
}

}
void main()
{

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
setup_oscillator( OSC_4MHZ );

// TODO: USER CODE!!
trisb=0x0F; // 8421
printf("presiona una tecla: \r");

while(1)
{
if(rcvchar==1)
{

bit_set(portb,4);

}

else

{

bit_clear(portb,4); //apaga

}

}
}
 
Hola, este codigo funciona, al menos en proteus
debes poner el hiperterminal a 9600


#device PIC16f627a
#include <16f627a.h>

#byte trisb = 0x86
#byte portb = 0x06
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bi ts=8)

char rcvchar;

#int_RDA
RDA_isr()
{
rcvchar=0x00; // Inicializo caracter recibido
if(kbhit()){ // Si hay algo pendiente de recibir ...
rcvchar=getc(); // lo descargo y ...
//rcvchar = toupper(rcvchar); // Lo transf. en mayuscula
printf("%c\n\r",rcvchar); // Devuelvo el caracter recibido
}
}

void main()
{

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
setup_oscillator( OSC_4MHZ );

// TODO: USER CODE!!
//trisb=0x0F; // 8421
printf("presiona una tecla: \r");

do{

if(rcvchar==0x31)
{
output_high(PIN_B4);

}

else
{
output_low(PIN_B4);

}
}while(1);
}
 
ricber de verdad muchas gracias si funciona el codigo en proteus pero por alguna razon ya cuando lo grabo en el pic y hago mis conexiones sigue sin funcionar no puedo mandar datos ni recibir que estara pasando? estoy usando el oscilador interno a 4mhz como dice el codigo pero sigo sin poder enviar ni recibir nada. gracias por la ayuda que me estas dando.
 
ricber, gracias por seguir ayudandome, sabes pues si tengo la hyperterminal a 9600 y los fuses que uso pues son los que estan en el programa estos:

#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

creo que todo esta bien pero no puedo usar la comunicacion rs232 nose porque, uso pickit2 para grabar el pic nose si tenga algo que ver, gracias y espero pueda tener solucion esto.
 
Hola, sigamos pensando,
tenes a nivel alto el MCLR.
Esta bien hacha la conexion entre el micro y el max232 y entre este y la pc.
Debes verificar si el oscilador del micro oscila.
Para verificar que funciona el hyperterminal hacele un puente con alambre entre el terminal
2 y 3 del conector DB9 de la PC, si el hyperterminal funciona bien cuando escribas algo deberia devolvertelo, deberias verlo en la pantalla.
Que programas usas para grabar el micro?

Hola
en esta instruccion if(kdatos[0]==12&kdatos[1]==34) que seria el 12 y el 34,
 
Última edición:
Hola que tal, pues el MCLR lo desactivo "#FUSES NOMCLR" no uso el max232 por que estoy usando un bluetooth para hacer el enlace con la pc, si funciona la hyperterminal y el bluetooth por que una vez hice un puente en el bluetooth conectando el pin rx y tx, hecho esto en la hyperterminal escribia algo y me lo devolvia a pantalla por lo cual descarto que no funcione hyperterminal o el bluetooth, para grabar el pic uso el programa pickit2, es muy desesperante esto de vdd, bueno te dejare una foto de como tengo conectado todo y un video en youtube que es donde me base para hacer esto muchas gracias que tengas buen dia.

P.D.
en algunas fotos aparece un led encendido, esto es un error siempre estaba prendido o cuando desconectaba el pic y volvia a conectar se apagaba el led, jamas a funcionado ningun codigo desde que lo compre, tengo tambien un 16f628a y tampoco lo he podido hacer funcionar.

Video:
Fotos:
11112010154.jpg


11112010153.jpg


11112010152.jpg
 
Última edición:
Hola que tal, pues uso pickit2 sin mplab, el pickit2 lo uso solo para grabarel pic, el mplab lo uso nadamas cuando necesito programar en ensamblador y si efectivamente el codigo esta en ccs.
 
Última edición:
Hola, Yo uso el ICD2, no conozco el pickit, pero creo que el problema puede estar en la grabacion del pic.
El tema del Vdd del programador es:
Si quieres usar la Vdd del pickit selecciona la casilla de que dice ON, y desconecta la alimentacion del pic.
Si quieres usar la alimentacion del pic, debes desactivar la casilla.
 
Hola, puede que el problema esté en la configuracion de los: Stop bit(s), si hay paridad o no, síncrono o asíncrono, el mismo que hizo el video ha hecho otro donde explica como saber la configuracion que tiene el módulo:
 
Atrás
Arriba