ATmega328P: Puertos de Entrada y Salida

Contenido:

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.

Video Tutorial

Ejemplo 1: Activar y desactivar 4 leds cada 100ms.

Arduino:

at328p puertos es ejm1 1
Figura 1: Circuito con Arduino para el Ejemplo 1 de los Puertos E/S.
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:

at328p puertos es ejm1 2
Figura 2: Circuito con ATmega328P para el Ejemplo 1 de los Puertos E/S.
#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:

at328p puertos es ejm2 1
Figura 3: Circuito con Arduino para el Ejemplo 2 de los Puertos E/S.
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:

at328p puertos es ejm2 2
Figura 4: Circuito con ATmega328P para el Ejemplo 2 de los Puertos E/S.
#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í ⭐.
Artículos Relacionados

¡Sé el primero en enterarte!

Suscríbete y recibe novedades, promociones y contenido exclusivo.

¡No hacemos spam! Lee nuestra política de privacidad para obtener más información.

Ofertas

Deja un comentario

Política de Privacidad

Esta web utiliza cookies para poder ofrecerte la mejor experiencia de usuario posible.

La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a mi web o ayudar a mi equipo a comprender qué secciones de la web encuentras más interesantes y útiles.

Puedes revisar mi Política de Privacidad dando clic aquí.