Puertos de Entrada y Salida del ATmega328P
El microcontrolador ATmega328P cuenta con un total de 23 puertos de entrada y salida (E/S), que pueden ser utilizados para conectar dispositivos externos al microcontrolador. Para configurar un pin debemos utilizar los siguientes registros:
DDxn: Asignación (0 = entrada, 1 = salida), determina si el pin es una entrada o una salida.
PINxn: Lectura, permite leer el estado de un pin que se ha configurado con entrada.
PORTxn: Escritura, controla si el pin está en nivel alto o en nivel bajo, teniendo en cuenta las siguientes condiciones:
- Si en PORTxn se escribe un 1 cuando el pin está configurado como pin de entrada, la resistencia pull-up se activa.
- Si en PORTxn se escribe un 1 cuando el pin está configurado como pin de salida, el pin del puerto se pone en HIGH.
- Si en PORTxn se escribe un 0 cuando el pin está configurado como pin de salida, el pin del puerto se pone en LOW.
✅ 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: Activar y desactivar 4 leds cada 100ms.
Arduino:
void setup() { DDRD = 0b11110000; // Puerto D: Salidas [7:4] PORTD = 0b00000000; // Salidas en Bajo _delay_ms(10); } void loop() { PORTD = 0b11110000; //Salidas en estado HIGH _delay_ms(100); // Retardo 100ms PORTD = 0b00000000; //Salidas en estado LOW _delay_ms(100); // Retardo 100ms }
Lenguaje C:
#define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> int main(void){ DDRD = 0b11110000; // Puerto D: Salidas [7:4] PORTD = 0b00000000; // Salidas en Bajo _delay_ms(10); while (1){ PORTD = 0b11110000; //Salidas en estado HIGH _delay_ms(100); // Retardo 100ms PORTD = 0b00000000; //Salidas en estado LOW _delay_ms(100); // Retardo 100ms } }
Ejemplo 2: Encender un Led D_x cada vez que se presione un Botón B_x.
Arduino:
void setup() { DDRD = 0b11110000; // Puerto D: Salidas [7:4], Entradas [3:0] PORTD = 0b00001111; // Pull Up Activo en las Entradas _delay_ms(10); } void loop() { if (!(PIND & 0b00000001)) { // Si el estado del bit 1 es LOW PORTD |= 0b00011111; // Coloca el bit 4 en HIGH } else { PORTD &= 0b11101111; // Si no coloca el bit 4 en LOW } if (!(PIND & 0b00000010)) { // Si el estado del bit 2 es LOW PORTD |= 0b00101111; // Coloca el bit 5 en HIGH } else { PORTD &= 0b11011111; // Si no coloca el bit 5 en LOW } if (!(PIND & 0b00000100)) { // Si el estado del bit 3 es LOW PORTD |= 0b01001111; // Coloca el bit 6 en HIGH } else { PORTD &= 0b10111111; // Si no coloca el bit 6 en LOW } if (!(PIND & 0b00001000)) { // Si el estado del bit 4 es LOW PORTD |= 0b10001111; // Coloca el bit 7 en HIGH } else { PORTD &= 0b01111111; // Si no coloca el bit 7 en LOW } _delay_ms(100); // Retardo 100ms }
Lenguaje C:
#define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> int main(void){ DDRD = 0b11110000; // Puerto D: Salidas [7:4], Entradas [3:0] PORTD = 0b00001111; // Pull Up Activo en las Entradas _delay_ms(10); while (1){ if (!(PIND & 0b00000001)) { // Si el estado del bit 1 es LOW PORTD |= 0b00011111; // Coloca el bit 4 en HIGH } else { PORTD &= 0b11101111; // Si no coloca el bit 4 en LOW } if (!(PIND & 0b00000010)) { // Si el estado del bit 2 es LOW PORTD |= 0b00101111; // Coloca el bit 5 en HIGH } else { PORTD &= 0b11011111; // Si no coloca el bit 5 en LOW } if (!(PIND & 0b00000100)) { // Si el estado del bit 3 es LOW PORTD |= 0b01001111; // Coloca el bit 6 en HIGH } else { PORTD &= 0b10111111; // Si no coloca el bit 6 en LOW } if (!(PIND & 0b00001000)) { // Si el estado del bit 4 es LOW PORTD |= 0b10001111; // Coloca el bit 7 en HIGH } else { PORTD &= 0b01111111; // Si no coloca el bit 7 en LOW } _delay_ms(100); // Retardo 100ms } }
Ejemplo 3: Sumar dos números de dos bits ingresados.
Este ejemplo solo está disponible en la 🔥 Guía de Programación mediante registros del Microcontrolador ATmega328P 🔥 adquiérela hoy dando clic ⭐ aquí ⭐.
Ejemplo 4: Generar números aleatorios y visualizar en el Puerto D y B.
Este ejemplo solo está disponible en la 🔥 Guía de Programación mediante registros del Microcontrolador ATmega328P 🔥 adquiérela hoy dando clic ⭐ aquí ⭐.