Reklama

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

Úvod

Funkci jednotky USART mikrokonroléru ATmega16/32 si demonstrujeme na jednoduchém příkladu “Opakovače”. Jediným úkolem tohoto programu bude přijímat znaky ze sériové linky a následně je přeposlat zpět odesílateli. K demonstraci funkce je použit Terminal by Br@y++, který slouží k poslání a přijmutí znaků v počítači. Dále je také nutné použít převodník z rozhraní USB na rozhraní UART. Jednoduchý popis, jak pracovat s tímto terminálem a převodníkem, lze nalézt ZDE. Elektronické schéma zapojení ukazuje Obr. 1.

Obr. 1: Elektronické schéma zapojení pro test jednotky USART

Obr. 1: Elektronické schéma zapojení pro test jednotky USART
Popis

Pro příjem znaku z jednotky USART je definována funkce “unsigned char uart_getc(void)”, kde čteme obsah datového registru UDR. Tato funkce obsahuje smyčku “while” pro čekání na příjetí nového znaku. Tento způsob se využívá pro příjem znaku pomocí testování v nekonečné smyčce “while(1)” (tzv. “polling”) bez použití přerušení. Díky tomu, že ve vzorovém zdrojovém kódu je použit příjem dat pomocí přerušení, tak stačí uložit pouze hodnotu registru UDR a tím vynechat funkci “unsigned char uart_getc(void)”, která testuje příjem nového znaku pomocí stavového bitu RXC. Pro odeslání znaku z jednotky USART je definována funkce “void uart_putc(unsigned char data )”, kde zapisujeme do datového registru UDR. Pro odeslání znaku pomocí sériové linky stačí zapsat data do registru UDR. Dále si definujeme proměnnou pro indikaci, že došlo k přijmutí nového znaku “newByte” a také proměnnou pro uložení a následné poslání znaku “receivedByte”. Po nastavení jednotky USART a vynulování proměnné pro informaci o přijetí nového znaku přejde program do nekonečné smyčky. V nekonečné smyčce je pouze podmínka pro zjištění, zda nebyl přijatý nový znak, který by měl být následně poslán zpět.

Okomentovaný zdrojový kód

 

001: #define F_CPU 16000000UL// Frekvence hodinového signálu (nutné pro delay.h)
002: #include <avr/io.h>
003: #include <avr/interrupt.h>
004: #include <util/delay.h>
005:
006: // Prototypy funkcí
007: unsigned char uart_getc(void);
008: void uart_putc(unsigned char data );
009:
010: // Přijatý znak
011: volatile unsigned char receivedByte;
012: volatile unsigned char newByte;// Nový znak
013:
014: // Přerušení po příjmu znaku
015: ISR(USART_RXC_vect)
016: {
017: receivedByte = UDR;
018: newByte = 1;// Nastavení informace o novém znaku
019: }
020:
021: int main(void)
022: {
023: // Nastavení rychlosti 9600Bd
024: // BAUD = 16e6 / (16 * (103+1)) = 9615
025: UBRRH = 0b00000000;
026: UBRRL = 0b01100111;
027:
028: // Nastavení jednotky USART
029: UCSRB = 0b10011000;// Povoleno přerušení po příjmu dat,
030: // povolení přijímače a vysílače
031: UCSRC = 0b10000110;// Asynchronní režim, žádná parita, 1 stop bit, délka dat 8b
032:
033: // Povolení přerušení
034: sei();
035:
036: newByte = 0;
037:
038: while(1)
039: {
040: if (newByte == 1)// Pokud byl přijatý nový znak
041: {
042: newByte = 0;// Vymazat informaci o novém znaku
043: uart_putc(receivedByte);
044: }
045: }
046:
047: return 0;
048: }
049:
050: // Získání znaku
051: unsigned char uart_getc(void)
052: {
053: // Čekání na přijetí znaku
054: while (!(UCSRA & (1<<RXC)));
055: return UDR;
056: }
057:
058: // Poslání znaku
059: void uart_putc(unsigned char data)
060: {
061: // Čekání na vyprázdnění registru UDR
062: while (!( UCSRA & (1<<UDRE)));
063: UDR = data;
064: }
Vzorové zdrojové kódy slouží pouze k jednoduché demonstraci funkce, proto často obsahují globální proměnné, neobsahují většinou ukazatele, dále také neobsahují kontroly proměnných, definování nevyužitých pinů mikrokontroléru a podobné správné programátorské návyky. Proto je nutné tyto kódy brát s patřičnou rezervou.
 

 

Demonstraci funkce na použitém terminálu ukazuje Obr. 2. Nastavení komunikace v terminálu je:

  • Přenosová rychlost: 9600Bd
  • Počet datových bitů: 8
  • Parita: Žádná
  • Počet stop bitů: 1

Obr. 2: Test pomocí Terminal by Br@y++

Obr. 2: Test pomocí Terminal by Br@y++

 
Aktualizace: 25.08.2016
 

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) 18.díl – Jednotka USART (1. část – Popis)

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.