martes, 1 de enero de 2013

Comunicación serial PIC a PIC

La comunicación RS232 se ha vuelto obsoleta en cuanto a computadoras se refiere, pero en el mundo de la electrónica sigue siendo un protocolo muy popular.

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.


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 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í.

19 comentarios:

  1. tengo una comunicación y proteus me la corre bien, pero en la protoboard no me funciona ya intente de todo, algún consejo???

    ResponderEliminar
  2. como 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...

    ResponderEliminar
    Respuestas
    1. Antes 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.
      Los 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().

      Eliminar
  3. Me pasa lo mismo... no funciona en la protoboard, lo pudieron resolver?

    ResponderEliminar
    Respuestas
    1. Nota que el esquemático mostrado es una simplificación, en el protoboard debes incluir el cristal y sus 2 capacitores para cada microcontrolador.
      Algo 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.

      Eliminar
  4. 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.

    ResponderEliminar
    Respuestas
    1. Prueba a usar 2 veces las funciones de envío y recepción de datos. Por ejemplo en el emisor:
      dato_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.

      Eliminar
  5. buen 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

    ResponderEliminar
    Respuestas
    1. Sí, lo que envía el protocolo RS232 son cadenas (o en este caso, caracteres), la forma de interpretarlo depende de ti.
      Puedes 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.

      Eliminar
    2. mauricio martinez6 de mayo de 2016, 17:39

      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

      Eliminar
  6. hola como puedo conseguir el dato que envia el modulo de bluetooth??

    ResponderEliminar
    Respuestas
    1. Tu 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.

      Eliminar
  7. tengo 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 )

    ResponderEliminar
  8. mauricio martinez6 de mayo de 2016, 18:29

    hola 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

    ResponderEliminar
  9. disculpa 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

    ResponderEliminar
  10. Como se conectas los cristales y los capacitores a los pics?

    ResponderEliminar
  11. como se hace recibir cadena de caracteres en pic c compiler.

    ResponderEliminar
  12. Hola, y cómo sería para un int32? He logrado enviar datos, pero no los recibe adecuadamente...

    ResponderEliminar