El Registro PORT (Puerto) en Arduino En este post veremos qué son los PORT PORT y cómo se utilizan. Al fnal lograremos manipular en bajo nivel y e manera m!s r!pia los contactos e entraa"salia el microcontrolaor e las placas Aruino. #os pines usaos en la placa pl aca Aruino $el ATmega% y el ATmega&'%( poseen tres puertos $El ATm ATmega)*% ega)*% $Aruino +no( usa la misma confguración e pines que el ATmega&'%(, •
B (pines digitales del 8 al 13)
•
C (entradas analógicas) analógicas)
•
D (pines digitales del 0 al )
Puertos que posee el Aruino ATmega)*% ATmega)*% Para m!s etalles sobre cómo est!n mapeaos los n-meros e los pines e Aruino a los puertos y los bits observa la siguiente imagen,
-meros e los pines e Aruino a los puertos y los bits. El Aruino /ega presenta varios puertos 012131E141 etc. 2aa puerto es controlao por tres registros1 registros1 los cuales también est!n efnios como variables en el lenguaje el Aruino. •
El registro DDR1 DDR1 etermina si el pin es una entraa o una salia.
•
El registro PORT controla PORT controla si el pin est! en nivel alto o en nivel bajo.
•
El registro P!" permite P!" permite leer el estao e un pin que se 5a confgurao con entraa usano la 6unción pin/oe$(.
“Los registros DDR y PORT pueden ser ambos, escritos y leídos. El registro PIN corresponde al estado de las entradas así ue solo puede ser leído.! El PORTD mapea PORTD mapea los pines igitales el 7 al 8 •
33R3 9 El registro e confguración el moo e los pines el puerto 3 9 lectura"escritura
•
PORT3 9 Registro e atos el puerto 3 9 lectura"escritura
•
P:3 9 Registro Registro e pines e entraa 9 solo lectura
El PORTB mapea PORTB mapea los pines igitales el % al &). #e debe recordar ue$ Los bits altos %& ' () est*n mapeados a los pines del cristal de cuar+o y no pueden ser usados. usados. Estos Estos son solamente solamente accesibles accesibles en el rduino rduino -ini. •
33R0 9 El registro e confguración el moo e los pines el puerto 0 9 lectura"escritura
•
PORT0 9 Registro e atos el puerto 3 9 lectura"escritura
•
P:0 9 Registro e pines e entraa 9 solo lectura
El PORTC mapea PORTC mapea los pines e entraa analógica el 7 al ;.
•
33R2 33R2 9 El registro e confguración el moo e los l os pines el puerto 0 9 lectura"escritura
•
PORT2 9 Registro e atos el puerto 3 9 lectura"escritura
•
P:2 9 Registro Registro e pines e entraa 9 solo lectura
2aa bit e estos registros corresponen con un solo pin< por ejemplo el bit menos signifcativo e los registros 33R01 PORT01 y P:0 5ace re6erencia al pin P07 $pin igital %( "or#al#ente antes para declarar un pin lo $ac%a#os de la siguiente #anera& void setup(){ Serial.begin(9600); pinMode(2,INP!); pinMode(",#!P!);
voi setup$(= >erial.begin$?'77(< pin/oe$*1:P+T(< pin/oe$)1O+TP+T(< @ Entonces si quisiéramos eclarar 8 pines $ese el igital 7 al igital 8(1 tenramos que repetir pin-ode 8 veces. Al igual que escribir tenramos que poner digitalrite%pin,estado) pin 7 estao alto1 pin & estao bajo1 etc. Al utilizar Registros PORT (Puerto) tenemos (Puerto) tenemos la ventaja e que con solo una instrucción poemos eclarar el pin como entraa o salia y también poemos escribir1 si lo queremos1 queremos1 como estao /I0/ o LO. Para controlar cual'uiera cual'uiera de los tres puertos dee#os usar dos instrucciones* •
Pri#era instrucción, instrucción , se ebe eclarar en la estructura +oid setup() y setup() y nos sirve para eclarar si el pin se va a usar como :P+T o como O+TP+T O +TP+T..
Dato !#portante& “Los pines 1 y 2 son la transmisi3n serial %R4 y T4 respecti5amente). #i utili+as “#erial.begin! en alguno de esos 6 puertos7 no tendr*s comunicaci3n serial. 8uidado con eso.!
Ejemplo, & B O+TP+T
7 B :P+T
33R, 33R, B 0&&&&&&&7< one , es la letra el puerto a usar $023(. >in embargo si queremos tener comunicación >erial tenramos que 5acer esto,
33RC B 33RC D 0&&&&&&77< Esta manera es m!s segura ya que confgura los pines el * al 8 como salias sin cambiar los pines 7 y &1 que como mencionamos son RC y TC Para tener m!s re6erencia re6erencia e los operaores bit a bit tipo A31 visita el siguiente post e Aruino, •
Tutorial de operaciones con its* its *
Tenemos Tenemos el siguiente siguiente cóigo, B&&&&&&&7< 2olocamos B1 porque el n-mero a marcar es 0inario. Para a#pliar #-s sore los tipos de datos en Arduino +isite#os el siguiente log& •
Tipos de Datos en Arduino*
Para saber el estao que le aremos al pin siempre lo ponremos escribieno e erec5a a izquiera. -mero -mero & a marcar
&
&
&
&
&
&
7
+bicaci 8 ón el pin en Aruino .
'
;
)
*
&
7
•
.egunda instrucción& es instrucción& es la escritura el puerto $esta variar! en 6unción el programa que estemos esarrollano(. #o localizamos en la 6unción +oid loop(). loop() .
Ejemplo, & BF:GF
7 B #OH
PORT, PORT,B 0&&&&&&&7< En este ejemplo los pines el & al 8 permanecer!n encenios $F:GF( y el pin 7 #OH. /ea#os un ee#plo aplicando estos conceptos& En este ejemplo lograremos que urante os segunos toos los les encienan1 urante os segunos m!s alumbren los impares y urante os m!s toos se apaguen. Ieamos, Conguración 2tiliada&
2onfguración +tilizaa para este proyecto. Abrimos Arduino !DE y escribimos el siguiente cóigo& cóigo & int $ontador%0;&&de$lara'os $ontador%0;&&de$lara'os la v void setup(){ % % *++++++00;& *+++++ +00;&&tili &tilia'os a'os
int contaorB7<""eclaramos la variable interna como contaor. contaor.
voi setup$(= 33R3B 0&&&&&&77<""+tilizamos 3 porque es el el 7 al 8 y 0 porque porque es 0inario. ""En este ejemplo no utilicé los pines 7 y & el Aruino. "JEsta instrucción es lo mismo mismo que 5acer 5acer esto, pin/oe$*1O+TP+T(< pin/oe$)1O+TP+T(< pin/oe$1O+TP+T(< pin/oe$;1O+TP+T(< pin/oe$'1O+TP+T(< pin/oe$81O+TP+T(< J" @
voi loop$(= 6or $contaorB7< contaor K)< contaor LL(=""establecemos LL(=""establecemos contaor menor que ) porque solo son ) casos. sMitc5$contaor(= case 7, PORT3B PORT3B 0&&&&&&&&<""aqu enceneremos enceneremos toos los les elay$*777(< case &, PORT3B PORT3B 0&7&7&7&7<""aqu enceneremos enceneremos solo los impares. elay$*777(< case *, PORT3B PORT3B 077777777<""aqu los apagaremos toos. elay$*777(< @ @ @ Para ver otro ejemplo utilizano Registro utilizano Registro PORT (Puerto)1 (Puerto)1 visitemos el siguiente post, •
Control de Displa4 .eg#entos #ediante Pulsadores*
/entaas 4 Des+entaas 'ue nos o5rece al utiliar el Registro PORT (Puerto)& Des+entaas& •
•
El código es #uc$o #-s di5%cil de depurar 4 #antener 1 y es muc5o m!s i6cil e entener para la gente. >olo lleva algunos microsegunos al procesaor ejecutar cóigo1 pero pora llevarte 5oras escubrir por qué no 6unciona y arreglarlo. Es muc5o #-s 5-cil causar #al 5unciona#iento no intencionao usano el acceso irecto a un puerto. Observa como la lnea DDRD 6 B111111101 B111111101 e arriba1 menciona que el pin 7 se ebe ejar como una entraa. El pin 7 la lnea e recepción $RC( en el puerto serial.Pora ser muy 6!cil causar que tu puerto serial eje e 6uncionar por cambiar el pin 7 a una salia.
/entaas& •
Puee que pueas ca#iar los pines de estado #u4 r-pido 1 en 6racciones e microsegunos. #as 6unciones igitalRea$( y igitalHrite$( igitalHrite$( son caa una cerca e una ocena e lneas e cóigo1 lo cual al ser compilao se convierte en unas cuantas instrucciones m!quina.
2aa instrucción maquina necesita un ciclo e reloj a &'/Fz1 lo cual puee sumar muc5o tiempo en aplicaciones muy epenientes el tiempo. El Registro PORT (Puerto) puee (Puerto) puee 5acer el mismo trabajo en muc5os menos ciclos e trabajo. •
•
Algunas veces necesitamos congurar #uc$os pines e7acta#ente al #is#o tie#po* Por tie#po* Por lo que usar las 6unciones igitalHrite $&71F:GF(1 seguia e la 6unción igitalHrite $&&1F:GF(1 causar! que el pin &7 se ponga en nivel alto varios microsegunos espués que el pin &&1 lo cual puee con6unir circuitos igitales conectaos al Aruino1 cuyo 6uncionamiento epena el tiempo preciso el cambio e esos bits. >i te est!s queano sin memoria para tu aplicación1 puees usar estos trucos para 5acer que tu código sea #-s pe'ueo. pe'ueo . +sano este métoo se necesitan muc5os menos bytes e cóigo compilao que si se 5ace un bucle para que se vaya cambiano caa pin uno por uno.
9apear Puertos de Arduino julio )&1 *7&; Gustavo 2ircelli Aruino Aruino11 Electrónica Electrónica11 Programación Programación11 Proyectos con Aruino 9apear puertos en Arduino es una t:cnica #u4 utiliada en progra#ación progra#ación para 5acilitar la generación posterior de código* En algunas situaciones requerimos la posibilia e mapear una cierta cantia e its en its en 6orma irecta a los puertos e Aruino o e un microcontrolaor en general1 por ejemplo moifcar el estao e una cierta cantia e salias igitales a partir e alg-n métoo1 que nos permita Nenlazar $ lo que llamo l lamo mapear( un bit e una variable e cóigo con c on un bit 6sico e los puertos. >upongamos que necesitamos controlar 1; pines igitales pines igitales e salia e nuestro Aruino 1 para lo cual ya conocemos que eberamos utilizar igitalHrite$pin1 igitalHrite$pin1 #OH"F:GF( para caa uno e los pines e salia. Aruino simboliza los pines igitales ese el 0 al 13 1 13 1 lo que nos 6acilita la construcción e >etc5es >etc5es N5arcoeano el cóigo.
<) digital=rite(3<) estamos estamos 5arcoeano1 es ecir refriénonos al pin 5%sico 3 e 3 e nuestro Aruino +no y mas precisamente el bit PD3 bit PD3 el el PORT3. 9apeo de los pines en el At#ega3;8 El micro Atmega)*% o &'% que utiliza Aruino poseen los siguientes puertos con la consiguiente simbologa en lo que respecta al FarMare e este c5ip,
FarMare 25ip Atmega)*%1 mapear ports 2iertos aspectos e lo que se ver! en esta entrega ya 6ue tratao en otra entraa entro e e este mismo mismo sitio. Para Para m!s in6ormación consultar, consultar, NEl registro PORT $puerto( Aruino >i consieramos solo los pines igitales el 7 al &)1 poemos eQtraer la siguiente tabla e relaciones entre los pines igitales e Aruino y su mapeo en los PORT> 6sicos el Atmega)*%,
Port3 y Port0 e Aruino 3one P3Q y P0Q son los puertos 3 y 0 el Atmega que inican los bits asociaos a caa Puerto. Por Por ejemplo PD0 es PD0 es el bit7 el Puerto3. Planteo :maginen a5ora que poseo conectaos &* #es a caa pin con eQcepción e los pines 7 y & que se utilizan para el >erial el monitor e Aruino1 y los l os ispongo e la siguiente manera,
/apear el Problema Problema presentao >abemos que en Aruino el mapeo previo e los pines es el siguiente, p7, rQ1 p&, tQ1 p* P3* 1 p) P3)1 p,P31 p; P3;1 p' P3'1 p8 P381 p% P071 p? P0&1 p&7 P0*1 p&& P0) p&* P01 p&)$le&) Aruino( P0;. Fay un libro muy interesante que trata el FarMare interno el Atmega pero muy entenible one trata aem!s el acceso a este FarMare con el lenguaje el sect5 sect5 e Aruino lo que lo 5ace muy -til. !ntroduction to E#edded .4ste#s& 2sing A".! C and t$e Arduino De+elop#ent De+elop#ent En+iron#entt (.4nt$esis ?ectures on Digital Circuits and .4ste#s)* En+iron#en >e me ocurrieron #es para 6acilitar la eQplicación1 pero poran ser cualquier tipo e otros ispositivos igitales. -i deseo es crear una 9unci3n ue podamos utili+ar en nuestros s:etc;es y ue me permita modi
?a 5unción o 9:todo de #apeo /i 6unción pora ser algo como esto escriir?ed(01111111111110000)<< escriir?ed(01111111111110000) 2omo por!n notar la inicación N7b inica que es un numero en 6ormato binario y caa bit representa el estao e caa le1 en este caso toos OB&. El 6ormato el métoo es el siguiente, escriir?ed(0?ed1 escriir?ed(0?ed1 ?ed; ?ed3 ?ed@ ?ed ?ed ?ed ?ed8 ?ed ?ed10 ?ed11 ?ed1;)< ?ed1;)< one #e7 #e7 representa representa el -mero le cuyo valor puee ser 1 O" o 0 OFF !#ple#entación 2omo primera meia el valor a pasar es un tipo e ato e * 0ytes1 entonces en Aruino poramos utilizar el unsigned int 1 e manera que el prototipo e mi métoo sera, void es$ribir-ed( unsigned int le { . /
voi escribir#e$ unsigne int les(
= . @ El métoo eber! ir tomano caa bit e la l a posición el valor pasao como variable ?eds a ?eds a la 6unción y mapear irectamente su valor al Port que correspona y en la posición que correspona. correspona. Por ejemplo si #es B7b&77..1 el #e& est! en O y por lo tanto ic5o N& eber! ser escrito en el PortD en PortD en el tercer bit B PD;. PD;. >i observamos el PortD es PortD es un 0yte $%bits(1 al igual que el PortB1 PortB1 aunque este -ltimo solo usa ; bits. En la siguiente tabla vamos a representar representar la variable leds $&' bits(1 el PORTD$%bits(1 PORTD$%bits(1 PORTB$; PORTB$; bits( y una variable auQiliar $au7 $au7(( tipo 4te e 4te e % bits >e puee apreciar el 9.B o byte m!s signifcativo que es la parte alta o ible Alto e la variable les y el ?.B o ?.B o byte menos signifcativo o ible 0ajo e la variable les. El />0 e los Port3"0 no eQisten.
Relación e mapeo entre Iariables e cóigo y Ports 4sicos S2ómo 5acemos entonces por ejemplo para llevar el B!T1 e B!T1 e la variable les que representa el ?ED1 1 ?ED1 1 al B!T;6PD; el B!T;6PD; el PuertoD PuertoD 1.. 1.. en eso se resume lo que va a 5acer nuestro métoo1 no solo con ?ED1 sino ?ED1 sino con el resto. Para Para esto 5ay que ir analizano pin a pin. Iamos a utilizar las 6unciones que provee implementaas en el compilaor e Aruino y que son las e desplaa#iento de its. its . 2rearemos 2rearemos una variable local1 entro el métoo1 evitano el uso e Globales y optimizar memoria1 ya que las #ocales se estruir!n al no ejecutarse el métoo y se crear!n temporalmente entro e nuestro métoo e mapear mape ar.. Iamos a eQplicar para el caso el ?ED1 el ?ED1.. 2reamos la variable 4te ?ed1G y otra variable auQiliar el tipo 4te au7* au76 ledsHH8G es ecir que en au7 a5ora au7 a5ora se guararan los bits resultao e esplazar a la erec5a % posiciones a la variable les1 esto es el 0/>0 $ 0yte m!s signifcativo e les( y que contiene ese el ?ED1 al ?ED8. ?ED8 .
variable byte auQ para mapear PORT3 >i observamos a5ora1 ?ED1 en ?ED1 en au7 au7 y y ?ED1 en ?ED1 en PortD1 PortD1 5ay ; espacios a la erec5a1 e esta manera 5acemos, led16 (au7 HH) I 000000100G lograno que le& ya creaa1 tenga el estao solo el #E3&1 esto es 7 o &. #a operación A"D con A"D con 7b7777&7771 permite escartar y asegurarse que solo el it; de au7 tenga au7 tenga el valor el #e&. #a operación A"D se A"D se realiza bit a bit1 e manera que &.7B7 y &.&B7. 3e la misma manera observamos que , •
led;6(au7HH3) I 000001000G esplazo ) a la erec5a
•
led36(au7HH1) I 000010000G esplazo & a la erec5a
•
led@6 (au7JJ1) I 000100000G esplazo & a la izquiera
•
led6(au7 JJ3) I 001000000G esplazo ) a la izquiera
•
led6(au7JJ) I 010000000G ; a la izquiera
Fasta aqu tenremos lograo casi el mapeo en el Port3 1 caa variable led7 posee el estado de cada led solo resta mapearlos en el puerto. Para esto creamos otra variable 4te puertoD60G y 5acemos lo siguiente puertoD6puertoD puertoD6puertoD K led1Kled;Kled3Kled@KledKled led1Kled;Kled3Kled@KledKledG G puertoD se armar! realizano las sucesivas operaciones OR bit a bit . Para ilustrar el caso supongamos que caa variable tenga seteao su bit le&B77777&771 le*B7777&7771le)B777&77771leB77&777771le;B7&777777 y le'B&7777777 Facieno OR bit a bit portD60B11111177 portD60B11111177 1 1 el QQ que quea son los bit bi t e r7 4 t7 4 'ue no dee#os a5ectar su +alor* Antes e escribir irectamente al Port3 ebemos ebemos cuiar e no a6ectar el valor e rQ1 tQ. Para esto creamos una variable 4te dG que va a leer los bits el Port3 1 e la siguiente manera, •
•
d6 P!"DG esta es una macro con acceso irecto solo a la lectura del PortD* En PortD* En el tutorial mencionao antes NEl registro PORT $puerto( Aruino 1 se escribe muy bien. Para resumir1 caa puerto el Aruino 012 y 31 eQisten macros para su acceso irecto e la 6orma, DDR7 lectura escritura el registro e irección $entraa o salia igital( el Port Q
•
PORT7 lectura PORT7 lectura escritura sobre el puerto Q
•
P!"7 lectura e los pines el puerto Q.
En mi caso utilicé P:Q para la lectura el Port3 y as ver en qué estao est!n los pines rQ y tQ. #o que 5acemos a5ora fnalmente es d6dI000000011G nos interesa rescatar rescatar solo los pines 7 y &1 su estao1 A3 777777&& puertoD6puertoDKdG Facemos OR bit a bit entre puerto3 y y guaramos en la misma variable 1 a5ora est! completo con el estao e los #es y el estao real e rQ"tQ sin a6ectar PORTD 6 puertoDG " puertoDG " escritura fnal al puerto 3. Resta Resta a5ora poer mapear los les restantes el al 1; sobre 1; sobre el Port0 e PB0 a PB. PB. >i volvemos a ver la tabla con la l a variable leds PortD 4 PortB1 PortB 1 y la variable au7 que au7 que tenamos como resultao e ledsHH8 1 ledsHH8 1 el ?ED eber! ?ED eber! ir al PortB PB0 y el ?ED8 al ?ED8 al PB1* Para lograr esto 5acemos, •
led6(au7HH1) I 000000001G
•
led86(au7JJ1) I 000000010G
2on lo cual ya nos quean 6ormateaas las variables le8 y % con la posición1 al igual que los les el & al ' ya analizaos. El ?ED ya ?ED ya no lo poemos recuperar e la variable au7 ya au7 ya que posee % bits y el ?ED est! ?ED est! en una novena posición que no eQiste1 por este motivo 5acemos, Au76leds< Au76leds< y aqu viene lo ivertio1 al igualar un 4te a un int 1 int 1 la in6ormación se recorta ya que au7 solo au7 solo tomar! el ?.B e ?.B e la variable leds variable leds11 y e esta manera el nuevo au7 quea au7 quea como sigue,
Iariable byte auQ para mapear PORT0 #uego. •
led6(au7HH) I 000000100G
•
led106(au7HH3) I 000001000G
•
led116(au7HH1) I 000010000G
•
led1;6(au7JJ1) I 000100000G
2reamos otra variable 4te puertoD y la armamos con la OR entre lo les que 6altan. puertoB6puertoBKledKled8Kled puertoB6puertoBKledKled8KledKled10Kled11Kle Kled10Kled11Kled1;G d1;G
y fnalmente enviamos la in6ormación al PuertoB PORTB 6 puertoB I 000111111G 0 00111111G con la m!scara e esos ' bits que nos interesan 2on esta eQplicación eQplicación ya por!n seguir seguir el cóigo completo1 para lo cual les ejo el mismo para este el métoo. Este métoo es muy -til1 por ejemplo lo estoy usano para 5acer un cubo e les e )U). Esta es una manera e 5acerlo1 puesto que en lugar e esplazar previamente au7 % posiciones a la erec5a1 quiz!s otro métoo pora ser lograr esplazamientos acores al bit a mapear1 por ejemplo si tomo ?ED1 1y esplazo &) posiciones a la erec5a la variable leds variable leds y y lo guaro irectamente en la variable led1 variable led1 ya estaramos en la posición, •
•
•
•
•
led16(ledsHH13) I 0000001001 0000001001 ya estara. led;6(ledsHH11) I 000001000G led36(ledsHH) I 000010000G led@6(ledsHH) I 000100000G led6(ledsHH) I 001000000G led6(ledsHH3) I 010000000G led6(ledsHH) I 000000001G led86(ledsHH) I 000000010G led6(ledsHH) I 000000100G led106(ledsHH3) I 000001000G led116(ledsHH1) I 000010000 4 led1;6(ledsJJ1) I 000100000*
2omo ven este otro en6oque es mas mas sintético e incluso incluso se pora optimizar usano vectores ya que los esplazamientos son impares1 entonces se pora usar una variable nice que incrementara en 6orma impar1 pero esa es otra 5istoria. #a iea aunque parece rebuscaa 6ue la mejor manera e eQplicar que encontré para mostrar el tema e las posiciones en variables y puertos e i6erente tamaVo. void es$r ibir-ed2( unsigned int { &
voi escribir#e*$ escribir#e*$ unsigne int les( =
"J Esta 6uncion mapea los pines el * al &7 que que son #e #e & al &7 en los puertos puertos PORT3 y PORT3 PORT3 PORT3 Bp81p'1p;1p1p)1p*1t Bp81p'1p;1p1p)1p*1tQ1rQ Q1rQ B#'1 #;1 #1#)1 #*1 #&1 Q1 Q
PORT0 PORT0 B Q1Q1p&)1 p&*1 p&& 1 p&71p?1 p% B Q1Q1#&*1
#&&1
#&71 #? 1 #% 1 #8
El parametro a pasar e la6uncion es el estao e los ? bits 7b#&1#*1#)1#1#;1#'1#81#%1#?1#&71# 7b#&1#*1#)1#1#;1#'1#81#%1#?1#&71#&&1#&*1Q1Q1Q1Q &&1#&*1Q1Q1Q1Q es in int &' bits bits
J" byte le&1le*1le)1le1le;1le'1le81le%1le le&1le*1le)1le1le;1le'1le81le%1le?1le&71le&&1le&*< ?1le&71le&&1le&*< "" variables que van a mapear el estao en los puertos 3 y 0 byte puerto3B7< byte puerto0B7< byte auQ< byte < "" la lectura lectura el byte el puerto puerto 3 auQBlesWW%< "" 0#>0 el int tiene la in6o e los les * al % le&B $auQ $auQ WW;( WW;( X 7b77777&77< le*B$auQWW)( X 7b7777&777< le)B$auQWW&( X 7b777&7777< leB $auQKK&( X 7b77&77777< le;B$auQ KK)( X 7b7&777777< le'B$auQKK;( X 7b&7777777< "">erial.println$auQ10:(< le8B$auQWW&( X 7b7777777&< le%B$auQKK&( X 7b777777&7< "" 5asta aqui se mapearon mapearon el le & al % one se esplazo esplazo el />0 e les les al #>0 e auQ "" nuevo auQBles< "" auQ tiene tiene el #>0 e les , #?1#&71#&&1#&*1Q1Q1Q1Q #?1#&71#&&1#&*1Q1Q1Q1Q le?B$auQWW;( X 7b77777&77< le&7B$auQWW)( X 7b7777&777< le&&B$auQWW&( X 7b777&7777< le&*B$auQKK&( X 7b77&77777< puerto3Bpuerto3 D le&Dle*Dle)DleDle;Dle'< le&Dle*Dle)DleDle;Dle'< puerto0Bpuerto0Dle8Dle%Dle?Dle&7Dle&&Dle&*< BP:3< "" lee el puerto3 esto es es para no a6ectar la escritura escritura e rQ"tQ rQ"tQ bit
&y7 BX7b777777&&< puerto3Bpuerto3D< PORT3 PORT3 B puerto3< "" escritura al puerto 3 PORT0 PORT0 B puerto0 X 7b77&&&&&&<