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: 56933, Oldal olvasási idő: kb. 4 perc
Lapozás: OK   3 / 9

AVR UART regiszterek

Ezután a kis elméleti bevezető után végre itt az ideje, hogy megvizsgáljuk, hogyan működik az AVR mikrovezérlőkkel az UART. És megírjuk a kódot, ami beállítja az UART-ot, hogy adatokat küldjünk és fogadjunk vele.

Mint a legtöbb mikrovezérlőnek, az AVR-nek is van külön a soros kommunikációra szolgáló perifériája (UART). Ez a speciális hardver nagymértékben megkönnyíti az életünket. Csak az elküldésre váró adatokat kell megadnunk és a periféria elvégzi a többit. Amint láttuk, a soros kommunikáció megadott standard sebességeken történhet csak (9600, 19200 bps, stb...), ami a mikrovezérlő sebességéhez viszonyítva elég lassúnak mondható. A hardveres soros kommunikáció előnye, hogy az elküldendő adatot (bájtot) csak az UART egy regiszterébe kell írni és már végeztünk is, a processzor innentől csinálhat bármi mást, az UART periféria ezalatt elküldi az adatot.

Hasonlóan az UART automatikusan érzékeli az adatküldés kezdetét az RX vonalon, ezután folyamatosan beolvassa az érkező adatokat, majd ha az egész bájt beérkezett, akkor közli a mikrovezérlővel, hogy olvassa ki az érkezett adatot az UART megfelelő regiszteréből.

Az AVR által használt UART-ot sokféle kommunikációs módra be lehet állítani. Én az alábbi példákban csak a leginkább elterjedt módot fogom használni egyszerű adatküldésre és fogadásra.

UART használata AVR mikrovezérlővel

Az ATmega8 mikrovezérlő UART-ja az alábbi hat regiszteren keresztül kapcsolódik a processzorhoz:

  • UDR: ez az UART Adat Regiszter
  • UCSRA, UCSRB és UCSRC: UART Kontrol és Státusz Regiszter A, B és C: Amint a neve is mutatja az UART beállítására és bizonyos állapotok jelzésére szolgáló regiszterek.
  • UBRRH és UBRRL: Ez az UART Baud Rate Regiszter, ami 16 bit nagyságú, ezért tárolásához 2 bájt kell. UBRRH a felső bájt, UBRRL pedig az alsó bájt.

Az AVR és a belső UART periféria kapcsolatát az alábbi ábra szemlélteti:

UART regiszterek

Ahhoz, hogy olyan programokat írjunk, ami az AVR UART perifériáját használja, szükséges a fenti regiszterek behatóbb ismerete. Nem fogom az összes regiszter összes bitjének funkcióját részletesen leírni, csak azt, ami most nekünk az egyszerű példáinkhoz feltétlenül szükséges (az ábrákon sárgával kiemelt bitek). Az ATmega8 adatlapja tartalmazza a fenti regiszterek minden egyes bitjének részletes leírását.

  • UDR: ez az USART Adat Regiszter: valójában ez nem egy, hanem két regiszter. Amikor kiolvassuk, akkor a vétel pufferben lévő adatot olvassuk ki, és amikor adatot írunk bele, akkor az az adás pufferbe kerül.

Két külön puffer létezik, egy az adatküldéshez és egy az adatfogadáshoz, amelyek ugyanazt a közös címet használják. A trükk az, hogy az összes írás, ami az UDR regiszterbe történik, az a kimenő pufferbe megy, és az összes kiolvasás, ami az UDR regiszterből történik, az a bejövő pufferből történik.

UDR = adat;       // UDR legyen egyenlő valamilyen adattal -> Adó-ba megy

adat = UDR;       // valamilyen adat legyen egyenlő az UDR-rel -> Vevő-ből jön

UCSRA: UART Kontrol és Státusz Regiszter A

  • RXC: ez a bit jelzi, ha az UART befejezte egy bejövő adatbájt vételét, és azt a főprogramnak ki kell olvasnia az UDR regiszterből
  • TXC: ez a bit jelzi, ha az UART befejezte egy kimenő adatbájt elküldését, és a főprogram újabb küldendő adatot írhat az UDR regiszterbe

UCSRB: UART Kontrol és Státusz Regiszter B

  • RXCIE: Vétel Befejezve Megszakítás Engedélyezése: Ha e bit értékének 1-et adunk, akkor a hozzá tartozó megszakítás engedélyezve lesz 
  • TXCIE: Adás Befejezve Megszakítás Engedélyezése: Ha e bit értékének 1-et adunk, akkor a hozzá tartozó megszakítás engedélyezve lesz
  • RXEN: Ha e bit értékének 1-et adunk, akkor az UART Vétel engedélyezve lesz. (Vevő áramkörök bekapcsolása)
  • TXEN: Ha e bit értékének 1-et adunk, akkor az UART Adás engedélyezve lesz. (Adó áramkörök bekapcsolása)
  • UCSZ2: (lásd később)

UCSRC: UART Kontrol és Státusz Regiszter C

Fontos!: Az UCSRC és az UBRRH (lásd később) regiszterek egy közös címen osztoznak, azt, hogy melyik regiszterbe fogunk írni, azt a 7. bit (az utolsó bit) határozza meg. Ha a 7. bit 1-es, akkor az adat a UCSRC regiszterbe íródik, ha az utolsó bit 0, akkor pedig az UBRRH regiszterbe. Ezt az utolsó 7. bitet úgy hívjuk, hogy:

  • URSEL: UART Regiszter Kiválasztó bit
  • UMSEL: UART Működési Mód Kiválasztó: ezzel a bittel tudunk választani a szinkron és az aszinkron működési mód között. (A példáknál csak az aszinkron soros kommunikációs módot fogom használni.)

  • USBS: USART Stop Bit Kiválasztás: ezzel a bittel lehet megadni, hogy 1 vagy 2 db Stop bitet akarunk használni. (A példáknál 1 stop bitet fogok használni.)

  • UCSZ: USART Karakter Méret Kiválasztás: Ez a 3 bit (az egyik az UCSRB regiszterben van!) adja meg az adatcsomagokban küldött adatbitek számát. Az ATmega8 egy 8 bites mikrovezérlő, ezért célszerű az adatokat bájtonkét küldeni, ezért 8 bitet fogok használni.

UBRR: UART Baud Rate Regiszter: ez az UART soros kommunikáció sebességének megadására szolgáló regiszter. Ezzel lehet az UART előosztását beállítani, amivel a rendszerórajelből előállítjuk az UART időalapját, hogy a bejövő adatok mintavételezése a megfelelő frekvenciával történjen majd. Ez képezi az adatküldés időalapját is. Ez a regiszter 16 bites, ezért 2 bájtból áll. UBBRH a felső bájt, UBBRL pedig az alsó bájt. Nekünk nem kell külön a felső és az alsó bájtba írnunk, a C fordító elintézi ezt helyettünk. Adott sebességű soros kommunikációhoz tartozó UBRR értéket az alábbi képlettel számolhatjuk ki (érdemes ezt a képletet beírni a C kódba, és kiszámolni a rendszer órajelfrekvenciát és a soros kommunikáció sebességét felhasználva):

UBBR értéke csak egész szám lehet. Ezért olyan baud rate-et használjunk csak, aminél a kommunikációs hibaszázalék az adatlapban ajánlott maximális ±3%-nál kisebb értékű!

Figyeljuk meg, hogy a BaudRate Regiszter értéke (UBBR) nem egyezik meg a soros kommunikációhoz használt baud-rate értékkel. UBBR értékét a programba illesztett alábbi kódrészlettel adjuk meg:

  1. #define F_CPU 7372800UL // 7.3728 MHz
  2. #define UART_BAUDRATE 9600 // 9600 bps
  3. #define UBRR_ERTEK ((F_CPU / (USRT_BAUDRATE * 16UL)) - 1)

Ahol F_CPU a mikrovezérlő órajele, UART_BAUDRATE pedig a soros kommunikáció sebessége (a cikk példáinál, 7.37280 MHz-es a rendszer órajel és 9600 bps a baud-rate).


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