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.

Metode za čitanje i upravljanje Arduino I / O portovima

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);

Ulazni pull-up otpornik

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.

Ulazi za mikrokontrolere Atmega168

Možda će netko jasnije ispitati luke u ovom obliku (isti na slici, ali u drugačijem dizajnu):

Ulazi za mikrokontrolere Atmega328

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.

Tabela sukladnosti luka Arduino i Atmega

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.

Arduino LED treperi kod

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

Upravljanje pinima

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.

Struktura luka D

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".

Windows kalkulator

Unesite željeni broj:

Način programiranja kalkulatora

I kliknite na HEX:

Prijevod brojeva na kalkulator

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

Prijenos broja u Arduino IDE

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:

Unošenje podataka u svaki pin

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

Podjela zapisa

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

Logično dodavanje

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:

Logičko množenje i pretvaranje

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

 

Pomnoženje sadržaja porta s brojem

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.

Pomnožite sadržaj priključka na nulu pomaknut za 5 bita

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:

Čitajte iz portova

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:

  • Povezivanje i programiranje Arduino-a za početnike
  • Kako spojiti inkrementalni davač na Arduino
  • PIC mikrokontroleri za početnike
  • Daljinski upravljač mikrokontrolera: IR daljinski, Arduino, ESP8266, 433 ...
  • Mjerenje temperature i vlažnosti na Arduinu - izbor načina

  •  
     
    komentari:

    # 1 napisao: Kipovets | [Cite]

     
     

    "Ali s logičkim dodavanjem, pojavljuje se problem - jedinicu ne možete pretvoriti u nulu, jer:

    0 + 0 = 1 "(c)

    Mali nadzor: 0 + 0 = 0.

     
    komentari:

    # 2 napisao: chugou | [Cite]

     
     

    Kipovets, vjerojatno je želio reći:

    1 + 1 = 1

     
    komentari:

    # 3 napisao: | [Cite]

     
     

    Kipovets,
    Banalna pogreška! Vidite koliko je dobro što na našem portalu sjede specijalci! Morate napraviti samo prikladan sadržaj!

     
    komentari:

    # 4 napisao: Serg | [Cite]

     
     

    U završnom dijelu piše PORTB | = 1 << 5 ... if (digitalRead (12) == 1). Ali 5 pin luka B, to je 13 pin arduinoa. Ili se varam ?!

     
    komentari:

    # 5 napisao: p-a-h-a | [Cite]

     
     

    Ako (PINB == B00010000) {} nijeslično kao ako smo napisali if (digitalRead (12) == 1)
    radije analogno
    (digitalno čitanje (12) == 1) &&(digitalno čitanje (13) == 1) &&(digitalno čitanje (14) == 1) &&(digitalno čitanje (15) == 1) &&(digitalno čitanje (11) == 1) ... i tako 8 priključaka

    Ovdje trebate ili ovo:
    ako (
    ! (~ PORTB & (1 << PB4))) {} //vraća0 ili 1
    bilo ovako:
    ako (PORTB & (1 << PB4)) {} // vraća pomaknutu jedinicu = 16, DEC
    bilo ovako:
    ako (
    bit_is_set (PORTB, 4)) {}// vraća pomaknutu jedinicu = 16, DEC