Los microcontroladores suelen tener varios grupos de pines GPIO, etiquetados PORTA, PORTB, PORTC, etc. o algo similar (tal vez P0, P1, etc.).
Cada uno de estos puertos se conoce como un puerto de E / S paralelo en las hojas de datos de los fabricantes, porque todos los pines del puerto pueden actuar en paralelo mediante una instrucción de la máquina . El ancho del puerto dictado por el ancho de la ruta de datos del microcontrolador (8, 16 o 32 bits).
(takenfromthedatasheetforthePIC32MX795F512L)
Porlotanto,lospinesenelprimerpuertodeunµCde8bitspuedendenominarseRA0aRA7,yenunµCde32bits,sedenominaránpinesRA0aRA31(donde,enesteejemplo,ResparaRegistro,lasiguienteletraeselnombredelpuerto,seguidodelnúmerodebit(otrosmicrocontroladorespuedentenerdiferentesconvencionesdenomenclatura,comoP0.0aP0.7,etc.).
Normalmente,cadapuertotendráalmenostresregistrosasociados(avecesmás);unoparaconfigurarladireccióndelospinesaentradaosalida,otroparaleerelestadodeentradaactualdelospinesdigitalesyotroparaconfigurarelestadodesalidadelospines.Puedehaberotroparaespecificarsicadapinesdedrenajeabiertoosalidapush-pull.
Prácticamentetodoslosmicrocontroladorespodránleeroescribirencadaunodeestosregistrosalavez;puedenonotenerlacapacidaddeleerbitsindividuales,odeescribirbitsindividualesdeunregistrosinafectaralosdemásenelpuerto,dependiendodelasinstruccionesdelprocesador.
Inclusosiunprocesadornotieneunainstrucciónparaleeroescribirunbitindividual,lasbibliotecasdeE/Spuedenocultarloalusuario;porejemplo,labibliotecadeE/SdigitaldeArduinotieneunafunciónllamadadigitalWrite(pin,valor)queseimplementaenunavariedaddemicrocontroladoresdiferentes,notodosloscualespuedentenerunainstrucciónparaescribirenunsolobit.Encuyocaso,senecesitaríaunalectura-modificación-escrituradelregistrodesalida,omantenerunregistrosombraenlamemoriapararecordarelúltimoestadodelpuertodesalida,porloquecuandoseactualicesolounopoco,podríaenmascararenelnuevoestadosinafectaralosotrospines.Delmismomodo,Arduinostienefuncionesparaleerunpindigitalyestablecerunpinparaelmododeentradaosalida.
LabibliotecadeE/SdeArduinosolopermitequelospinesdigitalesseescribandeformaindividual,yaquelospuertosutilizadosvariarándeunaplacaaotraylospinesnosepuedenasignardeformaconsecutiva.Entonces,encambio,lasfuncionessolousanunnúmerodepindigitalabstracto(0-13).AsíqueparaunArduino,elconceptodeun"puerto paralelo" no existe realmente, que es de donde viene la confusión. Pero bajo su capa de abstracción, todavía están allí en el microcontrolador incorporado.
Los pines del puerto real en el procesador pueden ser bastante diferentes de un procesador a otro, por ejemplo, aquí están las asignaciones para el Arduino Uno (8 bits ATmega 328P) y Arduino DUE (ARM SAM3X8E de 32 bits):
Pin # Uno DUE
0 PD0 A.8
1 PD1 A.9
2 PD2 B.25
3 PD3 C.28
4 PD4 C.26/A.29
5 PD5 C.25
6 PD6 C.24
7 PD7 C.23
8 PB0 C.22
9 PB1 C.21
10 PB2 C.29/A.28
11 PB3 D.7
12 PB4 D.8
13 PB5 B.27
Entonces, mientras que las asignaciones para el Uno son sencillas (utilizando primero todo el Puerto D, luego seis bits del Puerto B), las asignaciones de puertos para el DUE están por todas partes. Dos de los pines digitales (4 y 10) están conectados incluso a más de un pin de puerto del ARM.
Finalmente, puede haber otro conjunto de registros en un microcontrolador que permita que algunos de los pines del puerto se usen como entradas analógicas. Todos los pines así designados siempre serán tratados individualmente; no puedes leer un grupo de pines analógicos en paralelo. Y para casi todos los microcontroladores, los periféricos como UARTs, I²C, SPI, etc., suelen compartir pines con los puertos paralelos; cuando estos periféricos están habilitados, los pernos son tomados por el periférico y ya no están disponibles en los registros de puertos paralelos.