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: 56951, Oldal olvasási idő: kb. 7 perc
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 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.
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:
Az RS-232 szabványra épülő kommunikáció az alábbi 2 jelszinttel rendelkezik:
(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:
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
Fogadás
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ésHa 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 konverterHa 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 konverterHa 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ásaMint 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! Értékeléshez bejelentkezés szükséges! |
Bejelentkezés
Hirdetés |