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. 3 perc
Lapozás: OK   4 / 9

Soros kommunikáció polling módszerrel

UART beállítása

Mielőtt használni tudnánk, az UART-ot megfelelően be kell állítani. Létrehozok egy függvényt, ami automatikusan beállítja az UART-ot (az első 2 példaprogramban még nem használunk megszakításokat).

  1. void KonfigUART()  // UART beallitasa
  2. {
  3.    // 9600 bps soros kommunikacio sebesseg beallitasa
  4.    UBRRL = UBRR_ERTEK;        // UBRR_ERTEK also 8 bitjenek betoltese az UBRRL regiszterbe
  5.    UBRRH = (UBRR_ERTEK>>8);   // UBRR_ERTEK felso 8 bitjenek betoltese az UBRRH regiszterbe
  6.    // Aszinkron mod, 8 Adat Bit, Nincs Paritas Bit, 1 Stop Bit
  7.    UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
  8.    //Ado es Vevo aramkorok bekapcsolasa
  9.    UCSRB |= (1 << RXEN) | (1 << TXEN);   //
  10. }

USART használata (adat küldése/fogadása)

Miután elkészült az UART beállító függvény, most megnézzük, hogyan is lehet adatokat küldeni és fogadni a soros porton keresztül. Ez a cikk az UART-tal ismerkedőknek íródott, ezért a legegyszerűbb megoldásokat fogom alkalmazni és csak a soros kommunikációra fogok koncentrálni. Természetesen később, amikor már kicsit megismerkedtünk az UART-tal, akkor az UART polling-olása helyett a következő fejezetben megnézzük, hogyan lehet adatokat küldeni és fogadni a beépített UART megszakítások használatával.

Adat küldése USART-tal

Ez a függvény egy adott karakter adatot küld el az UART-tal. Lényegében csak az UART puffer-jébe írjuk be az elküldendő adatot, amit valójában már az UART küld el automatikusan a soros porton keresztül.

Egy fontos dolgot kell észben tartanunk, mielőtt az UART kimenő pufferjébe adatot írnánk: először ellenőrizni kell, hogy a puffer szabad-e vagy nem. Ha foglalt, akkor az azt jelzi, hogy az UART még nem fejezte be a korábban kapott adat elküldését, de amint ezzel végzett, akkor átveszi a pufferből a következő adatot és elkezdi elküldeni azt.

Fontos azt is megemlíteni, hogy a pufferben tárolt adat nem az az adat, amit az UART éppen küld. Az UART a pufferből a shift-regiszterébe olvassa az adatot, ami elkezdi elküldeni azt, ezáltal a puffer felszabadul és kész új adatok fogadására. Minden alkalommal, amikor az UART beolvassa a kimenő pufferből az adatokat, ezáltal törli is azt, és erről tájékoztatja is a mikrovezérlőt az UCSRA regiszter “USART Adat Regiszter Üressé Vált - UDRE” jelzőbitjének az átállításával. Az adatküldő függvényünkben ennek a bitnek az állapotát figyeljük folyamatosan, és amikor azt jelzi, hogy a puffer üres, s adatot írhatunk bele, akkor töltjük fel a kimenő puffert (UDR regisztert).

A fent vázolt folyamatot követhetjük nyomon az alábbi ábrán:

a)  Az UDR kimenő puffere üres, de az előző adatbájt küldését még nem fejezte be a küldő Shift-regiszter.

b)  Ha új adatbájtot akarunk küldeni, akkor azt beírhatjuk az üres UDR kimenő pufferbe. Az előző adatbájt küldését még mindig nem fejezte be a küldő Shift-regiszter.

c)  Ha a küldő Shift-regiszter befejezte az előző adatbájt küldését, akkor automatikusan beolvassa az UDR kimenő pufferéből a következő elküldendő adatot.

d) Az UDR puffer kiolvasása egyben ki is üríti azt (a tartalmát lenullázza) és ezáltal a TXC jelzőbit állapota is megváltozik, jelezve, hogy az UDR kimenő puffere üres, kész az újabb adat fogadására.

  1. void UARTAdatKuld(char data) // Ez a fuggveny a kuldendo adatot beirja az UDR regiszter kimeno pufferjebe
  2. {
  3.    while(!(UCSRA & (1<<UDRE)))  // Varakozas amig az Ado kesz nem lesz az adatkuldesre
  4.    {
  5.       //  Varakozas
  6.    }
  7.    // Az Ado mar kesz az adatkuldesre, a kuldendo adatot a kimeno pufferjebe irjuk
  8.    UDR=data;
  9. }

Adat beolvasása UART-tal

Ez a függvény adatot olvas be az UART-ból. Például, ha a PC-vel adatot küldünk a mikrovezérlőnek (a), akkor az AVR UART az adatot automatikusan fogadja (b), és ha a bejövő adatbájt összes bitje megérezett, akkor az UDR bejövő puffer-be rakja, majd az UCSRA regiszter megfelelő jelzőbitjét is beállítja, ezzel jelezve, hogy az adat elérhető a bejövő pufferben (c). Innen már a mi felelősségünk (illetve a főprogramunké), hogy a pufferben lévő adatot kiolvassuk és feldolgozzuk (d), különben, ha időközben új adatbájt érkezik, akkor az előző adatot felülírja. Tehát írunk egy olyan “polling” függvényt, ami folyamatosan azt vizsgálja, hogy az UCSRA regiszter RXC bitje mikor jelzi, hogy új bejövő adat érkezett, majd azt beolvassa az UART UDR regiszteréből.

Fontos megjegyezni, hogy amint az alábbi ábrán is látható, adat küldésekor egy bájt legkisebb helyiértékű bitjét (0. bit) küldjük először, a legmagasabb helyiértékű bit-jét (7. bit) pedig utoljára. Az adat fogadásakor is a 0-dik bit érkezik meg először és a 7-dik bit utoljára. Ezért a fogadó Shift regiszter “megfordítja” a beérkező bitek sorrendjét, hogy az adatbájton belül a megfelelő helyre kerüljenek.

  1. char UARTAdatFogad() // Ez a fuggveny a beerkezo adatokat kiolvassa az UDR regiszter bejovo pufferebol
  2. {
  3.    while(!(UCSRA & (1<<RXC))) // Varakozas amig nincs uj bejovo adat
  4.    {
  5.       //  Varakozas
  6.    }
  7.    //Most mar van beerkezett adat, amit kiolvasunk a pufferbol
  8.    return UDR;
  9. }


A cikk még nem ért véget, lapozz!
Következő: »»   4 / 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