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
AVR UART regiszterekEzutá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ővelAz ATmega8 mikrovezérlő UART-ja az alábbi hat regiszteren keresztül kapcsolódik a processzorhoz:
Az AVR és a belső UART periféria kapcsolatát az alábbi ábra szemlélteti: UART regiszterekAhhoz, 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.
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
UCSRB: UART Kontrol és Státusz Regiszter B
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:
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:
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! Értékeléshez bejelentkezés szükséges! |
Bejelentkezés
Hirdetés |