kategória: Obvody mikrokontrolérov
Počet zobrazení: 41940
Komentáre k článku: 5

Metódy čítania a správy vstupov / výstupov Arduino

 

Ak chcete pracovať s vonkajším svetom, musíte nakonfigurovať výstupy mikrokontroléra na príjem alebo prenos signálu. Výsledkom bude, že každý pin bude pracovať v režime vstupu a výstupu. Existujú dva spôsoby, ako to urobiť na každej doske Arduino, ktorú máte radi, presne ako sa dozviete z tohto článku.

Metódy čítania a správy vstupov / výstupov Arduino

Metóda jedna - Štandardný jazyk pre Arduino IDE

Každý to vie Arduino Je naprogramovaný v jazyku C ++ s určitými úpravami a zjednodušením pre začiatočníkov. Hovorí sa tomu Wiring. Spočiatku sú všetky porty arduino definované ako vstupy a nie je potrebné ich špecifikovať v kóde.

Porty sa zvyčajne zapisujú vo funkcii inicializácie premenných:

neplatné nastavenie ()
{
// kód
}

Používa sa na to príkaz pinMode, má pomerne jednoduchú syntax, najskôr sa uvedie číslo portu, potom sa jeho úloha oddelí čiarkami.

pinMode (nomer_porta, naznachenie)

Týmto príkazom je vnútorný obvod mikrokontroléra nakonfigurovaný špecifickým spôsobom.

Port môže pracovať v troch režimoch: INPUT - vstup, v tomto režime sa vyskytuje čítanie údajov zo senzorov, stav tlačidla, analógový a digitálny signál. Port sa nachádza v tzv stav vysokej impedancie, jednoduchými slovami - vstup má vysoký odpor. Táto hodnota sa napríklad nastaví napríklad na 13 kolíkov dosky:

pinMode (13, INPUT);

OUTPUT - výstup, v závislosti od príkazu predpísaného v kóde, má port hodnotu jedna alebo nula. Výstup sa stáva akýmsi regulovaným zdrojom energie a vytvára maximálny prúd (v našom prípade 20 mA a 40 mA na špičke) pripojený k záťaži. Ak chcete priradiť port ako výstup Arduino, musíte zadať:

pinMode (13, VÝSTUP);

INPUT_PULLUP - port funguje ako vstup, ale k nemu sa pripája tzv. 20 kΩ pull-up odpor.

Podmienené vnútorné obvody portu v tomto stave sú uvedené nižšie. Znakom tohto vstupu je, že vstupný signál je vnímaný ako prevrátený (mikrokontrolér vníma „jednotku“ na vstupe ako „nula“). V tomto režime nemôžete použiť externé pull-up odpory pri práci s tlačidlami.

pinMode (13, INPUT_PULLUP);

Vstupný pull-up odpor

Dáta sú prijímané z portov a prenášané na ne príkazmi:

  • digitalWrite (pin, value) - prevádza výstupný pin na logický 1 alebo 0, na výstupe sa objaví alebo zmizne napätie 5V, napríklad digitalWrite (13, HIGH) - dodáva 5 voltov (logická jednotka) na 13 pinov a digitalWrite (13, nízka) ) - prevádza 13 pinov do stavu logickej nuly (0 voltov);

  • digitalRead (pin) - načíta hodnotu zo vstupu, napríklad digitalRead (10), načíta signál z 10 pinov;

  • analogRead (pin) - číta analógový signál z analógového portu, hodnota je v rozsahu od 0 do 1023 (v rámci 10-bitového ADC), príkladom je analogRead (3).


Druhá metóda - správa portov prostredníctvom registrov Atmega a zrýchlenie kódu

Takáto kontrola je samozrejme jednoduchá, ale v tomto prípade existujú dve nevýhody - vyššia spotreba pamäte a zlý výkon pri práci s portmi. Pamätáte si však, čo je Arduino, bez ohľadu na voliteľnú dosku (uno, micro, nano)? Po prvé, toto mikrokontrolér rodiny AVR ATMEGA, nedávno použité MK atmega328.

V Arduino IDE môžete naprogramovať jazyk C AVR pôvodný pre túto rodinu, akoby ste pracovali so samostatným mikrokontrolérom. Ale prvé veci ako prvé. Ak chcete spravovať porty Arduino týmto spôsobom, musíte najskôr dôkladne zvážiť nasledujúci obrázok.

Porty mikrokontroléra Atmega168

Možno niekto jasnejšie preskúma prístavy v tejto podobe (rovnaké na obrázku, ale v inom prevedení):

Porty mikrokontroléra Atmega328

Tu vidíte korešpondenciu záverov Arduina a názvy prístavov atmega. Máme 3 porty:

  • Portbou;

  • PORTC;

  • PORTD.

Na základe zobrazených obrázkov som zostavil tabuľku korešpondencie medzi prístavmi Arduino a Atmega, ktorá bude pre vás v budúcnosti užitočná.

Tabuľka zhody portov Arduino a Atmega

Atmega má tri 8-bitové registre, ktoré kontrolujú stav portov, napríklad port B zistí svoj účel vykreslením analógií pomocou štandardných elektroinštalačných nástrojov opísaných na začiatku tohto článku:

  • PORTB - Správa stavu výstupu. Ak je kolík v režime „Výstup“, potom 1 a 0 určujú prítomnosť rovnakých signálov na výstupe. Ak je kolík v režime „Input“, potom 1 pripája pull-up odpor (rovnaký ako vyššie uvedený INPUT_PULLUP), ak 0 je stav s vysokou impedanciou (analóg INPUT);

  • PINB je register na čítanie. Podobne obsahuje informácie o aktuálnom stave kolíkov portu (logická jednotka alebo nula).

  • DDRB - register smeru portu. Týmto označíte mikrokontroléru, či je port vstupom alebo výstupom, „1“ ako výstup a „0“ ako vstup.

Namiesto písmena „B“ môžu existovať aj ďalšie názvy podľa názvov portov, napríklad PORTD alebo PORTC môžu pracovať aj iné príkazy.

Blikáme LED, namiesto štandardnej funkcie digitalWrite (). Najprv si pripomeňme, ako vyzerá originálny príklad z knižnice Arduino IDE.

Blikajúci kód LED Arduino

Toto je kód známeho „blikania“, ktorý ukazuje blikanie LED zabudovanej v doske.

Správa pinov

Poznámky vysvetľujú kód. Logika tejto práce je nasledovná.

Príkaz PORTB B00100000 uvádza PB5 do stavu logickej jednotky, vzhľad a tieto obrázky a tabuľka sú umiestnené a vidíme, že PB5 zodpovedá 13 pinom Arduiny.

Písmeno „B“ pred číslami znamená, že hodnoty píšeme binárne. Číslovanie v binárnom formáte prebieha zprava doľava, t. tu je jednotka v šiestom bite od pravého okraja bitu, ktorý hovorí mikrokontroléru o interakcii so stavom šiesteho bitu registra B portov (PB5). Nasledujúca tabuľka ukazuje štruktúru portu D, je podobná a je uvedená ako príklad.

Štruktúra prístavu D

Hodnotu môžete nastaviť nie binárne, ale v hexadecimálnej podobe, napríklad otvoríme kalkulačku okien a v režime „VIEW“ vyberte možnosť „Programátor“.

Kalkulačka systému Windows

Zadajte požadované číslo:

Režim kalkulačky programátora

A kliknite na HEX:

Preklad čísel na kalkulačke

V tomto prípade všetko prevedieme do Arduino IDE, ale namiesto predpony „B“ to bude „0x“.

Prenos čísla v Arduino IDE

S týmto vstupom je však problém. Ak máte niečo pripojené k iným pinom, potom zadáte príkaz ako B00010000 - vynulujete všetky piny okrem 13 (PB5). Údaje pre každý špendlík môžete zadať jednotlivo. Vyzerá to takto:

Zadávanie údajov do každého špendlíka

Takýto záznam sa môže zdať nepochopiteľný, poďme na to.

Analyzuje sa záznam

Toto je logická operácia sčítania | = znamená pridať niečo k obsahu portu.

Logická operácia sčítania

To znamená, že do registra musíte pridať slovo 8 bitov s jednotkou posunutou o 5 bitov - v dôsledku toho, ak sa ukáže, že 11000010 je 110 110 010. V tomto príklade je vidieť, že iba PB5 sa zmenil, zostávajúce bity tohto registra zostali nezmenené, ako aj Stav kolíkov mikrokontroléra zostal nezmenený.

S logickým pridaním však vzniká problém - jednotku nemôžete zmeniť na nulu, pretože:

0+0=1

1+0=1

0+1=1

Pomôže nám logické znásobenie a inverzia:

Logické násobenie a inverzia

& = znamená vynásobiť obsah prístavu konkrétnym číslom.

 

Násobenie obsahu portov číslom

A toto je číslo, ktoré vynásobíme. Znak „~“ označuje inverziu. V našom prípade je obrátená jednotka nula. To znamená, že vynásobíme obsah portu nulou, posunutou o 5 bitov. Napríklad to bolo 10110001, stalo sa 10100001. Zostávajúce bity zostali nezmenené.

Vynásobte obsah portu nulou posunutou o 5 bitov

To isté sa dá urobiť pomocou operácie prevrátenia (^):

Čítanie z portov, analóg digitalRead () sa vykonáva pomocou registra PIN, v praxi to vyzerá takto:

Čítanie z portov

Tu skontrolujeme, či sa výraz v zátvorkách rovná skutočnému stavu portov, t. podobne, ak by sme napísali if (digitalRead (12) == 1).


záver

Prečo existujú také problémy so správou portov, ak môžete používať štandardné užitočné funkcie? Je to všetko o rýchlosti a veľkosti kódu. Pri použití druhej metódy diskutovanej v článku je veľkosť kódu výrazne znížená a rýchlosť sa zvyšuje o niekoľko rádov. Štandardný digitalWrite () bol vykonaný v 1800 μs a zaznamenávaný priamo do portu v 0,2 μs, a digitalRead () v 1900 μs, a tiež sa zmenil na 0,2 μs. Táto metóda riadenia bola nájdená na otvorených priestoroch siete a často sa nachádza v kóde. ukončené projekty.

Pozri tiež na bgv.electricianexp.com:

  • Pripojenie a programovanie Arduino pre začiatočníkov
  • Ako pripojiť inkrementálny kodér k Arduino
  • Mikrokontroléry PIC pre začiatočníkov
  • Diaľkové ovládanie mikrokontroléra: IR diaľkové ovládanie, Arduino, ESP8266, 433 ...
  • Meranie teploty a vlhkosti na Arduino - výber metód

  •  
     
    komentár:

    Napísal # 1: Kipovets | [Uviesť]

     
     

    „Ale s logickým prírastkom nastáva problém - jednotku nemôžete zmeniť na nulu, pretože:

    0 + 0 = 1 "(c)

    Malý dohľad: 0 + 0 = 0.

     
    komentár:

    Napísal # 2: chugou | [Uviesť]

     
     

    Kipovets, pravdepodobne chcel povedať:

    1 + 1 = 1

     
    komentár:

    Napísal # 3: [Uviesť]

     
     

    Kipovets,
    Banal preklep! Vidíte, aké je dobré, že na našom portáli sedí špecialisti! Musíte vytvoriť iba vhodný obsah!

     
    komentár:

    Napísal # 4: Serg | [Uviesť]

     
     

    V záverečnej časti hovorí PORTB | = 1 << 5 ... if (digitalRead (12) == 1). Ale 5 pin portu B, to je 13 pin arduino. Alebo sa mýlim?!

     
    komentár:

    Napísal # 5: p-a-h-a | [Uviesť]

     
     

    Ak (PINB == B00010000) {} nie jepodobné, ako keby sme napísali if (digitalRead (12) == 1)
    skôr analógový
    (digitalRead (12) == 1) &&(digitalRead (13) == 1) &&(digitalRead (14) == 1) &&(digitalRead (15) == 1) &&(digitalRead (11) == 1) ... a tak 8 pinov portu

    Tu potrebujete buď toto:
    ak (
    ! (~ PORTB & (1 << PB4))) {} //výnos0 alebo 1
    buď takto:
    ak (PORTB & (1 << PB4)) {} // vráti posunutú jednotku = 16, DEC
    buď takto:
    ak (
    bit_is_set (PORTB, 4)) {}// vráti posunutú jednotku = 16, DEC