Comunicación serial RS232 «botones y leds», Pic C Compiler

En esta sección aprenderás a realizar una comunicación serial RS232 con dos microcontroladores PIC. El objetivos es enviar datos por el puerto serial a un microcontroladores PIC para que encienda diferentes LED´s.

Comunicación serial RS232

La comunicación RS232 es un protocolo de comunicación asíncrono que define cómo los dispositivos deben transmitir y recibir datos y señales de control. Establece normas para la transmisión de señales de control, como el inicio y el fin de los datos, y también define los parámetros de los cables y conectores utilizados para la conexión.

Además, la comunicación RS232 permite una amplia gama de velocidades de transmisión de datos, lo que la hace adecuada para una amplia variedad de aplicaciones. La velocidad de transmisión de datos se puede ajustar según sea necesario para adaptarse a las necesidades específicas de una aplicación.

A pesar de la popularidad de otros estándares más modernos, como USB y Ethernet, la comunicación RS232 sigue siendo una parte importante de la industria tecnológica. Se utiliza en una amplia variedad de aplicaciones, desde la conexión de dispositivos industriales hasta la conexión de dispositivos de almacenamiento y la transmisión de datos de sensores y controladores.

En resumen, la comunicación RS232 es un estándar de comunicación serie que ha resistido la prueba del tiempo y sigue siendo relevante en la industria tecnológica de hoy en día. Aunque ha sido superado por otros estándares en muchos casos, sigue siendo una parte importante de la tecnología y se utiliza en una amplia variedad de aplicaciones.

Circuito de conexión

Programación PIC de transmisión

Inicialmente se establecen los parámetros de la comunicación RS232.

  • baud = Velocidad de transmisión.
  • parity = Bit de paridad. 
  • xmit = Pin de transmisión.
  • rcv = Pin de recepción. 
  • bits = Datos de transmisión.
  • stream = identificación de transmisión.

#use rs232(baud=9600, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8)

Se definen los pines de entrada para los botones.


#define boton1 input(pin_d0)
#define boton2 input(pin_d1)
#define boton3 input(pin_d2)

Para evitar enviar múltiples veces el estado del los botones, debemos guardar el estado presente y pasado del botón, utilizando la siguientes variables.


int1 pasboton1 = 0;
int1 pasboton2 = 0;
int1 pasboton3 = 0;

Cuando el botón cambia de estado se envía el comando correspondiente, si esta pulsado se envía «LED1_ON» y si no esta pulsado se envía «LED1_OFF».


if (pasboton1 != boton1) 
     {   
        delay_ms(10);
        if(pasboton1==0)
        {
            printf("LED1_ON\r");
            pasboton1=1;  
        }else
        {
            printf("LED1_OFF\r");  
            pasboton1=0;
        }
     }

Para el boton2 y boton3 se realiza el código con la misma lógica.

Código completo PIC Transmisión 


#FUSES NOMCLR

#use rs232(baud=9600, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8)

#define boton1 input(pin_d0)
#define boton2 input(pin_d1)
#define boton3 input(pin_d2)

int1 pasboton1 = 0;
int1 pasboton2 = 0;
int1 pasboton3 = 0;

void main()
{

   while(TRUE)
   {

      if (pasboton1 != boton1)
      { 
         delay_ms(10);
         if(pasboton1==0)
         {
            printf("LED1_ON\r");
            pasboton1=1;
         }else
         {
            printf("LED1_OFF\r");
            pasboton1=0;
         }  
      }
      
      
     if (pasboton2!=boton2)
     {
        delay_ms(10);
        if(pasboton2==0)
        {
            printf("LED2_ON\r");
            pasboton2=1;
        }else
        {
            printf("LED2_OFF\r");
            pasboton2=0;
        }
     }

     if (pasboton3!=boton3)
     {
        delay_ms(10);
        if(pasboton3==0)
        {
            printf("LED3_ON\r");
            pasboton3=1;
        }else
        {
            printf("LED3_OFF\r");
            pasboton3=0;
        }
     }

   }
}

Programación PIC de recepción 

Inicialmente se establecen los parámetros de la comunicación RS232.


#use rs232(baud=9600, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8)

Se definen los pines de salida conectados a los LED´s.


#define LED1   PIN_D0
#define LED2   PIN_D1
#define LED3   PIN_D2

Se habilitan las interrupciones para la comunicación rs232.


 enable_interrupts(int_rda);
 enable_interrupts(global);
   

Cuando se reciben datos por el pin de recepción  el programa detiene sus funciones para recibir los datos, el programa guarda los datos en la variable recibido[i] y termina la comunicación rs232 cuando recibe un carácter de salto de linea.


#int_rda
void rda_isr()
{
   memset(recibido, 0, sizeof(recibido)); //limpia los registros de la varible
   int8 i=0;
   while(true)
   {  
      recibido[i]=getc();//RECIBE EL CARACTER
      
      if(recibido[i]=='\r')//busca el salto de linea \r
      {
         recibido[i]='\0';//fin de la cadena = caracter nulo \0
         leds();
         return;
      }
      i++;
   }  
} 

La subrutina void leds() se coloca en el archivo.h del proyecto o en la parte superior del programa antes del #int_rda.


void leds()
{}

Se define una variable de caracteres que contienen el identificador del led que se encenderá o apagara.


   char LED1_ON[20] = "LED1_ON";
   char LED1_OFF[20] = "LED1_OFF";

La función strcmp() compara los datos recibidos por el puerto rs232 y con las variables anteriores. 


 result = strcmp(recibido, LED1_ON);//compara, si son iguales (0), no (+-1)

Si los datos recibidos y LED1_ON es igual, resultado=0 por lo tanto encenderá el led1, si no es igual pasa a la siguiente comparación.


  if(result==0)
      {
         OUTPUT_BIT(LED1,1);
         return;
      }

Si los datos recibidos y LED1_OFF es igual resultado = 0, entonces apagara el led1, si no es igual pasa a la siguiente comparación.


 result = strcmp(recibido, LED1_OFF);
      
      if(result==0)
      {
         OUTPUT_BIT(LED1,0);
         return;
      }

Finalmente se aloja en la función void main(){} y espera hasta activarse la interrupción nuevamente.

Código completo PIC recepción 


#include "string.h"

#FUSES NOMCLR

#use rs232(baud=9600, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8)

#define LED1   PIN_D0
#define LED2   PIN_D1
#define LED3   PIN_D2

char recibido[20];

void leds();

#int_rda
void rda_isr()
{
   memset(recibido, 0, sizeof(recibido)); //limpia los registros de la varible
   int8 i=0;
   while(true)
   {
      recibido[i]=getc();//RECIBE EL CARACTER

      if(recibido[i]=='\r')//busca el salto de linea \r
      {
         recibido[i]='\0';//fin de la cadena = caracter nulo \0
         leds();
         return;
      }
      i++;
   }
}


void leds()
{
   signed int8 result;

   char LED1_ON[20] = "LED1_ON";
   char LED1_OFF[20] = "LED1_OFF";

   char LED2_ON[20] = "LED2_ON";
   char LED2_OFF[20] = "LED2_OFF";

   char LED3_ON[20] = "LED3_ON";
   char LED3_OFF[20] = "LED3_OFF";

   while (true)
   {

      result = strcmp(recibido, LED1_ON);//compara, si son iguales (0), no (+-1)

      if(result==0)
      {
         OUTPUT_BIT(LED1,1);
         return;
      }//enciende el led1

      result = strcmp(recibido, LED1_OFF);

      if(result==0)
      {
         OUTPUT_BIT(LED1,0);
         return;
      }

      result = strcmp(recibido, LED2_ON);

      if(result==0)
      {
         OUTPUT_BIT(LED2,1);
         return;
      }

      result = strcmp(recibido, LED2_OFF);

      if(result==0)
      {
         OUTPUT_BIT(LED2,0);
         return;
      }

      result = strcmp(recibido, LED3_ON);

      if(result==0)
      {
         OUTPUT_BIT(LED3,1);
         return;
      }

      result = strcmp(recibido, LED3_OFF);

      if(result==0)
      {
         OUTPUT_BIT(LED3,0);
         return;
      }
      return;
   }

}


void main()
{
   enable_interrupts(int_rda);
   enable_interrupts(global);

   while(TRUE)
   {


      //TODO: User Code
   }

}
Scroll al inicio