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.
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);
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.
Varbūt kāds skaidrāk pārbaudīs ostas šādā formā (tas pats attēlā, bet atšķirīgā dizainā):
Š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ē.
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.
Šis ir plaši pazīstamā “mirgošanas” kods, kas parāda tāfeles iebūvētās gaismas diodes mirgošanu.
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.
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”.
Ievadiet vēlamo numuru:
Un noklikšķiniet uz HEX:
Šajā gadījumā mēs to visu pārsūtīsim uz Arduino IDE, bet prefiksa "B" vietā tas būs "0x".
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:
Šāds ieraksts var šķist nesaprotams, izdomāsim to.
Šī ir loģiska papildināšanas darbība, | = nozīmē kaut ko pievienot ostas saturam.
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:
& = nozīmē ostas satura reizināšanu ar noteiktu numuru.
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.
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:
Š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ē e.imadeself.com
: