{"id":661,"date":"2019-12-22T19:44:53","date_gmt":"2019-12-22T19:44:53","guid":{"rendered":"http:\/\/robots-argentina.com.ar\/didactica\/?p=661"},"modified":"2020-11-04T15:19:18","modified_gmt":"2020-11-04T15:19:18","slug":"arduino-entradas-y-salidas-manipulacion-de-puertos","status":"publish","type":"post","link":"https:\/\/robots-argentina.com.ar\/didactica\/arduino-entradas-y-salidas-manipulacion-de-puertos\/","title":{"rendered":"Arduino: Entradas y salidas – Manipulaci\u00f3n de puertos"},"content":{"rendered":"

\"\"<\/a><\/p>\n

NOTA:<\/strong> Para ver el uso de los pines del ATmega328P en Arduino recomiendo leer el art\u00edculo Arduino UNO R3 \u2013 Conect\u00e1ndolo al mundo exterior<\/strong><\/a>.<\/p><\/blockquote>\n

Programaci\u00f3n avanzada de puertos<\/strong><\/p>\n

En principio, es importante recordar que los puertos de un microcontrolador de 8 bits tienen esa misma cantidad de entradas\/salidas, o sea ocho l\u00edneas. Esto nos har\u00eda pensar que el ATmega328P, que posee tres puertos (B, C y D), dispone de 3 x 8 = 24 l\u00edneas de entrada\/salida disponibles. Sin embargo, utilizado en un Arduino no es as\u00ed, como veremos.<\/p>\n

\"\"<\/a><\/p>\n

La mayor\u00eda de los bits de los puertos de los microcontroladores son de uso m\u00faltiple, es decir que se comportan de una forma u otra de acuerdo con su configuraci\u00f3n. Varias l\u00edneas de puertos cumplen funciones vitales en la operaci\u00f3n de un Arduino, funciones que no son l\u00edneas de entrada\/salida de uso general.<\/p>\n

\"\"<\/a><\/p>\n

El PORTB<\/strong> (puerto B) tiene ocupadas dos l\u00edneas de entrada\/salida que se utilizan para conectar el cristal oscilador. Estos pines, el PORTB<\/strong> bit-6<\/strong> y PORTB<\/strong> bit-7<\/strong>, pueden quedar libres si se configura al chip para utilizar el oscilador interno, pero esta opci\u00f3n no podemos utilizarla en el Arduino debido a que ya tiene su sistema basado en la velocidad de cristal de 16 MHz, adem\u00e1s de que el cristal est\u00e1 soldado a esos pines en el circuito de la placa.<\/p>\n

El PORTC<\/strong> tiene dos bits que no est\u00e1n disponibles, uno de ellos, el PORTC<\/strong> bit-6<\/strong> se utiliza como entrada de reinicio (RESET<\/strong>), y el otro bit (7<\/strong>) no est\u00e1 cableado hacia el exterior del ATmega328P con c\u00e1psula PDIP<\/a><\/strong> que viene enchufado en el z\u00f3calo del Arduino Uno R3, porque no posee suficientes l\u00edneas disponibles en su encapsulado de 28 patas. Y cuando se trata de un chip con encapsulado de montaje superficial TQFP<\/strong> de 32 pines (como en el Arduino Nano<\/strong> y en algunos clones de Arduino Uno<\/strong>), las dos l\u00edneas faltantes est\u00e1n dedicadas al convertidor anal\u00f3gico digital (ADC6<\/strong> y ADC7<\/strong>) y no son pines de entrada\/salida digital.<\/p>\n

Dos bits del PORTD<\/strong>, el PORTD<\/strong> bit-0<\/strong> y el PORTD<\/strong> bit-1<\/strong>, se utilizan durante la programaci\u00f3n del Arduino, ya que est\u00e1n conectados a la interfaz USB<\/strong>, adem\u00e1s de ser los pines TX<\/strong> y RX<\/strong> utilizados para la comunicaci\u00f3n serie<\/a>. Estos pines se pueden utilizar para comunicaci\u00f3n serie asincr\u00f3nica hacia el exterior, y tambi\u00e9n como entradas o salidas cuando no se est\u00e1 grabando un programa. Pero no deben tener conexiones instaladas mientras se programa el Arduino.<\/p>\n

En consecuencia, no se llega a disponer de la cantidad de 24 entradas\/salidas que ofrecer\u00edan tres puertos de 8 bits.<\/p>\n

El ATmega328P, como cualquier otro microcontrolador, tiene registros para cada puerto con los cuales se define si cada bit del puerto ser\u00e1 usado como entrada o como salida, y en varios casos otra funci\u00f3n. El ATmega328P tiene tres puertos: PORTB<\/strong>, PORTC<\/strong> y PORTD<\/strong>, por lo cual hay tres bancos de registros de configuraci\u00f3n, uno para cada puerto.<\/p>\n\n\n\n\n\n\n
Bancos y puertos de ATmega 328p<\/caption>\n
Banco<\/th>\n27<\/sup><\/th>\n26<\/sup><\/th>\n25<\/sup><\/th>\n24<\/sup><\/th>\n23<\/sup><\/th>\n22<\/sup><\/th>\n21<\/sup><\/th>\n20<\/sup><\/th>\n<\/tr>\n
PORTB<\/td>\n <\/td>\n <\/td>\nDigital 13<\/td>\nDigital 12<\/td>\nDigital 11<\/td>\nDigital 10<\/td>\nDigital 9<\/td>\nDigital 8<\/td>\n<\/tr>\n
PORTC<\/td>\n <\/td>\n <\/td>\nA5<\/td>\nA4<\/td>\nA3<\/td>\nA2<\/td>\nA1<\/td>\nA0<\/td>\n<\/tr>\n
PORTD<\/td>\nDigital 7<\/td>\nDigital 6<\/td>\nDigital 5<\/td>\nDigital 4<\/td>\nDigital 3<\/td>\nDigital 2<\/td>\nDigital 1<\/td>\nDigital 0<\/td>\n<\/tr>\n
Valor<\/th>\n128<\/th>\n64<\/th>\n32<\/th>\n16<\/th>\n8<\/th>\n4<\/th>\n2<\/th>\n1<\/th>\n<\/tr>\n<\/table>\n

Registros<\/strong><\/p>\n

El ATmega328P tiene tres registros de 8 bits con los que administra estos tres puertos:<\/p>\n