Kategorijas: Mikrokontrolleru shēmas
Skatījumu skaits: 41940
Komentāri par rakstu: 5

Arduino I / O portu nolasīšanas un pārvaldības metodes

 

Lai mijiedarbotos ar ārpasauli, jums ir jākonfigurē mikrokontrollera izejas signāla saņemšanai vai pārraidīšanai. Tā rezultātā katrs tapa darbosies ievades un izvades režīmā. Katrā jūsu iecienītajā Arduino tāfelē to var izdarīt divos veidos, tieši tā, kā jūs mācāties no šī raksta.

Arduino I / O portu nolasīšanas un pārvaldības metodes

Pirmā metode - Arduino IDE standarta valoda

To zina visi Arduino Tas ir ieprogrammēts C ++ formātā ar dažiem pielāgojumiem un vienkāršojumiem iesācējiem. To sauc par Elektroinstalāciju. Sākotnēji visi arduino porti tiek definēti kā ieejas, un kodā tas nav jānorāda.

Ostas parasti tiek rakstītas mainīgā inicializācijas funkcijā:

iestatīšana nav spēkā ()
{
// kods
}

Tam tiek izmantota komanda pinMode, tai ir diezgan vienkārša sintakse, vispirms tiek norādīts porta numurs, pēc tam tā lomu atdala ar komatiem.

pinMode (nomer_porta, naznachenie)

Ar šo komandu īpašā veidā tiek konfigurēta mikrokontrollera iekšējā shēma.

Portā var darboties trīs režīmi: INPUT - ievade, šajā režīmā notiek datu nolasīšana no sensoriem, pogas statuss, analogs un digitālais signāls. Osta atrodas ts stāvoklis ar augstu pretestību, vienkāršiem vārdiem sakot - ievadei ir augsta pretestība. Šī vērtība, piemēram, tiek iestatīta, piemēram, 13 tabulas piniem, ja nepieciešams:

pinMode (13, INPUT);

OUTPUT - izeja, atkarībā no kodā noteiktās komandas, porta vērtība ir viena vai nulle. Izeja kļūst par sava veida vadāmu enerģijas avotu un rada tai maksimālo strāvu (mūsu gadījumā 20 mA un 40 mA pie maksimuma) līdz tai pievienotajai slodzei. Lai portu kā izvadi piešķirtu Arduino, jums jāievada:

pinMode (13, OUTPUT);

INPUT_PULLUP - ports darbojas kā ieeja, bet tā sauktais savieno ar to. 20 kΩ ievelkamais rezistors.

Šajā stāvoklī ostas nosacītā iekšējā shēma ir parādīta zemāk. Šīs ieejas iezīme ir tāda, ka ieejas signāls tiek uztverts kā apgriezts (ieejas “vienību” mikrokontrollers uztver kā “nulli”). Šajā režīmā nevar izmantot ārējos savilkšanas rezistorus strādājot ar pogām.

pinMode (13, INPUT_PULLUP);

Ieejas ievelkamais rezistors

Dati tiek saņemti no ostām un nosūtīti uz tām ar komandu palīdzību:

  • digitalWrite (tapa, vērtība) - attiecīgi pārveido izejas tapu par loģisku 1 vai 0, izejā parādās vai pazūd 5 V spriegums, piemēram, digitalWrite (13, HIGH) - piegādā 5 voltus (loģisko vienību) 13 tapām, un digitalWrite (13, zems) ) - pārveido 13 tapas loģiskās nulles stāvoklī (0 volti);

  • digitalRead (pin) - nolasa vērtību no ieejas, piemēram, digitalRead (10), nolasa signālu no 10 tapām;

  • analogRead (pin) - nolasa analogo signālu no analogā porta, jūs iegūstat vērtību diapazonā no 0 līdz 1023 (10 bitu ADC robežās), piemērs ir analogRead (3).


Otrā metode - pārvaldiet ostas, izmantojot Atmega reģistrus, un paātriniet kodu

Šāda vadība, protams, ir vienkārša, taču šajā gadījumā ir divi trūkumi - lielāks atmiņas patēriņš un slikta veiktspēja, strādājot ar portiem. Bet atcerieties, kas ir Arduino, neatkarīgi no opciju paneļa (uno, micro, nano)? Pirmkārt, tas mikrokontrolleru AVR saime ATMEGA, nesen lietots MK atmega328.

Arduino IDE varat ieprogrammēt C AVR valodu, kas dzimta šai ģimenei, it kā jūs strādātu ar atsevišķu mikrokontrolleri. Bet vispirms viss. Lai šādā veidā pārvaldītu Arduino ostas, vispirms rūpīgi jāizvērtē šī ilustrācija.

Atmega168 mikrokontrolleru porti

Varbūt kāds skaidrāk pārbaudīs ostas šādā formā (tas pats attēlā, bet atšķirīgā dizainā):

Atmega328 mikrokontrolleru porti

Šeit jūs redzat Arduino secinājumu un Atmega ostu nosaukumu atbilstību. Tātad, mums ir 3 ostas:

  • PORTB;

  • PORTC;

  • PORTD.

Balstoties uz attēliem, es sastādīju sarakstes tabulu starp Arduino un Atmega ostām, tā jums būs noderīga nākotnē.

Arduino un Atmega ostu atbilstības tabula

Atmega ir trīs 8 bitu reģistri, kas kontrolē ostu stāvokli, piemēram, ports B izdomās to mērķi, sastādot analoģijas ar standarta vadu rīkiem, kas aprakstīti šī raksta sākumā:

  • PORTB - Pārvaldiet izvades statusu. Ja tapa ir režīmā "Izeja", tad 1 un 0 nosaka to pašu signālu esamību izejā. Ja tapa ir “ievades” režīmā, tad 1 pievieno savilkšanas rezistoru (tāds pats kā iepriekš apskatītajam INPUT_PULLUP), ja 0 ir augstas pretestības stāvoklis (INPUT analogs);

  • PINB ir lasāms reģistrs. Attiecīgi tajā ir informācija par ostas tapu pašreizējo stāvokli (loģiskā vienība vai nulle).

  • DDRB - ostas virzienu reģistrs. Ar to jūs mikrokontrolleram norādāt, kas ir ports kā ieeja vai izvade, ar “1” izeju un “0” ieeju.

Burta “B” vietā var būt arī kāds cits pēc ostu nosaukumiem, piemēram, PORTD vai PORTC citas komandas darbojas līdzīgi.

Mirgojam gaismas diodei, aizstājam parasto funkciju digitalWrite (). Vispirms atcerēsimies, kā izskatās oriģinālais piemērs no Arduino IDE bibliotēkas.

Arduino LED mirgojošs kods

Šis ir plaši pazīstamā “mirgošanas” kods, kas parāda tāfeles iebūvētās gaismas diodes mirgošanu.

Tapu pārvaldība

Komentāri izskaidro kodu. Šī darba loģika ir šāda.

Komanda PORTB B00100000 ievieto PB5 loģiskas vienības stāvoklī, paskatieties, un šie attēli un zemāk redzamā tabula atrodas, un mēs redzam, ka PB5 atbilst 13 Arduina pin.

Burts “B” ciparu priekšā norāda, ka vērtības mēs rakstām binārā formā. Numerācija binārā notiek no labās uz kreiso pusi, t.i. šeit vienība atrodas sestajā bitā no bita labās malas, kas mikrokontrolleram paziņo par mijiedarbību ar B porta reģistra (PB5) sestā bita stāvokli. Zemāk redzamajā tabulā parādīta D porta struktūra, tā ir līdzīga un dota kā piemērs.

D ostas struktūra

Vērtību var iestatīt nevis binārā, bet heksadecimālā formā, piemēram, tam mēs atveram Windows kalkulatoru un “VIEW” režīmā atlasām opciju “Programmētājs”.

Windows kalkulators

Ievadiet vēlamo numuru:

Programmētāja kalkulatora režīms

Un noklikšķiniet uz HEX:

Skaitļu tulkošana uz kalkulatora

Šajā gadījumā mēs to visu pārsūtīsim uz Arduino IDE, bet prefiksa "B" vietā tas būs "0x".

Numura pārsūtīšana Arduino IDE

Bet ar šo ievadi pastāv problēma. Ja jums ir kaut kas savienots ar citiem tapiem, ievadot komandu, piemēram, B00010000, jūs atiestatīsit visus kontaktus, izņemot 13 (PB5). Katru tapu var ievadīt atsevišķi. Tas izskatīsies šādi:

Datu ievadīšana katrā tapā

Šāds ieraksts var šķist nesaprotams, izdomāsim to.

Ieraksta parsēšana

Šī ir loģiska papildināšanas darbība, | = nozīmē kaut ko pievienot ostas saturam.

Loģiskās pievienošanas operācija

Tas nozīmē, ka reģistrā jāpievieno 8 bitu vārds ar vienību, kas nobīdīta par 5 bitiem - kā rezultātā, ja 11000010 izrādās 110,110,010. Šajā piemērā var redzēt, ka ir mainījies tikai PB5, pārējie šī reģistra biti ir palikuši nemainīgi, kā arī Mikrokontroliera tapu stāvoklis palika nemainīgs.

Bet ar loģisku pievienošanu rodas problēma - jūs nevarat pārvērst vienību uz nulli, jo:

0+0=1

1+0=1

0+1=1

Mums palīdzēs loģiskā reizināšana un inversija:

Loģiskā reizināšana un apgriešana

& = nozīmē ostas satura reizināšanu ar noteiktu numuru.

 

Porta saturu reizinot ar skaitli

Un tas ir skaitlis, ar kuru mēs reizinām. Zīme “~” norāda inversiju. Mūsu gadījumā apgrieztā vienība ir nulle. Tas ir, mēs reizinām ostas saturu ar nulli, nobīdītu par 5 bitiem. Piemēram, tas bija 10110001, tas kļuva par 10100001. Atlikušie biti palika nemainīgi.

Reiziniet porta saturu ar nulli, kas nobīdīts par 5 bitiem

To pašu var izdarīt, izmantojot apgrieztu darbību (^):

Lasot no portiem, digitalRead () analogs tiek veikts, izmantojot PIN reģistru, praksē tas izskatās šādi:

Lasīt no ostām

Šeit mēs pārbaudām, vai izteiksme iekavās ir vienāda ar ostu reālo stāvokli, t.i. līdzīgi, ja mēs uzrakstījām if (digitalRead (12) == 1).


Secinājums

Kāpēc ostas pārvaldībā rodas šādas grūtības, ja varat izmantot ērtas standarta funkcijas? Tas viss ir saistīts ar ātrumu un koda lielumu. Izmantojot otro metodi, kas apskatīta rakstā, koda lielums tiek ievērojami samazināts, un ātrums palielinās par vairākām kārtas. Standarta digitalWrite () tika izpildīts 1800 μs, ierakstot tieši ostā ar 0,2 μs, un digitalRead () 1900 μs, un tas arī kļuva par 0,2 μs. Šī vadības metode tika atrasta tīkla atklātajās vietās un bieži atrodama kodā. pabeigti projekti.

Skatīt arī vietnē i.electricianexp.com:

  • Arduino savienošana un programmēšana iesācējiem
  • Kā pieslēgt inkrementālo kodētāju Arduino
  • PIC mikrokontrolleri iesācējiem
  • Mikrokontrolleru tālvadības pults: IR tālvadības pults, Arduino, ESP8266, 433 ...
  • Temperatūras un mitruma mērīšana Arduino - dažādu iespēju izvēle

  •  
     
    Komentāri:

    # 1 rakstīja: Kipovets | [citāts]

     
     

    "Bet ar loģisku pievienošanu rodas problēma - jūs nevarat pārvērst vienību uz nulli, jo:

    0 + 0 = 1 "(c)

    Neliela pārraudzība: 0 + 0 = 0.

     
    Komentāri:

    # 2 rakstīja: čugou | [citāts]

     
     

    Kipovets, viņš, iespējams, gribēja pateikt:

    1 + 1 = 1

     
    Komentāri:

    # 3 rakstīja: | [citāts]

     
     

    Kipovets,
    Banāls typo! Jūs redzat, cik labi, ka speciālisti sēž mūsu portālā! Jums ir jāizveido tikai piemērots saturs!

     
    Komentāri:

    # 4 rakstīja: Sergs | [citāts]

     
     

    Pēdējā daļā teikts: PORTB | = 1 << 5 ... if (digitalRead (12) == 1). Bet 5 piespraudes ostai B ir 13 tapas arduino. Vai arī es kļūdos ?!

     
    Komentāri:

    # 5 rakstīja: p-a-h-a | [citāts]

     
     

    Ja (PINB == B00010000) {} navlīdzīgi kā tad, ja mēs rakstījām, ja (digitalRead (12) == 1)
    drīzāk analogi
    (digitalRead (12) == 1) &&(digitalRead (13) == 1) &&(digitalRead (14) == 1) &&(digitalRead (15) == 1) &&(digitalRead (11) == 1) ... un tātad 8 piespraudes

    Šeit jums ir nepieciešams vai nu šis:
    ja (
    ! (~ PORTB & (1 << PB4))) {} //atgriežas0 vai 1
    nu šādi:
    ja (PORTB & (1 << PB4)) {} // atgriež pārvietoto vienību = 16, DEC
    nu šādi:
    ja (
    bit_is_set (PORTB, 4)) {}// atgriež pārvietoto vienību = 16, DEC