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.
-
Oferta Producto en ofertaATmega328P: Guía de Programación mediante registros
$19,99El precio original era: $19,99.$13,99El precio actual es: $13,99.
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:
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:
#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í ⭐.