Programování mikrokontrolérů architektury AVR (6)

Zdroj: SOOM.cz [ISSN 1804-7270]
Autor: Prog0el
Datum: 11.4.2016
Hodnocení/Hlasovalo: 1.57/7

Pokud jste již někdy přemýšleli nad jednoduchým způsobem, jak zprovoznit komunikaci mezi mikrokontrolérem a osobním počítačem, pak je tento článek o rozhraní USART přesně pro vás.

Datový přenos a formát dat

Rozhraní USART (Universal Synchronous/ Asynchronous Receiver and Transmitter) je schopno komunikovat v duplexním módu, což znamená, že každé s připojených zařízení může ve stejném zařízení vysílat a současně přijímat data. Každé zařízení, které chceme připojit má vývody pro přijímač (RxD) a vysílač (TxD). Důležité je také propojit země (GND) obou zařízení. Vždy platí, že se zařízení propojují kříženým kabelem, tj. RxD jednoho zařízení propojíme s TxD zařízení druhého buďto přímo, nebo přes převodník napěťových úrovní, který bude popsán později. Jelikož se jedná o sériové rozhraní, tak v jednom okamžiku není možné celou informaci vyslat/ přijmout (na rozdíl od paralelního rozhraní).

Křížený kabel:

Křížený kabel

Data jsou vysílána ve formátu: |START BIT|DATA|(PARITA)|STOP BIT|

Pokud chceme navázat komunikaci se zařízením, pak musíme znát a nastavit přenosovou rychlost, počet datových bitů, stop bitů a paritu. Pro přenosovou rychlost je zažitá jednotka „baud“ (Bd), která udává počet změn stavů za sekundu. V našem případě, kdy využíváme zařízení pro dvoustavovou logiku (0 a 1), platí, že 1Bd=1b/s. Pokud bychom měli datový přenos využívající modulaci vícestavovou (například QPSK- Quadrature Phase Shift Keying), pak by tento přepočet nebyl platný. Běžně používané přenosové rychlosti jsou násobky 1200Bd, což jsou nejčastěji „baudrate“ 9600, 57600, 115200.

Počet datových bitů se nejčastěji nastavuje na osm, jelikož se při tomto počtu přenáší celé byte. V minulosti bylo rozšířené použití sedmi datových bitů, zejména za dob největšího rozkvětu dálnopisných spojů a kódování ASCII-128, jelikož ASCII-128 je sedmibitové kódování. Počet stop bitů se většinou nastavuje na jeden stop bit, avšak je možno nastavit i dva stop bity na úkor času. Paritní bit slouží k ověření správnosti příjmu dat. Jeho princip je založen na počítání bitů o logické hodnotě 1. Obvody dále vyhodnotí, zda je počet jedničkových bitů sudý či lichý (0 je považována za sudou) a na základě nastavení obvodů pro výpočet parity připojí zmíněný paritní bit za blok dat, před stop bit(y). Přijímač pak přijme data včetně paritního bitu a z dat si vypočítá svůj paritní bit. Pokud se tento nově vypočtený paritní bit shoduje s paritním bitem přijatým, pak jsou data považována za korektní. Hodnota paritního bitu označující výsledek výpočtu parity se může lišit v závislosti na nastavení obvodů parity, protože máme na výběr z několika možností, jak paritu nastavit. Při nastavení liché parity je paritní bit roven 1 pouze, pokud je počet jedniček sudý či roven 0. Sudá parita je přesný opak, tj. pokud je počet jedničkových bitů lichý, pak je nově vzniklý paritní bit roven 1. V běžných situacích paritu nepotřebujeme, proto ji můžeme vypnout. V tomto případě bude za blokem dat následovat ihned stop bit. Paritní bit lze na většině počítačů nastavit také do pevné logické úrovně 0 nebo 1, což lze využít při nutnosti přenést vícebitová slova, než jsou schopna zařízení zpracovat, což se používá jen zřídka.

Přenos dat může být synchronní či asynchronní. Při synchronním přenosu dat je současně s daty přenášen také signál sloužící k synchronizaci přenosu dat, což má výhodu v tom, že není nutno, aby mělo každé ze zařízení vlastní časovač či aby věděly, na jaké přenosové rychlosti mají pracovat. Asynchronní přenos vyžaduje, aby oboje zařízení věděly, na jaké přenosové rychlosti mají pracovat a zvyšují se nároky na přesnost časování obou zařízení, jelikož se s daty nepřenáší žádná informace, která by mohla sloužit k synchronizaci. V praxi nepředstavuje časování ani znalost přenosové rychlosti takové problémy, jak by se mohlo na první pohled zdát a pro svou jednoduchost se asynchronní mód rozhraní USART využívá častěji.

Registry rozhraní USART

Aby bylo možno předem popsané parametry rozhraní USART nastavit, pak je nutno použít skupiny konfiguračních registrů.

UCSRA (USART Control and Status Register A) |RxC|TxC|UDRE|FE|DOR|PE|U2X|MPCM| RxC: log.1 je příznakem přijetí byte TxC: log.1 je příznakem vysílání dat UDRE: log.1: Vysílací buffer je prázdný FE: log.1: Chybný rámec dat DOR: log.1: Data není možno zpracovat- buffer je plný. PE: log.1: Byl přijat chybný paritní bit U2X: log.1: Nastavení dvojnásobné přenosové rychlosti MPCM: log.1: Multiprocesorový mód- metoda, jak propojit více mikrokontrolérů na jednu sběrnici USART.

UCRSB (USART Control and Status Register B) |RxCIE|TxCIE|UDRIE|RxEN|TxEN|UCSZ2|RxB8|TxB8| RxCIE: log 1.: Povolení přerušení po dokončení příjmu TxCIE: log 1.: Povolení přerušení při vysílání (po tom, co TxC bude v log. 1) UDRIE: log 1.: Přerušení po nastavení bitu UDRE do log. 1 RxEN: log 1.: Povolení příjmu TxEN: log 1.: Povolení vysílání UCSZ2: Třetí bit nastavení počtu datových bitů RxB8: Devátý přijatý znak TxB8: Devátý vysílaný znak

UCSRC (USART Control and Status Register C) |URSEL|UMSEL|UPM1|UPM0|USBS|UCSZ1|UCSZ0|UCPOL| URSEL: Přepínání operace s UCRSC (log. 1) a UBRRH (log. 0) UMSEL: log.1: synchronní přenos; log.0: asynchronní přenos UPM1: Vyšší ze dvou bitů určených k nastavení módu parity UPM0: Nižší ze dvou bitů určených k nastavení módu parity USBS: Počet stop bitů: log.1: 2; log.0: 1 UCSZ1: Druhý bit nastavení počtu datových bitů UCSZ0: První bit nastavení počtu datových bitů UCPOL: Přepínání reakce na vzestupnou (log. 0) či sestupnou (log.1) hranu v případě synchronního přenosu


Nastavení počtu datových bitů
UCSZ2UCSZ1UCSZ0Počet datových bitů
0005
0016
0107
0118
100rezervováno
101rezervováno
110rezervováno
1119

Nastavení parity
UPM1UPM0mód
00parita vypnuta
01rezervováno
10sudá parita
11lichá parita

UBRRH (USART Baud Rate Register; Higher byte) |URSEL|-|-|-|UBRR 11|UBRR 10|UBRR 9|UBRR 8|

UBRRL (USART Baud Rate Register; Lower byte) |UBRR 7|UBRR 6|UBRR 5|UBRR 4|UBRR 3|UBRR 2|UBRR 1|UBRR 0| URSEL v případě práce s UBRRH nastavte na hodnotu log. 0, viz popis UCSRC.

Pomocí bitů UBRR0-UBRR11 se nastavuje přenosová rychlost, která se pro každý mód přenosu počítá podle jiného vzorce. Jelikož budeme v našem seriálu používat pouze asynchronní mód, tak ostatní módy uvažovat nebudu. Níže uvedený vzorec je pro asynchronní mód, když je bit U2X nastaven v logické 0. Pokud to bude možné a vypočtená hodnota UBRR nebude vyšší, než 4095, pak změnu přenosové rychlosti neprovádějte pomocí dvojnásobení přenosové rychlosti prostřednictvím nastavení U2X bitu do logické 1, jelikož by se potom více projevovaly nepřesnosti nastavení UBRRH/L zapříčiněné zaokrouhlováním. UBRR=(f_CPU/(16•BAUDRATE))-1

Chybu způsobenou nutností zaokrouhlovat hodnotu UBRR je, v případě asynchronního přenosu dat, nutno vypočítat a posoudit, zda bude přípustná. Příliš velká odchylka může způsobovat menší odolnost proti chybám. Zde se již projevuje předem zmíněný požadavek na přesnost načasování jak na straně přijímací, tak na straně vysílací. Maximální přípustnou odchylku udává výrobce v závislosti na počtu bitů nesoucích informaci, tedy součtu datových a paritních bitů. V datasheetu pro mikrokontrolér AT mega 8 se zmíněná tabulka nachází na str. 144. Povšimněte si, že jsou zde uvedeny dvě tabulky; pro každou logickou hodnotu bitu U2X jedna tabulka. Vzorec pro výpočet zmiňované odchylky přenosové rychlosti je uveden níže: odchylka přenosové rychlosti[%]=(?UBRR?_int/UBRR-1)•100 UBRR je nezaokrouhlený výsledek UBRR UBRRint je výsledek UBRR po zaokrouhlení na celá čísla

Pro názornost uvedu příklad výpočtu obsahu registru UBRRH/L pro asynchronní režim rozhraní USART při taktovací frekvenci 8MHz a požadované přenosové rychlosti 9600Bd za předpokladu, že budeme využívat 8 datových bitů a paritu vypneme. UBRR=8000000/(16•9600)-1=51.083 Ż?51

Výsledek výpočtu zaokrouhlíme na celá čísla a převedeme do binární soustavy a zleva doplníme nuly do celkového počtu 12 bitů: 51DEC=110011BIN =>000000110011 Výsledkem je nastavení bitů UBRR[11..0]

Nyní vypočítáme procentuelní odchylku přenosové rychlosti (dle tabulky uvedené výrobcem je přípustná odchylka maximálně ±2%): odchylka přenosové rychlosti[%]=(51/(51.083 Ż )-1)•100?-0.16% Výpočet odchylky nezpochybnil přesnost časování rozhraní USART.

Pro ty, kteří si chtějí práci usnadnit, budou výhodné tabulky začínající na straně 153, kde jsou vybrané hodnoty UBRRH/L vypočteny již předem, nicméně může nastat situace, kdy budete potřebovat vypočítat hodnotu, která v tabulce chybí a v tom případě pro vás bude znalost výše uvedených výpočtů užitečná.

UDR (USART Data Register) Tento datový registr nám umožňuje přistupovat k přijatým datům tím, že jej jednoduše přečteme. V případě, že chceme vysílat data, pak se musíme nejprve ujistit, zda je bit UDRE v logické 1 (příznak prázdného bufferu přijímače). Pokud je rozhraní nakonfigurováno na devět datových bitů, pak je devátý přijatý bit umístěn v registru UCSRB jako bit RxB8 a devátý bit určený k vyslání ve stejném registru jako TxB8.

Logické úrovně a jejich úprava

Informace, které po rozhraní přenášíme je nutno nějakým způsobem vyjádřit. Pro tento účel se nejčastěji používá, v případě dvoustavové logiky, dvou úrovní napětí. Odlišné napěťové úrovně jsou na straně mikrokontroléru i počítače, jak uvádí tabulka níže.


Tabulka napěťových úrovní rozhraní USART
logická úroveňnapěťová úroveň TTL [V]napěťová úroveň RS-232 [V]
0+0.8 ÷ +2+3 ÷ +25
1+2.7 ÷ +5-3 ÷ -25

Hodnoty, které leží mezi napěťovými úrovněmi symbolizujícími logické úrovně, se nazývají zakázanými pásmy. Zakázané pásmo neoznačuje žádnou logickou úroveň a jedná se teoreticky o třetí stav. Jelikož pracujeme ve dvoustavové logice, tak se snažíme o to, aby aplikace v zakázaném pásmu nepracovala. V praxi se vždy vyskytne doba, kdy se v zakázaném pásmu můžeme ocitnout, avšak tato doba je pouze zanedbatelná. Rozhraní USART se ještě může vyskytnout v 3.3V modifikaci. Tohoto systému napěťových úrovní využívají některé komunikační moduly pro Wi-Fi, GSM, GPS či servisní rozhraní routek.

Rozhraní USART se využívá v mnoha různých modifikacích, co se týče napěťových úrovní. Modifikace úrovní, která byla v předchozí tabulce uvedena jako RS-323 je používána zejména z důvodu možnosti použití delší přenosové cesty, než při použití TTL úrovní. TTL je zkratka transistor-transistor logic a označuje technologii výroby integrovaných obvodů, se kterou ovšem nemá mnoho společného; jedná se o zažité označení. Nevýhodou propojování zařízení s různými napěťovými úrovněmi je skutečnost, že je nutno úrovně upravit převodníkem. Převodník může být pasivní, což není nic jiného, než odporový dělič. Toto řešení je vhodné pouze ke snižování napěťových úrovní a v praxi se využívá spíše převodník aktivní. Aktivní převodník lze realizovat z diskrétních součástek, tedy z tranzistorů, diod, kondenzátorů a rezistorů, nebo využít specializovaný integrovaný obvod. Poslední ze zmíněných řešení je tím nejméně pracným a zároveň jakostním.

Integrovaný obvod ST232 (nebo ekvivalent MAX232) převádí signál na vstupu, přivedený z mikrokontroléru do napěťových úrovní RS-232 a naopak, jak znázorňuje schéma zapojení níže. Ty pozornější z vás jistě napadne, jak integrovaný obvod může zvyšovat napětí? S odpovědí na otázku souvisí kondenzátory C1 a C2, které tvoří tzv. „nábojovou pumpu“, která je schopna napětí zvýšit. Kondenzátory značené se znakem „+“ jsou elektrolytické a závisí u nich na polaritě. Polaritu výrobce tiskne na pouzdro a při přepólování většinou kondenzátor vybuchne a mohl by poškodit váš majetek či zdraví, za což neberu odpovědnost. Kondenzátory C4 a C5 slouží k filtraci výstupního napětí nábojové pumpy. Všechny elektrolytické kondenzátory v této konstrukci by měly být alespoň pro napětí 16V. Všimněte si, že převodník obsahuje dva páry převodníků (RS-232>TTL a TTL>RS-232). Využit byl pouze jeden pár; vstupy druhého páru tzv. „transceiverů“ byly spojeny s nulovým potenciálem (připojeny ke GND). Bez tohoto opatření by obvod i nadále fungoval, avšak zvýšilo by se riziko poškození obvodu statickou elektřinou.

Časování rozhraní USART

Jelikož se zabýváme asynchronním přenosem, tak popíšu pouze asynchronní přenos dat po rozhraní USART. Časový diagram má na horizontální ose vynesen čas a na ose vertikální logické úrovně. Pokud leží daná část křivky na časové ose, pak je pro tento čas logická úroveň na výstupu TxD 0. Pokud je daná část křivky grafu od horizontální osy vzdálena, pak se výstup nachází v logické 1.

Časový diagram

Výše uvedený časový diagram je vertikálními čarami rozdělen na časové úseky, které trvají po dobu t: t=1/BAUDRATE

V klidu je na výstupu TxD úroveň logické 1 až do doby, vlivem start bitu logická úroveň do 0. Následuje blok dat, kdy je nejnižší bit vysílán jako první. Za blokem dat může, ale také nemusí být připojen bit paritní (jak bylo uvedeno v předchozích statích) a stop bit mění logickou úroveň zpět do klidového stavu, tedy log.1.Důvodem k volbě logické 1 jako klidové úrovně je možnost detekce přerušení vedení. Pokud se vedení přeruší, logická úroveň se změní a je možno detekovat chybu.

Časování rozhraní USART téměř nemusíte řešit, pokud používáte interní periferii, která datový rámec sestaví za vás. Ve své praxi jsem se již setkal s mikrokontrolérem, který tímto rozhraním nedisponoval a bylo nutno jej emulovat, při čemž se znalost časování hodila.

Propojení mikrokontroléru s počítačem

Na straně počítače se používá konektor „CANON 9“ se standardizovaným pinoutem, který vyjma popisovaných vývodů „RxD“, „TxD“ a „GND“ obsahuje i další vývody, které slouží k hardwarovému řízení toku dat a předávání provozních stavů sběrnice. Pro náš účel nejsou tyto ostatní vývody využitelné, a proto je nebudeme brát na zřetel. Čísla vývodů konektoru CANON 9 jsou uvedena na jejich pouzdrech.

Provedení s kolíky:


Pinout konektoru CANON 9 pro rozhraní RS232

Provedení s dutinkami:


Konektor CANON 9

Starší typy počítačů obsahovaly, mnohdy ne pouze jedno rozhraní RS-232, na motherboard. Postupný vývoj rozhraní USB, které RS-232 ze spotřební elektroniky takřka zcela vytlačila, donutil ty, kteří se o elektroniku nezajímají pouze jako uživatelé, aby využívali převodníky USB<->RS-232. Stavba převodníku je možná i v domácích podmínkách pomocí obvodů „FT232RL“, „FT232BL“ a podobných, nicméně levněji vyjde si jej koupit již hotový. Ve většině případů si zakoupíte kabel, který je na jednom konci opatřen konektorem USB a na straně druhé konektorem CANON 9 s kolíky

Důležité je mít nainstalované ovladače převodníku, které výrobce nejčastěji distribuuje spolu s převodníkem na CD. Při instalaci tohoto zařízení do svého počítače se řiďte pokyny uvedenými výrobcem.

Sériový terminál

Sériový terminál je program nejčastěji určený pro osobní počítače, který nám zprostředkovává komunikaci mezi počítačem a připojeným zařízením. Sériový terminál byl dříve součástí operačního systému Windows xp a nižších jako program „hyperterminál“. V současné době se musíme spoléhat na software třetích stran, jelikož už sériový terminál v prostředí operačních systémů Windows Vista a novějších integrován není. Většina terminálů vypadá obdobně. Jelikož jsem se kdysi rozhodl naprogramovat si terminál vlastní, rozhodl jsem se vám jej touto cestou zpřístupnit. Jedná se o freeware program poskytovaný bez jakýchkoliv záruk. Rovněž se zříkám jakékoli odpovědnosti spjaté s jeho používáním. Budu pokračovat v popisu na mnou napsaném programu, který bude fungovat na systémech Windows Vista a novějších, jelikož je programován v C# pomocí WPF.

Sériový terminál

Pokud používáte převodník na rozhraní RS-232 z USB, tak jej nejdříve připojte. Jelikož je možno k počítači připojit více sériových portů, tak je bylo nutno nějak odlišit. Jednotlivé porty jsou odlišeny označením „COMx“, kde „x“ je číslo portu. Číslo portu je nutno nastavit v poli „Available COM ports“, čímž aplikaci sdělíme, se který m sériovým rozhraním v počítači chceme komunikovat. Jestliže máte k počítači připojeno sériových portů více, pak můžete zjistit číslo vámi vybraného rozhraní jednoduše, pomocí správce zařízení systému Windows nebo, pokud je to možné, zařízení odpojit, rozhrnout rozbalovací nabídku, připojit zařízení a sledovat, které číslo přibylo. Pokračujte nastavením přenosové rychlosti, parity, počtu datových a stop bitů.

Po nastavení předem popsaných parametrů spojení můžeme realizovat připojení tlačítkem „Connect“ a začít komunikovat tak, že do pole „Tx“ na terminálu napíšeme text a po stisknutí enteru se text odešle. Přijatý text je možno číst v okně „Rx“ a tlačítkem „Clear screen“ jej vymazat. Je také možno číst přímo hexadecimální interpretaci přijatého řetězce nebo zadat hexadecimální tvar znaku. Tlačítko „\n lock“ přepíná mezi režimem vložení znaku „\n“ na konec vysílaného řetězce (indikován zelenou kontrolkou vedle tlačítka) a režimem, kdy se po stisku enteru odešle pouze příslušný řetězec bez znaku „\n“ na konci.

Jednoduchý test, zda vám terminál i rozhraní RS-232 na počítači funguje je propojení pinů RxD a TxD, čímž realizujete smyčku. Po této úpravě budou veškerá vyslaná data opět přijata.

Praktický příklad

Nyní si popíšeme zařízení, které bude reagovat na naše povely jak odpovědí tak spuštěním akustické signalizace. Využití podobného zařízení byste našli v řízení domu či automatizovaných procesů. Který fanoušek informačních technologií kdy nepřemýšlel o tom, že by měl alespoň jeden pokoj, který by kompletně řídil počítač? Pokud patříte mezi ně, jako, že já rozhodně ano, pak je pro vás tento příklad střípkem do mozaiky.

Začneme tedy vysvětlením následujícího schéma zapojení:

Schéma zapojení

Jak můžete vidět, oproti minulým dílům našeho seriálu je zde vyjma mikrokontroléru AT mega 8 ještě jeden integrovaný obvod, kterým je již popsaný převodník napěťových úrovní, který je zde, spolu s konektory CANON 9, jediným komponentem, jehož činnost jsme si dosud prakticky neukazovali. Číslování vývodů integrovaného obvodu je stejné jako u mikrokontroléru, pouze si dovolím upozornit na odděleně zakreslené napájení obvodu, které se nachází, spolu s blokovacím kondenzátorem, nad IC1.

Zbylé části konstrukce jsem již vysvětlil v předchozích odstavcích, a proto můžeme pokračovat s vysvětlením funkce zařízení.

Zařízení bude schopno po přijetí znaku „1“, „2“ nebo „3“ následovaného příkazem „V“- vypnout nebo „Z“- zapnout konkrétní LED diodu označenou číslicí nebo neprovádět žádnou změnu- „X“. Další užitečnou funkcí v našem smyšleném ovládaném domě bude zjištění stavu světel, čehož docílíme zasláním znaku „?“, po kterém bude následovat odpověď, která podá informaci o stavu osvětlení. Pokud zašleme znak „s“, pak konstrukce odpoví „Zdravime ze soom.cz“.

Realizace zapojení Práce v sériovém terminálu

Rozhraní USART je nakonfigurováno na přenosovou rychlost 9600Bd, 8 datových bitů, 1 stop bit a bez paritního bitu. Stejně si nakonfigurujte také váš sériový terminál. V programu se opět nevyhneme přerušení, jehož rutina bude volána pokaždé, kdy dojde k příjmu znaku.

Okomentovaný program si můžete stáhnout zde a sériový terminál zde.