Categories: Circuits de microcontroladors
Nombre de visualitzacions: 41940
Comentaris sobre l'article: 5
Mètodes per llegir i gestionar els ports d'E / S Arduino
Per interactuar amb el món exterior, heu de configurar les sortides del microcontrolador per rebre o transmetre un senyal. Com a resultat, cada pin funcionarà en el mode d'entrada i sortida. Hi ha dues maneres de fer-ho en tots els taulers d’Arduino que més us agraden, exactament de la manera d’aprendre d’aquest article.

Mètode primer - El llenguatge estàndard per a l'IDE Arduino
Tothom ho sap Arduino Està programat en C ++ amb algunes adaptacions i simplificacions per a principiants. S'anomena cablejat. Inicialment, tots els ports arduino es defineixen com a entrades i no cal especificar-ho al codi.
Els ports normalment s’escriuen amb la funció d’inicialització variable:
nul configuració ()
{
// codi
}
Per fer-ho, utilitzeu l’ordre pinMode, que té una sintaxi bastant simple, primer indiqueu el número de port, després el seu paper, separat per comes.
pinMode (nomer_porta, naznachenie)
Amb aquesta ordre, el circuit intern del microcontrolador es configura d’una manera específica.
Hi ha tres modes en què el port pot funcionar: INPUT - entrada, en aquest mode es produeix lectura de dades de sensors, estat del botó, senyal analògic i digital. El port es troba a l’anomenada estat d’alta impedància, en paraules simples: l’entrada té una alta resistència. Aquest valor s'estableix, per exemple, a 13 pins del tauler, si cal, de la següent manera:
pinMode (13, INPUT);
OUTPUT - sortida, depenent de l'ordre prescrit en el codi, el port té un valor d'un o zero. La sortida es converteix en una mena de font d’energia controlada i produeix un corrent màxim (en el nostre cas, 20 mA i 40 mA al pic) a la càrrega connectada a aquesta. Per assignar un port com a sortida a Arduino, heu d'introduir:
pinMode (13, OUTPUT);
INPUT_PULLUP: el port funciona com a entrada, però l'anomenat es connecta a ell. Resistència de tracció de 20 kΩ.
A continuació, es mostra el circuit intern condicional del port en aquest estat. Una característica d’aquesta entrada és que el senyal d’entrada es percep com a invertit (la “unitat” a l’entrada és percebuda pel microcontrolador com a “zero”). En aquest mode, no podeu utilitzar resistències externes quan es treballa amb botons.
pinMode (13, INPUT_PULLUP);

Les dades es reben dels ports i se’ls transmet els comandaments:
-
digitalWrite (pin, valor): converteix el pin de sortida en un 1 o 0 lògic, respectivament, apareix o desapareix la tensió de 5V a la sortida, per exemple digitalWrite (13, HIGH) - subministra 5 volts (unitat lògica) a 13 pins i digitalWrite (13, baixa) ) - tradueix 13 pins en un estat de zero lògic (0 volts);
-
digitalRead (pin): llegeix el valor de l'entrada, per exemple digitalRead (10), llegeix el senyal de 10 pins;
-
analogRead (pin): llegeix un senyal analògic des d’un port analògic, obté un valor en l’interval de 0 a 1023 (dins d’un ADC de 10 bits), un exemple és analogRead (3).
Mètode dos: gestionar els ports mitjançant registres Atmega i accelerar el codi
Per descomptat, aquest control és senzill, però hi ha dos inconvenients: un major consum de memòria i un mal rendiment quan es treballa amb ports. Però recordeu què és un Arduino, independentment del tauler d’opcions (uno, micro, nano)? En primer lloc, això microcontrolador AVR de la família ATMEGA, recentment utilitzat MK atmega328.
A l’ID Arduino, podeu programar l’idioma C AVR originari d’aquesta família, com si treballés amb un microcontrolador independent. Però primer les coses primer. Per gestionar els ports Arduino d'aquesta manera, primer heu de tenir en compte amb detall la il·lustració següent.
Potser algú examinarà amb més claredat els ports d'aquesta forma (el mateix en la figura, però en un disseny diferent):

Aquí podeu veure la correspondència de les conclusions d’Arduino i els noms dels ports d’Atmega. Per tant, tenim 3 ports:
-
PORTBOL;
-
PORTC;
-
PORTD.
A partir de les imatges mostrades, vaig recopilar una taula de correspondència entre els ports d’Arduino i Atmega, que us serà útil en el futur.

Atmega disposa de tres registres de 8 bits que controlen l’estat dels ports, per exemple, el port B esbrinarà el seu propòsit dibuixant analogies amb les eines de cablejat estàndard descrites al començament d’aquest article:
-
PORTB - Gestiona l'estat de la sortida. Si el pin està en el mode "Sortida", 1 i 0 determinen la presència dels mateixos senyals a la sortida. Si el pin està en el mode "Entrada", 1 connecta una resistència de tracció (igual que la INPUT_PULLUP discutida anteriorment), si 0 és un estat d'alta impedància (analògic de INPUT);
-
PINB és un registre de lectura. En conseqüència, conté informació sobre l'estat actual dels pins del port (unitat lògica o zero).
-
DDRB: registre de direcció del port. Amb això, indiqueu al microcontrolador quin és el port com a entrada o sortida, amb “1” una sortida i “0” una entrada.
En lloc de la lletra “B”, pot haver-hi qualsevol altra segons els noms dels ports, per exemple, altres comandaments PORTD o PORTC funcionen de manera semblant.
Parpellegem el LED, substituïm la funció estàndard digitalWrite (). Primer, recordem com és l'exemple original de la biblioteca IDE d'Arduino.

Aquest és el codi del conegut “parpelleig”, que mostra el parpelleig del LED incorporat a la placa.

Els comentaris expliquen el codi. La lògica d’aquest treball és la següent.
L’ordre PORTB B00100000 posa PB5 en l’estat d’una unitat lògica, mira, i aquestes imatges i la taula de sota es troben i veiem que PB5 correspon a 13 pins d’Arduina.
La lletra "B" davant dels números indica que estem escrivint els valors de forma binària. La numeració en binari va de dreta a esquerra, és a dir. aquí la unitat es troba en el sisè bit des de la vora dreta del bit, que explica al microcontrolador la interacció amb l'estat del sisè bit del registre B del port (PB5). La taula següent mostra l'estructura del port D, és similar i es dóna com a exemple.

Podeu definir el valor no en binari, sinó en forma hexadecimal, per exemple, per això obrim la calculadora de Windows i en el mode “VEURE”, seleccioneu l’opció “Programador”.

Introduïu el número desitjat:

I feu clic a HEX:

En aquest cas, transferim tot això a l'IDE Arduino, però en lloc del prefix "B" serà "0x".

Però amb aquesta entrada hi ha un problema. Si teniu alguna cosa connectada a altres pins, introduïu una ordre com B00010000: restablireu tots els pins tret de 13 (PB5). Podeu introduir les dades de cada passador individualment. Semblarà així:

Aquest registre pot semblar incomprensible, esbrinem-ho.

Aquesta és una operació d’addició lògica, | = significa afegir alguna cosa al contingut del port.

Això vol dir que cal afegir una paraula de 8 bits al registre amb una unitat canviada per 5 bits, com a resultat, si 11000010 resulta que és 110.110.010. En aquest exemple, es pot veure que només ha canviat PB5, els bits restants d’aquest registre s’han mantingut sense canvis. Es va mantenir el mateix estat de les conclusions del microcontrolador.
Però, amb una addició lògica, apareix un problema: no podeu convertir la unitat en zero, perquè:
0+0=1
1+0=1
0+1=1
La multiplicació i la inversió lògiques ens ajudaran:

& = significa multiplicar el contingut del port per un número específic.

I aquest és el nombre pel qual multipliquem. El signe "~" indica inversió. En el nostre cas, la unitat invertida és zero. És a dir, multipliquem el contingut del port per zero, canviat per 5 bits. Per exemple, era el 10110001, es va convertir en 10100001. La resta de bits es va mantenir sense canvis.

El mateix es pot fer mitjançant l'operació inversa (^):
La lectura des dels ports, l’anàlisi de digitalRead () es realitza mitjançant el registre PIN, a la pràctica es veu així:

Aquí comprovem si l’expressió entre parèntesis és igual a l’estat real dels ports, és a dir. de la mateixa manera si escrivim si (digitalRead (12) == 1).
Conclusió
Per què hi ha aquestes dificultats amb la gestió del port si podeu utilitzar funcions convenients estàndard? Es tracta de velocitat i mida de codi. Quan s'utilitza el segon mètode, tractat a l'article, la mida del codi es redueix significativament i la velocitat augmenta en diversos ordres de magnitud. L'estàndard digitalWrite () es va executar en 1800 μs, i es va enregistrar directament al port en 0,2 μs, i digitalRead () en 1900 μs, i també es va convertir en 0,2 μs. Aquest mètode de control es va trobar als espais oberts de la xarxa i sovint es troba en codi. projectes acabats.
Consulteu també a electro-ca.tomathouse.com
: