Tartalom:
- Hogyan vigyünk át adatokat kevés vezetéken, bitek továbbítása sorban egymás után, soros port
- Start bit, adatbitek, stop bit
- RX és TX jelvezetékek
- Átviteli sebesség
- Szabványos jelszintek
——————————————————————
Az Arduino mikrovezérlőjén van két olyan kivezetés (D0 és D1), amelyeknek megkülönböztetett funkciójuk van. A két kivezetést együtt soros portnak hívjuk. Az egyik kivezetés az adatokat fogadja (Rx – receiver), a másik pedig küldi (Tx – transmitter). A soros átvitel bitenként zajlik, vagyis egy időben egyetlen bit halad át a vezetéken. Ennek megfelelően a kommunikáció sebességét a másodpercenként átvitt bitek számával mérjük. Az Arduino maximális átviteli sebessége 115200 bit másodpercenként.
Az adatok ugyan bitenként, de egymástól jól elhatárolható csomagokban közlekednek. Ezek az adat csomagok START jelből, 8 bit adatból (1 byte) és két STOP jelből állnak, melyeket az adatvezetéken megjelenő feszültség jelképez.
Adó egység működése: Nyugalmi állapotban az adó egység magas jelszintet tart a jelvezetéken. Ez kb 5V feszültséget jelent. Amikor adatokat akar átadni, meghatározott időre 0V-ot kapcsol a jelvezetékre. Ez a start jelzés. Ezt követően meghatározott időközönként 0V és 5V feszültségeket kapcsol a jelvezetékre attól függően, hogy az átadni kívánt byte-nak melyik bitje 0 és melyik 1. Az átvitel a legkisebb helyi értékű bittel kezdődik. Ha az adó végzett mind a nyolc bittel, akkor két időegységnyi stop jelzés következik, hogy a vevő alaphelyzetbe tudjon állni, és ezzel vége a az adott byte átvitelének.
Vevő egység működése: Mivel a vevő egység nem tudja, hogy mikor következik adatok küldése, folyamatosan figyeli az adatvezeték feszültségét. Mindaddig amig 5V-ot talál, addig várakozik. A start bit értelem szerűen egy 0V-os feszültség érték. A vevő ekkor a start bit megjelenését követően meghatározott időközönként megnézi a jelvezeték feszültségét. Ha éppen 0V-ot talál, akkor az LOW, ha 5V körüli értéket, akkor az HIGH. Mivel 8 bitet akarunk átvinni, 8 alkalommal néz a vonalra. Az időpillanatokat a vevő saját maga időzíti, ezért nem árt, ha az adó és a vevő áramkör órája ugyanolyan gyorsan ketyeg. Nagyon fontos, hogy az adás és a vétel sebessége azonos legyen. A nyolc bit vétele után a vevő még egy alkalommal ránéz a vonalra, és ellenőrzi a két időegységnyi stop jelzés meglétét. Ha ekkor alacsony feszültséget talál a vonalon, akkor hiba van. Mivel a jelvezetékek hossza és a környezet zavarjel impulzusai megzavarhatják az adatátvitelt, különböző sebességeket lehet beállítani. Zavarjelekkel terhelt nagyon hosszú jelvezetékeken az átviteli sebesség legyen kicsi (pl. 9600 bit/sec vagy még kisebb), míg rövid vezetékeken lehet a maximum.
Az univerzális aszinkron soros adatküldés és fogadás története a géptávírók koráig nyúlik vissza. Akkoriban nagyon kicsi sebességekkel dolgoztak, úgy emlékszem 110 bit/sec volt a jellemző sebesség. Egy villanymotor által forgatott mechanikus tengelyen elhelyezett érintkezők állították elő a jelsorozatot a leütött billentyű alapján. Az adó és a vevő egység sebességét össze kellett hangolni. Ehhez a forgó tengelyre szerelt korong nyújtott segítséget. A korongra csíkokat festettek, és ha azt egy rezgésbe hozott hangvilla által nyíló és záródó résen át nézték, akkor megfelelő sebességnél a csíkokat állni látták. A villanymotor fordulatszámát addig változtatták, amíg a csíkok álltak. Már csak a vevő és adó egységnél használt hangvilláknak kellett azonosnak lenniük, hogy szinkronban legyenek a szerkezetek. No meg sokat kellett ellenőrizni a villanymotor sebességét. Akkoriban a kicsi átviteli sebesség miatt nem nagyon kellett átviteli hibákkal foglalkozni. Ahogyan nőtt a sebesség, már előfordult, hogy az átvitel során egy-egy bit megsérült, pl. 0 helyett a vevő 1-et olvasott egy zavarimpulzus miatt. Ezért idővel a soros kommunikációban megjelentek az átvitel helyességét ellenőrző megoldások. A nyolc értékes bit mellett még egy 9. bitet is átvittek, ez a paritás bit. Az elv egyszerű, összeadták a nyolc bit értékét, és az eredmény maradéka lett a paritás bit értéke. Vételkor is megismételték a nyolc bit összeadását, és kiszámolták a paritás értékét. Ha ez megegyezett az átküldött paritás értékével, akkor valószínűleg nem sérült az adat.
A paritás bit használta opció, kikapcsolható a használata, mert ez növeli a sebességet.
Az soros átvitel gyűjtőneve UART kommunikáció. Eredetileg bipoláris jelszintekkel történt az átvitel. Pl. az RS-232 szabvány szerint az ‘1’ -12 V és -5 V közötti, a ‘0’ pedig +12 V és +5 V közötti jelszint. A mikrovezérlők és a logikai IC-k világában azonban természetesebb megoldás az unipoláris jelszint alkalmazása: ‘1’ a digitális rendszer logikai magas jelszintje (+5 V, az egyes eszközöknél +3,3 V), a ‘0’ pedig az alacsony logikai szint (0 V). Tétlen állapotban, amikor nincs adatküldés, az adás vonalat (TX) mindig magas szint.
Egy bit időtartama az adatküldés sebességétől függ. A szabványos adatsebességek: 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 bit/s. Pl. A 9600 bit/s azt jelenti, hogy egy bitre 1 s/9600 = 0,00010416667 s, azaz 104,1667 µs idő jut. A start és stop (esetleg paritás) bitek miatt a hasznos adatok továbbítási sebessége kisebb, mint az aktuális adatküldési sebesség. Mivel a mikrovezérlők konkrét és kerek órajel frekvenciákkal dolgoznak (pl. az Arduino Uno 16Mhz), nem feltétlenül egyszerű feladat a pontos bitidők előállítása.
Ha megismerted az UART kommunikáció részletes működését, esetleg érdekelhet az I2C kommunikáció is. Kattints ide, ha igen!
Ha szeretnél gyakorlati példát látni arra, hogyan használhatod a soros portot Arduino programban, akkor kattints ide!