El Registro PORT

22
El Registro PORT (Puerto) en Arduino febrero 27, 2014 José Villalaz Arduino, Arduino para principiantes, Programación 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):

description

tipos de port en arduino

Transcript of El Registro PORT

El Registro PORT (Puerto) en Arduino febrero 27, 2014  José Villalaz  Arduino, Arduino para principiantes, Programación

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

o B (pines digitales del 8 al 13)

o C (entradas analógicas)

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

o El registro DDR, determina si el pin es una entrada o una salida.

o El registro PORT controla si el pin está en nivel alto o en nivel

bajo.

o 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

o DDRD – El registro de configuración del modo de los pines del

puerto D – lectura/escritura

o PORTD – Registro de datos del puerto D – lectura/escritura

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

o DDRB – El registro de configuración del modo de los pines del

puerto B – lectura/escritura

o PORTB – Registro de datos del puerto D – lectura/escritura

o PINB – Registro de pines de entrada – solo lectura

El PORTC mapea los pines de entrada analógica del 0 al 5.

o DDRC – El registro de configuración del modo de los pines del

puerto B – lectura/escritura

o PORTC – Registro de datos del puerto D – lectura/escritura

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

12345

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.

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

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

o Tipos de Datos en Arduino.

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

escribiendo de derecha a izquierda.

Número

a

marcar

1 1 1 1 1 1 1 0

Ubicaci

ón del

pin en

Arduino

.

7 6 5 4 3 2 1 0

o Segunda instrucción: es la escritura del puerto (esta variará

en función del programa que estemos desarrollando). Lo

localizamos en la funciónvoid 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 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 <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:

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 por qué no funciona y arreglarlo.

o Es mucho más fácil causar mal funcionamiento no

intencionado usando el acceso directo a un puerto. Observa

como la línea DDRD = B11111110, de arriba, menciona que el

pin 0 se debe dejar como una entrada. El pin 0 la línea de

recepción (RX) en el puerto serial.Podría ser muy fácil 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 rápido,

en fracciones de microsegundos. Las funciones digitalRead() y

digitalWrite() son cada una cerca de una docena de líneas 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. ElRegistro 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 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.

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.

Espero que la información suministrada sea de su comprensión y utilidad.

Recuerda seguir visitando nuestros post.

Saludos.

ESCRITO POR ALVARO SABURIDO, EL 20 MAYO, 2014

 

Hola jousss, hoy los quiero introducir en el fascinante mundo de la electrónica y el

uso de una plataforma Open Source llamada Arduino con la que he estado

desarrollando proyectos en los últimos meses no sólo para ampliar mi

conocimiento en plataformas de desarrollo sino también nutrir a Modulo 0 de

nuevos proyectos y cursos relacionados con esta maravilla italiana. Antes de

empezar a hablar de Arduino tenemos que saber un par de cosas:

Exactamente.. ¿Qué es Arduino?Arduino es una plataforma de electrónica abierta para la creación de prototipos

basada en software y hardware flexibles y fáciles de usar. Se creó para artistas,

diseñadores, aficionados y cualquiera interesado en crear entornos u objetos

interactivos.

Las placas Arduino pueden medir valores ambientales al recibir información de

variedad de sensores y afectar sus alrededores controlando luces, motores y otros

actuadores

Las tarjetas pueden ser fabricadas caseramente o comprar una tarjeta

preesamblada y probada, el software puede ser descargado gratuitamente. Los

diseños de referencia están disponibles bajo una licencia de código abierto, así

que cualquiera es libre de adaptar el diseño a sus necesidades.

Los fundadores de Arduino son: Massimo Banzi, David Cuartielles, Tom Igoe,

Gianluca Martino y David Mellis.

 

10 Razones para usar Arduino10.- Open Source

Arduino es una plataforma de código y hardware abierto, es decir, puedes acceder

a todo aspecto del funcionamiento circuital y algorítmico de las placas, y mucho

mejor que eso, te dan todos los archivos Eagle, diagramas y componentes para

que tu mismo crees tu versión de Arduino. Por razones de mercadeo, y licencias

propias de la organización Open Source Initiative (ISO) esta prohibido usar el

nombre de la empresa Arduino para las placas independientes, por eso es

importante separar las tarjetas de otras empresas o clones (FreeDuino,

Protoduino, Crowdino) de falsificaciones ilegales que tienen el nombre de la

empresa.

 

9.- Fácil de programar

Hay quienes dicen que para programar Arduino, no es necesario saber nada de

electrónica, y en parte es cierto por que Arduino te ofrece un entorno de desarrollo

integrado (IDE) con funciones preestablecidas que reducen la lógica a lectura de

entradas, control de tiempos y salidas de una manera semántica e intuitiva. Por

eso lo convierte en una herramienta perfecta para los que quieran iniciarse en el

mundo de la electrónica y luego, probar cosas mas

difíciles. 

Arduino tiene la ventaja que no necesita ningun tipo de tarjeta de programación

como pasa con los microcontroladores sino que la misma placa se conecta vía

serial a la computadora usando un cable USB y se pueden cargar los programas

totalmente en vivo, sin riesgo de dañar la tarjeta debido a su protección adicional.

El código es sumamente amigable y posee su propio lenguaje de alto nivel

llamado Processing. Cosa que no limita a que Arduino pueda programarse en

cualquier tipo de lenguaje, un ejemplo del código se muestra a continuación:

[code lang=”arduino” light=”true”]

int led = 13;

// the setup routine runs once when you press reset:

void setup() {

// initialize the digital pin as an output.

pinMode(led, OUTPUT);

}

// the loop routine runs over and over again forever:

void loop() {

digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)

delay(1000); // wait for a second

digitalWrite(led, LOW); // turn the LED off by making the voltage LOW

delay(1000); // wait for a second

}

[/code]

8.- Documentación y tutoriales en exceso

Si algo tiene Arduino es que Internet esta plagado literalmente de documentación

sobre esta plataforma, así que decir que no se encuentran tutoriales para aprender

no es una excusa válida para este caso. Desde la misma página de la empresa, el

IDE que también viene con multitud de ejemplos y los incontables tutoriales en

Youtube y la red sobre esta plataforma la hacen una de las más fáciles de

desarrollar.

 

7.- Librerías

Una de las ventajas mas grandes que tiene Arduino es que poseen librerías para

prácticamente cualquier componente externo que se le quiera acoplar (hablaremos

de esto en la siguiente sección de Shields y complementos) haciendo innecesario

aprenderse el datasheet del componente y desarrollar el software necesario para

adquirir los valores de un sensor de temperatura digital por ejemplo, estamos

99.9% seguros que ya existe una librería con funciones predefinidas para el uso

óptimos de los periféricos, si bien es super necesario saber como funcionan por

cuestiones de ingeniería y resolución de problemas, el no reinventar la rueda es

esencial.

Varias librerías con las que cuenta Arduino:

EEPROM: librería con funciones de escritura y lectura de la memoria EEPROM del

dispositivo

Ethernet: librería para el uso de este protocolo en presencia del Shield Arduino

Ethernet.

GSM: librería para la transmisión/recepción y procesamiento de GSM.

Servo: librería exclusiva para el uso de servo motores, muy útil en robótica.

Wi-fi: librería para el uso del shield de Wifi.

 

6.- Diferentes placas.

Si en algo se diferencia Arduino de otras plataformas de desarrollo, es la multitud

de placas con distintas prestaciones que ofrecen al mercado. Dependiendo de las

necesidades del desarrollador se optarán por placas diferentes que poseen

atributos variables de memoria, capacidad, cantidad de puertos I/O,

microcontrolador entre otros. A continuación les presentamos algunas de estas

placas:

Arduino Uno R3: La placa básica que ofrece Arduino. Esta basada en un

microcontrolador ATmega328. Posee 14 I/O digitales (6 de ellos soportan PWM), 6

entradas analogicas, coenxión USB y opera a 5 V.

Arduino DUE: Arduino DUE se presenta como una de las placas mas robustas al

ser la primera con un microcontrolador basado en un núcleo ARM de 32-bit. Posee

54 entradas/salidas digitales (12 PWM), 12 entradas analógicas, 4 UARTS, 2 DAC,

y sólo funciona con alimentación de 3.3V Lo cual la hace suceptible a voltajes de

5V (Pueden dañar la

placa). 

Arduino YÚN: Sin duda una de las mas interesantes y personalmente mi próxima

adquisición. Su atractivo recae en su doble procesador, de parte de Arduino un

ATmega32u4 y un Atheros AR9331 que soporta distribuciones Linux basads en

OpenWRT. La placa provee de soporte Ethernet, Wifi, USB y Micro SD, 20 I/O

terminales digitales (7 PWM) 12 entradas analógicas.

Arduino MEGA ADK: Esta es la placa que yo adquirí de primero, super robusta,

basada en un microcontrolador ATmega2560 con una interfaz USB que permite

conectar cn telefonos Android directamente. Posee 54 pines digitales (15 se

pueden utilizar para PWM), 16 entradas Analógicas y 4 UARTS.                              

Arduino NANO y Mini: estas placa estan pensadas para una coenxión fácil de

prototipado y para proyectos de robótica que requieran muy poco espacio, tienen

el mismo procesador que la placa UNO pero viene super compacto con muchos

menos puertos.                                                                                  

5.- Shields y periféricos:

Arduino también ofrece una gran gama de Shields o placas extras que cumplen

funcionalidades especificas como Ethernet, GSM, Control de Reles, Wi-fi y pueden

ser acopladas a las tarjetas de forma sencilla, aumentando considerablemente el

rango de aplicaciones disponibles. Para completar la faena Arduino también es

compatible con infinidad de periféricos de otras marcas como Xbee, Teclados,

LCD, sensores digitales, dispositivos de Sparkfun, serial, 1-Wire, SD-Card entre

muchos otros.

 

4.- Precio

El precio es uno de los elementos mas atractivos de Arduino, desde placas en 21$

hasta placas de 71$ como el Arduino Yún, mucho menos de lo que habría que

invertir en desarrollo de Raspberry Pi y Microcontroladores de Microchip. Sin

embargo, resulta aún mas económico hacer nuestro propio Arduino en casa.

 

3.- Infinidad de aplicaciones.

Gracias a su versatilidad, Arduino se ha convertido en la placa de desarrollo con la

que prácticamente se puede hacer de todo, desde domotizar tu hogar u oficina,

aplicaciones en robótica como cerebro de un robot has ser utilizado como nodos

de tecnologías WSN (Redes de sensores inalambricos). Entre sus aplicaciones

mas conocidas están:

Control y monitoreo de sensores.

Efectos con leds.

Transponders (Transmisores/receptores)

Educación.

Monitoreo ambiental.

Biomedicina.

Telemedicina.

Domótica.

Robótica.

 

 

2.- Es cool

Qué mas podriamos pedir, es fácil, se programa rápido, permite combinar

perifericos de todo tipo, es barato, y aparte es atractivo visualmente, sino me

creen solo vean como es la caja donde viene el Arduino Uno: