ATmega16 tiene 32 pines de E/S para comunicarse con dispositivos externos. Antes de interactuar con dispositivos externos, estos pines deben configurarse como pines de entrada o salida. Este artículo demuestra el funcionamiento básico de E/S del ATmega 16 utilizando LED.
Los cuatro puertos se pueden configurar para leer una entrada de algún dispositivo externo o para proporcionar salida a cualquier dispositivo externo según la aplicación. Por ejemplo, un interruptor está conectado a un pin específico, ese pin debe configurarse como entrada para leer los valores del interruptor (dispositivo externo en este caso) y si está conectando un LED a cualquier pin de puerto, entonces ese pin específico debe Se puede configurar como salida para transmitir la señal al LED (dispositivo externo en este caso). Se puede configurar un solo puerto para que algunos de los pines del mismo puerto sean de entrada y otros de salida.
Configuración de puertos IO:
Cada puerto (PORTx, x = A o B o C o D) de los microcontroladores AVR tiene tres registros asociados:
1. DDRx: Registro de dirección de datos, para definir la dirección de cada pin PORTx y configurarlo para que sea como entrada o salida.
dos. PORTx: En este registro se escriben los valores que se deben proporcionar en la salida del puerto. Estos valores actúan como entrada al dispositivo conectado al puerto de salida del microcontrolador (a través de los pines de salida PORTx configurados).
3. PINx: Este registro almacena el valor de entrada del hardware externo conectado, cuando el puerto está configurado como puerto de entrada. Los datos de entrada se leen del registro PINx.
Por lo tanto, el primer paso para configurar o inicializar cualquier puerto IO es definir su dirección en el registro de dirección de datos (DDRx) para definir el comportamiento de los pines individuales como entrada o salida. Un valor alto (1) en cualquier bit del registro DDRx significa que el pin correspondiente está configurado en salida y viceversa.
Ejemplo: considerando el escenario del interruptor LED, supongamos que un interruptor está conectado al Pin5 (PORTD.4) del PORTD y el LED está conectado al Pin8 (PORTD.7) del PORTD. Ahora necesitamos inicializar los pines en consecuencia. Los otros pines PORTD no se utilizan en este caso, por lo que pueden ignorarse de ahora en adelante.
PASO 1: Para configurar PORTD.4 como entrada, el valor del Pin-5 (DDRD.5) en el registro DDRD se establece en 0.
DDRD.7
|
DDRD.6
|
DDRD.5
|
DDRD.4
|
DDRD.3
|
DDRD.2
|
DDRD.1
|
DDRD.0
|
–
|
–
|
0
|
–
|
–
|
–
|
–
|
–
|
Fig. 2: Valor del bit de registro DDRD para definir PORTD como entrada al AVR
Paso 2: Para inicializar PORTD.7 como salida, el valor del Pin-8 (DDRD.7) en el registro DDRD se establece en 1.
DDRD.7
|
DDRD.6
|
DDRD.5
|
DDRD.4
|
DDRD.3
|
DDRD.2
|
DDRD.1
|
DDRD.0
|
1
|
–
|
0
|
–
|
–
|
–
|
–
|
–
|
Fig. 3: Valor del bit de registro DDRD para definir PORTD como salida en el AVR
Paso 3: El resto de pines pueden tener cualquier valor ya que en este caso no se están utilizando. Los valores predeterminados del registro DDRx son 0 para cada pin, es decir, todos los puertos del microcontrolador AVR se inicializan como entrada.
DDRD.7
|
DDRD.6
|
DDRD.5
|
DDRD.4
|
DDRD.3
|
DDRD.2
|
DDRD.1
|
DDRD.0
|
1
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
Figura 4:
Por lo tanto, el valor DDRD se inicializará a 0x80.
Figura 5:
El comando anterior también se puede escribir de esta manera:
Figura 6:
Donde, 0b es el símbolo utilizado para representar números binarios y el siguiente es el valor real de 8 bits.
Configuración del valor de pull-up:
Los cuatro puertos del Atmega16 están equipados con resistencias pull-up internas controladas por software. Cada pin de puerto se puede obtener configurando los valores en el registro PORTx. La siguiente tabla ilustra el estado real del pin con diferentes combinaciones de valores DDRx y PORTx.
DDRx
|
PUERTOx
|
Estado de E/S
|
Levantar
|
Descripción
|
0
|
0
|
Prohibido
|
No
|
Pines PORTx configurados para entrada y pull-ups deshabilitados.
|
0
|
1
|
Prohibido
|
Sí
|
Pines PORTx definidos como entrada con pull-up habilitado
|
1
|
0
|
Salida
|
No
|
Pines PORTx configurados en salida y pull-ups deshabilitados.
|
1
|
1
|
Salida
|
Sí
|
Pines PORTx configurados para salida con pull-ups habilitados.
|
Fig. 7: Estado de los pines para diferentes combinaciones de bits de DDRx y PORTx en la interfaz LED
Ejemplo: Los siguientes comandos se pueden usar para deshabilitar y habilitar pull-ups en PORTD.
PUERTO = 0xFF; // Pines PORTD levantados.
PUERTO = 0x00; //Deshabilita los registros pull-up.
Para comprender los comandos anteriores, a continuación se explica un experimento simple de parpadeo del LED.
Descripción del circuito:
Conecte el circuito como se muestra en el diagrama del circuito. No hay ningún cristal en el circuito. Este proyecto utiliza el cristal incorporado del microcontrolador AVR, evitando así la necesidad de un cristal externo. El valor del cristal interno oscila entre 1MHz y 8MHz, que se puede ajustar mediante los fusibles. (Los lectores pueden conectar el cristal externo pero modificar los bits de fusible en consecuencia. Los bits de fusible se explican en artículos posteriores).
Explicación del código:
#incluir
Incluir todos los archivos de entrada y salida del microcontrolador AVR.
#incluir
WinAvr tiene una función incorporada para proporcionar retraso. Para utilizar las funciones de retardo, incluya el archivo de encabezado anterior.
DDRA=0xFF;
Para convertir el puerto A en el puerto de salida
PUERTO=~PUERTO;
Cualquiera que sea el valor de la PUERTA, felicítelo y envíelo de regreso a la PUERTA.
_delay_ms(1000);
Una función de retardo proporciona un retraso de 1000 milisegundos.
Para comprender cómo compilar y ejecutar el programa anterior, consulte el tutorial Trabajar con AVRstudio.
¿Qué se debe observar?
Asimismo, un código podría ser que el LED parpadee en las cuatro PUERTAS. Se observa que todos los pines funcionan correctamente, excepto los pines PC2, PC3, PC4 y PC5. La razón es que los microcontroladores AVR tienen JTAG incorporado, que debe desactivarse para usar estos pines como pines de E/S. La desactivación de JTAG se explica en un artículo aparte.
Código fuente del proyecto
###
// Programa para parpadear el LED usando el microcontrolador AVR (ATmega16)
###
Diagramas de circuito
Diagrama de circuito de cómo conectar el LED con el microcontrolador AVR-ATmega16 |
Componentes del proyecto
- ATmega16
- CONDUJO