luokat: Mikrokontrolleripiirit
Katselukertoja: 41940
Kommentit artikkeliin: 5

Menetelmät Arduino I / O -porttien lukemiseen ja hallintaan

 

Jos haluat olla vuorovaikutuksessa ulkomaailman kanssa, sinun on määritettävä mikrokontrollerin lähdöt signaalin vastaanottamiseen tai lähettämiseen. Seurauksena on, että jokainen tappi toimii tulo- ja lähtötilassa. Kaikilla rakastamillasi Arduino-levyillä on kaksi tapaa tehdä tämä, miten opit tästä artikkelista.

Menetelmät Arduino I / O -porttien lukemiseen ja hallintaan

Menetelmä yksi - Arduino IDE: n standardikieli

Kaikki tietävät sen Työläs Se on ohjelmoitu C ++: een joitain mukautuksia ja yksinkertaistuksia aloittelijoille. Sitä kutsutaan johdotukseksi. Aluksi kaikki arduino-portit määritellään tuloiksi, eikä sitä tarvitse määritellä koodissa.

Portit kirjoitetaan yleensä muuttujan alustusfunktiossa:

tyhjä asennus ()
{
// koodi
}

Tätä varten käytetään pinMode-komentoa, sillä on melko yksinkertainen syntaksi, ensin ilmoitetaan porttinumero, sitten sen rooli erotetaan pilkuilla.

pinMode (nomer_porta, naznachenie)

Tällä komennolla mikrokontrollerin sisäinen piiri konfiguroidaan tietyllä tavalla.

On olemassa kolme tilaa, joissa portti voi toimia: INPUT - tulo, tässä tilassa tapahtuu tietojen lukeminen antureilta, painikkeen tila, analoginen ja digitaalinen signaali. Satama sijaitsee ns korkea impedanssitila, yksinkertaisin sanoin - tulolla on korkea vastus. Tämä arvo asetetaan esimerkiksi tarvittaessa 13 kortin tappiin seuraavasti:

pinMode (13, INPUT);

OUTPUT - lähtö, koodissa määrätyn komennon mukaan portin arvo on yksi tai nolla. Lähdöstä tulee eräänlainen ohjattu virtalähde ja tuottaa maksimivirtaan (tässä tapauksessa 20 mA ja 40 mA huipussa) kytkettynä kuormaan. Jos haluat määrittää portin lähtöksi Arduinolle, sinun on annettava:

pinMode (13, OUTPUT);

INPUT_PULLUP - portti toimii tulona, ​​mutta ns yhdistää sen. 20 kΩ vetovastus.

Tässä tilassa portin ehdolliset sisäiset piirit on esitetty alla. Tämän tulon piirre on, että tulosignaali havaitaan käänteisenä (mikro-ohjain havaitsee tulossa olevan yksikön "nollaksi"). Tässä tilassa et voi käyttää ulkoisia vetovastuksia kun työskentelet painikkeilla.

pinMode (13, INPUT_PULLUP);

Sisäänvedettävä vastus

Tiedot vastaanotetaan porteista ja välitetään niille komennoilla:

  • digitalWrite (nasta, arvo) - muuntaa lähtötapin loogiseksi 1 tai 0, vastaavasti 5 V jännite tulee näkyviin tai häviää, esimerkiksi digitalWrite (13, HIGH) - syöttää 5 volttia (looginen yksikkö) 13 nastaan ​​ja digitalWrite (13, alhainen) ) - kääntää 13 nastaa loogisen nollan tilaan (0 volttia);

  • digitalRead (pin) - lukee arvon tulosta, esimerkki digitalRead (10), lukee signaalin 10 nastaa;

  • analogRead (pin) - lukee analogisen signaalin analogisesta portista, saat arvon välillä 0-1023 (10-bittisessä ADC: ssä), esimerkki on analogRead (3).


Tapa 2 - hallitse portteja Atmega-rekistereiden avulla ja nopeuta koodia

Tällainen ohjaus on tietysti yksinkertainen, mutta tässä tapauksessa on kaksi haittaa - suurempi muistin kulutus ja huono suorituskyky porttien kanssa työskennellessä. Mutta muista mikä on Arduino riippumatta lisäkortista (uno, micro, nano)? Ensinnäkin tämä mikrokontrolleri AVR-perhe ATMEGA, äskettäin käytetty MK atmega328.

Arduino IDE: ssä voit ohjelmoida äidinkielelläsi tälle C AVR -perheelle, kuin työskentelisit erillisen mikrokontrollerin kanssa. Mutta ensin ensin. Jos haluat hallita Arduinon satamia tällä tavalla, sinun on ensin harkittava huolellisesti seuraavaa kuvaa.

Atmega168-mikrokontrollerportit

Ehkä joku tutkii selkeämmin satamat tässä muodossa (sama kuvassa, mutta eri muodossa):

Atmega328-mikrokontrollerportit

Täällä näet Arduinon päätelmien ja satamien nimien vastaavuuden. Joten, meillä on 3 porttia:

  • PORTB;

  • PORTC;

  • PORTD.

Esitettyjen kuvien perusteella olen laatinut taulukon kirjeenvaihdosta Arduinon ja Atmega-satamien välillä, siitä on sinulle hyötyä tulevaisuudessa.

Satamien vastaavuustaulukko Arduino ja Atmega

Atmegalla on kolme 8-bittistä rekisteriä, jotka ohjaavat porttien tilaa, esimerkiksi portti B selvittää niiden tarkoituksen piirtämällä analogioita tämän artikkelin alussa kuvattujen vakiojohdotustyökalujen kanssa:

  • PORTB - Hallitse lähtötilaa. Jos nasta on "lähtö" -tilassa, 1 ja 0 määrittävät samojen signaalien läsnäolon lähdössä. Jos tappi on “syöttö” -tilassa, silloin 1 yhdistää vetovastuksen (sama kuin yllä selostettu INPUT_PULLUP), jos 0 on korkean impedanssin tila (INPUTin analogi);

  • PINB on luettu rekisteri. Siksi se sisältää tietoja porttitappien nykytilasta (looginen yksikkö tai nolla).

  • DDRB - portin suuntarekisteri. Sen avulla osoitat mikro-ohjaimelle, mikä portti on tulona tai ulostulona, ​​“1” -lähdöllä ja “0” -sisääntulolla.

B-kirjaimen sijasta porttien nimien mukaan voi olla muitakin, esimerkiksi PORTD- tai PORTC-komennot toimivat samalla tavalla.

Vilkutamme merkkivaloa, korvaamme standardin digitalWrite () toiminnon. Ensin muistetaan, miltä alkuperäinen esimerkki Arduino IDE -kirjasto näyttää.

Arduino LED-merkkivalo vilkkuu

Tämä on tunnetun ”vilkkumisen” koodi, joka osoittaa, että korttiin sisäänrakennettu LED vilkkuu.

Tappien hallinta

Kommentit selittävät koodin. Tämän työn logiikka on seuraava.

PORTB B00100000 -komento asettaa PB5: n loogisen yksikön tilaan, katso, ja ne kuvat ja taulukko, jotka sijaitsevat alla ja näkevät, että PB5 vastaa 13-nastaista Arduinaa.

B-kirjain numeroiden edessä osoittaa, että kirjoitamme arvot binaarimuodossa. Numerointi binaarissa kulkee oikealta vasemmalle, ts. tässä yksikkö on kuudennessa bitissä bitin oikeasta reunasta, mikä kertoo mikro-ohjaimelle vuorovaikutuksesta portti B -rekisterin (PB5) kuudennen bitin tilan kanssa. Seuraavassa taulukossa esitetään portin D rakenne, se on samanlainen ja on annettu esimerkkinä.

Portin D rakenne

Voit asettaa arvon ei binaarisena, vaan heksadesimaalimuodossa, esimerkiksi avaamme tälle Windows-laskimen ja valitse ”VIEW” -tilassa ”Ohjelmoija” -vaihtoehdon.

Windows-laskin

Kirjoita haluamasi numero:

Ohjelmoija Laskin-tila

Napsauta HEX:

Numeroiden kääntäminen laskurilla

Tässä tapauksessa siirrämme kaiken tämän Arduino IDE: lle, mutta etuliitteen "B" sijaan se on "0x".

Numeronsiirto Arduino IDE: ssä

Mutta tällä syötteellä on ongelma. Jos sinulla on jotain kytkettyä muihin nastaihin, kirjoittamalla komento kuten B00010000 - nollaat kaikki nastat paitsi 13 (PB5). Voit kirjoittaa tiedot jokaiselle nastalle erikseen. Se näyttää tältä:

Tietojen syöttäminen kuhunkin nastaan

Tällainen tietue voi tuntua käsittämättömältä, selvitetään se.

Tietueen jäsentäminen

Tämä on looginen lisäysoperaatio, | = tarkoittaa jotain lisäämistä portin sisältöön.

Looginen lisäysoperaatio

Tämä tarkoittaa, että sinun on lisättävä rekisteriin 8 bitin sana yksiköllä, jota on siirretty 5 bitillä - seurauksena, jos 11000010 osoittautuu 110 110 010. Tässä esimerkissä voidaan nähdä, että vain PB5 on muuttunut, tämän rekisterin jäljellä olevat bitit ovat pysyneet muuttumattomina. Mikrokontrollerin tapien tila pysyi ennallaan.

Mutta loogisella lisäyksellä syntyy ongelma - et voi muuttaa yksikköä nollaan, koska:

0+0=1

1+0=1

0+1=1

Looginen kertolasku ja inversio tulevat apuamme:

Looginen kertolasku ja käänteinen

& = tarkoittaa kertoa portin sisältö tietyllä numerolla.

 

Kertomalla portin sisältö luvulla

Ja tämä on luku, jolla kerrotaan. ~ ~ -Merkki osoittaa käännöksen. Meidän tapauksessamme käänteinen yksikkö on nolla. Eli kerrotaan portin sisältö nollalla, siirtämällä 5 bittiä. Esimerkiksi se oli 10110001, siitä tuli 10100001. Loput bitit pysyivät ennallaan.

Kerro portin sisältö nollalla, siirtämällä 5 bittiä

Sama voidaan tehdä käänteisoperaatiolla (^):

Lukeminen porteista, digitalRead () -analogi suoritetaan PIN-rekisterillä, käytännössä se näyttää tältä:

Lue porteista

Tässä tarkistetaan, onko sulkeissa oleva lauseke sama kuin porttien todellinen tila, ts. samoin, jos kirjoitimme if (digitalRead (12) == 1).


johtopäätös

Miksi satamahallinnassa on niin vaikeuksia, jos pystyt käyttämään tavallisia käteviä toimintoja? Kyse on nopeudesta ja koodikoosta. Kun käytetään toista, artikkelissa käsiteltyä menetelmää, koodikoko pienenee merkittävästi ja nopeus kasvaa useilla suuruusluokilla. Standardi digitalWrite () suoritettiin 1800 μs, ja tallennus suoraan porttiin 0,2 μs, ja digitalRead () 1900 μs, ja tuli myös 0,2 μs. Tämä ohjausmenetelmä löytyi verkon avoimista tiloista ja löytyy usein koodista. valmiit projektit.

Katso myös osoitteesta i.electricianexp.com:

  • Arduinon kytkeminen ja ohjelmointi aloittelijoille
  • Kuinka kytkeä inkrementaalianturi Arduinoon
  • PIC-mikro-ohjaimet aloittelijoille
  • Mikrokontrollerin kaukosäädin: IR-kaukosäädin, Arduino, ESP8266, 433 ...
  • Lämpötilan ja kosteuden mittaaminen Arduinolla - valikoima menetelmiä

  •  
     
    kommentit:

    # 1 kirjoitti: Kipovets | [Cite]

     
     

    "Mutta loogisella lisäyksellä syntyy ongelma - et voi muuttaa yksikköä nollaan, koska:

    0 + 0 = 1 "(c)

    Pieni valvonta: 0 + 0 = 0.

     
    kommentit:

    # 2 kirjoitti: chugou | [Cite]

     
     

    Kipovets, hän todennäköisesti halusi sanoa:

    1 + 1 = 1

     
    kommentit:

    # 3 kirjoitti: | [Cite]

     
     

    Kipovets,
    Banaali kirjoitusvirhe! Näet kuinka hyvä on, että asiantuntijat istuvat portaalissamme! Sinun on tehtävä vain sopivaa sisältöä!

     
    kommentit:

    # 4 kirjoitti: Serg | [Cite]

     
     

    Viimeisessä osassa sanotaan PORTB | = 1 << 5 ... if (digitalRead (12) == 1). Mutta 5 nastaa portista B, se on 13 nasta arduinoa. Vai olenko erehtynyt ?!

     
    kommentit:

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

     
     

    Jos (PINB == B00010000) {} ei olesamanlainen kuin jos kirjoitimme if (digitalRead (12) == 1)
    melko analoginen
    (digitalRead (12) == 1) &&(digitalRead (13) == 1) &&(digitalRead (14) == 1) &&(digitalRead (15) == 1) &&(digitalRead (11) == 1) ... ja niin 8 porttinastaa

    Täällä tarvitset joko tämän:
    jos (
    ! (~ PORTB & (1 << PB4))) {} //tuotto0 tai 1
    joko näin:
    jos (PORTB & (1 << PB4)) {} // palauttaa siirretyn yksikön = 16, DEC
    joko näin:
    jos (
    bit_is_set (PORTB, 4)) {}// palauttaa siirretyn yksikön = 16, DEC