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í ⭐.

Deja un comentario