Fórum témák

» Több friss téma
Cikkek » Egyszerű soros kommunikáció AVR-rel (UART)
Egyszerű soros kommunikáció AVR-rel (UART)
Szerző: Fizikus, idő: Jún 12, 2010, Olvasva: 56950, Oldal olvasási idő: kb. 7 perc
Lapozás: OK   2 / 9

Soros kommunikáció (elmélet) 

A soros aszinkron adatátvitel lényegében különbözik más digitális adatátviteli módoktól, mert a kommunikáció nem tartalmazza az adatforgalom szinkronizálását végző közös “clock” órajelet. Nincs egy vezeték, ami az adást és a vételt összehangolja, ezért egy előre meghatározott frekvenciával kell mind az adatokat küldő készüléknek az adatot küldeni, mind a vevő készüléknek a bejövő adatból meghatározott időközönként mintát venni. Mielőtt 2 eszköz kommunikálni tudna egymással, a közöttük történő információcsere alapvető szabályait tisztázni kell.

A kommunikáció az alábbi 5 rétegre bontható le:

  • Fizikai réteg: ezen a csatlakozók kialakítását, tényleges fizikai paramétereit értjük (méret, forma, stb.).
  • Elektromos réteg: azt definiálja, hogy milyen feszültségszinteket használunk a kommuikációhoz.
  • Logikai réteg: azt definiálja, hogy melyik feszültségszint jelenti a logikai 1-et és melyik a logikai 0-át.
  • Adat réteg: definiálja a kommunikáció sebességét, azt, hogy a biteket 8, 9 vagy 10 bitből álló csoportokban küldjük-e. A csoportok előtt és után használunk-e speciális jelzőbiteket az adatcsoportok elkülönítésére.
  • Alkalmazási réteg: azt adja meg, hogy milyen sorrendben kell az egyes adatcsomagokat küldeni, hogyan szerveződnek az adatcsomagok üzenetekké.

FIZIKAI réteg

TTL

A TTL-UART-nál csak 3 vezeték kell a kétoldalú soros kommunikációhoz. Egy Adás (Transmit-TX) egy Vétel (Receive-RX) és egy közös föld (GND) vezeték. A TX vonalon küldjük el az adatot a másik eszköznek, és az RX vonalon a másik eszköz küld adatot nekünk.

RS232

Az RS-232 egy 9 pólusú ún. D-Sub csatlakozót használ. De az aszinkron soros kommunikáció során ebből csak hármat használunk.

  • RxD : adatfogadás, 2-es láb
  • TxD : adatküldés, 3-as láb
  • Föld (GND): 5-ös láb

USB

Az USB-n alapuló kommunikációnál 2 adatvonal van (DATA+ és DATA-), plussz egy föld (GND) és egy +5 V (VCC) vezeték.

ELEKTROMOS és LOGIKAI réteg

 Az AVR mikrovezérlők által használt TTL logikai jelszintek:

  • Logikai egy (1) szint: 5 V
  • Logikai nulla (0) szint: 0 V

Az RS-232 szabványra épülő kommunikáció az alábbi 2 jelszinttel rendelkezik:

  • ha a feszültség -3 és -25 volt közé esik, akkor logikai egy (1),
  • ha a feszültség +3 és +25 volt közötti, akkor logikai nulla (0) állapotú.

(A PC-kben ez a 2 jelszint legtöbbször a ±12V)

Ahogy a képen is látszik a -3 V és +3 V közötti szint definiálatlan, ezért tiltott.

Az USB szabványra épülő kommunikáció az alábbi jeleket használja:

  • Logikai egy (1) szint: ha DATA+ 2,8 V fölötti értékű és ezzel egyidejűleg a DATA- pedig 0,3 V alatti
  • Logikai nulla (0) szint: ha DATA- 2,8 V fölötti értékű és ezzel egyidejűleg a DATA+ pedig 0,3 V alatti

ADAT és ALKALMAZÁSI réteg

Az aszinkron soros kommunikáció az információt egymás után, bitről-bitre továbbítja. A kommunikáció során nem kell külön átvinni az órajelet is az adattal együtt. Nincs egy közös “clock” vezeték, ami az adást és a vételt összehangolja, ezért a kommunkiáció csak előre meghatározott sebességeken történhet. Az adó és vevő közötti szinkronizációhoz nagyon pontos időzítés kell, ezért a busz mindkét oldalán ugyanazt a kommunikációs sebességet kell használni (ezt az ún. baud-rate-tel szokás megadni, ami a másodpercenként elküldött bitek számával egyezik meg). A példák során a 9600 bps sebességet fogom használni, ahol 9600 bit-et küldünk másodpercenként, ezért egy bit küldéséhez 1/9600 = 0.000104 másodperc, azaz 104 us kell.

A küldő oldalon az UART fog egy bájtnyi adatot és a biteket sorban egymás után, egyenként továbbítja. A vételi oldalon a másik UART az egymás után érkező biteket újra bájtokká rakja össze. Egy 8 bitből álló bájt küldéséhez extra biteket is küldenünk kell. Az egyik a Start bit, amivel a másik készülékkel tudatjuk, hogy készüljön fel, mert adatot fogunk küldeni. A másik a Stop bit (ez lehet 1 vagy 2 db bit, a továbbiakban 1 Stop bitet fogok használni), amivel azt tudatjuk a másik készülékkel, hogy befejeztük az adatküldést. Ezért egy bájt elküldéséhez összesen 10 bit kell, így 9600 bps sebességgel maximálisan 960 bájtot (karaktert) tudunk másodpercenként elküldeni. Van még egy ún. paritásbit is, de az egyszerűség kedvéért ezt nem fogom használni.

Vizsgáljuk meg részletesebben, hogy mi is történik a küldő és a vételi oldalon (az alábbi ábrák a TTL jelszinten történő  kommunikációt mutatják be).

Küldés

  • Adásszünetben (amikor nincs adatküldés), az adatvezetéken logikai 1 szint van, a TX vonal állapota Magas (5 V, várakozó állapot)
  • Ha a készülék adatot akar küldeni, akkor azt egy Start bit-tel jelzi (A TX vonalat 104 us-ig Alacsony állapotra kapcsolja. Ez a Start bit, ami mindig egy logikai 0.)
  • Ezután folyamatosan, sorban egymás után elküldi az adatbiteket, minden egyes bitet 104 us időtartam hosszan.
  • Az adatbitek végén paritásbit is állhat (nem használjuk).
  • Az adatküldés befejeztével, az átvitel végét egy Stop bit jelzi (A TX vonal legalább 104 us hosszan tartó Magas állapota a Stop bit, ami mindig egy logikai 1).
  • A Stop bit után azonnal következhet egy újabb átvitel Start bitje, de tetszőlegesen hosszú ideig is logikai 1 értéken maradhat a vonal (szünet, várakozó állapot).

Fogadás

  • A fogadó készülék várakozik az adatátvitel megkezdésére (vár a Start bit-re, arra, hogy az RX vonal állapota Alacsony (0V) legyen)
  • Amikor start bitet kap, akkor vár fél bit-nyi időtartamig (104/2 = 52 us-ig). Ekkor a Start bit közepénél van, és újra leolvassa az RX vonal állapotát, hogy megbizonyosodjon róla, ez egy valódi Start bit, nem pedig egy esetleges elektronikus zavar/zaj.
  • Ezután 104 us-ot vár, ekkor éppen az első adatbit közepénél tart, majd mintát vesz a vevő a jelvezeték logikai szintjéből (leolvassa az RX vonal értékét)
  • 104 us-os időtartamonként hasonló módon minden bitidő közepén mintát vesz a vevő a jelvezeték logikai szintjéből, leolvassa mind a 8 adatbit értéket és az adás végét jelző Stop bit-et.
  • Ezután a vevő megkapta a teljes adatcsomagot az esetleges Paritás és Stop bittel együtt.

Mivel a kerettel (Start bit, Stop bit) kiegészített adatok közvetlenül egymás után is küldhetők vagy rövidebb-hosszabb szünetek közbeiktatásával, ezt az átviteli megoldást aszinkron soros átvitelnek szokás nevezni. 

Az AVR UART automatikusan gondoskodik az adatok küldéséről és fogadásáról. Érzékeli az adatküldés kezdetét, és a vétel alatt ez az egység gondoskodik az Rx láb megfelelő időközönként történő mintavételezéséről, hogy megállapítsa mikor egy, mikor nulla a fogadott bit értéke. Ha pedig adatátvitel van a külvilág felé, akkor az UART kiolvassa a következő bájtot a küldőpufferből és elküldi a szükséges biteket az előre kiválasztott sebességgel.

Szintillesztés

Ha a soros kommunikációt használó mindkét eszköz TTL logikai jelszinteket használ, akkor közvetlenül össze lehet kötni az RX és TX lábakat, de ha az egyik eszköz TTL, a másik pedig RS-232 jelszinteket használ, akkor közvetlenül nem köthetők össze (hacsak nem akarjuk az AVR mikrovezérlőt rövid úton kivégezni).

A TTL és RS-232 jelszintet használó készülékeket csak ún. szintillesztőn keresztül köthetjük össze. A szintillesztő a soros kommunikáció (PC-ről jövő RS-232) ±12V-os jelszintjeit átkonvertálja a mikrovezérlő 5V-os TTL jelszintjére és viszont.

A fentiekhez hasonlóan, a TTL-et és USB-t használó készülékeket is csak egy TTL-USB szintillesztőn keresztül köthetjük össze. A szintillesztő a PC-ről jövő USB jeleket átkonvertálja a mikrovezérlő TTL jelszintjére és viszont.

RS232-TTL konverter

Ha van soros RS-232-es port a számítógépünkön, akkor az RS-232 - TTL szintillesztést legegyszerűbben egy speciálisan erre a célra készített integrált áramkör segítségével valósíthatjuk meg, ami a mikrovezérlő által használt TTL jeleket átalakítja RS-232 jelekké. Ez könnyen megvalósítható egy MAX232 IC-vel, ami az 5V-ból maga állítja elő az RS-232 jelszintekhez szükséges ±12V feszültséget. Az alábbi kapcsolás például a TavIR-AVR weboldalról való:

(kattints a képre)

USB-TTL konverter

Ha nincs soros RS-232-es port a számítógépünkön, akkor ahhoz, hogy USB-t használjunk a mikrovezérlővel történő kommunikációhoz, kell egy átalakító, ami a mikrovezérlő által használt TTL jeleket átalakítja USB jelekké. Ez az átalakító panel a PC felől USB csatolóval van ellátva, a kontroller felől pedig soros portként látszik, a ki- és bemenetek TTL jelszintűek. Vehetünk egy TTL-USB átalakítót, vagy akár mi is építhetünk egyet az FTDI cég FT232BM IC-jének felhasználásával (az alábbi kapcsolás is a TavIR-AVR weboldalról való):

(kattints a képre)

A forrasztás nem az erősségem (pláne nem az SMD alkatrészek forrasztása), ezért én az alábbi képen látható TTL-USB átalakíót szereztem be:

Látható, hogy az összecserélés elkerülése végett gondosan felcímkéztem a vezetékeket, hogy látható legyen az adatáramlás iránya, és hogy tudjam, melyiket kell a ki- és bemenő lábakra kötni. Ezután rákötöttem a korábbi cikkemben már ismertetett robotvezérlő panelen kialakitott USART csatlakozóra (LINK). Látható az is, hogy a mikrovezérlő már nem a belső oszcillátort használja, hanem egy 7.3728 MHz-es külső kvarcról megy.

AVR rendszerórajelének kiválasztása

Mint azt már korábban is említettem, az UART nem használ a kommunikáció szinkronizálására egy közös órajel vonalat. Azért hogy a két készülék mégis szinkronban legyen egymással és kommunikálni tudjon, előre meg kell határozni, hogy a kommunikáció milyen sebességgel történjen (meg kell adnunk egy közös baud-rate-et).

Ideális esetben az AVR rendszer órajele a soros kommunikáció sebességének egész számú többszöröse, ekkor a mikrovezérlő és a soros kommunikáció sebessége között nincs fáziskülönbség. Ha nem pontosan egész számú többszöröse, akkor az egymással kommunikáló két eszköz nem lesz tökéletesen szinkronban, a küldött és fogadott adatok egy bizonyos töredéke hibás lesz a 2 készülék sebességkülönbsége miatt.

Az ATmega8 adatlapjában megtalálhatjuk, hogy az egyes rendszer órajelek és általánosan használt baud rate-ek esetén mekkora a soros kommunikáció hibaszázaléka. Az adatlapban az ajánlott  maximális hibaszázalék  +/-3%. A lenti képen látható, hogy pl. egy 8 MHz-es kristályt használva, a 115.2 kbps sebességű soros  adatátvitel hibája 8.5%. Ekkora hibánál már nem tudunk megbízhatóan kommunikálni ezzel a sebességgel. De ha a kommunikáció sebességét visszavesszük 38.4 kbps-nél kisebb értékre, akkor a hiba már elfogadható mértékű lesz. Láthatjuk hogy a kommunikáció hibamentes (0.00%-os hiba), ha a rendszer órajele az 1.8432 MHz egész számú többszöröse.

Az USART időzítése a megbízható kommunikáció miatt nagyon kritikus, fontos, hogy az AVR saját rendszer órajele is stabil legyen. Az AVR rendszer órajeléből állítja elő a mikrovezérlő az USART kommunikáció órajelét, és azt az időintervallumot, amivel az RX vonalon bejövő adatok mintavételezése és a TX vonalon kimenő adatok küldésének az időzítése történik. Az AVR belső RC oszcillátora ehhez a feladathoz nem elég stabil; ha nem akarunk adatot veszíteni, akkor egy külső kristályt kell használnunk, ami nagyon precíz külső órajelet ad. A példákban 7.3728 MHz-es külső kvarcot használtam, mert ezzel az összes általánosan használt baud-rate hibamentesen fut. Külső kristály használatához át kell állítani az AVR fuse bitjeit az alábbiak szerint:

A felhasznált külső kvarc sebessége 3 és 8 MHz közé esik (CKSEL3..1=111).

Lassan emeljük a kristály oszcillátoron a feszültséget (CKSEL0=1, SUT=11).

Tehát az AVR Studio-ban a Fuse biteknél a CKSEL=1111 és a SUT=11 beállítást kell kiválasztani:

Ezzel a hardver kész is, már csak az UART programot kell megírni.


A cikk még nem ért véget, lapozz!
Következő: »»   2 / 9
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem