Reklama

Základy ovládání mikrokontroléru ATmega(16/32) 18.díl – Jednotka USART (1. část – Popis)

Úvod

V dalším příspěvku o mikrokontrolérech ATmega16/32 se zaměříme na jednotku USART. USART je pravděpodobně nejvíce využívaná komunikační jednotka. Asi nejčastěji se tato jednotka používá pro spojení mikrokontroléru s počítačem. Komunikaci pomocí jednotky USART byla již několikrát použita i na našich stránkách např. ZDE. K propojení mikrokontroléru s PC je navíc potřeba použít vhodný převodník z rozhraní USB na rozhraní UART. Krátký popis jednoho z mnoha těchto převodníků lze nalézt ZDE.

Popis jednotky

Jednotka USART pracuje v plném duplexním režimu, tzn. že lze najednou přijímat i zasílat data. Komunikaci lze volit mezi synchronním a asynchronním režimem. Pokud je zvolen synchronní režim, tak lze určit, zda mikrokontrolér bude jednotka “Master” anebo “SLAVE”. Daleko více je využíván režim asynchronní komunikace, a proto se v tomto příspěvku zaměříme pouze na něj. Pro asynchronní režim lze volit délku bitů v rozmezí 5 – 9, dále lze volit počet “stop bitů” 1 – 2 a také lze volit nastavení parity. Jednotka USART umožňuje pro asynchronní režim zdvojnásobení přenosové frekvence. Pro rozpoznání chyb disponuje jednotka možnostmi detekcí ztráty znaku, detekcí chyby rámce a detekcí chyby parity. Při komunikaci lze využít tři nezávislé přerušení a to: po odeslání znaku, po vyprázdnění odesílacího registru a po příjmu znaku.

 

Jednotku USART tvoří tři bloky: generátor hodin, vysílač a přijímač. Blok “generátor hodin” se skládá ze synchronizace externích hodin používané v synchronním “Slave” režimu a z generátoru přenosové rychlosti. Pin XCK je použit pouze v synchronním režimu. Vysílač tvoří jeden buffer, sériový posuvný registr, generátor parity a řídící logiku pro různé formáty sériových rámců. Zapisovací buffer umožňuje kontinuální přenos rámců bez jakéhokoliv zpoždění mezi rámci. Přijímač je nejsložitější blok jednotky USART díky tomu, že obsahuje jednotku pro obnovu hodin a dat. Jednotky pro obnovu hodin a dat jsou použity v asynchronním režimu. Blok přijímače dále tvoří detektor parity, řídící logika, posuvný registr a dvouúrovňový přijímací buffer (UDR). Přijímač podporuje stejné formáty rámců jako vysílač, ale navíc může detekovat chybu rámce, ztráty znaku a chybu parity. Jak již bylo řečeno, přijímač obsahuje dvouúrovňový buffer, který pracuje jako kruhový FIFO (“First In – First Out”) buffer. Proto musí být vždy přečteny data z registru UDR pouze jednou. Další důležitou věcí je, že příznakové bity chyb FE (chyba rámce), DOR (ztráta znaku) a devátý přijatý bit RXB8 jsou bufferovány s daty v přijímacím bufferu. Proto musí být vždy příznakové bity přečteny dříve než data z registru UDR, jinak dojde ke ztrátě informace o chybě. Posuvný registr přijímače může pracovat dokonce i jako tříúrovňový buffer.

Popis registrů

Pro práci s jednotkou USART budeme pracovat s registry UDR, UCSRA, UCSRB, UCSRC a registrový pár UBRRL a UBRRH.

 
UDR

Jako první se podíváme na registr UDR, což je datový buffer. Tento registr je společný jak pro přijímač, tak pro vysílač. Pokud data z registru UDR čteme, tak tím dostaneme data z bufferu přijímače. Při zápisu dat do registru UDR zapisujeme do bufferu vysílače. Abychom mohli do bufferu vysílače zapisovat, tak je nutné také nastavit bit UDRE v registru UCSRA do stavu log. 1.

 
UCSRA

Druhým popisovaným registrem je registr UCSRA. Tento registr obsahuje komunikační příznakové bity a příznakové bity informující o chybách. Jednotlivé bity registru UCSRA ukazuje Tab. 1.

Tab. 1: Popis bitů v registru UCSRA

Pozice bitu Označení
7 – (nejvyšší váha) RXC
6 TXC
5 UDRE
4 FE
3 DOR
2 PE
1 U2X
0 – (nejnižší váha) MPCM

 

Bity RXC a TXC slouží k informaci o ukončení akce příjmu, nebo vyslání znaku. Bit RXC je nastaven do stavu log. 1, pokud přijímací buffer obsahuje nějaká nepřečtená data. Po vyprázdnění bufferu dojde k automatickému vynulování bitu. Příznakový bit RXC může generovat přerušení. Bit TXC je nastaven do stavu log. 1, pokud došlo k odeslání všech dat a již nejsou žádné data v bufferu vysílače. Bitem TXC lze také generovat přerušení. Další příznakový bit UDRE nás informuje o tom, že je vysílací buffer (UDR) prázdný a připravený pro zápis. I tento bit můžeme využít pro generování přerušení. Jednotlivé vektory přerušení lze nalézt ZDE.

Následující tři bity FE, DOR a PE jsou příznakové bity, které nás informují o jednotlivých chybových stavech. Tyto příznakové bity jsou platné pouze do doby přečtení registru UDR. Při zápisu do registru UCSRA musí být vždy tyto bity nastaveny do stavu log. 0.

První chybový bit FE slouží k indikaci chyby rámce. K nastavení dojde tehdy, pokud nebyl indikován platný stop bit. K vynulování bitu FE dojde po příjmu platného “stop bitu”. Další příznakový bit DOR nás informuje o ztrátě dat. K nastavení do stavu log. 1 dojde, pokud je již přijímací buffer plný, tzn. obsahuje dva znaky, nový znak je v posuvném registru a je detekován nový “start bit”. Poslední chybový bit PE informuje o chybě parity. Tento bit je nastaven do stavu log. 1 ,pokud nesouhlasí přijatá a vypočítaná parita.

Předposledním bitem U2X můžeme nastavit dvojnásobnou přenosovou rychlost. Tento bit je použit pouze v asynchronních režimech. Pokud nastavíme bit U2X do stavu log. 1, tak změníme nastavení dělicího poměru pro přenosovou rychlost z 16 na 8.

Poslední bit MPCM nastavuje víceprocesorový režim, tzn. že všechny přijaté rámce, které neobsahují adresu, jsou ignorovány. Tímto bitem nijak neovlivníme funkci vysílače jednotky USART.

 
UCSRB

Dalším popisovaným registrem je registr UCSRB. Tento registr slouží k nastavení povolení jednotlivých přerušení, jednotlivých bloků apod. Význam jednotlivých bitů ukazuje Tab. 2.

Tab. 2: Popis bitů v registru UCSRB

Pozice bitu Označení
7 – (nejvyšší váha) RXCIE
6 TXCIE
5 UDRIE
4 RXEN
3 TXEN
2 UCSZ2
1 RXB8
0 – (nejnižší váha) TXB8

 

Nastavením bitů RXCIE, TXCIE a UDRIE do stavu log. 1 lze povolit přerušení:

  • po příjmu dat (pokud je RXCIE = 1 a dojde k nastavení RXC v registru UCSRA)
  • po dokončení vysílání dat (pokud je TXCIE = 1 a dojde k nastavení TXC v registru UCSRA)
  • po vyprázdnění registru UDR (pokud je UDRIE = 1 a dojde k nastavení UDRE v registru UCSRA).

K vyvolání přerušení musí být také povolené globální přerušení např. pomocí “sei()”.

Další dva bity RXEN a TXEN povolují funkci přijímače a vysílače. Pokud je nastaven bit RXEN do stavu log. 1, dojde k povolení přijímače jednotky USART. Nastavením bitu TXEN do stavu log. 1 povolíme vysílač jednotky USART.

UCSZ2 určuje společně s UCSZ1 a UCSZ0 z registru UCSRC délku datového znaku. Výběr délky znaky je uveden až v popisu registru UCSRC.

Bit RXB8 je devátý přijatý datový bit. Tento bit musí být přečten před přečtením registrem UDR.

Bit TXB8 je devátý vysílací bit. Tento bit musí být zapsán před zápisem do registru UDR.

 
USCRC

Posledním řídícím registrem je registr UCSRC. Tímto registrem nastavujeme režim komunikace. Význam jednotlivých bitů ukazuje Tab. 3.

Tab. 3: Popis bitů v registru UCSRC

Pozice bitu Označení
7 – (nejvyšší váha) URSEL
6 UMSEL
5 UPM1
4 UPM0
3 USBS
2 UCSZ1
1 UCSZ0
0 – (nejnižší váha) UCPOL

 

Bitem URSEL určujeme, zda zapisujeme do registru UCSRC a nebo do registru UBBRH, protože tyto dva registry obsahují stejný adresní prostor. Pro zápis do registru UCSRC musí být bit URSEL nastaven do stavu log. 1.

Bitem UMSEL volíme režim komunikace. Pokud je tento bit ve stavu log. 1, tak je vybrán synchronní režim a pro stav log. 0 je vybrán asynchronní režim.

Bity UPM1 a UPM0 se vybírá parita. Výběr parity ukazuje Tab. 4.

Tab. 4: Výběr parity pomocí bitů UPM1 a UPM0

UPM1 UPM0 Vybraná parita
0 0 Žádná parita
0 1 Rezervováno
1 0 Sudá parita
1 1 Lichá parita

 

Dalším bitem USBS volíme počet “stop bitů”. Při stavu log. 1 jsou nastaveny dva “stop bity”, zatímco pro stav log. 0 pouze jeden.

Následují dva bity UCSZ1 a UCSZ0, které spolu s bitem UCSZ2 z registru UCSRB nastavují počet datových bitů, viz Tab. 5.

Tab. 5: Výběr počtu datových bitů pomocí bitů UCSZ2, UCSZ1 a UCSZ0

UCSZ2 UCSZ1 UCSZ0 Počet datových bitů
0 0 0 5
0 0 1 6
0 1 0 7
0 1 1 8
1 0 0 Rezervováno
1 0 1 Rezervováno
1 1 0 Rezervováno
1 1 1 9

 

Poslední bit UCPOL je důležitý pouze v synchronním režimu. Při použití asynchronního režimu je tento bit nastaven do stavu log. 0. Tímto bitem definujeme vztah mezi datovým výstupem, vzorkováním vstupního signálu a hodinovým signálem na XCK. Výběr ukazuje Tab. 6.

Tab. 6: Výběr režimu pomocí UCPOL

UCPOL Změna dat na výstupním pinu TxD Vzorkování vstupních dat na RxD
0 Náběžná hrana XCK Sestupná hrana XCK
1 Sestupná hrana XCK Náběžná hrana XCK

 
 

 
UBBRH a UBRRL

Jako poslední je popsán registrový pár UBRRH a UBRRL. Tyto registry slouží k nastavení přenosové rychlosti. Výpočet přenosové rychlosti a nastavení registrového páru UBRR ukazuje Obr. 1.

Obr. 1: Výpočet přenosové rychlost a registru UBRR pro různé režimy komunikace, převzato z [1]

Obr. 1: Výpočet přenosové rychlost a registru UBRR pro různé režimy komunikace, převzato z [1]

Význam jednotlivých bitů registru UBBRH ukazuje Tab. 7 a význam bitů registru UBRRL ukazuje Tab.8.

Tab. 7: Popis bitů v registru UBBRH

Pozice bitu Označení
7 – (nejvyšší váha) URSEL
6 -
5 -
4 -
3 UBRR11
2 UBRR10
1 UBRR9
0 – (nejnižší váha) UBRR8

 

Tab. 8: Popis bitů v registru UBBRL

Pozice bitu Označení
7 – (nejvyšší váha) UBRR7
6 UBRR6
5 UBRR5
4 UBRR4
3 UBRR3
2 UBRR2
1 UBRR1
0 – (nejnižší váha) UBRR0

 

Bitem URSEL v registru UBBRH opět určujeme, zda se budou data zapisovat do registru UBRRH, nebo do registru UCSRC. Při zápisu do registru UBBRH musí být tento bit ve stavu log. 0.

 

[1] ATMEL. 8-bit Microcontroller with 32KBytes In-System Programmable Flash. [online] citováno 26. října 2014. Dostupné na www: http://www.atmel.com/images/doc2503.pdf
Jiné příspěvky v kategorii:

Základy ovládání mikrokontroléru ATmega(16/32) 1.díl – První kroky

Základy ovládání mikrokontroléru ATmega(16/32) 2. díl – Kompilace a krokování programu

Základy ovládání mikrokontroléru ATmega(16/32) 3.díl – Nahrání vytvořeného zdrojového kódu do mikrokontroléru

Základy ovládání mikrokontroléru ATmega(16/32) 4.díl – Ovládání vstupně/výstupních portů

Základy ovládání mikrokontroléru ATmega(16/32) 5.díl – Ošetření zákmitů na vstupním pinu mikrokontroléru

Základy ovládání mikrokontroléru ATmega(16/32) 6.díl – Externí přerušení

Základy ovládání mikrokontroléru ATmega(16/32) 7. díl – Jednoduchá elektronická hrací kostka

Základy ovládání mikrokontroléru ATmega(16/32) 8.díl – A/D převodník (1.část)

Základy ovládání mikrokontroléru ATmega(16/32) 9.díl – A/D převodník (2.část)

Základy ovládání mikrokontroléru ATmega(16/32) 10.díl – A/D převodník (3.část)

Základy ovládání mikrokontroléru ATmega(16/32) 11.díl – Čítač / Časovač (1.část – Základní popis)

Základy ovládání mikrokontroléru ATmega(16/32) 12.díl – Čítač / Časovač (2.část – Popis registrů)

Základy ovládání mikrokontroléru ATmega(16/32) 13.díl – Čítač / Časovač (3.část – Praktická ukázka)

Základy ovládání mikrokontroléru ATmega(16/32) 14.díl – Dvouřádkový LCD displej

Základy ovládání mikrokontroléru ATmega(16/32) 15.díl – Popis implementace komunikace I2C a EEPROM paměti 24LC512

Základy ovládání mikrokontroléru ATmega(16/32) 16.díl – Watchdog

Základy ovládání mikrokontroléru ATmega(16/32) 17.díl – Obsluha maticové klávesnice

Základy ovládání mikrokontroléru ATmega(16/32) 19.díl – Jednotka USART (2. část – Praktická ukázka)

Základy ovládání mikrokontroléru ATmega(16/32) 20. díl – Generování audio signálu pomocí PWM

Základy ovládání mikrokontroléru ATmega(16/32) 21. díl – Analogový komparátor

Základy ovládání mikrokontroléru ATmega(16/32) 22. díl – Krokování programu v jazyce symbolických adres (JSA)

 
Tajned facebook
 

Za případné chyby v textu, ve zdrojovém kódě, nebo ve schématickém zapojení se omlouváme.
AUTOŘI NEBEROU ŽÁDNOU ODPOVĚDNOST ZA PŘÍPADNÉ ÚJMY NA ZDRAVÍ ČI MAJETKU.