kategorier: Microcontroller kredsløb
Antal visninger: 41940
Kommentarer til artiklen: 5
Metoder til læsning og styring af Arduino I / O-porte
For at interagere med omverdenen skal du konfigurere udgangene fra mikrokontrolleren til at modtage eller transmittere et signal. Som et resultat fungerer hver pin i input- og output-tilstand. Der er to måder at gøre dette på hvert Arduino-bræt, du elsker, nøjagtigt hvordan du lærer af denne artikel.

Metode én - standardsproget for Arduino IDE
Alle ved det Arduino Det er programmeret i C ++ med en vis tilpasning og forenklinger for begyndere. Det kaldes ledningsføring. Oprindeligt er alle arduino-porte defineret som input, og det er ikke nødvendigt at specificere dette i koden.
Porte skrives normalt i variabel initialiseringsfunktion:
ugyldig opsætning ()
{
// kode
}
For at gøre dette skal du bruge pinMode-kommandoen, den har en temmelig enkel syntaks, angiv først portnummeret og derefter dets rolle, adskilt med kommaer.
pinMode (nomer_porta, naznachenie)
Med denne kommando konfigureres mikrokontrollerens interne kredsløb på en bestemt måde.
Der er tre tilstande, hvor porten kan arbejde: INPUT - input, i denne tilstand opstår læsning af data fra sensorer, knapstatus, analogt og digitalt signal. Havnen er placeret i den såkaldte højimpedansstilstand, med enkle ord - input har høj modstand. Denne værdi indstilles f.eks. 13 pin på kortet, hvis nødvendigt, som følger:
pinMode (13, INPUT);
OUTPUT - output, afhængigt af den kommando, der er foreskrevet i koden, tager porten en værdi på en eller nul. Outputet bliver en slags kontrolleret strømkilde og producerer en maksimal strøm (i vores tilfælde 20 mA og 40 mA på toppen) til den belastning, der er forbundet til den. For at tildele en port som output til Arduino skal du indtaste:
pinMode (13, OUTPUT);
INPUT_PULLUP - porten fungerer som input, men den såkaldte forbindelse til den. 20 kΩ pull-up modstand.
Portens betingede interne kredsløb i denne tilstand er vist nedenfor. Et træk ved dette input er, at indgangssignalet opfattes som inverteret (”enheden” ved indgangen opfattes af mikrokontrolleren som ”nul”). I denne tilstand kan du ikke bruge eksterne pull-up-modstande når du arbejder med knapper.
pinMode (13, INPUT_PULLUP);

Data modtages fra havne og transmitteres til dem ved hjælp af kommandoerne:
-
digitalWrite (pin, value) - konverterer output pin til henholdsvis en logisk 1 eller 0, 5V spænding vises eller forsvinder ved output, for eksempel digitalWrite (13, HIGH) - leverer 5 volt (logisk enhed) til 13 pins, og digitalWrite (13, low) ) - oversætter 13 stifter til en tilstand af logisk nul (0 volt);
-
digitalRead (pin) - læser værdien fra input, eksempel digitalRead (10), læser signalet fra 10 pins;
-
analogRead (pin) - læser et analogt signal fra en analog port, du får en værdi i området fra 0 til 1023 (inden for en 10-bit ADC), et eksempel er analogRead (3).
Metode to - styre havne gennem Atmega-registre og fremskynde kode
En sådan kontrol er selvfølgelig enkel, men i dette tilfælde er der to ulemper - større hukommelsesforbrug og dårlig ydeevne, når man arbejder med porte. Men husk, hvad er Arduino, uanset optionskortet (uno, mikro, nano)? Først og fremmest dette mikrokontroller AVR-familie ATMEGA, brugt for nylig MK atmega328.
I Arduino IDE kan du programmere C AVR-sproget hjemmehørende i denne familie, som om du arbejdede med en separat mikrokontroller. Men først ting først. For at administrere Arduino-porte på denne måde skal du først overveje følgende illustration.
Måske vil nogen tydeligere undersøge havne i denne form (det samme i figuren, men i et andet design):

Her ser du korrespondance mellem konklusionerne fra Arduino og navnene på havne i Atmega. Så vi har 3 havne:
-
PORTB;
-
PORTC;
-
PORTD.
Baseret på de viste billeder udarbejdede jeg en korrespondancetabel mellem havne i Arduino og Atmega, det vil være nyttigt for dig i fremtiden.

Atmega har tre 8-bit-registre, der kontrollerer havnenes tilstand, for eksempel vil port B finde ud af deres formål ved at tegne analogier med standardforbindelsesværktøjerne beskrevet i begyndelsen af denne artikel:
-
PORTB - Administrer outputstatus. Hvis stiften er i "Output" -tilstand, bestemmer 1 og 0 tilstedeværelsen af de samme signaler ved udgangen. Hvis stiften er i "Input" -tilstand, forbinder 1 en pull-up-modstand (det samme som INPUT_PULLUP, der er diskuteret ovenfor), hvis 0 er en højimpedansstilstand (analog INPUT);
-
PINB er et læseregister. I overensstemmelse hermed indeholder den information om den aktuelle tilstand af portstifterne (logisk enhed eller nul).
-
DDRB - portretningsregister. Med det indikerer du til mikrokontrolleren, hvad porten er som input eller output, med "1" en output og "0" en input.
I stedet for bogstavet “B”, kan der være andre i henhold til navnene på havne, f.eks. PORTD eller PORTC andre kommandoer fungerer på samme måde.
Vi blinker LED'en, udskift standard digitalWrite () -funktionen. Lad os først huske, hvordan det originale eksempel fra Arduino IDE-biblioteket ser ud.

Dette er koden for den velkendte “blink”, der viser blinkingen af den indbyggede LED i kortet.

Kommentarerne forklarer koden. Logik for dette arbejde er som følger.
Kommandoen PORTB B00100000 sætter PB5 i tilstanden af en logisk enhed, se, og disse billeder og nedenstående tabel er placeret, og vi ser, at PB5 svarer til 13 pin Arduina.
Bogstavet "B" foran tallene viser, at vi skriver værdierne i binær form. Nummerering i binær går fra højre til venstre, dvs. her er enheden i den sjette bit fra bitens højre kant, der fortæller mikrokontrolleren om interaktionen med tilstanden til den sjette bit i port B-registeret (PB5). Tabellen herunder viser strukturen i port D, den er den samme og er givet som et eksempel.

Du kan indstille værdien ikke i binær, men i hexadecimal form, for eksempel for dette åbner vi windows-lommeregneren og i "VIS" -tilstand skal du vælge "Programmer" indstillingen.

Indtast det ønskede nummer:

Og klik på HEX:

I dette tilfælde overfører vi alt dette til Arduino IDE, men i stedet for præfikset "B" vil det være "0x".

Men med dette input er der et problem. Hvis du har noget forbundet med andre stifter, skal du indtaste en kommando som B00010000 - du nulstiller alle stifter undtagen 13 (PB5). Du kan indtaste data for hver pin enkeltvis. Det ser sådan ud:

En sådan optegnelse kan virke uforståelig, lad os finde ud af det.

Dette er en logisk tilføjelsesproces, | = betyder at tilføje noget til portens indhold.

Dette betyder, at du skal tilføje et ord på 8 bit i registeret med en enhed skiftet med 5 bit - som et resultat, hvis 11000010 viser sig at være 110.110.010. I dette eksempel kan det ses, at kun PB5 har ændret sig, de resterende bits i dette register har været uændrede såvel som Tilstanden for mikrokontrollerstifterne forblev uændret.
Men med logisk tilføjelse opstår der et problem - du kan ikke forvandle enheden til nul, fordi:
0+0=1
1+0=1
0+1=1
Logisk multiplikation og inversion vil hjælpe os:

& = betyder at multiplicere portens indhold med et specifikt nummer.

Og dette er det antal, som vi multiplicerer med. "~" Tegnet indikerer inversion. I vores tilfælde er den inverterede enhed nul. Det vil sige, at vi multiplicerer portens indhold med nul, skiftet med 5 bit. For eksempel var det 10110001, det blev 10100001. De resterende bit forblev uændret.

Det samme kan gøres ved hjælp af invertering (^):
Aflæsning fra porte, analogen af digitalRead () udføres ved hjælp af PIN-registeret, i praksis ser det sådan ud:

Her kontrollerer vi, om udtrykket i parenteser er lig med den virkelige tilstand af havne, dvs. på samme måde, hvis vi skrev hvis (digitalRead (12) == 1).
konklusion
Hvorfor er der så vanskeligheder med havnestyring, hvis du kan bruge praktiske standardfunktioner? Det handler om hastighed og kodestørrelse. Når du bruger den anden metode, der er omtalt i artiklen, reduceres kodestørrelsen markant, og hastigheden øges med flere størrelsesordrer. Standard digitalWrite () blev udført i 1800 μs og blev optaget direkte til havnen i 0,2 μs og digitalRead () i 1900 μs og blev også i 0,2 μs. Denne kontrolmetode blev fundet på de åbne rum på netværket og findes ofte i kode. færdige projekter.
Se også på elektrohomepro.com
: