RobotyPic son proyectos básicos de electrónica con microcontroladores PIC, de aplicación en el mundo de la robótica didáctica, con archivos fuente creados mediante el compilador CCS PIC C COMPILER en lenguajeC.

Comunicación RS232 entre dos PIC



Este ejemplo consiste en la comunicación entre dos PIC por RS232. Cada uno de los PIC dispone de un teclado para enviar datos y un display para visualizar la información recibida. Cada uno de ellos puede enviar y recibir la información del otro indistintamente.

pulsa en la imagen para ampliarla

Para este tipo de comunicación lo primero será configurarla mediante la siguiente directiva en la cabecera del programa:

#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)

Entre parentesis las opciones de configuración de la transmisión:

        En baud especificaremos la velocidad de transmisión.
    En xmit  especificamos el pin del PIC utilizado para la transmisión. En el 16f876a será el pin c6.
        En rcv especificamos el pin utilizado para la recepción. Para este PIC, el c7.

Existen más opciones pero para este ejemplo con estas es suficiente para conseguir la comunicación.

Una vez dentro ya de la función principal del programa, hay que habilitar la interrupción por recepción RS232.

enable_interrupts(INT_RDA);

Y  la correspondiente habilitación global de interrupciones:

enable_interrupts(GLOBAL);

Configurada y habilitada la transmisión serie RS232, ahora cada vez que se quiera enviar un dato vía esta comnicación, se tiene que ejecutar la instrucción...

putc(valor); 

...donde “valor” es la variable que contiene la información a transmitir.

Cada vez que por el pin configurado en la directiva   #use rs232 como rcv se reciba nueva información, actuará la interrupción por recepción RS232 anteriormente habilitada y el programa saltará inmediatamente a la función   #int_RDA  donde se encuentra el código que debe ejecutarse, en este caso, mostrar la información recibida por LCD.

Para obtener dicha información, se ejecuta la instrucción...

valor=getc();   

En la variable “valor” se almacenará la información recibida.


[+/-] Ver / Ocultar programa completo en C


El código del programa es el mismo para los dos PIC ya que ambos realizan la misma función.

En esta animación se puede ver el resultado en la simulación bajo Proteus.



Todos los archivos del proyecto se pueden descargar en este enlace:




El proyecto contenido en el artículo ha sido diseñado y probado con éxito utilizando las siguientes versiones de software:
- Windows xp y windows 7
- Proteus V7.7 SP2
- CCS PIC C COMPILER v4.084


19 comentarios:

Meta dijo...

Hola:

Me gustan tus ideas. ¿Puedes hacer un ejemplo con un PIC16F877/87?

Por ejemplo:
1) Dos PIC16F887.
2) Estos PIC se comunica entre si por RS232.
3) EL 16F887 como principal usa un LCD 20x4 de 4 bits. 8 pulsadores físicos de entrada. Los analógicos de momento de reserva para un uso en el futuro. Ahora no es el momento.
4) El otro PIC 16F887 se conecta a RS232, las entradas que recibe el primer PIC1 serán mostrada en las salidas digitales del PIC2.
5) El PIC2 usa 8 entradas digitales, 8 salidas digitales y algún que otras entradas analógica por si usamos un LM35 por poner un ejemplo.

Complejo hacerlo en C. ¿Verdad?

En lo que haz hecho hasta ahora en el blog, buen trabajo.

Chabier dijo...

Hola Meta.
Existen tantas aplicaciones desarrolladas en C como la mente sea capaz de imaginar. En RobotyPic lo que se intenta es mostrar ejemplos básicos muy concretos y cada lector que aplique, si lo desea, todos esos ejemplos en aplicaciones tan complejas como se necesite. En cierto modo todo lo que propones ya está reflejado en RobotyPic, eso sí, desglosado por artículos: ejemplos con uso de LCDs, con uso de teclados, lectura de variables analógicas, comunicación RS232,trasmisión de valores del LM35 por RS232 (concretamente como transmisión de una variable "float" por RS232)...

Juan dijo...

Muy buen trabajo me ha sido de mucha ayuda. Tengo una pregunta ¿Se puede en un PIC configurar dos interfaces RS232? Por favor alguna ayuda, de antemano gracias.

Chabier dijo...

Hola Juan.
Si te refieres a comunicar varios dispositivos por un mismo bus de dos lineas sería mejor el uso del bus I2C en el que independientemente del número de dispositivos conectados comunicas con el que deseas individualmente mediante una dirección de acceso.

Juan dijo...

Es que la idea es la siguiente: un modulo de radiofrecuencia que llega a un PIC vía rs232, con este PIC muestro lo recibido en un display y también envió vía rs232 a un PC. ¿La mejor solución seria agregar otro PIC?, tengo el PIC 16f877a.

Chabier dijo...

Hola Juan.
El RS232 es una comunicación punto a punto entre dos componentes.Si intercalas otro deberías "desconectar" al componente de la red que no deba intervenir en ese momento, por ejemplo mediante un multiplexado. Otra opción, intercalar otro PIC comunicado con el receptor mediante I2C por ejemplo. O quizá puedas probar también una red RS485 que permite más de 2 componentes.

Marco Cariño Trujillo dijo...

A alguien le funciono la simulación? el LCD del PIC 1 solo enciende pero no imprime ningun dato, solo esta verde, como puedo solucionar ese problemita?

Chabier dijo...

Hola Marco.
En la animación puedes ver que el funcionamiento es correcto. Si lo haces tal cual está aquí mostrado te debe funcionar. Descarga los archivos del enlace. Son los utilizados para la simulación.

cristhian Bonaldy dijo...

Amigo he seguido este post y este proyecto y en PIC C hay un problema al compilar debido a que envía 5 warnings, 4 de ellos dicen que deshabilitan las interrupciones para evitar las re-entradas y el otro warning es que el while(1) siempre será cierto. Además que colocar funciones de imprimir y delay dentro de una interrupción no es apropiado, también creo que existe algún problema con la librería del teclado. Yo he revisado los .HEX que has enviado en el paquete del proyecto y lo comparé con lo que arroja en PIC CCS y no son los mismos. Que puedo hacer para resolver con ese código me haga lo que te da a ti en la simulación? y disculpa la gran molestia.

CCNA dijo...

Tengo el mismo problema que Marco y Cristhian.
Cuando lo descargo el programa funciona correctamente, pero si lo vuelvo a compilar (sin hacer ninguna modificacion inclusive) deja de funcionar.
Evidentemente no esta compilado con las librerias standard lcd.c y kbd.c de PIC CCS.
Chabier, las podrias dejar en algun lugar para descargar ?
Gracias.

Chabier dijo...

Hola CCNA.
He incluido las dos librerías en el enlace de descarga de los archivos del artículo.

CCNA dijo...

Gracias Chabier, ahora si funciona.
Un groso ..!!

Juan dijo...

Hola Chabier, tu blog me ha sido de gran ayuda.
Pregunta ¿Este ejemplo me seria útil si conecto un modulo bluetooth (HC-05)?
De antemano gracias

Robotypic dijo...

Hola Juan.
Aquí está mostrado lo básico para una comunicación serie. Como tal, como una base de la que partir, si te serviría pero deberás adaptarlo tu dispositivo.

oscar fidel dueñez vazquez dijo...

Muy buena página estos ejemplos sirven bastante, me han sido de gran ayuda. Sólo hay que ponerle imaginación e ingenio para desarrollar cualquier proyecto complejo porque estos ejemplos son la base. Gracias por la información.

oscar fidel dueñez vazquez dijo...

Ejemplos de como controlar un pic mediante OS ANDROID.

Nahuel Ber dijo...

Hola, muy buen ejemplo. Funciona muy bien, pero quiero tomar el ejemplo para hacer otro proyecto con un 16f628a y me sale lo mismo que cristhian Bonaldy: Envía 5 warnings, 4 de ellos dicen que deshabilitan las interrupciones para evitar las re-entradas y el otro warning es que el while(1) siempre será cierto. Además que colocar funciones de imprimir y delay dentro de una interrupción no es apropiado, también creo que existe algún problema con la librería del teclado.
Ya puse las librerias dentro de mi carpeta donde guardo el proyecto, intenté también con mencionarle la ruta "C:.....\..." y nada, como puedo hacer?? Muchas gracias, muy bueno todo!!

Robotypic dijo...

Nahuel. Las advertencias o avisos que salen al compilar son eso, avisos. Mientras no te de errores, las advertencias no impiden que el programa funcione correctamente. Si has puesto las librerías del enlace de descarga en la carpeta de tu proyecto asegurate que no tienes las originales de tu versión en la carpeta drivers del CCS.

Wilmer Fabian Triana dijo...

Hola buen día, muy interesante el tema. Me gustaria saber si alguien sabe como enviar y recibir mas de un dato. Les agradezco la colaboración.

Related Posts Plugin for WordPress, Blogger...

CONTACTA - (Haz referencia del artículo sobre el que trata la consulta o comentario)