Kategorijos: Mikrovaldiklio grandinės
Peržiūrų skaičius: 41940
Straipsnio komentarai: 5

Arduino I / O prievadų skaitymo ir valdymo metodai

 

Norėdami bendrauti su išoriniu pasauliu, turite sukonfigūruoti mikrovaldiklio išėjimus, kad būtų galima priimti ar perduoti signalą. Todėl kiekvienas kaištis veiks įvesties ir išvesties režimais. Yra du būdai, kaip tai padaryti kiekvienoje mėgstamoje „Arduino“ lentoje, būtent to, ko išmokote iš šio straipsnio.

Arduino I / O prievadų skaitymo ir valdymo metodai

Pirmasis metodas - standartinė „Arduino IDE“ kalba

Visi tai žino Arduino Tai užprogramuota C ++ formatu su šiek tiek pritaikymu ir supaprastinimu pradedantiesiems. Jis vadinamas laidų. Iš pradžių visi arduino prievadai yra apibrėžiami kaip įėjimai, ir to nereikia nurodyti kode.

Uostai paprastai rašomi kintamojo iniciacijos funkcija:

negaliojanti sąranka ()
{
// kodas
}

Tam naudojama komanda „pinMode“, ji turi gana paprastą sintaksę, pirmiausia nurodomas prievado numeris, tada jo vaidmuo atskirtas kableliais.

„pinMode“ („nomer_porta“, „naznachenie“)

Naudojant šią komandą, mikrovaldiklio vidinė grandinė sukonfigūruojama tam tikru būdu.

Yra trys režimai, kuriais uostas gali veikti: INPUT - įvestis, šiuo režimu duomenų skaitymas iš jutiklių, mygtuko būsena, analoginis ir skaitmeninis signalas. Uostas yra vadinamojoje didelės varžos būsena, paprastais žodžiais tariant - įėjimas turi aukštą varžą. Ši vertė, pavyzdžiui, nustatoma, pavyzdžiui, 13 plokštės kaiščių, jei reikia:

pinMode (13, INPUT);

OUTPUT - išėjimas, atsižvelgiant į kodekse nurodytą komandą, prievado reikšmė yra viena arba nulis. Išėjimas tampa savotišku kontroliuojamu energijos šaltiniu ir sukuria maksimalią srovę (mūsų atveju 20 mA ir 40 mA prie piko), prijungtą prie apkrovos. Norėdami priskirti prievadą kaip išvestį „Arduino“, turite įvesti:

pinMode (13, OUTPUT);

INPUT_PULLUP - prievadas veikia kaip įvestis, tačiau vadinamasis jungiasi prie jo. 20 kΩ traukiamasis rezistorius.

Šios būsenos sąlyginė vidinė uosto schema parodyta žemiau. Šio įėjimo bruožas yra tas, kad įvesties signalas suvokiamas kaip apverstas („įtaisą“ prie įėjimo mikrovaldiklis suvokia kaip „nulį“). Šiame režime negalima naudoti išorinių traukiamųjų varžų kai dirbate su mygtukais.

„pinMode“ (13, INPUT_PULLUP);

Įvesties rezistorius

Duomenys gaunami iš prievadų ir perduodami jiems komandomis:

  • „digitalWrite“ (kaištis, vertė) - paverčia išėjimo kaištį atitinkamai 1 arba 0 loginiu, išvestyje atsiranda arba išnyksta 5 V įtampa, pvz., „digitalWrite“ (13, HIGH) - tiekia 5 voltų (loginis vienetas) į 13 kontaktų, o „digitalWrite“ (13, žemas) ) - paverčia 13 kaiščių į loginio nulio būseną (0 voltų);

  • „digitalRead“ (pin) - nuskaito reikšmę iš įvesties, pavyzdžiui, „digitalRead“ (10), nuskaito signalą iš 10 kaiščių;

  • analoRead (pin) - nuskaito analoginį signalą iš analoginio prievado, gausite reikšmę nuo 0 iki 1023 (per 10 bitų ADC), pavyzdys yra analogRead (3).


Antras metodas - tvarkykite uostus per „Atmega“ registrus ir paspartinkite kodą

Toks valdymas, žinoma, yra paprastas, tačiau šiuo atveju yra du trūkumai - didesnis atminties sunaudojimas ir prastas našumas dirbant su prievadais. Bet atsimeni, kas yra „Arduino“, neatsižvelgiant į opcionų lentą („uno“, „micro“, „nano“)? Visų pirma, tai mikrovaldiklis AVR šeima ATMEGA, neseniai naudotas MK atmega328.

„Arduino IDE“ galite programuoti gimtąja kalba šiai C AVR šeimai, tarsi dirbtumėte su atskiru mikrovaldikliu. Bet visų pirma pirmiausia. Norėdami tokiu būdu valdyti Arduino uostus, pirmiausia turite atidžiai apsvarstyti šią iliustraciją.

„Atmega168“ mikrovaldiklių prievadai

Galbūt kažkas aiškiau išnagrinės uostus tokia forma (tas pats paveikslėlyje, bet kitokiu dizainu):

„Atmega328“ mikrovaldiklių prievadai

Čia matote Arduino išvadų ir Atmega uostų pavadinimų atitikimą. Taigi, mes turime 3 prievadus:

  • PORTBAS;

  • PORTCAS;

  • PORTD.

Remdamasis vaizdais sudariau Arduino ir Atmega uostų korespondencijos lentelę, ji jums bus naudinga ateityje.

Uostų „Arduino“ ir „Atmega“ atitikties lentelė

„Atmega“ turi tris 8 bitų registrus, kurie kontroliuoja prievadų būklę, pavyzdžiui, uostas B išsiaiškins jų paskirtį nubraižydamas analogijas su standartiniais laidų įrankiais, aprašytais šio straipsnio pradžioje:

  • PORTB - tvarkykite išvesties būseną. Jei kaištis yra „Išvesties“ režime, tada 1 ir 0 nustato tų pačių signalų buvimą išvestyje. Jei kaištis yra „įvesties“ režime, tada 1 jungia ištraukiamąjį varžą (tokį pat, kaip aukščiau aptartą INPUT_PULLUP), jei 0 yra didelės varžos būsena (INPUT analogas);

  • PINB yra skaitymo registras. Atitinkamai, joje yra informacijos apie dabartinę prievado kaiščių būseną (loginis vienetas arba nulis).

  • DDRB - uosto krypčių registras. Su juo jūs mikrovaldikliui nurodote, ar prievadas yra įvestis, ar išėjimas, „1“ išėjimas ir „0“ įėjimas.

Vietoj raidės „B“ gali būti bet kuri kita pagal prievadų pavadinimus, pavyzdžiui, panašiai veikia ir kitos komandos PORTD arba PORTC.

Mirksime šviesos diodu, pakeisime standartinę „digitalWrite“ () funkciją. Pirmiausia prisiminkime, kaip atrodo originalus pavyzdys iš „Arduino IDE“ bibliotekos.

„Arduino“ LED indikatorius mirksi

Tai gerai žinomo „mirksėjimo“ kodas, parodantis, kad mirksi LED, įmontuota į plokštę.

Smeigtukų valdymas

Komentaruose paaiškinamas kodas. Šio darbo logika yra tokia.

Komanda PORTB B00100000 nustato PB5 loginio mazgo būseną, pažiūrėkite, o žemiau esančias nuotraukas ir lentelę pamatysite, kad PB5 atitinka 13 Arduinos smeigtukų.

Raidė „B“ prieš skaičius rodo, kad vertes rašome dvejetainėje formoje. Numeravimas dvejetainiu būdu eina iš dešinės į kairę, t. čia blokas yra šeštajame bitų taške nuo dešiniojo bito krašto, kuris mikrokontroleriui praneša apie sąsajas su šeštojo bitų porto B registre (PB5) būsena. Žemiau esančioje lentelėje parodyta D prievado struktūra, ji yra panaši ir pateikiama kaip pavyzdys.

D uosto struktūra

Galite nustatyti vertę ne dvejetainiu, o šešioliktainiu pavidalu, pavyzdžiui, atidarome „Windows“ skaičiuoklę ir „VIEW“ režimu pasirinkite parinktį „Programuotojas“.

„Windows“ skaičiuoklė

Įveskite norimą numerį:

Programuotojo skaičiuoklės režimas

Ir spustelėkite HEX:

Skaičių vertimas skaičiuotuve

Tokiu atveju mes visa tai perkeliame į „Arduino IDE“, tačiau vietoj priešdėlio „B“ jis bus „0x“.

Numerio perkėlimas Arduino IDE

Bet dėl ​​šios informacijos yra problema. Jei turite ką nors prijungtą prie kitų kaiščių, tada įveskite tokią komandą kaip B00010000 - iš naujo nustatysite visus kaiščius, išskyrus 13 (PB5). Kiekvieno segmento duomenis galite įvesti atskirai. Tai atrodys taip:

Duomenų įvedimas į kiekvieną smeigtuką

Toks įrašas gali atrodyti nesuprantamas, išsiaiškinkime.

Įrašo analizė

Tai logiška papildymo operacija, | = reiškia ką nors pridėti prie uosto turinio.

Loginio papildymo operacija

Tai reiškia, kad registre turite pridėti 8 bitų žodį, kurio vienetas pasislinks 5 bitais - kaip rezultatas, jei 11000010 pasirodys 110 110 010. Šiame pavyzdyje galima pamatyti, kad pasikeitė tik PB5, likę šio registro bitai liko nepakitę, taip pat Mikrokontrolerio kaiščių būklė nepakito.

Tačiau logiškai pridedant iškyla problema - jūs negalite paversti įrenginio nuliu, nes:

0+0=1

1+0=1

0+1=1

Mums pasitarnaus loginis daugyba ir inversija:

Loginis daugyba ir apvertimas

& = reiškia uosto turinio padauginimą iš konkretaus skaičiaus.

 

Uosto turinį padauginus iš skaičiaus

Ir tai yra skaičius, kurį mes dauginame. Ženklas „~“ rodo inversiją. Mūsų atveju apverstas vienetas yra lygus nuliui. T. y., Uosto turinį padauginame iš nulio, perkeltą 5 bitais. Pavyzdžiui, jis buvo 10110001, jis tapo 10100001. Likę bitai liko nepakitę.

Padauginkite prievado turinį nuliu, perkeltu 5 bitais

Tą patį galima padaryti naudojant apverstą operaciją (^):

Skaitant iš uostų, „digitalRead“ () analogas atliekamas naudojant PIN registrą, praktiškai atrodo taip:

Skaitykite iš uostų

Čia mes patikriname, ar skliausteliuose esanti išraiška lygi realiai prievadų būklei, t. panašiai, jei rašėme if (digitalRead (12) == 1).


Išvada

Kodėl kyla tokių sunkumų, susijusių su uosto valdymu, jei galite naudoti standartines patogias funkcijas? Viskas priklauso nuo greičio ir kodo dydžio. Taikant antrąjį metodą, aptartą straipsnyje, kodo dydis žymiai sumažėja, o greitis padidėja keliomis eilėmis. Standartinis „digitalWrite“ () buvo atliktas 1800 μs, o įrašymas tiesiai į prievadą - 0,2 μs, o „digitalRead“ () - 1900 μs, o taip pat tapo 0,2 μs. Šis valdymo metodas buvo rastas atvirose tinklo vietose ir dažnai aptinkamas kode. baigti projektai.

Taip pat žiūrėkite tinklalapyje i.electricianexp.com:

  • „Arduino“ prijungimas ir programavimas pradedantiesiems
  • Kaip prisijungti prie Arduino prieauginį kodą
  • PIC mikrovaldikliai pradedantiesiems
  • Mikrovaldiklio nuotolinio valdymo pultas: IR nuotolinio valdymo pultas, „Arduino“, ESP8266, 433 ...
  • Temperatūros ir drėgmės matavimas Arduino - įvairių būdų pasirinkimas

  •  
     
    Komentarai:

    # 1 rašė: Kipovets | [citata]

     
     

    "Tačiau logiškai pridėjus iškyla problema - jūs negalite paversti įrenginio nuliu, nes:

    0 + 0 = 1 “(c)

    Maža priežiūra: 0 + 0 = 0.

     
    Komentarai:

    # 2 rašė: čugou | [citata]

     
     

    Kipovets, jis tikriausiai norėjo pasakyti:

    1 + 1 = 1

     
    Komentarai:

    # 3 rašė: | [citata]

     
     

    Kipovets,
    Banalu rašybos klaida! Jūs matote, kaip gerai, kad specialistai sėdi mūsų portale! Jūs turite sukurti tik tinkamą turinį!

     
    Komentarai:

    # 4 rašė: Sergas | [citata]

     
     

    Paskutinėje dalyje sakoma: PORTB | = 1 << 5 ... if (digitalRead (12) == 1). Bet 5 smeigtukai uosto B, tai 13 smeigtukai arduino. O gal aš klystu ?!

     
    Komentarai:

    # 5 rašė: p-a-h-a | [citata]

     
     

    Jei (PINB == B00010000) {} nėrapanašus į, jei rašėme if (digitalRead (12) == 1)
    veikiau analogiška
    („digitalRead“ (12) == 1) &&(„digitalRead“ (13) == 1) &&(„digitalRead“ (14) == 1) &&(„digitalRead“ (15) == 1) &&(„digitalRead“ (11) == 1) ... taigi 8 prievadų kaiščiai

    Čia jums reikia arba šio:
    jei (
    ! (~ PORTB & (1 << PB4))) {} //grįžta0 arba 1
    arba taip:
    jei (PORTB & (1 << PB4)) {} // grąžina perkeltą vienetą = 16, DEC
    arba taip:
    jei (
    bit_is_set (PORTB, 4)) {}// grąžina perkeltą vienetą = 16, DEC