El Registro PORT en Arduino

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

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

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