ATmega328P: Módulo USART

Contenido:

Módulo USART del ATmega328P

El módulo USART (Universal Synchronous/Asynchronous Receiver/Transmitter) del ATmega328P es una interfaz de comunicación serie que puede operar en modo síncrono o asíncrono. Puede ser utilizado para comunicaciones de datos en serie, tales como la comunicación serial RS-232 o RS-485, la comunicación por infrarrojos, la comunicación por radio y otros protocolos de comunicación de datos en serie.

El USART del ATmega328P tiene una serie de registros que controlan su funcionamiento. Los principales registros son el Registro de Control y Estado del USART (UCSRnA/B/C) y el Registro de Datos del USART (UDRn).

Puede operar en modo síncrono o asíncrono. En modo asíncrono, el USART transmite y recibe datos utilizando un reloj interno generando una señal de sincronización a partir de la frecuencia del oscilador. En modo síncrono, el USART utiliza una señal de reloj externa para sincronizar la transmisión y recepción de datos.

El módulo USART del ATmega328P puede ser utilizado para la transmisión y recepción de datos en serie a diferentes velocidades de baudios y puede ser programado para operar en modo full-duplex o half-duplex.

✅ Si quieres conocer la descripción de cada uno de los registros, además de varios ejemplos adicionales de los que encontrarás en este post, te invito a que adquieras la 🔥 Guía de Programación mediante registros del Microcontrolador ATmega328P 🔥 dando clic ⭐ aquí ⭐. Adicionalmente recibirás los sketch de Arduino IDE y de Microchip Studio, incluyendo los archivos de simulación en Proteus Profesional v8.10.

Video Tutorial

Ejemplo 1: Encender cada uno de 6 leds disponibles ingresando su número mediante el Puerto Serial.

Para encender cada uno de los 6 LEDs mediante el ingreso de un número en el Puerto Serial se configura cada uno de los registros correspondiente a dicha comunicación para que trabaje a una tasa de 9600 baudios, con 1 bit de inicio, 8 bits de datos, sin paridad y con 1 bit de parada.

En el bucle de repetición, se comprueba que exista un dato sin leer en el buffer, al momento de que llegue un dato al microcontrolador, este lo lee y lo vuelve a enviar para comprobar su funcionamiento, posteriormente el dato se analiza para encender cada uno de los leds mediante el registro PORTC.

Arduino:

at328p usart ejm1 1
Figura 1: Circuito con Arduino para el Ejemplo 1 del Módulo USART.
void setup() {
  DDRC = 0b00111111; // A0 - A5 Salidas
  PORTC = 0b00000000; // Salidas en Bajo
  UCSR0A = 0b00000000;
  UCSR0B = 0b00011000; // Rx y Tx Habilitada
  UCSR0C = 0b00000110; // Asincrono, Sin Paridad, 1 bit de Parada
  UBRR0 = 103; // 9600 Baudios
  delay(10);
}

void loop() {
  // Rx
  if (UCSR0A & 0b10000000) { //Comprueba si existe un dato sin leer
    unsigned char dato = UDR0; // Añade los datos a la variable
    while (!(UCSR0A & 0b00100000)); // Espera hasta que el buffer este vacio
    // TX
    UDR0 = dato;
    // Control de Salidas
    if (dato == '1') {
      PORTC |= 0b00000001;
    } else {
      PORTC &= 0b11111110;
    }
    if (dato == '2') {
      PORTC |= 0b00000010;
    } else {
      PORTC &= 0b11111101;
    }
    if (dato == '3') {
      PORTC |= 0b00000100;
    } else {
      PORTC &= 0b11111011;
    }
    if (dato == '4') {
      PORTC |= 0b00001000;
    } else {
      PORTC &= 0b11110111;
    }
    if (dato == '5') {
      PORTC |= 0b00010000;
    } else {
      PORTC &= 0b11101111;
    }
    if (dato == '6') {
      PORTC |= 0b00100000;
    } else {
      PORTC &= 0b11011111;
    }
  }
}

Lenguaje C:

at328p usart ejm1 2
Figura 2: Circuito con ATmega328P para el Ejemplo 1 del Módulo USART.
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>

int main(void){
	DDRC = 0b00111111; // A0 - A5 Salidas
	PORTC = 0b00000000; // Salidas en Bajo
	UCSR0A = 0b00000000;
	UCSR0B = 0b00011000; // Rx y Tx Habilitada
	UCSR0C = 0b00000110; // Asincrono, Sin Paridad, 1 bit de Parada
	UBRR0 = 103; // 9600 Baudios
	_delay_ms(10);
	while (1){
		// Rx
		if (UCSR0A & 0b10000000) { //Comprueba si existe un dato sin leer
			unsigned char dato = UDR0; // Añade los datos a la variable
			while (!(UCSR0A & 0b00100000)); // Espera hasta que el buffer este vacio
			// TX
			UDR0 = dato;
			// Control de Salidas
			if (dato == '1') {
				PORTC |= 0b00000001;
				} else {
				PORTC &= 0b11111110;
			}
			if (dato == '2') {
				PORTC |= 0b00000010;
				} else {
				PORTC &= 0b11111101;
			}
			if (dato == '3') {
				PORTC |= 0b00000100;
				} else {
				PORTC &= 0b11111011;
			}
			if (dato == '4') {
				PORTC |= 0b00001000;
				} else {
				PORTC &= 0b11110111;
			}
			if (dato == '5') {
				PORTC |= 0b00010000;
				} else {
				PORTC &= 0b11101111;
			}
			if (dato == '6') {
				PORTC |= 0b00100000;
				} else {
				PORTC &= 0b11011111;
			}
		}
	}
}

Ejemplo 2: Encender / apagar cada uno de 6 leds disponibles. El led será seleccionado ingresando su número mediante el puerto serial.

Este ejemplo solo está disponible en la 🔥 Guía de Programación mediante registros del Microcontrolador ATmega328P 🔥 adquiérela hoy dando clic ⭐ aquí ⭐.

Deja un comentario