Como están, en este post aprenderemos a montar un sistema que permita la Comunicación serial entre 2 Microcontroladores PIC16f628A.
Veremos como se programa cada uno de los micro controladores, por lo tanto uno hará las veces de emisor y el otro de receptor.
Ademas pondré a su disposición el código C de cada uno de los PIC16f628 para que puedan compilarlo ustedes mismos.
Sin mas rodeos vamos a comenzar:
1. Componentes para la Comunicación serial entre 2 Microcontroladores .
- 2 Microcontroladores PIC16F628
- 2 Diodos LED
- 1 Protoboard.
- Software de simulación PROTEUS.
- Compilador CCS.
2. Código del emisor RS232
Para comenzar usaremos uno de los pics 16f628 como emisor de un caracter ASSCI.
En este caso sera la letra ‘ T ‘ el caracter que se enviará por el pin de transmisión, Tx RB2 del nuestro PIC.
Para saber que cada envío de dicho caracter se ha realizado , colocaremos una señalización por medio de un LED que indicara que el caracter se ha enviado.
El código es el siguiente:
#INCLUDE <16f628a.h> // Define el PIC16f628
#FUSES NOWDT // Es un fuse que resetea el pic si este se cuelga.
#FUSES NOPROTECT // Permite o bloquea lectura del pic con un programador
#FUSES NOLVP // Anula pin de programación RB4 LVP y lo deja como I/O
#FUSES NOMCLR // NOMCLR = PIN RA5 Input. MCLR = PIN RA5 como reset
// ************************FUSES DEL RELOJ ************************************
//************************ PARA USAR EL OSCILADOR INTERNO DEL PIC *************
#FUSES INTRC_IO // HABILITA el OSCILADOR INTERNO
#USE DELAY(clock = 4000000, INTERNAL) // COMPLEMENTA EL FUSE INTRC_IO
// *********************** ACTIVAMOS EL RS232 *********************************
#USE RS232 (BAUD=9600, XMIT=PIN_B2) // SE HABILITA LA COMUNICACIÓN SERIAL
//------------------- SETEO DE PUERTOS DEL PIC --------------------------------
# USE fast_io(A) // SET RÁPIDO DE PUERTO A TRABAJA CON SET_TRIS_A(FF)
# USE fast_io(B) // SET RÁPIDO DE PUERTO B TRABAJA CON SET_TRIS_B(0B)
//**************** PROGRAMA PRINCIPAL *****************************************
void main()
{
SET_TRIS_B(0B00000000); // CONFIGURA TODO EL PUERTO B COMO SALIDA
WHILE (1) // BUCLE PRINCIPAL
{
PUTC ('T'); // ENVÍA EL CARACTER 'T' POR EL PIN RS232 PIN_B2
DELAY_ms(200); // RUTINA ADICIONAL PARA PRENDER Y APAGAR UN LED
OUTPUT_HIGH(PIN_B3); // RUTINA ADICIONAL PARA PRENDER Y APAGAR UN LED
DELAY_ms(200); // RUTINA ADICIONAL PARA PRENDER Y APAGAR UN LED
OUTPUT_LOW(PIN_B3); // RUTINA ADICIONAL PARA PRENDER Y APAGAR UN LED
}
}
//************************ fin del programa ***********************************
3. Código del receptor RS232
El PIC16f628 que trabajará como receptor del caracter enviado por el primer PIC tendra la tarea de recibir el caracter, almacenarlo en una variable para finalmente hacer una comparación. Si la comparación del caracter recibido contra uno que se esperaba es positiva se encenderá un LED indicador.
La pata del pic encargada de recibir la interrupción serial es la RCV ubicado en el PIN B1.
Esta configuración se define con la sentencia :
USE RS232 (BAUD=9600,RCV=PIN_B1,XMIT=PIN_B2)
Veamos es código:
#INCLUDE <16f628a.h> // Define el PIC16f628
#FUSES NOWDT // Es un fuse que resetea el pic si este se cuelga.
#FUSES NOPROTECT // Permite o bloque lectura del pic con un programador
#FUSES NOLVP // Anula pin de programación RB4 y lo deja como I/O
#FUSES NOMCLR // NOMCLR = PIN RA5 Input. MCLR=PIN RA5 como reset
// ************************FUSES DEL RELOJ ************************************
//************************ PARA USAR EL OSCILADOR INTERNO DEL PIC *************
#FUSES INTRC_IO // HABILITA el OSCILADOR INTERNO
#USE DELAY(clock = 4000000, INTERNAL) // COMPLEMENTA EL FUSE INTRC_IO
// *********************** ACTIVAMOS EL RS232 *********************************
#USE RS232 (BAUD=9600,RCV=PIN_B1,XMIT=PIN_B2) // habilita el puerto serial
//------------------- SETEO DE PUERTOS DEL PIC --------------------------------
# USE fast_io(A) // SET RÁPIDO DE PUERTO A TRABAJA CON SET_TRIS_A(FF)
# USE fast_io(B) // SET RÁPIDO DE PUERTO B TRABAJA CON SET_TRIS_B(0B)
//******************* VARIABLE QUE ALMACENA DATO SERIAL RECIBIDO **************
INT8 DATO_SERIAL;
//****************** ACTIVAR INTERRUPCIÓN SERIAL ******************************
#INT_RDA
VOID recepcion_serial (void) // SE EJECUTA AL RECIBIR LA INTERRUPCIÓN del PIC 1
{
DATO_SERIAL= getc(); // SE CAPTURA EL DATO Y SE ALMACENA EN LA VARIABLE
}
//**************** PROGRAMA PRINCIPAL *****************************************
void main()
{
SET_TRIS_B(0B00000010); // CONFIGURA PIN_B1 INPUT PARA RS232 EL RESTO OUTPUT
OUTPUT_B(0X00); // INICIA EL PUERTO LIMPIO
ENABLE_INTERRUPTS(INT_RDA);// HABILITA LA INTERRUPCIÓN SERIAL
ENABLE_INTERRUPTS(GLOBAL); // HABILITA LAS INTERRUPCIONES
WHILE (1) // BUCLE PRINCIPAL
{
IF(DATO_SERIAL=='T') // Si el dato recibido es T
{
OUTPUT_HIGH(PIN_B0); // ENCIENDE Y APAGA LED SI EL DATO ES CORRECTO
DELAY_ms(200); // ENCIENDE Y APAGA LED SI EL DATO ES CORRECTO
OUTPUT_LOW(PIN_B0); // ENCIENDE Y APAGA LED SI EL DATO ES CORRECTO
DELAY_ms(200); // ENCIENDE Y APAGA LED SI EL DATO ES CORRECTO
}
}
}
//************************ fin del programa ***********************************
El circuito de la Comunicación serial entre 2 Microcontroladores :
Ambos circuitos, el del pic emisor trabajando con un monitor serial y el de ambos pics trabajando juntos se muestra a continuación:


El link para la descarga de los códigos y la simulación :
http://homoluath.com/21375611/ledserial
Puedes revisar nuestras otras entradas en:
https://www.tecnocienciaperu.com/electronica/
















