Reference   Language (extended) | Libraries | Comparison | Changes

Registro PORT (puerto)

Los registros de PORT permiten manipular los pines del microcontrolador de la placa Arduino em bajo nivel y demanera más rapida. Los chips usados usados en la placa Arduino (el ATmega8 y el ATmega168)poseen tres puertos:

  • B (pines digitales del 8 al 13)
  • C (entradas analógicas)
  • 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. El registro DDR, determina si el pin es una entrada o una salida. El registro PORT controla si el pin está en nivel alto o en nivel bajo, y el registro PIN permite leer el estado de un pin que se ha configurado con entrada usando la función pinMode(). 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 - 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 D - lectura/escritura
PINB - Registro de pines de entrada - 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 B - lectura/escritura
PORTC - Registro de datos del puerto D - lectura/escritura
PINC - Registro de pines de entrada - 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) Each bit of these registers corresponds to a single pin; e.g. the low bit of DDRB, PORTB, and PINB refers to pin PB0 (digital pin 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 = DDRD | B11111100;  // esta manera es más segura ya que configura los 
	                  // pines del 2 al 7 como salidas in cambiar los pines 0 y 1,
                          // los cuales son RX y TX

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

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

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

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

Generalmten, hacer este tipo de cosas no es una buena idea. ¿Por que no? Aquí se presentan algunas razones:

  • 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.

  • 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.

  • 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:

  • Puede que puedas cambiar los pines de estado muy rápido, en fracciones de microsegundos. Si miras el código fuente en lib/targets/arduino/wiring.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.

  • 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.

  • 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.

Véase también

Página principal Referencia

Correcciones, sugerencias, y nueva documentación deberán ser publicadas en el Foro (castellano) o en el Foro (inglés).

El texto de la referencia de Arduino está publicado bajo la licencia Creative Commons Reconocimiento-Compartir bajo la misma licencia 3.0. Los ejemplos de código de la referencia están liberados al dominio público.

Share