Firtec

  Arduino Mega y la UART con interrupciones 

La placa Arduino Mega 2560 tiene varios puertos UART, en este ejemplo vemos el uso de la UART2 (pin 17 para RX y pin 16 para TX).
Para hacer las cosas mas interesantes se muestra como recibir datos mediante la interrupción de la UART2.
Este enfoque es un tanto distinto de la clásica recepción mediante sondeo continuo del puerto.

if(Serial.available()){
  if(Serial.read() == '1'){
    // Hacer algo con el dato!!!
 }

El código anterior es la forma clásica de recibir datos por la UART con Arduino, sin embargo en algunas circunstancias esto puede no ser eficiente.
En definitiva estamos siempre atentos a si hay nuevos datos en la UART, el uso de la interrupción elimina este problema.
El microcontrolador solo atiende a la UART cuando hay datos disponibles en el buffer del receptor y lo hace de manera automática.
Sin importar lo que estemos haciendo, cuando lleguen nuevos datos el control del programa pasará a la UART para procesar los nuevos datos.
El código del ejemplo es el siguiente.

/******************************************************************************
 * Descripción: Capturando datos en la UART2 
 *              Este programa utiliza la interrupción de la UART2
 *              cuando hay datos en el buffer de recepción se llama
 *              a la función ISR para procesar los datos recibidos.
 *              Los datos se muestran en una pantalla LCD y se ha 
 *              decodificado el BackSpace (carácter 0x08) para 
 *              borrar datos en pantalla.
 * Placa Arduino: MEGA 2560
 * Arduino IDE: 1.8.5
 *
 * www.firtec.com.ar
*******************************************************************************/

#include "LiquidCrystal.h"

LiquidCrystal lcd(8,9,4,5,6,7);

#define ledPin 13
#define F_CPU 16000000
#define USART_BAUDRATE 19200//9600
#define UBRR_VALUE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
char RX_Byte ;
volatile char base;

/********************************************************************
 * Función para la configuración del Hardware
 * Argumentos: NINGUNO
 * Retorna: NADA
 *
*********************************************************************/
void setup(){
   pinMode(13, OUTPUT); 
   pinMode(16, OUTPUT);
   pinMode(17, INPUT);
   digitalWrite(13, LOW);
   lcd.begin(20,4);

  lcd.setCursor(2,0);
  lcd.print("FIRTEC ARGENTINA");
  lcd.setCursor(2,1);
  lcd.print("Datos en la UART");
  lcd.setCursor(0,2);
  lcd.print("--------------------");
  lcd.setCursor(1,3);
  lcd.print("www.firtec.com.ar");

  // Configura los baudios
  UBRR2H = (uint8_t)(UBRR_VALUE >> 8);
  UBRR2L = (uint8_t)UBRR_VALUE;
  UCSR2C |= (1 << UCSZ20) | (1 << UCSZ21); // 8-bit para los datos recibidos
  UCSR2B |= (1 << RXEN2) | (1 << TXEN2) | (1 << RXCIE2);   // Interrupciones activas      
  UCSR2A = 0x00; // Limpia banderas
  interrupts();
}
/********************************************************************
 * Función pincipal del programa, solo cambia de estado el LED de la 
 * placa Mega (pin13) para indicar que es sistema está atento a las 
 * interrupciones del receptor UART.
 ********************************************************************/
void loop(){
  delay(1000);              
  digitalWrite(ledPin, digitalRead(ledPin) ^ 1);
}

/***************************************************************************
 * Función ISR para la UART2.
 * Procesa y muestra el caracter recibido. Si es 0x08 escribe "-" 
 * borrando el caracter en esa locación.
 * La variable base se usa para mover el cursor al casillero que le 
 * corresponde en la línea del LCD.
 * Argumentos: NINGUNO
 * Retorna: NADA
 *
****************************************************************************/
ISR(USART2_RX_vect){  
  RX_Byte = UDR2;  // Leo el dato recibido
  if(RX_Byte==0x08 & base >0){
     base--; 
     lcd.setCursor(base,2);
     lcd.print("-");
   }
  if(RX_Byte!=0x08){   
    lcd.setCursor(base,2);
    lcd.print(RX_Byte);
    UDR2 = RX_Byte;
    base++;
    }
 }
//*********** FIN DE ARCHIVO FIRTEC ARGENTINA **************************************
   

El siguiente es el ejemplo funcionando.

 Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.