El Registro PORT (Puerto) en Arduino En este post veremos qué son los PORT y cómo se utilizan. Al final lograremos manip
Views 90 Downloads 4 File size 496KB
El Registro PORT (Puerto) en Arduino En este post veremos qué son los PORT y cómo se utilizan. Al final lograremos manipular en bajo nivel y de manera más rápida 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 configuración de pines que el ATmega168):
B (pines digitales del 8 al 13)
C (entradas analógicas)
D (pines digitales del 0 al 7)
Puertos que posee el Arduino ATmega328 Para más detalles sobre cómo están mapeados los números de los pines de Arduino a los puertos y los bits observa la siguiente imagen:
Números 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 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.
El registro PIN permite leer el estado de un pin que se ha configurado con entrada usando la función pinMode().
“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
El PORTB mapea los pines digitales del 8 al 13. Se debe recordar que… Los bits altos (6 & 7) están mapeados a los pines del cristal de cuarzo y no pueden ser usados. Estos son solamente accesibles en el Arduino Mini.
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
El PORTC mapea los pines de entrada analógica del 0 al 5.
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 digital 8) Normalmente antes para declarar un pin lo hacíamos de la siguiente manera: void setup(){ Serial.begin(9600); pinMode(2,INPUT); pinMode(3,OUTPUT);
void setup(){ Serial.begin(9600); pinMode(2,INPUT); pinMode(3,OUTPUT); } Entonces si quisiéramos declarar 7 pines (desde el digital 0 al digital 7), tendríamos que repetir pinMode 7 veces. Al igual que escribir tendríamos 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 instrucción podemos declarar el pin como entrada o salida y también podemos escribir, si lo queremos, como estado HIGH o LOW. Para controlar cualquiera de los tres puertos, debemos usar dos instrucciones.
Primera instrucción: 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 transmisión serial (RX y TX respectivamente). Si utilizas “Serial.begin” en alguno de esos 2 puertos; no tendrás comunicación 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 comunicación Serial tendríamos que hacer esto:
DDRX = DDRX | 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, que como mencionamos son RX y TX Para tener más referencia de los operadores bit a bit tipo AND, visita el siguiente post de Arduino:
Tutorial de operaciones con bits.
Tenemos el siguiente código: B11111110; Colocamos B, porque el número a marcar es Binario. Para ampliar más sobre los tipos de datos en Arduino visitemos el siguiente blog:
Tipos de Datos en Arduino.
Para saber el estado que le daremos al pin siempre lo pondremos escribiendo de derecha a izquierda. Número 1 a marcar
1
1
1
1
1
1
0
Ubicaci 7 ón del pin en Arduino .
6
5
4
3
2
1
0
Segunda instrucción: es la escritura del puerto (esta variará en función del programa que estemos desarrollando). Lo localizamos en la función void loop().
Ejemplo: 1 =HIGH
0 = LOW
PORTX= B11111110; En este ejemplo los pines del 1 al 7 permanecerán 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 más alumbren los impares y durante dos más todos se apaguen. Veamos: Configuración Utilizada:
Configuración Utilizada para este proyecto. Abrimos Arduino IDE y escribimos el siguiente código: int contador=0;//declaramos la v void setup(){ DDRD= B11111100;//Utilizamos
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 instrucción 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 >8; es decir que en aux ahora se guardaran los bits resultado de desplazar a la derecha 8 posiciones a la variable leds, esto es el BMSB ( Byte más significativo de leds) y que contiene desde el LED1 al LED8.
variable byte aux para mapear PORTD Si observamos ahora, LED1 en aux y LED1 en PortD, hay 5 espacios a la derecha, de esta manera hacemos: led1= (aux >>5) & 0b00000100; logrando que led1 ya creada, tenga el estado solo del LED1, esto es 0 o 1. La operación AND con 0b00001000, permite descartar y asegurarse que solo el bit2 de aux tenga el valor del Led1. La operación AND se realiza bit a bit, de manera que 1.0=0 y 1.1=0. De la misma manera observamos que :
led2=(aux>>3) & 0b00001000; desplazo 3 a la derecha
led3=(aux>>1) & 0b00010000; desplazo 1 a la derecha
led4= (aux3) & 0b00001000;
led11=(aux>>1) & 0b00010000;
led12=(aux13) & 0b00000100, ya estaría.
led2=(leds>>11) & 0b00001000; led3=(leds>>9) & 0b00010000; led4=(leds>>7) & 0b00100000;
led5=(leds>>5) & 0b01000000; led6=(leds>>3) & 0b10000000; led7=(leds>>9) & 0b00000001;
led8=(leds>>7) & 0b00000010; led9=(leds>>5) & 0b00000100; led10=(leds>>3) & 0b00001000;
led11=(leds>>1) & 0b00010000 y led12=(leds8; // BLSB del int tiene la info de los leds 2 al 8 led1= (aux >>5) & 0b00000100; led2=(aux>>3) & 0b00001000; led3=(aux>>1) & 0b00010000; led4= (aux1) & 0b00010000; led12=(aux