Propojení mikrokontroléru ATmega s počítačem
Zadáním mého projektu bylo vytvořit zařízení založené na mikrokontroléru ATmega16, které bude komunikovat s počítačem (USART - sériový port) a bude vykreslovat různé funkce na LCD displej. Okomentovaný zdrojový kód pro naprogramování zařízení komunikujícího s PC Program pro ATmega16 Grafická aplikace
Schéma zapojení
editovatVyužité součástky:
- DIS1, HD44780 20 x 4 – LCD displej 20 x 4
- IC3, MEGA16-P – ATmega16
- x1 - (1 – 6) – usbasp programátor
- x2 – (1 – 4) – UART převodník
- SP1 – „piezo bzučák“
- LED1 – LED dioda
- R1 – 100 Ω rezistor
- R2 – 10 KΩ rezistor
- R3 – 10 KΩ potenciometr
- C1, C4 – 100 nF kondenzátor
- C2, C3 – 22 pF kondenzátor
- Q1 – 16 MHz krystal
- SW1 - spínač
Ovládání sériového portu PC
editovatK práci se sériovým portem PC v asynchronním režimu slouží knihovna Pyserial, která je podporována především programovacím jazykem Python. Dokumentaci knihovny Pyserial včetně návodu na instalaci naleznete ZDE
Ovládání sériového portu pomocí knihovny Pyserial
editovatimport serial #importuje knihovnu Pyserial
ser = serial.Serial(port='COM3', baudrate=9600, timeout=1, bytesize=8,
parity='N', stopbits=1, xonxoff=0, rtscts=0)
- otevře sériový port s danými parametry ('COM ...' pro windows, '/dev/tty ...' pro Linux)
print(ser.name)
- vypíše jméno portu
ser.write("Hello")
- odešle řetězec "Hello"
ser.read(100)
- přečtě až 100 byte z bufferu přijímače
ser.close()
- zavře sériový port "ser"
Grafická aplikace v Pythonu
editovatK vytváření grafických oken v programovacím jazyku Python slouží knihovna Tkinter. Knihovna je implementována v jádru Pythonu, takže ji není potřeba nijak instalovat. Dokumentaci knihovny Tkinter naleznete ZDE
Ovládání sériové komunikace mezi PC a jednotkou USART mikrokontroléru ATmega16
editovatK samotnému propojení mikrokontroléru ATmega16 s počítačem potřebujeme vhodný UART převodník, protože většina novodobých počítačů již sériový port postrádá. Já využil UART TLL CP2104. Tento převodník vám z USB portu vytvoří sériový port COM (ve windows), který snadno naleznete ve Správci zařízení.
Zpracování přijatých dat mikrokontrolérem
editovatPo odeslání znaku z počítačem pomocí sériového portu jsou data doručena jednotce USART mikrokontroléru, která je načte do datového bufferu registru UDR, odkud tyto data mohou být přečteny. Registr UDR může v jednu chvíli držet pouze jeden datový byte a tento byte se nezmění do té doby, než bude z registru UDR přečten. Po tom co je datový byte z registru UDR přečten se do registru UDR načte další datový byte uchovávaný v druhé úrovni bufferu.
Kompletní příjem bytu může vyvolat přerušení, takže při každém přerušení signalizujícím kompletní příjem bytu budeme číst data z registru UDR, čímž dosáhneme toho, že po každém odeslání znaku z pc bude tento znak (spíše jeho ascii podoba) načtena do proměnné se kterou můžeme dále pracovat.
LCD displej
editovatVe své práci jsem využil LCD 20 x 4 s řadičem SPLC780.
Ovládání LCD displeje
editovatK ovládání LCD displeje slouží knihovna „lcd.h“ vytvořená pro LCD displeje založené na řadiči HD44780. Tato knihovna je „open source“ a jejím autorem je Peter Fleury. Odkaz na dokumentaci knihovny a její stažení ZDE.
int main(void)
{
lcd_init(LCD_DISP_ON); //aktivace displeje
lcd_clrscr(); //vyčistí displej
lcd_gotoxy(x, y); //nastaví kurzor na souřadnice x, y
lcd_puts("Hello World"); //zapíše na displej konstantní řetězec
return 0;
}
Funkce hodin a běžícího textu na LCD displeji
editovatK vytvoření funkce hodin a běžícího textu potřebujeme vyvolat přerušení každou 1 s (pro hodiny) a například každých 0.5 s (pro běžící text). Právě k práci s časem nám slouží časovač. Abychom pochopili jak tyto funkce vytvořit, tak si první popíšeme časovač a přerušení.
Časovač v normálním režimu
editovatČasovač slouží, jak je z názvu patrné, k práci s časem, časovými intervaly. Jeho využití si můžeme představit třeba na funkci hodin. Kdybychom pracovali s prodlevou „_delay_ms(1000)“ a po každém intervalu bychom provedly přičtení a přepočítání času, tak by mikrokontrolér celou sekundu nedělal nic jiného, než že by počítal prodlevu a nebylo by tedy možné provádět jakékoli další operace. K vyhnutí se těmto problémům nám slouží právě zmíněný časovač. Mikrokontrolér ATmega16 je vybaven dvěma 8 – bitovými a jedním 16 – bitovým časovačem. Funkce časovače v normálním režimu je poměrně jednoduchá. Časovač do svého registru přičte 1 při každém strojovém cyklu mikrokontroléru a po dosažení maximální hodnoty registru tento registr vynuluje. Přetečení je jedna z možností, která umožňuje časovači vyvolat přerušení. Časovače mikrokontroléru ATmega16 jsou vybaveny 10 bitovým děličem hodinového taktu, který nám umožňuje snížit frekvenci přičítání do registru, čímž dosáhneme toho, že naplnění registru bude trvat déle.
Přerušení
editovatPřerušení nám u mikrokontrolérů umožňuje měnit běh hlavního programu a při námi určených podmínkách hlavní program přerušit a provést požadovaný kód. Funkci přerušení si můžeme představit například na nějakém elektronickém zařízení, jako je například MP3/MP4 přehrávač. Přehrávač má tlačítka zastavit, zeslabit, zesílit a další. Kdybychom využili klasické metody ošetření stisknuté klávesy, při níž se stále dokola v hlavním programu zjišťuje, jestli je tlačítko stisknuté, tak bychom zpožďovali námi přehrávanou hudbu, což je uživatelsky nepřípustné. Právě k zabránění tomuto zpoždění se využívají přerušení. Přerušení mohou být externí, nebo je mohou vyvolat samotné periferie mikrokontroléru.
Vektory přerušení naleznete ZDE