Es por eso que dedicamos este post a un ejemplo de comunicación serial entre 2 PIC16F877a (un emisor y un receptor), para ello los programas se han escrito en C con el compilador CCS y simulado en ISIS de PROTEUS.
Al puerto B del microcontrolador emisor se le han conectado entradas lógicas, los cuales se muestran en el puerto B del receptor. Ambos microcontroladores tienen un cristal de 20MHz y usan su módulo serial por hardware.
Al puerto B del microcontrolador emisor se le han conectado entradas lógicas, los cuales se muestran en el puerto B del receptor. Ambos microcontroladores tienen un cristal de 20MHz y usan su módulo serial por hardware.
Esquemático y simulación.
Código emisor:
#include "16f877a.h"
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
int main( void ){
int dato;
while(1){
dato=input_b(); //Recibimos un entero de 8 bits (Puerto B).
putc(dato); //Mandamos el dato por el puerto serial.
delay_ms(1000); //Hacemos un retardo
}
return 0;
}
Código receptor:
#include "16f877a.h"
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8)
int main( void ){
int dato;
while(1){
if(kbhit()){ //Revisamo si hemos recibido algo por el puerto serial.
dato=getc(); //Recibimos un dato de 8 bits
output_b(dato);//Mostramos el dato en el puerto B
}
}
return 0;
}
Esta es la configuración típica utilizada, estos mismos programas se pueden usar si en lugar de un cable se utiliza un módulo Bluetooth serial,ya que el protocolo es transparente para el micro.
Durante la simulación es muy conveniente que el micro nos mande mensajes, así como en un programa de PC normal con la ayuda de la función
Descargar códigos y simulación aquí.
Durante la simulación es muy conveniente que el micro nos mande mensajes, así como en un programa de PC normal con la ayuda de la función
printf()
, para este caso se puede conectar la terminal virtual de ISIS a la línea TX del micro que nos va a mandar la información y, con un simple printf()
el programa va a mandar esa cadena por el puerto serial.Descargar códigos y simulación aquí.
tengo una comunicación y proteus me la corre bien, pero en la protoboard no me funciona ya intente de todo, algún consejo???
ResponderEliminarcomo sería el código en C para que ambos pics envíen y reciban datos? ya que tengo uno y me corre bien en proteus, pero a la hora de implementarlo en la protoboard no funciona...
ResponderEliminarAntes que nada asegúrate que estén conectados tanto TX del micro1 a RX del micro 2 como TX del micro2 a RX del micro1.
EliminarLos datos se mandan en cualquier momento que desees con la función putc();
Para recibir datos hay que consultar constantemente nuestro buffer de entrada con la función kbhit(), si tiene "algo" lo leemos con get().
Me pasa lo mismo... no funciona en la protoboard, lo pudieron resolver?
ResponderEliminarNota que el esquemático mostrado es una simplificación, en el protoboard debes incluir el cristal y sus 2 capacitores para cada microcontrolador.
EliminarAlgo en lo que debes prestar especial atención es en la configuración de los #fuses, por ejemplo, para un cristal de 4MHz debes cambiar el HS por XT.
me haz ayudado mucho en mi proyecto tesis gracias, aun asi debo enviar dos puertos, el a y el b de un 16f873a, pero solo puedo enviar uno, no se si me podrias ayudar con eso, te lo agradeceria un monton.
ResponderEliminarPrueba a usar 2 veces las funciones de envío y recepción de datos. Por ejemplo en el emisor:
Eliminardato_a = input_a();
dato_b = input_b();
putc(dato_a);
putc(dato_b);
En el receptor:
dato_a = getc();
// delay_ms(100);
dato_b = getc();
output_a(dato_a);
output_b(dato_b);
Si aún no funciona, prueba a usar el delay que está comentado en el receptor.
todavia esta abierto este foro
ResponderEliminarbuen dia. una molestia, tengo una duda, este protocolo (rs232) puede enviar y recibir mas de una variable, es decir ejm en un pic tengo 3 sensores. estos pueden enviar la lectura a un segundo pic usando variables distintas
ResponderEliminarSí, lo que envía el protocolo RS232 son cadenas (o en este caso, caracteres), la forma de interpretarlo depende de ti.
EliminarPuedes enviar uno a uno los datos de tus sensores poniendo 3 putc() en el emisor y 3 getc() en el receptor, de preferencia agrega un delay entre cada putc().
Otra manera es mandar el dato es con printf(), en este caso debes mandar los 3 bytes de tus 3 sensores como una cadena.
hola abel perdon la molestia como seria exactamente la programacion en lenjuage c ya que estoy armando un cubo leds de 6x6x6 y necesito conectar dos pic 16f877a serial vos me prodrias ayudar desde ya te agradesco saludos
Eliminarhola como puedo conseguir el dato que envia el modulo de bluetooth??
ResponderEliminarTu módulo bluetooth-serial tiene las terminales RX y TX, solo conéctalas a tu micro como si lo estuvieras conectando con otro micro, la comunicación es transparente. El micro nunca sabrá que estás utilizando un módulo bluetooth-serial en lugar de otro micro.
Eliminartengo un programa similar, ambos pics envían y revisen datos por medio de un teclado matricial con salida a una lcd 16x2, la cosa es que necesito saber como hago para que el mensaje se apruebe (habilitar una tecla en el teclado matricial un enter...) y este se envie... (mi problema es que al oprimir una tecla esta se muestra de inmediato en la lcd receptora )
ResponderEliminarhola abel perdon la molestia como seria exactamente la programacion en lenjuage en c ya que estoy armando un cubo de 6x6x6 para un proyecto escolar y necesitaria conectar dos pic 16f877a serial para poder conntrolarlo dede ya muchas gracias saludos
ResponderEliminardisculpa amigo ya hice todo lo posible por que me mande datos el pic pero no jala como dices, ya le puce el cristal de cuarzo a 20mhz y capacitores de 22pf y nada mas no quiere en el fisico, en el simulado si da pero en el fisico no, me podrias echar la mano
ResponderEliminarComo se conectas los cristales y los capacitores a los pics?
ResponderEliminarcomo se hace recibir cadena de caracteres en pic c compiler.
ResponderEliminarHola, y cómo sería para un int32? He logrado enviar datos, pero no los recibe adecuadamente...
ResponderEliminar