SVETELEKTRO

15. júla 2012   Verzia pre tlač Verzia pre tlač

Programujeme AVR v jazyku C – 8. časť


zawin

Univerzálna asynchrónna/synchrónna sériová linka (USART)

V nasledujúcich častiach seriálu sa budeme venovať štandardom určeným na obojsmerný prenos dát. V dnešnej časti sa bližšie pozrieme na univerzálnu asynchrónnu/synchrónnu sériovú linku alebo skrátene USART. USART patrí k základnej výbave takmer všetkých mikropočítačov rady AVR, čo znamená že je hardvérovo implementovaná ako periféria mikropočítača.
 

Popis asynchrónnej/synchrónnej sériovej linky

Sériová linka je známa už mnoho rokov. Na počítači sa vyskytuje pod štandardom RS-232 a je vyvedená z počítača pomocou DB-9 konektora. Rozhranie RS-232 však nemôžeme priamo pripojiť s rozhraním USART na mikropočítači, pretože RS-232 ma odlišne definované napäťové úrovne logických hodnôt. V dnešnej dobe sa už čoraz menej vyskytuje sériová linka na počítačoch či notebookoch, pretože je nahrádzaná rozhraním USB. Na to aby sme mohli prenášať dáta z mikropočítača cez USART do počítača potrebujeme prevodník na rozhranie RS-232 alebo USB.

Návod na jednoduchý prevodník na USB nájdete v tomto článku

Dáta z mikropočítača možno teda prenášať buď asynchrónne alebo synchrónne. Rozdiel je v tom, že pri synchrónnom prenose potrebujeme ďalší vodič, ktorý bude synchronizovať prenos dát hodinovým signálom. Pri synchrónnom prenose môžeme dosahovať vyššie rýchlosti v porovnaní s asynchrónnym. Avšak asynchrónny prenos dát sa využíva oveľa častejšie, najmä z toho dôvodu ,že rozhranie RS-232 na počítači dokáže komunikovať len asynchrónne.

Pri asynchrónnom prenose je dátový rámec definovaný nasledovne:
Štart bit – začiatok prenosu, slúži na zosynchronizovanie vysielača a príjimača, stav linky je v log. 0
Dátove bity – môže ich byť 5 až 9, začína sa bitom najnižšej váhy (LSB)
Parity bit – slúži ako kontrolná suma pri prenose dát
Stop bity (1 alebo 2) – ukončenie prenosu, stav linky je v log. 1
Stav nečinnosti – ak sa žiadne dáta po linke neodosielajú ostáva v log. 1.


 

Bloková schéma USART


Jednotka USART pozostáva z troch základných blokov.

Sú to: generátor hodinového signálu, vysielač a prijímač.

Generátor hodinového signálu je zložený z generátora prenosovej rýchlosti a synchronizačných obvodov pre externý vstup hodinového signálu, ktorý je využívaný v prípade, ak jednotka pracuje v synchrónnom „SLAVE“ režime. Vývod XCK sa využíva len ak jednotka pracuje v synchrónnom prenosovom režime.

Vysielač je zložený z vyrovnávacieho registra, sériového posuvného registra, generátora parity a riadiacich obvodov pre prenos rôznych formátov údajov. Vyrovnávací register pre zápis dovoľuje vysielať údaje bez oneskorenia medzi jednotlivými čiastkovými prenosmi.

Prijímač je vďaka jednotkám obnovy údajov a hodinového signálu najzložitejšou časťou modulu USART. Jednotky obnovy sa využívajú pri asynchrónnom príjme dát. Prijímač obsahuje tiež obvod na kontrolu parity, riadiacu jednotku, posuvný register a dvojúrovňový prijímací vyrovnávací register (UDR). Prijímač podporuje všetky formáty prenosu dát vysielača a môže detekovať chybu príjmu, pretečenie údajov a chybu parity.

 

 

Popis registrov

Modul USART mikropočítača Atmega8 obsahuje štyri 8-bitové registre:
-údajový register UDR,
-riadiaci a stavový register A, UCSRA
-riadiaci a stavový register B, UCSRB
-riadiaci a stavový register C, UCSRC

Jeden 16-bitový register:
-register prenosovej rýchlosti UBRR.

Údajový register UDR:
– Slúži na ukladanie prijatých dát cez USART a taktiež na zápis dát ,ktoré budú cez USART vyslané.

Riadiaci a stavový register A, UCSRA – USART Control and Status Register A:
– Nastavuje a informuje o stave USART

Bit 7 – RXC: USART Recieve Complete, Ukončený príjem znaku
Tento príznakový bit je nastavený na hodnotu log.1, ak v prijímací zásobník obsahuje neprečítané dáta. Bit RXC je vynulovaný, ak prijímací zásobník je prázdny. Ak sa zakáže činnosť prijímača, potom sa vynuluje zásobník a bit RXC bude obsahovať hodnotu log.0. Príznakový bit RXC môže byť využitý na generovanie prerušenia.

Bit 6 – TXC: USART Transmit Complete, ukončené vysielanie znaku
Tento príznakový bit sa nastaví na hodnotu log.1, keď rámec vložený do vysielacieho posuvného registra je kompletne vyslaný a nové údaje nie sú zapísané do vysielacieho vyrovnávacieho registra (UDR). TXC príznak sa automaticky vynuluje, keď sa vykoná príslušná obsluha prerušenia, alebo zápisom log.1 do tejto V/V lokácie. Príznak TXC môže byť využitý na generovanie odpovedajúceho prerušenia.

Bit 5 – UDRE: USART Data Register Empty, údajový register prázdny
Príznakový bit UDRE indikuje, že vysielací vyrovnávací register je pripravený prijať nové dáta. Ak bit UDRE má hodnotu log.1 vyrovnávací register je prázdny a pripravený na zápis nového znaku. Príznak UDRE môže byť využitý na generovanie odpovedajúceho prerušenia.

Bit 4 – FE: Frame Error, chyba rámca
Tento bit sa nastaví na hodnotu log.1, ak znak v prijímacom vyrovnávacom registri obsahoval chybu rámca (prvý stop bit prijatého znaku bol rovný log.0). Hodnota bitu FE je platná pokiaľ sa neprečíta obsah prijímacieho vyrovnávacieho registra UDR. Bit FE je rovný nule, ak stop bit prijatého rámca má hodnotu jedna. Zápisom do registra UCSRA sa uvedený bit vynuluje.

Bit 3 – DOR: Data OverRun, pretečenie dát
Tento bit sa nastaví na hodnotu log.1, ak dôjde k pretečeniu pri príjme dát. Pretečenie je charakterizované nasledovnými podmienkami: Prijímací zásobník je plný-(dva znaky), nový znak je v prijímacom posuvnom registri a je prijatý ďalší štart bit. Hodnota bitu DOR je platná pokiaľ sa neprečíta obsah prijímacieho vyrovnávacieho registra UDR. Zápisom do registra UCSRA sa uvedený bit vynuluje.

Bit 2 – PE: Parity Error, chyba parity
Bit PE sa nastaví na hodnotu log.1, ak znak v prijímacom vyrovnávacom registri obsahoval chybu parity a kontrola parity bola povolená (UPM1=1). Hodnota bitu PE je platná, pokiaľ sa neprečíta obsah prijímacieho vyrovnávacieho registra UDR. Zápisom do registra UCSRA sa uvedený bit vynuluje.

Bit 1 – U2X: Double the USART Transmission speed, dvojnásobná prenosová rýchlosť
Bit U2X má význam len pri asynchrónnom prenose. Ak je zvolený synchrónny prenos, do bitu U2X zapíšeme hodnotu log.0. Pri asynchrónnej komunikácii sa zápisom logickej jednotky do bitu U2X prenosová rýchlosť zdvojnásobí.

Bit 0 – MPCM: Multi-processor Communication Mode
Pomocou bitu MPCM povoľujeme režim multiprocesorovej komunikácie. Keď bit MPCM obsahuje log.1, potom všetky prijímané rámce, ktoré neobsahujú informáciu o adrese sa prijímačom USART ignorujú. Poznamenajme, že hodnota bitu MPCM nemá vplyv na činnosť vysielača modulu USART.

Riadiaci a stavový register B, UCSRB – USART Control and Status Register B

Bit 7– RXCIE: RX Complete Interrupt Enable, povolenie prerušenia od RXC
Zápisom log.1 do bitu RXCIE povoľujeme prerušenie od príznaku RXC. Prerušenie RXC bude generované, ak bit RXCIE obsahuje hodnotu log.1, je globálne povolená obsluha prerušení (bit I v SREG má hodnotu log.1) a súčasne sa bit RXC v registri UCSRA nastaví na hodnotu log.1.

Bit 6 – TXCIE: TX Complete Interrupt Enable, povolenie prerušenia od TXC
Zápisom log.1 do bitu TXCIE povoľujeme prerušenie od príznaku TXC. Prerušenie TXC bude generované, ak bit TXCIE obsahuje hodnotu log.1, je globálne povolená obsluha prerušení (bit I v SREG má hodnotu log.1) a súčasne sa bit TXC v registri UCSRA nastaví na hodnotu log.1.

Bit 5 – UDRIE: USART Data Register Empty Interrupt Enable, povolenie prerušenia od UDRE
Zápisom log.1 do bitu UDRIE sa povolí prerušenie od príznaku UDRE. Prerušenie UDRE bude generované, ak bit UDRIE obsahuje hodnotu log.1, je globálne povolená obsluha prerušení (bit I v SREG má hodnotu log.1) a súčasne sa bit UDRE v registri UCSRA nastaví na hodnotu log.1.

Bit 4 – RXEN: Receiver Enable, povolenie činnosti prijímača
Zápis log.1 do bitu RXEN sa povolí činnosť prijímača jednotky USART. Režim V/V vývodu RxD sa nastaví na vstup do prijímača USART. Ak sa zakáže činnosť prijímača (RXEN = 0 ), potom sa zničí obsah prijímacieho zásobníka a príznakov FE, DOR a PE.

Bit 3 – TXEN: Transmitter Enable, povolenie činnosti vysielača
Zápis log.1 do bitu TXEN povoľujeme činnosť vysielača jednotky USART. Aktuálny režim V/V vývodu TxD sa nastaví na výstup z vysielača USART. Ak sa zakáže činnosť prijímača (TXEN = 0 ), potom sa vyšlú všetky údaje z posuvného vysielacieho registra a z vyrovnávacieho registra, zakáže sa činnosť vysielača a vývod TxD sa vráti do pôvodného režimu.

Bit 2 – UCSZ2: Character Size, dĺžka znaku
Bit UCSZ2 spolu s bitmi UCSZ1:0 v registri UCSRC určuje počet údajových bitov prenášaného znaku.

Bit 1 – RXB8: Receive Data Bit 8, prijatý údajový bit 8
Ak je nastavená dĺžka prenášaných znakov na deväť bitov, potom v bite RXB8 je uchovaná hodnota prijatého deviateho údajového bitu. Jeho hodnota musí byť prečítaná pred čítaním obsahu registra UDR.

Bit 0 – TXB8: Transmit Data Bit 8, vysielaný údajový bit 8
Ak je nastavená dĺžka prenášaných znakov na deväť bitov, potom TXB8 reprezentuje deviaty vysielaný údajový bit. Deviaty údajový bit musí byť zapísaný pred zápisom spodných ôsmych bitov do registra UDR.

Riadiaci a stavový register C, UCSRC – USART Control and Status Register C

Bit 7 – URSEL: Register Select, výber registra
Na základe hodnoty bitu URSEL je možné voliť medzi prístupom k registru UCSRC, alebo registru UBRRH. Pri čítaní UCSRC je hodnota tohto bitu log.1. Ak zapisujeme do registra UCSRC musí URSEL obsahovať hodnotu log.1.

Bit 6 – UMSEL: USART Mode Select, výber režimu USART
Pomocou bitu UMSEL volíme režim činnosti jednotky USART. Ak bit UMSEL má hodnotu nula, potom USART pracuje v asynchrónnom prenosovom režime. Ak bit UMSEL má hodnotu jedna, potom USART pracuje v synchrónnom prenosovom režime.

Bit 5:4 – UPM1:0: Parity Mode, režim parity
Tieto bity povoľujú a nastavujú typ generovania a kontroly parity. Ak je generovanie a kontrola parity povolená, potom vysielač bude v každom rámci generovať a vysielať paritný bit. Prijímač bude na základe prichádzajúcich dát generovať hodnotu paritného bitu a porovnávať ho s prichádzajúcim paritným bitom v súlade s nastavením bitu UPM0. Pri chybe parity sa nastaví príznak PE v registri UCSRA.

 

UPM1 UPM0 Režim parity
0 0 Žiadna
0 1 Nevyužité
1 0 Povolená, párna parita
1 1 Povolená, nepárna parita

 


Bit 3 – USBS: Stop Bit Selct, výber stop bitu
Pomocou bitu USBS sa volí počet stop bitov, ktoré sú vložené do vysielaného rámca. Prijímač modulu USART ignoruje nastavenie bitu USBS. Ak bit USBS má hodnotu nula, potom vysielaný rámec obsahuje jeden stop bit. Ak bit USBS má hodnotu jedna, potom vysielaný rámec bude obsahovať dva stop bity.

Bit 2:1 – UCSZ1:0: Character Size, dĺžka znaku
Pomocou bitov UCSZ1:0 a bitu UCSZ2 v registri UCSRB je možné nastaviť počet dátových bitov (dĺžku znaku) vo vysielanom a prijímanom rámci.

 

UCSZ2 UCSZ1 UCSZ0 Dĺžka znaku
0 0 0 5 bitov
0 0 1 6 bitov
0 1 0 7 bitov
0 1 1 8 bitov
1 0 0 Nevyužité
1 0 1 Nevyužité
1 1 0 Nevyužité
1 1 1 9 bitov

 


Bit 0 – UCPOL: Clock Polarity, polarita hodinových impulzov
Bit UCPOL je využitý len v prípade synchrónneho prenosového režimu. Ak je používaný asynchrónny režim do bitu UCPOL zapisujeme nulu. Pomocou bitu UCPOL definujeme vzťah medzi hodinovým signálom a vzorkovaním vstupného signálu, respektíve okamžikom zmeny výstupného signálu.

 

UCPOL Zmena vysielaných dát,(TxD vývod) Vzorkovanie prijímaných dát, (RxD vývod)
0 Vzostupná XCK hrana Zostupná XCK hrana
1 Zostupná XCK hrana Vzostupná XCK hrana

 


Registre prenosovej rýchlosti, UBRRL a UBRRH – USART Baud Rate Registers

Bit 15 – URSEL: Register Select, výber registra
Na základe hodnoty bitu URSEL je možné voliť medzi prístupom k registru UCSRC, alebo k registru UBRRH. Pri čítaní UBRRH je hodnota tohto bitu log.0. Ak zapisujeme do registra UBRRH musí URSEL obsahovať log 0.

Bity 14:12 – nevyužité (rezervované) bity
Pri zápise do UBRRH musia byť tieto bity rovné nule.

Bity 11:0 – UBRR11:0: USART Baud Rate Register, register prenosovej rýchlosti
12-bitový register UBRR obsahuje údaj o prenosovej rýchlosti jednotky USART. V registri UBRRH sú obsiahnuté štyri bity najvyššej váhy a register UBRRL obsahuje osem bitov nižšej váhy. Zmena obsahu registra UBRR v priebehu prenosu spôsobí stratu prijímaných a vysielaných dát. Zápisom do registra UBRRL sa bezprostredne zmení prenosová rýchlosť.

Výpočet prenosovej rýchlosti v Baudoch alebo výpočet obsahu registra UBRR na základe prenosovej rýchlosti

Pozn.: Časté problémy s nefunkčnosťou UART na mikropočítači bývajú spôsobené odchýlkou prenosovej rýchlosti od žiadanej nakoľko výpočet hodnoty UBRR nevýde vždy celé číslo. Na dosiahnutie štandartných prenosových rýchlostí bez odchýlky sa používajú externé kryštálové oscilátory na frekvenciách 1,8432 MHz, 3,6864 MHz, 7,3728 MHz, 11,0592 MHz a 14,7456MHz. Pokiaľ používame vnútorný RC oscilátor nezabudnime nastaviť register OSCCAL, ktorý kalibruje RC oscilátor. Nastavenie registra UBRR a odchýlky pri rôznych prenosových rýchlostiach v závislosti od frekvencie hodín sa dočítate v datasheete atmega8 od strany 153.

 

 

Praktická realizácia prenosu dát cez UART

Zapojenie mikropočítača atmega8 pre prenos dát cez UART

Nato aby sme mohli otestovať priložené programy musíme najskôr prepojiť mikropočítač s počítačom cez prevodník. Prevodník môžeme realizovať buď na rozhranie RS-232 alebo USB. Zapojenie ilustruje aj nasledovná schéma.


 

Práca s knižnicou na obsluhu sériovej linky

Pre jednoduchšiu prácu s rozhraním UART na mikropočítači Atmega8 som sa rozhodol v spolupráci s kamarátom luboss17 naprogramovať knižnicu na obsluhu sériovej linky. Pomocou nej si ukážeme ako inicializovať UART a ako prenášať dáta.

Knižnicu určenú pre mikropočítač atmega8 si môžete stiahnuť tu: uart.zip

V AVR studio 4 si vytvoríme nový projekt, následne vo vytvorenom adresári projektu pridáme súbory knižnice (uart.c, uart.h). Tieto súbory taktiež pridáme aj v našom projekte v AVR studio. Ak sa nám to podarilo môžeme otestovať náš prvý program.

Program č.1: cyklické odosielanie reťazca znakov

Na začiatku programu inicializujeme UART mikropočítača cez funkciu uart_init(); pričom parametrom tejto funkcie je prenosová rýchlosť, ktorú musíme zadať. Štandardne sa používa rýchlosť 9600 baudov, preto som túto rýchlosť zvolil aj ja v nasledovnom programe. Pre správne nastavenie prenosovej rýchlosti musíme mať korektne nastavenú pracovnú frekvenciu mikropočítača v nastaveniach projektu. Funkcia uart_init(); ďalej pomocou registra UCSRB povolí prijímač a vysielač a registrom UCSRC nastaví parametre prenosu – 8 dátových bitov, 1 stop bit, parita vypnutá.

Po inicializovaní UART-u môžeme začať odosielať alebo príjimať dáta. Na začiatok teda v programe odosielame v nekonečnej slučke reťazec znakov pomocou funkcie uart_puts();

Pozn. 1: na odoslanie jedného znaku slúži funkcia uart_putc();
Pozn. 2.: Pri zápise reťazca znakov používame úvodzovky napr. uart_puts("Ahoj"); pri zápise jedného znaku apostrofy uart_putc('A');Ukážka programu:

Program č. 2: vrátenie odoslaného reťazca znakov
V druhom programe budeme už posielať aj dáta do mikropočítača. Dáta sú mikropočítačom príjimané do buffera (zásobníka) s nastavenou dĺžkou 128bajtov. Pri príjme nového znaku nastane prerušenie a znaky sa ukladajú do poľa pričom sa čaká na ukončovací znak alebo . Ak ukončovací znak dorazí reťazec znakov sa ukončí a nastaví sa príznak informujúci že príjem reťazca znakov je ukončený. Pomocou funkcie uart_gets(); môžeme tieto dáta vybrať na spracovanie. Návratovou hodnotou funkcie je príznak či bol prijatý reťazec znakov alebo nie. Do parametra funkcie zadáme ukazovateľ na pole do ktorého sa má prijatý reťazec znakov uložiť.

Ukážka programu:

Program č. 3: sčítavanie čísel
V tretom ukážkovom programe si ukážeme jednoduchý program, ktorý sčítava prijaté čísla cez sériovú linku a naspäť posiela výsledok sčítania.
V nekonečnom cykle sa testuje či prišiel nový reťazec znakov. Ak áno, vykoná sa funkcia zisti_cislo(); ktorá prijatý znak čísla premení na číslo. Ak číslo je nenulové pričíta sa ku výsledku a následne sa výsledok pošle naspäť cez UART. Program pracuje len s jednocifernými číslami, nič vám však nebráni môj ukážkový program vylepšiť.

Ukážka programu:

Na záver sa chcem poďakovať všetkým, ktorí sa podieľali na tvorbe tohto článku.
V ďalšej časti seriálu sa bližšie pozrieme na komunikačné rozhranie SPI.

Ako sa vám páčil tento článok?
  • Páči sa mi (0)
  • Súhlasím (0)
  • Zábavné (0)
  • Informatívne (0)
Najnovšie články od zawin (zobraziť všetky)

Komentáre (9)

  1. kizmoo píše:

    Mierna optimalizacia zapisu funkcie zisti_cislo

    unsigned char zisti_cislo(char *str)

    {

    if ( (str[0] >= ‚0‘) && (str[0] <= '9'))
    return str[0] – ‚0‘;

    else

    return 0;

    }

  2. macpe píše:

    čau, mám s tím jeden problém. Když přímám řetězec (používám první program který tu je uveden) tak mi misto „ahoj svete“ mi přijde ´ˇ´«[05]ÚéĘ´ používám atmegu8 s pojistkama továrně nastevenýma na 1mHz, nejsem si jistej kde je problém

  3. madboy píše:

    Mam taky dotaz k rychlostiam tzv. baudrate …. našiel som a jednej stranke že ked použivam atmega 8 s vnutornym krištalom 1MHz tam rychlost ma byt 2400… a ked použijem externy krištal tak potom možem použit 9600 je to pravda? aky krištal si použival ty ty aleno aku frekvenciu ked si bouživat 9600 ??

  4. matti píše:

    Chcel by som sa spytat, ci to prijimanie stringu (uart_gets) je skutocne funkcne. Ci tam nahodou nie je nejaka chyba, pretoze vsetko funguje v pohode okrem toho.

  5. filip_4 píše:

    Velka vdaka autorovi(-om) za super serial 🙂 .. Matti, funguje i ta funkcia na prijimanie stringu. V mojom pripade bolo ale treba zmenit v uart.c „ISR(USART_RXC_vect)“ na „ISR(USART__RXC_vect)“ (rozdiel je v jednom dvojitom podtrzniku :D) pouzivam AtmelStudio 6.

  6. Wortex píše:

    Posielanie stringu mi funguje bez problémov, problém mám pri načítaní stringu nefunguje mi to, skúšal som upraviť ISR(USART_RXC_vect)“ na „ISR(USART__RXC_vect)“ ale bez výsledku. Nejaké nápady?

Pridaj komentár