Programación de Micros AVR en Linux

Puertos E/S de los AVR

Programación de puertos digitals de entrada/salida

Registros

Los microcontroladores AVR tienen asociados 3 registros para cada uno de sus puertos de E/S, es decir 3 para el PUERTO A, 3 para el puerto PUERTO B, 3 para el PUERTO C y así sucesivamente dependiendo cuantos puertos implemente el modelo del microcontrolador AVR.

  • DDRx
  • PORTx
  • PINx

DDRx

Data Direction Register x: Registro de dirección de datos.

Este registro configura si los pines del puerto x serán de entrada o salida. Es de 8 bits, donde cada bit representa un pin del puerto x. Si se escribe un 1 en algún bit de este registro, el pin correspondiente será configurado como salida, si se escribe un 0 se configura como de entrada. Por default todos los pines se configuran como entrada despues de un RESET.

PORTx

Data Register x: Registro de Datos.

Este registro tiene una doble funcionalidad; cuando un puerto es de salida, el valor escrito (1 o 0) en alguno bit del registro será reflejado en el pin correspondiente .

Cuando el puerto es configurado como entrada, escribir un 1 en algún bit del registro activará la resistencia PULL-UP interna correspondiente al pin. Un 0 desactiva la resistencia PULL-UP interna.

PINx

Port Input Register x: Registro Entrada de Datos.

Este registro es de sólo lectura, y se utiliza para leer el estado de los puertos configurados como entrada. El valor de cada bit representa el estado lógico actual del pin que le corresponde.

En algunos modelos de microcontroladores (ver su datahseet), escribir en este registro invierte el estado de los pines configurados como salida (toggle).

Ejemplo

Configurar los pines 0, 1, 2 y 3 del PUERTO B como entrada y los pines 4, 5, 6 y 7 como salida.

El valor del registro sería: 0xF0 (240 en decimal)

					
						
							DDRB = 0xF0;
							DDRB = (1 << PB4) | (1 << PB5) | (1 << PB6) | (1 << PB7);
						
					

Escritura en pines de salida

Para escribir un 1 lógio en los pines 4 y 7 del PUERTO B se haria escribiendo el valor 0x90 (144 en decimal)

					
						
							PORTB = 0x90;
							PORTB = (1 << PB4) | (1 << PB7);
						
					

Leer el estado de una entrada

Para leer el estado del pin 2 del PUERTO B se lee el registro PINB completo y se hace una máscara con el bit 2 (0x04)

					
						
							int input = PINB & 0x04;
							int input = PINB & (1 << PB2);
						
					

Siguiente capítulo

USART del ATmega32

Ir al capitulo 5