Está en la página 1de 4

Registro PORT (puerto)

Los registros de PORT permiten manipular los pines del microcontrolador de la placa Arduino en bajo nivel y de manera más
rápida. Los chips usados en la placa Arduino (el ATmega8, el ATmega168 y el ATmega328p)poseen tres puertos:
o B (pines digitales del 8 al 13)
o C (entradas analógicas)
o D (pines digitales del 0 al 7)

Cada puerto es controlado por tres registros, los cuales también están definidos como variables en el lenguaje del Arduino
(Pagina 76 del Datasheet):
o El registro DDR, determina si el pin es una entrada o una salida.

o Cuando el DDR ha sido configurado como salida, si en el registro PORT guardamos un uno lógico, el pin del puerto
sacará un uno (HIGH) por el puerto de salida. Sin embargo si en el registro PORT guardamos un cero logico, el pin
del puerto sacará un cero (LOW) por el puerto de salida.
o Cuando el DDR ha sido configurado como entra, si en el registro PORT guardamos un uno lógico, la resistencia de
pull-up se activa. Pero si en el registro PORT guardamos un cero lógico, la resistencia de pull-up se desactiva.

o El registro PIN permite leer el estado de un pin que se ha configurado como entrada. Este registro nos da un 1 si a un
pin del microcontrolador se le está alimentando externamente, y un cero si esta en nivel bajo de voltaje.

Los esquemas de los chips ATmega8 and ATmega168 muestran los puertos. El nuevo ATmega328p usa la misma
configuración de pines que el ATmega168.
Los registros DDR y PORT pueden ser ambos, escritos y leídos. El registro PIN corresponde al estado de las entradas así que
solo puede ser leído.

El PORTD mapea los pines digitales del 0 al 7


DDRD - El registro de configuración del modo de los pines del puerto D - lectura/escritura
PORTD - Registro de datos del puerto D - lectura/escritura
PIND - Registro de pines de entrada del puerto D - solo lectura

PORTB mapea los pines digitales del 8 al 13. Los bits altos(6 & 7) están mapeados a los pines del cristal de cuarzo y no pueden
ser usados.
DDRB - El registro de configuración del modo de los pines del puerto B - lectura/escritura
PORTB - Registro de datos del puerto B - lectura/escritura
PINB - Registro de pines de entrada del puerto B - solo lectura

PORTC mapea los pines de entrada analógica del 0 al 5. Los pines 6 y 7 solo son accesibles en el Arduino Mini
DDRC - El registro de configuración del modo de los pines del puerto C - lectura/escritura
PORTC - Registro de datos del puerto C - lectura/escritura
PINC - Registro de pines de entrada del puerto C- solo lectura

Cada bit de estos registros corresponden con un solo pin; por ejemplo el bit menos significativo de los registros DDRB, PORTB,
y PINB hace referencia al pin PB0 (pin digtal 8). Para más detalles sobre como están mapeados los números de los pines de
Arduino a los puertos y los bits, mira el diagrama de tu chip: ATmega8, ATmega168. (Ten en cuenta que algunos bits de un
puerto pueden estar siendo usados para otras cosas diferentes a E/S; y ten cuidado de no cambiar los valores de los registros
correspondientes a ellos.)

Ejemplos

En referencia al mapeo de los pines del cual se habla en los párrafos anteriores, los registros del puerto D controlan los pines
digitales del 0 al 7 de la placa Arduino.

Deberías tener en cuenta, sin embargo, que los pines 0 y 1 son usados para la comunicación serial y por tanto para programar y
depurar el Arduino, por lo que cambiar esos pines debería ser evitado a menos que se necesite para funciones de entrada y salida
serial. Ten en cuenta que esto puede interferir con las descarga y depuración de programas.

DDRD es el registro de direccionamiento del Puerto D (Pines digitales Arduinos del 0 al 7). Los bits en este registro controlan si
los pines del Puerto D son configurados como entradas o salidas, por ejemplo:

DDRD = B11111110; // configura los pines del 1 al 7 como salidas y el pin 0 como
entrada
DDRD = 0xFE; // configura los pines del 1 al 7 como salidas y el pin 0 como entrada en
hexadecimal
DDRD = 254; // configura los pines del 1 al 7 como salidas y el pin 0 como entrada en
decimal

DDRD = DDRD | B11111100; // esta manera es más segura ya que configura los
// pines del 2 al 7 como salidas sin cambiar los pines 0 y 1,
// los cuales son RX y TX

//Mira la web de referencia a los operadores bit a bit tipo y Tutorial de operaciones con bits en
el Playground.

PORTD es el registro para el estado de las salidas. Por ejemplo:

PORTD = B10101000; // configura los pines digitales 7,5,3 HIGH

Para modificar solo un pin y el resto dejarlos igual, hay que usar mascaras de datos por ejemplo:

PORTD = PORTD & B10000000; // el pin digital 7 se pone HIGH y el resto no se toca

Si los pines se han configurados como salidas usando el registro DDRD o la función pinMode() los pines se leerán siempre como
si estuviesen a nivel alto.

PINB es el registro de entrada, este registro permite leer todos los pines de entrada a la vez.

¿Por que usar manipulación de puertos?

From Tutorial de operaciones con bits

Generalmente, hacer este tipo de cosas no es una buena idea. ¿Por que no? Aquí se presentan algunas razones:
o El código es mucho más difícil de depurar y mantener, y es mucho más difícil de entender para la gente. Solo lleva algunos
microsegundos al procesador ejecutar código, pero podría llevarte horas descubrir porque no funciona y arreglarlo! Tu
tiempo es valioso, no? pero el de el procesador es poco valioso, medido en coste de electricidad que necesita. Normal mente
es mucho mejor escribir un código de la forma más obvia.
o El código es menos portable. Si usas las funciones digitalRead() y digitalWrite(), es mucho más fácil escribir código que va
a funcionar en todos los micrcontroladores Atmel, donde los registros de puerto y de control pueden ser diferentes en cada
tipo de microcontroladores.
o Es mucho más fácil causar mal funcionamiento no intencionado usando el acceso directo a un puerto. Observa como la
linea DDRD = B11111110, de arriba, menciona que el pin 0 se debe dejar como una entrada. El pin 0 la linea de recepción
(RX) en el puerto seria. Podría ser muy fácil causar que tu puerto serial deje de funcionar por cambiar el pin 0 a una salida.
Será bastante confuso cuando de repente no puedas recibir datos por el puerto serial, ¿no?

Puede que te estés diciendo, genial, ¿para que querría yo usar esto entonces? Aquí están algunos de los aspectos positivos del
acceso directo al puerto:
o Puede que puedas cambiar los pines de estado muy rápido, en fracciones de microsegundos. Si miras el código fuente en
hardware\arduino\cores\arduino\wiring_digital.c, verás que las funciones digitalRead() y digitalWrite() son cada una
cerca de una docena de lineas de código, lo cual al ser compilado se convierte en unas cuantas instrucciones máquina. Cada
instrucción maquina necesita un ciclo de reloj a 16MHz, lo cual puede sumar mucho tiempo en aplicaciones muy
dependientes del tiempo. El acceso directo al puerto puede hacer el mismo trabajo en muchos menos ciclos de trabajo.
o Algunas veces necesitamos configurar muchos pines exactamente al mismo tiempo. Por lo que usar las funciones
digitalWrite(10,HIGH), seguida de la función digitalWrite(11,HIGH), causará que el pin 10 se ponga en nivel alto varios
microsegundos después que el pin 11, Lo cual puede confundir circuitos digitales conectados al Arduino cuyo
funcionamiento dependa del tiempo preciso del cambio de esos bits. De forma alternativa, se puede ver que usando el
comando PORTB |= B1100, se pueden cambiar a estado alto ambos pines a la vez.
o Si te estás quedando sin memoria para tu aplicación, puedes usar estos trucos para hacer que tu código sea más pequeño.
Usando este método se necesitan muchos menos bytes de código compilado que si se hace un bucle para que se vaya
cambiando cada pin uno por uno. En algunos casos, esto puede ser una gran diferencia entre hacer que tu programa quepa
en una memoria flash o no.

También podría gustarte