USART alacsony szinten

  • Átviteli sebesség beállítása
  • Külsőórajel használata
  • Adatkeretek felépítése
  • Paritásbit
  • Adatátviteli jelzők és megszakítások
  • USART letiltása és engedélyezése
  • Az USART adó használatbavétele (példaprogram)
  • Egyéb működési módok
  • USART regiszterek részletes leírása

————————————————————————————

Bár nem szoktunk rá gondolni, de az egyik elsődleges kommunikációs lehetőség az Arduino világban a soros port (tudományos nevén USART). Elsődleges, mert akkor is használjuk, amikor nem is tudunk róla. A bootloadert is tartalmazó Arduino UNO vagy nano (és pesze a többi alaplap) minden programfeltöltéshez az USART-ot használja. Az USB porthoz csatlakoztatott Arduino-ra egy USB-soros illesztő chip segítségével kerül át programunk.

A sorosport működéséről van egyszerűbb ismertető, amit a tovább haladás előtt (főleg a kezdőknek) érdemes elolvasni. Azt is érdemes fejben tartani, hogy az Arduino IDE alapból rendelkezik a soros port használatához szükséges szoftver eszközökkel. Roppant kényelmesen, a vezérlő belső regisztereinek ismerete nélkül fogadhatunk és küldhetünk adatokat. Az, USART vezérlő regisztereiről még később részletes információkat kaphatunk. Találhatók rövidebb példa kódok is.

Igen nehezen tudom elképzelni, hogy mikor lehet szükség a sorosport belső regisztereinek írásával és olvasásával való kommunikációra. Azonban ha kénytelenek vagyunk más fejlesztő eszközt használni, pédául az Atmel Studió (immár Microchip Studió) fejlesztési környezetben kell dolgoznunk, ott rákényszerülhetünk erre. Nomeg rákényszeríthet bennünket az emberi természet alapvető kíváncsisága is. Nem csak azt akarjuk tudni, hogyan született meg a világegyetem, hanem azt is mitől működik a sorosport.

Kezdjük az elején. Foglaljuk össze az ATMega328 (és hasonló vezérlők) beépített USART egységének legfontosabb tulajdonságait:

  • Teljes duplex működés. Ez mindössze annyit jelent, hogy az adtok fogadása és küldése teljesen független egymástól.  Ez persze nem teljesen igaz, mert tudomásom szerint a sebesség azonos kell legyen, de más tekintetben valóban nincsenek kötöttségeink.
  • Aszinkron vagy szinkron működés. Aszinkron akkor az adattovábbítás, ha nincs órajel vezeték. A sorosportot pont ezért találták ki, mert így nem kell külön órajelvezeték. Azonban az ATMega vezérlőkben mégis lehet órajel vezetéket használni, de persze a továbbítás módja ettől még teljesen ugyanaz! Csak éppen nem lehetnek problémák abból, hogy a két vezérlőnek nem teljesen azonos az órajele.
  • Master vagy Slave Clocked szinkron működés. Szinkron mód esetén az órajel forrása lehet a mester és lehet a slave is. Ha a master adja az órajelet, akkor az erre a célra lefoglalt kivezetés (XCK) a masteren kimenet, a slave-en bemenet. Illetve ha a slave adja az órajelet, akkor fordítva.
  • Nagy felbontású átviteli sebesség generátor. A felbontás jelen esetben 12 bites számlálót jelent. Ebbe a számlálóba írt kezdőérték segítségével lehet az átviteli sebességet behangolni.
  • Támogatja az 5, 6, 7, 8 vagy 9 adathosszúságot és 1 vagy 2 stop bittel rendelkező adatkeretet. Általában 8 bites átvitelt használunk, de elképzelhető, hogy jóval kevesebb bit is elég, és ez növeli az átvitel sebességét. Pl. 5 bittel már átvihető egy szűkített ABC, értelmes olvasható szöveget lehetne így továbbítani.
  • Páratlan vagy páros paritásgenerálás és paritásellenőrzés hardver által támogatott. Ezt sem szoktuk alapból használni. Ha azonban zajos környezetben dolgozunk, és gyakori az adatok sérülése, akkor érdemes bekapcsolni ezt a szolgálttást. Egy bit jelzi a vezérlő megfelelő regiszterében, hogy a megérkezett adatból számított ellenőrző összeg megeggyezik-e a továbbított paritásbittel. Ha nem egyeznek, akkor sérült az adat.
  • Adattúlcsordulás észlelése. Ez akkor fordulhat elő, ha a fogadó puffer terület megtelt, mert programunk nem olvasta ki az érkezett adatokat. Ekkor elvesznek adatok, és ezt jelzi a vezérlő egy jelzőbit bebillentésével.
  • Keretezési hibák észlelése. Ez akkor fordulhat elő, ha az átviteli stop bit hibás volt. Ez a szinkronizált állapotok felderítéséhez szükséges.
  • Három különálló megszakítás a TX Complete, a TX Data Register Empty és az RX Complete. A megszakítások használata lehetőséget ad arra, hogy a programnak ne kelljen figyelni a soros port állapotára. Ha adat érkezik, akkor keletkezik megszakítás stb.
  • Többprocesszoros kommunikációs mód. Meglepő, de azt is tudja a rendszer, hogy egyszerre vevő is figyelje az adatokat, és csak azt az adatot vegye ki magának, ami neki szól. Ehhez cím adatokat is továbbít a rendszer, és 8 bites adatkeret esetén ehhez a 9. bitre is szükség van az átvitelben.
  • Dupla sebességű aszinkron kommunikációs mód.

Az USAR működését lényegében 6 regiszter határozza meg. Ezek a következők:

(a regiszterek nevében a „n” betű arra utal, hogy a vezérlőnek több USART egysége is lehet, és ezeket lehet megkülönböztetni egymástól a sorszámuk behelyettesítésével)

  • UDRn – az az USART ki és bemeneti adatregiszter. ATMega328 esetén csak egy USAR lett beépítve, ezért konkrét neve UDR0. Ebbe írjuk az átvinni kívánt adatot, illetve ebből olvassuk ki az érkezett adatot.
  • UCSRnA – A jelű konfigurációs és státus regiszter. Ennek bitjei jelzik az átviteli hibákat, az átvitel állapotát, valamint ebben a regiszterben lehet beállítani a dupla átviteli sebességet és a többprocesszoros átviteli módot.
  • UCSRnB – B jelű konfigurációs és státus regiszter. Ennek a regiszternek a bitjeivel lehet engedélyezni a vétel és adás kész illetve adatregiszter üres megszakításokat. Itt lehet engedélyezni a vevő és adóegység működését. Itt található az átviteli adatbitek számának beállításához tartozó két bit, és itt találjuk a kilenc bites átvitel .bitjét vételnél, illetve itt adhatjuk meg a kilencedik bitet adáshoz.
  • UCSRnC – C jelű konfigurációs regiszter. Itt állítható be a működési mód (szinkron, aszinkron) paritásvizsgálat módja, a stop bitek száma, az átviteli adatbitek számát meghatározó harmadik bit, és az órajel polaritást meghatározó bit.
  • UCSRnL és UCSRnH – Átvitel sebesség meghatározó regiszterek. Összesen 12 bittel lehet beállítani az átviteli sebességet (az UCSRnH regiszternek csak z alsó négy bitje használatos).

A fenti regiszterek bitjeinek jelentésével az későbbiekben részletesen foglalkozunk. Ha egy beállítást el szeretnénk végezni, elegendő a programban a regiszter nevére hivatkozni és beállítani a megfelelő bitet. Pl. Ha szeretnénk adatot írni az adatregiszterbe, csak ennyit kell írni programunkban:

Pl.:UDR0=231;

A fenti programsor 231-et ír az adatregiszterbe. Ezzel azonnal meg is indul az adatok átvitele a TX kivezetésen, kivéve, ha az előző adat átvitele még folyamatban van, mert ha igen, akkor annak befejezésekor kezdődik az átvitel.

Mielőtt részletesen megnézzük az egyes regiszterek bitjeinek pontos jelentését, szerezzünk egy kis áttekintést az USART egység tulajdonságairól és működési részleteiről. A részletes regiszter leírások a jelen ismerettő legutolsó fejezetében találhatók.

Az átvitel nagyon érzékeny az átviteli sebesség pontosságára. A vevő ugyanis nem ismeri az adó pontos órajelét. Szerencsére a vezérlők belső órajelét viszonylag pontos kvarc kristályok biztosítják. Azonban még ezekkel is vannak elvi problémák mert az adó és vevő oldal kvarc kristályi nem feltétlenül azonos frekvenciával működik, tekintve hogy különböző típusú és órajelű vezérlők lehetnek. A szabványos USART sebességeket nem is mindig egyszerű jól megválasztani emiatt. És akkor még nem beszéltünk a soros átvitelt biztosító jelvezetékről, aminek hossza fordított arányban áll az átviteli sebességgel. Minél hosszabb, annál kisebb lehet a sebesség a vezetékekben keletkező egyre nagyobb zavarjelek miatt. Igen fontos tehát az átviteli sebességet meghatározó órajelgenerátor pontos beállítása az adóban és a vevőben is. Az ATMega328 vezérlőben egy 12 bites számláló látja el ezt a feladatot. Találunk az USART egységben két regisztert, ami ehhez a feladathoz kapcsolódik. A regiszterek neve UBRRnH illetve UBRRnL. Az ATMega328-ban csak egy USART található, ezért a konkrét regiszter nevek UBRR0L és UBRR0H, ezt keressünk az adatlapon! A két regiszterben tárolt 12 bites érték a megfelelő pillanatokban beíródik egy visszafelé számlálóba. Ez a számláló úgy állítja elő az átviteli sebességet, hogy a vezérlő órajelének minden felfutó élénél visszaszámol egyet. Amikor eléri a nullát, előállítja a soros átvitel következő bitjét a soros kimeneten. A vevő egység pedig (RX vonal a vevő egységen) a számláló 0 értékénél vesz mintát a jelszintből. Bár ez technikailag kicsit bonyolultabb ettől, de ezzel most ne foglalkozzunk. Amikor a számláló nullázódott, vissza íródik belé az UBRRnH és UBRRnL regiszterek tartalma, és kezdődik minden előről.

A regiszterekben tárolt 12 bites szám alapján könnyen kiszámítható a soros átvitel sebessége, amit boud-ban (bit/másodperc) szoktak megadni. Három eset lehetséges:

  1. Aszinkron normál mód:

2. Aszinkron dupla sebességű mód:

3. Szinkron mód:

A fenti képletekkel kiszámolhatjuk, hogy mekkora átviteli sebesség adódik a regiszterekbe írt tartalom alapján. Vegyük példának a normál módot, mert általában ezt szoktuk használni. Legyen a regiszterbe írt tartalom 103. Számoljuk ki, mekkora sebesség adódik. Az fosc az órajelfrekvencia, ami esetünkben 16Mhz, azaz 16 000 000. Vagyis 16 000 000 / (16*(103+1))=9615,38. Kerekítve nagyjából 9600 baud sebességet kaptunk. Látható, hogy ha a vezérlő órajelfrekvenciája relatíve kicsi (merthogy 16Mhz manapság kicsinek számít), akkor  nem lesz teljesen „szabványosan” pontos az átviteli sebesség. Azonban ez a pici eltérés kisebb sebességeken nem okoz problémát. Ugyanis a vevő valahol a bit átviteli idejének közepén vesz mintát a jelből, és egy néhány bitből álló jelsorozat teljes időtartama alatt sem keletkezik akkora elcsúszás, hogy az utolsó mintavétel jelentősen eltérjen az utolsó bit (stop bit) közepéből. Nagyobb sebességeken ebből már adódhatnak gondok. Mivel a következő adatkeretnél a start bitnél újra indul a jelsorozat kezdő pontjának megállapítása, azaz újraszinkronizálódik minden, összességében nincs veszélyben az átvitel.

Nem foglalkoztam mindhárom esettel, de látható, hogy a számítás elve ugyanaz, csak a többi átviteli mód nagyobb sebességekre alkalmas. Említésre érdemes, hogy a szinkron módnál nyolcszoros sebességet kaphatunk, de itt van külön órajel vezeték, tehát az adó és vevő szinkronja végig biztosítva van.

A fenti számításoknak számunkra inkább a fordítottja az értékes, amikor a kívánatos átviteli sebesség alapján akarjuk kiszámítani a UBRRnH és UBRRnL regiszterek tartalmát. Hogy ne kelljen elővenni a középiskolai egyenletrendezési tudásunkat, ezt is kimásoltam a vezérlő adatlapjából a fenti három esetre.

  1. Aszinkron normál mód:

2. Aszinkron dupla sebességű mód:

3. Szinkron mód:

Lássunk egy példát erre a számításra is. Tegyük fel, hogy 115 200 baud sebességű átvitelt szeretnénk megvalósítani normál módban. Mennyi legyen a regiszter értéke? Egyszerű kiszámítani: (16 000 000 / (16*115 200))-1=7,68 kerekítve 8.

Ahogyan növeljük a sebességet, nő az átvitel bizonytalansága, pl. 115200baud-nál már elég durva kerekítéssel kelet élnünk a pontos értékhez képest. Azonban a 115200 baud a gyakorlatban néhány méteres vezetékig teljesen jól és megbízhatóan működik.

Külső órajel használata

Csak szeretném megemlíteni, hogy nem kell feltétlenül a vezérlő saját órajelét használni. Nagyobb sebesség és stabilitás igény esetén a szinkron átvitelnél használatos XCK kivezetésre külső órajelet is ráköthetünk. Szinkron mód esetén a master vagy a slave rá is van kötve a másik vezérlő XCK kimenetére, hogy annak órajelét használja. Sajnos az adatlapból nem sikerült kiderítenem, hogy ennek a külső órajelnek mennyi lehet a maximális frekvenciája. Biztos benne van valahol, de nem szántam rá időt, mert eddig még nem volt szükségem erre a lehetőségre.

Adatkeretek felépítése

Adatkeretnek hívjuk azt a csomagot, ami ténylegesen átvitelre kerül a vezeéken keresztül. Ebben vannak értékes és redundáns adatok, amik szükségesek az átvitelhez. Az adatkeret határozza meg, hogy milyen hosszú értékes adatot tudunk átvinni, hány stop bitet alkalmazunk, valamint azt is, hogy használunk-e paritás ellenőrzést, ami nagyon hasznos lehet az átviteli hibák kiszűrésében. Az adatkeretünk a következő bitekből épülhet fel:

  • 1 start bit
  • 5, 6, 7, 8 vagy 9 adatbit
  • Páros vagy páratlan paritásbit
  • 1 vagy 2 stop bit

A start bit, a választható számú adatbit és az egy vagy két stopbit nyilván kötelező, hiszen minimálisan ebből épül fel az adatkeretünk. A paritásbit azonban opcionális. A későbbiekben ismertetésre kerülő UCSRnC (USART control és státus) regiszterben tudjuk beállítani az adatkeret tulajdonságait. A regiszter bitjeinek jelentését lásd később az USART regiszterek részletezésénél.

Találtam egy nagyon szép ábrát az adatlapban az adatkeret bemutatásra:

Az ábrán található betűkódok jelentése:

  • St                     Start bit, mindig alacsony.
  • 0,1,2…8           Adatbitek (0–8).
  • P                      Paritásbit. Lehet páratlan vagy páros.
  • Sp                    Stop bit, mindig magas.

A stop bit időtartamának letelése után azonnal bekövetkezhet egy újabb adatkeret startbitje. Ekkor a vonalon a jelszint lemegy nullába. Azonban az is lehet, hogy nincs azonnal következő adatkeret, és bármeddig magas szinten maradhat a vonal. A vevő ekkor akármeddig várakozik a startbit alacsony szintjére. Ez az IDLE felirattal jelzett szaksz.

A leggyakrabban 8 bites adatokat viszünk át és nem használunk paritásbitet. Emlékeim szerint ha leírjuk az Arduino IDE környzetben a setup()-ban azt, hogy serial.begin(9600), akkor pontosan ezt a beállítást érjük el.

Paritásbit

A paritásbit bekapcsolása nyilván csökkenti az átviteli sebességet, ezért csak akkor érdemes használni, ha tényleg szükség van rá. És mikor is van rá szükség? Hát amikor zajos a vonal, nagy az esélye, hogy időnként egy-egy bit megsérül, azaz nem a valós értékét azonosítja a vevő. Az adatsérüléstől a paritás ellenőrzés nem ment meg, de legalább tudhatjuk, ha megsérült az adatunk.

Csak érdekesség képen megemlítenem, hogyan is kerül kiszámításra a paritásbit. Az adatlapból származik a kép:

Az index értékkel felsorolt „d” betűk az átvitt adat bitjeit jelentik. A bekarikázott „+”-jel pedig kizáró vagy kapcsolatot ábrázolja. Nem túl bonyolult. Adáskor az USART saját maga kiszámítja az átvinni kívánt adatból a paritásbit értékét. A vevő egység pedig az összes adatbit beérkezésekor kiszámítja ugyanezt, és összehasonlítja a megérkezett paritás bit értékkel. Ha egyeznek, akkor nem történik semmi, hiszen minden rendben van. Ha azonban nem egyezik a két érték akkor az UCSRnA (ATMEga328 esetén UCSR0A) regiszter UPEn bitjét bebillenti 1-re, amit le lehet kérdezni a programból! A bit nevében a kis „n” szerepe ugyanaz mint a regiszter nevében, tehát egy ATMega328 esetében UPE0 a konkrét bitnév

Adatátviteli jelzők és megszakítások

Az USART adó állapotát két jelzőbittel követhetjük nyomon. Az egyik azt jelzi, hogy az adatátviteli regiszterbe írhatunk-e új adatot. Ha jól értelmeztem az adatlap leírását, akkor ebből a regiszterből átíróik az adat egy munkaregiszterbe, amiből aztán megtörténik az adatbitek soros kiléptetése. Azonban ekkor már kész az adatregiszter az új adat fogadására, miközben az előző átvitel még zajlik. Az adatregiszter üres jelzőbitet az UCSRnA regiszterben találjuk UDREn (USART Data Register Empty) néven. A bit értéke akkor egy, ha adatokat írhatunk az adat regiszterbe.

Nem kell folyamatosan figyelni programunkban ezt a bitet. Lehetséges az is, hogy megszakítás keletkezzen amikor a bit értéke bebillen. Ekkor a következő adat behelyezését az adatregiszterbe elvégezheti a megszakítást kiszolgáló programrész. A megszakítást természetesen engedélyezni kell az UCSRnB regiszter UDRIEn bitjével. Fontos tudnivaló, hogy a megszakítás rutinnak feltétlenül adatot kell írnia az adatregiszterbe, ami a az UDREn bitet automatikusa törli, vagy le kell tiltania ezt a megszakítást, különben új megszakítás következik be, amint a megszakítás rutin befejeződött.

Ahogyan az üres adatregiszter állapotra kapunk jelzést a fentiek szerin, nyilván arra is találunk jelzőbitet illetve keletkezhet megszakítás, ha vége az átvitelnek. Ezt a bitet szintén az UCSRnA regiszterben találjuk, neve pedig TXCn (transmit complete). A hozzátartozó megszakítás engedélyező bit Az UCSRnB regiszterben található TXCIEn bitnéven. A megszakítás rutinnak nem kell törölnie a TXCn jelzőt, az automatikusan megtörténik. Az adás megtörténtét jelző bit illetve a hozzátartozó megszakítás akkor hasznos, ha a kiküldött adat után azonnal figyelni kell a vevő válaszát.

Nem csodálkozunk azon, hogy a vevőegységnek is van egy jelzőbitje aminek értékéből megtudhatjuk, hogy érkezett-e adat. Ezt a jelzőbitet az is  UCSRnA regiszterben találjuk RXCn néven. Ennek értéke akkor lesz 1, ha van adat a fogadási pufferben. Ha ekkor kiolvassuk az UDRn regisztert (adatregiszter), akkor a jelző törlődik. Természetesen megszakítást is kaphatunk, ha az UCSRnB regiszterben az RXCIEn bitet 1-be írjuk. Ekkor az adat érkezésekor keletkező megszakítással olvashatjuk ki az adatot.

USART letiltása és engedélyezése

Mint minden hardver részegységet, az USART-ot is engedélyezni kell ahhoz hogy használhassuk. Külön engedélyezhetjük az adást és a vételt is. Az UCSRnB regiszterben az RXENn és a TXENn bitek szolgálnak erre. 

Az USART adó használatba vétele és adás folyamata

Ahhoz hogy az adóval adatokat továbbíthassunk be kell állítanunk az az USART üzemmódját (szinkron, asszinkron), adatkeret jellemzőit, a port sebességet, ha megszakítással akarunk dolgozni akkor engedélyezni kell a megszakítást, és végül engedélyezni kell az adót. Ehhez a következő regiszterek megfelelő értékeinek a beállítása szükséges:

  1. Üzemmeód beállítás – UCSRnC regiszter UMSELn1 és UMSELn0 bitek
  2. Paritás ellenőrzés és paritás képzési mód – UCSRnC regiszter UPMn0 és UPMn1 bitek.
  3. Stopbitek száma – UCSRnC regiszter USBSn bit
  4. Adatméret – UCSRnC regiszter UCSZn0 és UCSZn1 bitek, valamint a UCSRnB regiszter UCSZn2 bitje
  5. Szinkron átvitelnél az órajel éleinek funkciója – UCSRnC regiszter UCPOLn bitje
  6. Átviteli sebesség beállítása – UBRRnH regiszter 0-3 bit, valamint az UBRRnL regszter 0-7 bitjei. A két regiszterbe, ami összesen 16 bit hosszú, egy 12 bit hosszú értéket kell beírnunk (épp ezért UBRRnH felső 4 bitje nem használt). A regiszter tartalmát az előzőekben megadott képlettekkel lehet kiszámítani.
  7. Megszakítások – UCSRnB regiszter RXCIEn, TXCIEn, UDRIEn bitek
    – RXCIEn Vétel megtörtént megszakítás akkor jön létre, ha az USART vevőegység fogadott egy komplett adatkeretet.
    – TXCIEn adás megtörtént megszakítás akkor jön létre, ha az adatregiszterbe írt adat átvitele megtörtént
    – UDRIEn adatregiszter üres megszakítás akkor jön létre, ha az előző adat átkerült egy munkaregiszterbe, és megkezdődött az adat továbbítása
  8. USART adás és vétel engedélezése – USCRnB regiszter RXENn és TXENn bitjei.
  9. TXENn bit 1 esetén a vezérlő TxDn (soros adás) kivezetésének állapota felülbírálóik, és kimenetnek lesz beállítva. Az adatregiszterbe írás elindítja az adat átvitelét.
  10. RXENn bit 1 esetén a vezérlő RxDn kiveztésének állapota felülbírálódik és bemenetnek lesz beállítva. Ha erre a kivezetésre soros adatkeret érkezik, akkor az adat az adatregiszterbe kerül.

A fentiek alapján nézzünk egy példát az USART egység beállítására. A példa szerint állítsuk az USART egységet normál aszinkron működésre 9600baud sebességgel, 8 bites adatkerettel, paritás ellenőrzés nélkül két stop bittel: Az átvitel vezérlésére nem használunk megszakítást.

UCSR0A = bx0xxxx00;
UCSR0B = b000110xx;
UCSR0C = b0000111x;
UBRR0L = b01100111;
UBRR0H = b00000000;

A fenti néhány sor közvetlenül beírható az Arduino nano vagy Uno Arduino IDE-ben megírt programjába. Lényegeben a Serial.begin(9600); programsort helyettesíti. A regiszter tartalmat binárisan adtam meg, hogy könnyebb legyen a biteket beazonosítani. Az „x”-el jelölt bitek értéke közömbös, illetve nem befolyásolja a beállítani kívánt működési módot. Lehet pl. 0 mindenütt. Lényegében a sorrend is mindegy. Az a lényeg, hogy csak ha minden regiszter beállítása megtörtént, akkor következzék be az első továbbítani kívánt adat beírása az adatregiszterbe (UDR0 regiszter)

Lássunk végre egy Arduino IDE-ben megírt példát a működésre! Az alábbi példát be lehet másolni, lefordítani, feltölteni a vezérlőre, és bekapcsolni a soros monitort 9600baud sebességgel! Eredményként másodpercenként megjelenik egy „A” betű (ASCII kódja 65) a soros monitoron!

void setup() {
  //sorosporti paraméterek (regiszterek beállítása)
  UCSR0A=B00000000;    //nincs dupla átviteli sebesség és többprocesszoros mód
  UCSR0B=B00011000;    //Adó és vevő engedélyezése, adatbitek számának 2. bitje (8bites átvitel)
  UCSR0C=B00001110;    //Szinkron mód, nincs paritás, két stopbit, 8 bites adatkeret, 
                                          //órajel polaritás felfutóélen adatváltozást ír elő
  UBRR0L=B01100111;    //9600baud sebesség 103=B01100111
  UBRR0H=B00000000;
}

void loop() {
  UDR0=65;        //adatot írunk az adatregiszterbe, az átvitel automatikusan indul
  delay(1000);     //várakozunk egy másodpercet
}

Egyéb működési módok

Ha az USART egységünket szokványos módon 8 bites adattal és két szóköz összekapcsolására akarjuk használni, akkor az eddig leírta tökéletesen elegendő információt adnak. Azonban van még néhány cseles működési mód, amiről jó tudni. Ezeket a működési módokat már nem próbáltam ki mert nem volt rá szükségem. Pusztán csak az adatlapban leírtakat igyekszem összefoglalni teljes részletesség nélkül.

  • 9 bites adatkeret használata

Mivel az adatok átvitelét byteonként szeretjük végezni és egy byte nyolc bites. Nem feltétlenül érthető, hogy miért is kell kilenc bites átvitelt megvalósítani. Valószínűleg a következő pontban (többprocesszoros kommunikációs mód) lesz nyilvánvaló a hasznossága. Nyilván a 9. bitet valamilyen jelzés átviteléhez használhatjuk, ami az értékes 8 bites adattal közlekedik, és nem kell egy új byte-ot átvinni a jelzés továbbításához. Az adatregiszterben csak nyolc bit hely van, ezért a 9. bitet jól eldugták a tervezők. Az UCSRnB regiszterben találtak egy elhasználható bitet.

Ha élünk a kilencedik bit átvitelének lehetőségével, akkor ezt a bitet az UCSRnB regiszterben úgy kell megváltoztatnunk, hogy a többi bit semmiképpen se változzon meg. Valamint a 9. bit beállítása után írhatjuk a továbbítandó adatbyte-ot az UDRn regiszterbe. Pl. tegyük fel, hogy egy 16 bites integer változóban található az értékes 9 bit. Az alábbi példa bemutatja, hogy hajtsuk végre a regiszterbe írást a 9. bit értékétől függően:

//a kódrészletben a data nevű változó tartalmát akarjuk továbbítani
// megvárjuk, hogy üres lesz az átviteli puffer 
while ( !( UCSRnA & (1<<UDREn))) ) ;  //UDREn bit 1 esetén üres 
                                      //a puffer és lehet bele írni
//Megvizsgáljuk a 9. bitet
if (data &0x0100)         //ha a bit értéke 1, akkor igaz
{UCSRnB |= (1<<TXB8);}     //a bit értéke 1, tehát vagy 
                                                    //kapcsolattal 1-re állítjuk a bitet
else {UCSRnB &=~(1<<TXB8);}  //a bit értéke 0, tehát törölni kell
UDRn=(byte)data;             //data típusát int-ről byte-ra
                             //alakítjuk és beírjuk az adat
                             //regiszterbe, ezzel indul az
                             //átvitel

  • Többprocesszoros kommunikációs mód

Itt arról van szó, hogy a soros vonalunkra több vevőegységet is csatlakoztatunk. Az adóegység által továbbított adatokat minden vevőegység megkapja. Ha nem lenne a többprocesszoros továbbítási megoldás beépítve az USART kommunikációba, akkor nem tehetnénk mást, mint azt, hogy az értékes adatokkal együtt valamiféle cím információt is továbbítanánk egyezményes pontokon külön adatkeret beiktatásával. Ha a vevők megkapták az adatokat akkor a felhasználói szoftver értékes processzoridő felhasználásával megkeresné ezeket a cím információt tartalmazó adatokat, és ezek alapján kiszűrné a számukra küldött információt. E helyett lehetőség van arra, hagy a felhasználói szoftverünk nélkül is azonosítsuk a cím információkat. Ezt követően már csak az a vevő veszi az adatokat amelyiknek szól. Természetesen az adatáramlást minden vevő továbbra is figyeli, hiszen bármikor érkezhet egy új cím valamelyik vevőnek, és akkor annak át kell venni az aktív, kijelölt vevő szerepét. Azonban ehhez nem kell a felhasználó szoftver, elintézi az USAT saját maga. Más a módszer ha 5-8 bites adatkeretet használunk, és más, ha 9 bites adatkerettel dolgozunk. Előbbi esetben (5-8 bites adatkeret) két stop bitet fog használni az USART és az első stopbit jelzi, ha cím adatot tartalmaz az adatkeret. Ha 9 bites adatkeretet használunk, akkor a 9. bit tölti be ezt a szerepet. Mindkét esetben (stop bit, illetve 9, bit) a bit 1 értéke jelzi, ha címadat érkezett.

A többprocesszoros üzemmódban fontos szerepe van az UCSRnA regiszterben található MPCMn bitnek. A következő folyamat zajlik le ennek a bitnek a segítségével:

  1. Minden vevőben be kell állítanunk a kommunikáció kezdetekor az MPCMn bitet egyre. Ha az MCPMn bit egy, akkor az USART csak olyan adatokat fog az UDRn adatregiszterbe helyezni, ami cím információt tartalmaz.
  2. A mester küld egy cím keretet, amit minden vevő vesz (a vevők felfedezik, hogy egy értéke van az első sop bitnek vagy a 9. bitnek, és ezzel egyidőben az MCPMn bitjük is egy).
  3. Minden vevő felhasználói szoftverének figyelnie kell az UDRn adatregisztert, amibe cím érkezik, és ezt minden vevő megkapja, hiszen a felhasználói szoftver állította az MCPMn bitet egyre. Ha az UDRn regiszterbe érkezett cím egyezik a vevő saját címével (és ezt a felhasználói szoftvernek kell kiderítenie), akkor az MCPMn bitet a felhasználói szoftvernek törölnie kell. Ha nem azonosította a saját címét, akkor az MCPMn bit értéke egy-en marad.
  4. Az a vevő, aki törölte a saját MCPMn bitjét minden adatkeretet megkap. Akinek az MCPMn bitje egyben maradt, az várja a cím adatot tartalmazó keretet, a többit mind eldobja.
  5. Ha a megcímzett vevő megkapta az utolsó adatkeretet is (ezt a felhasználói szoftvernek kell tudnia), akkor be kell állítani a felhasználói szoftvernek az MCPMn bitet egyre. Itt a kommunikáció lényegében a 2. pontról folytatódik.

Az USART egység regisztereinek leírása

Ez valójában két regiszter, de ugyanazon a memória címen található a vezérlőben. Ha erre a címre írunk, akkor a TX (adás) regiszterbe írjuk a továbbítandó adatot. Ha olvasunk a memóriacímről, akkor az érkezett adatot kapjuk meg az RX (vétel) regiszterből

7. bit – RXCn USART Receive Complete. Ez a jelzőbit akkor 1, ha olvasatlan adatok vannak a fogadási pufferben, és 0, ha a fogadási puffer üres. Ha a vevőt letiltjuk, a fogadási puffer kiürül, és ennek következtében az RXCn bit nulla lesz. Az RXCn jelző használható a Receive Complete megszakítás létrehozására (lásd az RXCIEn bit leírását).

6. bit – TXCn: USART Transmit Complete. Ez a jelzőbit akkor kerül beállításra, ha a Transmit Shift Register teljes kerete ki lett léptetve a TX kimeneten, és jelenleg nincs új adat az átviteli pufferben (UDRn). A TXCn jelzőbit automatikusan törlődik ha Transmit Complete megszakítás kerül végrehajtásra, vagy törölhető úgy, hogy egy 0-át írunk a bithelyre. A TXCn jelző képes Transmit Complete megszakítást generálni (lásd a TXCIEn bit leírását).

5. bit – UDREn: USART adatregiszter üres. Az UDREn jelző azt jelzi, hogy az adatregiszter (UDRn) készen áll-e az új adatok fogadására. Ha az UDREn 1, akkor a puffer üres, ezért készen áll arra, hogy beleírjuk a továbbítandó adatot. Az UDREn jelző képes megszakítást generálhat (lásd az UDRIEn bit leírását). Az UDREn alaphelyzetbe állítás (bekapcsolás vagy reset után) úgy van beállítva, hogy jelezze, hogy a jeladó készen áll.

4. bit – FEn: Keret hiba. Ez a bit akkor lesz 1, ha az aktuálisan érkezett adat fogadásakor kerethiba volt. Azaz, amikor az adat átvitelekor az első stop bit nulla. Az FEn bit az adatregiszter (UDRn) kiolvasásáig érvényes. A FEn bit nulla, ha a fogadott adatok stopbitje egy. Ha írás történik az UCSRnA regiszterbe, akkor ezt a bitet minden esetben 0-ra kell állítani.

3. bit – DORn Adat túlcsordulás. Ez a bit akkor kerül beállításra egyre, ha a rendszer adat túlcsordulási feltételt észlel. Adat túlcsordulás akkor fordul elő, ha az az adatregiszterben egy érvényes adat található, amit még nem olvastunk ki, és közben egy start bit érkezik (nincs hová tárolni az éppen érkező adatot). A DORn bit az adatregiszter (UDRn) olvasásáig érvényes és automatikusan törlődik az adatregiszter kiolvasásakor. Ha írunk UCSRnA-ba regiszterbe, akkor ezt a bitet állítsuk feltétlenül nullába.

2. bit – UPEn: USART paritási hiba. Ez a bit akkor kerül beállításra, ha a fogadási puffer következő karaktere fogadáskor paritáshibát mutatott, és a paritásellenőrzés engedélyezve volt ezen a ponton (UPMn1 = 1). Ez a bit a fogadási puffer (UDRn) olvasásáig érvényes. Mindig állítsuk ezt a bitet nullára, amikor UCSRnA-ba írunk.

1. bit – U2Xn: Dupla USART átviteli sebesség. Ez a bit csak az aszinkron műveletre van hatással. Állítsuk ezt a bitete 0-ra nullára szinkron működés és normál sebesség használata esetén. Ha ezt a bitet egybe írjuk, akkor az átviteli sebességosztó osztója 16-ról 8-ra csökken, ami gyakorlatilag megduplázza az aszinkron kommunikáció átviteli sebességét.

0. bit – MPCMn: Többprocesszoros kommunikációs mód. Ez a bit lehetővé teszi a többprocesszoros kommunikációs módot. Amikor az MPCMn bitet 1-be írjuk, az USART vevő által fogadott összes bejövő keretet, amely nem tartalmaz cím információt, figyelmen kívül hagyja a rendszer. Az MPCMn beállítás nincs hatással a jeladóra.

7. bit – RXCIEn: RX Receive Complete megszakítás engedélyezése. Ennek a bitnek az 1-be írása lehetővé teszi a megszakítást az RXCn jelző bebillenésekor. USART Receive Complete megszakítás csak akkor jön létre, ha az RXCIEn bit 1-be van állítva, valamint az SREG globális megszakításjelző is engedélyezve van, és az UCSRnA RXCn bitje is bebillen 1-be.

6. bit – TXCIEn: TX Transmit Complete megszakítás engedélyezése. Ennek a bitnek az 1-be írása lehetővé teszi a megszakítást a TXCn jelző bebillenésének hatására. Az USART Transmit Complete megszakítás csak akkor jön létre, ha a TXCIEn bit 1-be van állítva, az SREG globális megszakítás engedélyezve van és a TXCn bit az UCSRnA regiszterben bebillen 1-be.

5. bit – UDRIEn: USART adatregiszter üres megszakítás engedélyezése. Ha ezt a bitet 1-be írjuk, az UDREn jelző bebillenése „adatregiszter üres” megszakítást eredményez. Az „adatregiszter üres” megszakítás csak akkor jön létre, ha az UDRIEn bit 1-be van állítva, a SREG globális megszakításjelző engedélyezve van, és az UCSRnA regiszter UDREn bitje 1-be billen.

4. bit – RXENn: Vevő engedélyezése. Ennek a bitnek az egybe írása engedélyezi az USART vevő működését. A vevő felülbírálja az RxDn tű normál portműködését, ha engedélyezve van. A fogadó letiltása kiüríti a fogadási puffert, érvénytelenítve a FEn, DORn és UPEn jelzőket.

3. bit – TXENn: Adó engedélyezése. Ennek a bitnek az egybe írása engedélyezi az USART adó működését. A jeladó felülbírálja a TxDn tű normál portműködését, ha engedélyezve van. Az adó letiltása (a TXENn nullára írása) addig nem lép hatályba, amíg a folyamatban lévő és függőben lévő átvitelek be nem fejeződnek, azaz amikor a Transmit Shift Register és a Transmit Buffer Register ki nem ürül. Ha a bit 0, akkor az adó le van tiltva, és többé nem bírálja felül a TxDn portot.

2. bit – UCSZn2: n karakterméret. Az UCSZn2 bit kombinálva az UCSRnC fegiszterben található UCSZn1:0 bitekkel, beállítja az adatbitek számát (Character Size), amelyet a vevő és az adó használ.

1. bit – RXB8n: 8 n bit adatainak fogadása. Az RXB8n a fogadott karakter kilencedik adatbitje, ha kilenc adatbittel rendelkező soros keretekkel működik a vevő. Ezt a bitet feltétlenül az adatregiszter (UDRn) kiolvasása előtt kell olvasni.

Bit 0 – TXB8n: Adatok továbbítása 8 n bit. A TXB8n a kilencedik adatbit a karakterben, amelyet kilenc adatbittel rendelkező soros keretekkel történő működés esetén kell továbbítani. Ezt a bitet be kell állítani, mielőtt az adatbitbe (UDRn) beérnék az adatbit alsó 8 bitjét.

7, 6 bitek – UMSELn1:0 USART mód kiválasztása. Ezek a bitek választják ki az USARTn működési módját az alábbi szerint.

UMSELn1UMSELn0Üzemmód
00Aszinkron USART
01Szinkron USART
10(Fenntartva)
11Fő SPI (MSPIM)(1)

5, 4 bitek – UPMn1:0: Paritási mód. Ezek a bitek engedélyezik és beállítják a paritás generálásának és ellenőrzésének típusát. Ha engedélyezve van, a jeladó automatikusan generálja és elküldi az átvitt adatbitek paritását az egyes kereteken belül. A fogadó paritásértéket generál a bejövő adatokhoz, és összehasonlítja azt az UPMn beállítással. Ha eltérést észlel, az UCSRnA regiszter UPEn jelzője lesz beállítva.

UPMn1UPMn0Paritásos mód
00Nincs paritás képzés
01(Fenntartva)
10Engedélyezve, páros paritás
11Engedélyezve, páratlan paritás

3. bit – USBSn: Stop bit Select. Ez a bit választja ki a jeladó által beillesztendő stopbitek számát. A vevő figyelmen kívül hagyja ezt a beállítást.

USBSnStop bit(ek)
01 bites
12 bites

Bit 2:1 – UCSZn1:0: Karakterméret. Az UCSZn1:0 bitek kombinálva az UCSRnB regiszterben található az UCSZn2 bittel, beállítják az adatbitek számát (Character Site), amelyet a vevő és az adó használ.

UCSZn2UCSZn1UCSZn0Karakterméret
0005 bites
0016 bites
0107 bites
0118 bites
100(Fenntartva)
101(Fenntartva)
110(Fenntartva)
1119 bites

0. bit – UCPOLn: Óra polaritás. Ez a bit csak szinkron módban használható. Állítsuk ezt a bitet 0-ra, ha aszinkron módot használunk. Szinkron módban Az UCPOLn bit beállítja az adatkimeneti változás és az adatbeviteli minta, valamint a szinkron óra (XCKn) közötti kapcsolatot.

Bit 11:0 – UBRR[11:0]: USART átviteli sebességregiszter. Ez egy 12 bites regiszter, amely tartalmazza az USART átviteli sebességét. Az UBRRnH tartalmazza a felső négy bitjét, az UBRRnL pedig az USART átviteli sebesség alsó nyolc bitjét. Az adó és a vevő folyamatos átvitele megsérül, ha az átviteli sebesség megváltozik (átvitel alatt írjuk a regisztert). Az UBRRnL írása elindítja az átviteli sebesség előskálázójának azonnali frissítését.

A normál szinkron működéshez 16Mhz órajel frekvenciára alább egy táblázat:

BaueUBRRn
2 400416
4 800207
9 600103
14 10068
19 20051
28 80034
38 40025
57 60016
76 80012
115 2008
230 4003
250 0003
500 0001
1 000 0000

Mennyire volt hasznos amit olvastál? Értékelés után szövegesen is leírhatod megjegyzéseidet és véleményedet!

Kattints egy csillagra az értékeléshez!

Szövegesen is leírhatod véleményedet! Ha kérdésed van, ne felejtsd el megadni az email címedet!