kategorije: Sklopovi mikrokontrolera
Broj pregledavanja: 41940
Komentari na članak: 5
Metode za čitanje i upravljanje Arduino I / O portovima
Za interakciju s vanjskim svijetom, morate konfigurirati izlaze mikrokontrolera za prijem ili prijenos signala. Kao rezultat, svaki pin će raditi u načinu ulaza i izlaza. Postoje dva načina da to učinite na vašoj omiljenoj ploči Arduino, točno kako ćete naučiti iz ovog članka.

Prva metoda - standardni jezik za Arduino IDE
To svi znaju Težak Programiran je na C ++ uz nešto prilagođavanja i pojednostavljenja za početnike. Zove se ožičenje. U početku su svi arduino portovi definirani kao ulazi i nema potrebe za specificiranjem u kodu.
Portovi se obično pišu u funkciji inicijalizacije varijable:
postavljanje praznine ()
{
// kod
}
Za to se koristi naredba pinMode, ima prilično jednostavnu sintaksu, prvo je naznačen broj porta, a zatim je njegova uloga odvojena zarezima.
pinMode (nomer_porta, naznachenie)
Ovom naredbom unutarnji krug mikrokontrolera konfiguriran je na određeni način.
Postoje tri načina na koja port može raditi: INPUT - ulaz, u ovom načinu se događa čitanje podataka s senzora, status gumba, analogni i digitalni signal. Luka se nalazi u tzv stanje visoke impedance, jednostavnim riječima - ulaz ima visoki otpor. Ova vrijednost je postavljena, na primjer, 13 pinova ploče, ako je potrebno, kako slijedi:
pinMode (13, ULAZ);
OUTPUT - izlaz, ovisno o naredbi propisanoj u kodu, ulaz uzima vrijednost jednaku ili nulu. Izlaz postaje vrsta kontroliranog izvora energije i proizvodi maksimalnu struju (u našem slučaju 20 mA i 40 mA na vrhuncu) na opterećenje povezano s njim. Da biste Arduinu dodijelili port kao izlaz, morate unijeti:
pinMode (13, IZLAZ);
INPUT_PULLUP - priključak radi kao ulaz, ali tzv. Otporni otpornik od 20 kΩ.
Uvjetni unutarnji krug porta u ovom stanju prikazan je dolje. Značajka ovog ulaza je da se ulazni signal doživljava kao obrnuti ("jedinica" na ulazu mikrokontroler doživljava kao "nulu"). U ovom načinu rada ne možete koristiti vanjske otpornike na povlačenje pri radu s gumbima.
pinMode (13, INPUT_PULLUP);

Podaci se primaju iz portova i prenose im ih naredbama:
-
digitalWrite (pin, value) - pretvara izlazni pin u logički 1 ili 0, napon se pojavljuje ili nestaje 5V na izlazu, na primjer digitalWrite (13, HIGH) - napaja 5 volti (logička jedinica) na 13 pinova, a digitalWrite (13, nizak ) - prevodi 13 pinova u stanje logičke nule (0 volti);
-
digitalRead (pin) - čita vrijednost s ulaza, primjerice digitalRead (10), očitava signal s 10 pina;
-
analogRead (pin) - čita analogni signal iz analognog ulaza, dobiva vrijednost u rasponu od 0 do 1023 (unutar 10-bitnog ADC-a), primjer je analogRead (3).
Druga metoda - upravljanje lukama kroz Atmega registre i ubrzavanje koda
Takva je kontrola naravno jednostavna, ali u ovom slučaju postoje dva nedostatka - veća potrošnja memorije i loši rad pri radu s portovima. Ali sjetite se što je Arduino, bez obzira na ploču s opcijama (uno, mikro, nano)? Prije svega, ovo mikrokontroler AVR familije ATMEGA, nedavno korištena MK atmega328.
U Arduino IDE-u možete programirati na materinjem jeziku za ovu obitelj C AVR, kao da radite s zasebnim mikrokontrolerom. Ali prvo stvari. Da biste na ovaj način upravljali lukama Arduino, prvo morate pažljivo razmotriti sljedeću ilustraciju.
Možda će netko jasnije ispitati luke u ovom obliku (isti na slici, ali u drugačijem dizajnu):

Ovdje vidite korespondenciju zaključaka Arduina i imena luka Atmega. Dakle, imamo 3 porta:
-
PORTB;
-
PORTC;
-
PORTD.
Na temelju prikazanih slika, sastavio sam tablicu dopisivanja između luka Arduino i Atmega, bit će vam korisna u budućnosti.

Atmega ima tri 8-bitna registra koja kontroliraju stanje portova, na primjer, priključak B će utvrditi njihovu svrhu crtanjem analogija sa standardnim alatima za ožičenje opisanim na početku ovog članka:
-
PORTB - Upravljanje statusom izlaza. Ako je iglica u načinu "Izlaz", tada 1 i 0 određuju prisutnost istih signala na izlazu. Ako je pin u režimu "Input", tada 1 spaja podizni otpornik (isto kao što je gore opisano INPUT_PULLUP), ako je 0 stanje visoke impedance (analogno INPUT-u);
-
PINB je registar za čitanje. U skladu s tim, sadrži podatke o trenutnom stanju igle porta (logička jedinica ili nula).
-
DDRB - registar smjerova ulaza. Pomoću toga mikrokontroleru pokazujete da li je ulaz ulaz ili izlaz, s izlazom "1" i "0" ulazom.
Umjesto slova "B", može postojati bilo koji drugi prema imenima portova, na primjer, PORTD ili PORTC ostale naredbe rade slično.
Trepćemo LED, zamjenjujemo standardnu funkciju digitalWrite (). Prvo, prisjetimo se kako izgleda izvorni primjer iz Arduino IDE biblioteke.

Ovo je šifra poznatog „treptanja“, koji pokazuje treptanje LED-a ugrađenog u ploču.

U komentarima se objašnjava kôd. Logika ovog djela je sljedeća.
Naredba PORTB B00100000 stavlja PB5 u stanje logičke jedinice, pogledajte, te slike i tablicu koja se nalazi ispod i vidite da PB5 odgovara 13 pin Arduina.
Slovo "B" ispred brojeva označava da vrijednosti pišemo u binarnom obliku. Numeriranje u binarnom obliku ide s desna na lijevo, tj. ovdje je jedinica u šestom bitu s desnog ruba bita, koji mikrokontroleru govori o interakciji sa stanjem šestog bita registra B (PB5). Tablica u nastavku prikazuje strukturu priključka D, slična je i dana je kao primjer.

Možete postaviti vrijednost ne u binarnom, već u heksadecimalnom obliku, na primjer, za to otvaramo Windows kalkulator i u načinu "VIEW" odaberite opciju "Programmer".

Unesite željeni broj:

I kliknite na HEX:

U ovom slučaju, sve to prenosimo na Arduino IDE, ali umjesto prefiksa "B" bit će "0x".

Ali s ovim ulazom postoji problem. Ako imate išta povezane s drugim iglama, tada unosite naredbu poput B00010000 - resetirat ćete sve igle osim 13 (PB5). Možete unijeti podatke za svaki pin pojedinačno. Izgledat će ovako:

Takav se zapis može činiti nerazumljivim, razmislimo.

Ovo je logična operacija dodavanja, | = znači dodavanje nečega sadržaju porta.

To znači da u registar morate dodati riječ od 8 bita s jedinicom pomaknutom za 5 bita - kao rezultat, ako se 11000010 pokaže da je 110,110,010. U ovom primjeru se vidi da se promijenio samo PB5, ostali bitovi ovog registra ostali su nepromijenjeni, kao i Stanje pinova mikrokontrolera ostalo je nepromijenjeno.
No, s logičkim dodavanjem, pojavljuje se problem - jedinicu ne možete pretvoriti u nulu, jer:
0+0=1
1+0=1
0+1=1
U pomoć će nam doći logičko množenje i inverzija:

& = znači umnožiti sadržaj priključka na određeni broj.

A ovo je broj s kojim se množimo. Znak "~" označava inverziju. U našem slučaju, obrnuta jedinica je nula. Odnosno, množimo sadržaj priključka na nulu, pomaknut za 5 bita. Na primjer, bio je 10110001, postao je 10100001. Preostali bitovi ostali su nepromijenjeni.

Isto se može učiniti korištenjem invertne operacije (^):
Čitanje iz portova, analogni digitalRead () izvodi se pomoću PIN registra, u praksi izgleda ovako:

Ovdje provjeravamo je li izraz u zagradama jednak stvarnom stanju portova, tj. slično ako smo napisali if (digitalRead (12) == 1).
zaključak
Zašto postoje takve poteškoće s upravljanjem portom ako možete koristiti standardne praktične funkcije? Sve je u brzini i veličini koda. Kada se koristi druga metoda o kojoj je riječ u članku, veličina koda se značajno smanjuje, a brzina se povećava za nekoliko reda veličine. Standardni digitalWrite () izveden je u 1800 µs, a snimanje izravno u ulaz u 0,2 µs, a digitalRead () u 1900 µs, a postalo je i u 0,2 µs. Ova metoda upravljanja pronađena je na otvorenim prostorima mreže i često se nalazi u kodu. gotovi projekti.
Pogledajte također na elektrohomepro.com
: