You are on page 1of 9

El Registro PORT (Puerto) en Arduino

Jos VillalazFebruary 27, 2014Arduino, Arduino para


principiantes, Programacin
En este post veremos qu son los PORT y cmo se utilizan. Al final lograremos
manipular en bajo nivel y de manera ms rpida los contactos de
entrada/salida del microcontrolador de las placas Arduino.
Los pines usados en la placa Arduino (el ATmega8 y el ATmega168) poseen
tres puertos (El ATmega328 (Arduino Uno) usa la misma configuracin de pines
que el ATmega168):
o

B (pines digitales del 8 al 13)

C (entradas analgicas)

D (pines digitales del 0 al 7)

Puertos que posee el Arduino ATmega328


Para ms detalles sobre cmo estn mapeados los nmeros de los pines de
Arduino a los puertos y los bits observa la siguiente imagen:

Nmeros de los pines de Arduino a los puertos y los bits.


El Arduino Mega presenta varios puertos B,C,D,E,F, etc.
Cada puerto es controlado por tres registros, los cuales tambin estn
definidos como variables en el lenguaje del Arduino.
o

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.

El registro PIN permite leer el estado de un pin que se ha configurado con


entrada usando la funcin pinMode().

Los registros DDR y PORT pueden ser ambos, escritos y ledos. El registro PIN
corresponde al estado de las entradas as que solo puede ser
ledo. El PORTD mapea los pines digitales del 0 al 7
o

DDRD El registro de configuracin 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

El PORTB mapea los pines digitales del 8 al 13. Se debe recordar que Los bits
altos (6 & 7) estn mapeados a los pines del cristal de cuarzo y no pueden ser
usados. Estos son solamente accesibles en el Arduino Mini.
o

DDRB El registro de configuracin 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

El PORTC mapea los pines de entrada analgica del 0 al 5.


o

DDRC El registro de configuracin 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 digital 8)
Normalmente antes para declarar un pin lo hacamos de la siguiente manera:
void setup(){
Serial.begin(9600);
pinMode(2,INPUT);
pinMode(3,OUTPUT);
}
Entonces si quisiramos declarar 7 pines (desde el digital 0 al digital 7),
tendramos que repetirpinMode 7 veces. Al igual que escribir tendramos que
poner digitalWrite(pin,estado) pin 0 estado alto, pin 1 estado bajo, etc.
Al utilizar Registros PORT (Puerto) tenemos la ventaja de que con solo una
instruccin podemos declarar el pin como entrada o salida y tambin
podemos escribir, si lo queremos, como estado HIGH o LOW.
Para controlar cualquiera de los tres puertos, debemos usar dos instrucciones.
o

Primera instruccin: se debe declarar en la estructura void setup() y nos


sirve para declarar si el pin se va a usar como INPUT o como OUTPUT.

Dato Importante:

Los pines 0 y 1 son la transmisin serial (RX y TX respectivamente). Si utilizas


Serial.begin en alguno de esos 2 puertos; no tendrs comunicacin serial.
Cuidado con eso.
Ejemplo:
1 = OUTPUT

0 = INPUT

DDRX = B11111110;
donde X es la letra del puerto a usar (BCD). Sin embargo si queremos tener
comunicacin Serial tendramos que hacer esto:
DDRX = DDRX | B11111100;
Esta manera es ms segura ya que configura los pines del 2 al 7 como salidas
sin cambiar los pines 0 y 1, que como mencionamos son RX y TX Para tener
ms referencia de los operadores bit a bit tipo AND, visita el siguiente post de
Arduino:
o

Tutorial de operaciones con bits.

Tenemos el siguiente cdigo:


B11111110;
Colocamos B, porque el nmero a marcar es Binario. Para ampliar ms sobre
los tipos de datos en Arduino visitemos el siguiente blog:
o

Tipos de Datos en Arduino.

Para saber el estado que le daremos al pin siempre lo pondremos escribiendo


de derecha a izquierda.

Nmero a
marcar

Ubicacin
del pin en

Arduino.
o

Segunda instruccin: es la escritura del puerto (esta variar en funcin del


programa que estemos desarrollando). Lo localizamos en la
funcin void loop().

Ejemplo:
1 =HIGH

0 = LOW

PORTX= B11111110;
En este ejemplo los pines del 1 al 7 permanecern encendidos (HIGH) y el pin 0
LOW.Veamos un ejemplo aplicando estos conceptos:
En este ejemplo lograremos que durante dos segundos todos los leds
enciendan, durante dos segundos ms alumbren los impares y durante dos
ms todos se apaguen. Veamos:
Configuracin Utilizada:

Configuracin Utilizada para este proyecto.


Abrimos Arduino IDE y escribimos el siguiente cdigo:

int contador=0;//declaramos la variable interna como contador.


void setup(){
DDRD= B11111100;//Utilizamos D porque es del 0 al 7 y B porque
es Binario.
//En este ejemplo no utilic los pines 0 y 1 del Arduino.
/*Esta instruccin es lo mismo que hacer esto:
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT); */
}
void loop(){
for (contador=0; contador <3; contador ++){//establecemos
contador menor que 3 porque solo son 3 casos.
switch(contador){
case 0:
PORTD= B11111111;//aqu encenderemos todos los leds
delay(2000);
case 1:
PORTD= B10101010;//aqu encenderemos solo los impares.
delay(2000);
case 2:
PORTD= B00000000;//aqu los apagaremos todos.
delay(2000);
}
}
}
Para ver otro ejemplo utilizando Registro PORT (Puerto), visitemos el siguiente
post:
o

Control de Display 7 Segmentos mediante Pulsadores.

Ventajas y Desventajas que nos ofrece al utilizar el Registro


PORT (Puerto):
Desventajas:

El cdigo es mucho ms difcil de depurar y mantener, y es mucho ms


difcil de entender para la gente. Solo lleva algunos microsegundos al
procesador ejecutar cdigo, pero podra llevarte horas descubrir por qu
no funciona y arreglarlo.

Es mucho ms fcil causar mal funcionamiento no intencionado usando el


acceso directo a un puerto. Observa como la lnea DDRD = B11111110, de
arriba, menciona que el pin 0 se debe dejar como una entrada. El pin 0 la
lnea de recepcin (RX) en el puerto serial.Podra ser muy fcil causar que
tu puerto serial deje de funcionar por cambiar el pin 0 a una salida.

Ventajas:
o

Puede que puedas cambiar los pines de estado muy rpido, en fracciones
de microsegundos. Las funciones digitalRead() y digitalWrite() son cada
una cerca de una docena de lneas de cdigo, lo cual al ser compilado se
convierte en unas cuantas instrucciones mquina.

Cada instruccin maquina necesita un ciclo de reloj a 16MHz, lo cual puede


sumar mucho tiempo en aplicaciones muy dependientes del tiempo.
El Registro PORT (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 funcin digitalWrite (11,HIGH), causar que el pin 10 se ponga en
nivel alto varios microsegundos despus que el pin 11, lo cual puede
confundir circuitos digitales conectados al Arduino, cuyo funcionamiento
dependa del tiempo preciso del cambio de esos bits.

Si te ests quedando sin memoria para tu aplicacin, puedes usar estos


trucos para hacer que tu cdigo sea ms pequeo. Usando este mtodo
se necesitan muchos menos bytes de cdigo compilado que si se hace un
bucle para que se vaya cambiando cada pin uno por uno.

Espero que la informacin suministrada sea de su comprensin y utilidad.


Recuerda seguir visitando nuestros post.
Saludos.

Leer y escribir directamente en los puertos del PIC en


Pinguino

Se puede utilizar los registros de configuracin de puertos para configurar los terminales de los
puertos ya sea como entradas o salidas, en los PIC estos registros son los TRIS, donde
un 0representa una salida y un 1 una configuracin como entrada.

Correspondencia entre puertos y terminales

Por ejemplo si quiero configurar los primeros 4 bits del puerto B como salida y los 4 ltimos bits del
puerto B como entradas hariamos lo siguiente:

TRISB = 11110000 Binario


TRISB = 0xF0

Hexadecimal

TRISB = 240

Decimal

Para escribir los datos en el puerto utilizamos los registros PORT, como ejemplo si el
puerto B esta configurado como salida y queremos colocarlo todo en alto haramos lo siguiente.

PORTB = 11111111 Binario


PORTB = 0xFF

Hexadecimal

PORTB = 255

Decimal

//Julio Fabio De La Cruz 2011


//Escritura de datos en el registro PORTB

void setup(){
//configuro puerto B como salida
TRISB=0x00;
}

void loop(){
//Coloco en alto todos los terminales del puerto B
PORTB=0xFF;
delay(1000);
//Coloco en bajo todos los terminales del puerto B
PORTB=0x00;
delay(1000);
}

You might also like