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

Z Wikiknih

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í[editovat | editovat zdroj]

Schéma zapojení zařízení propojeného s počítačem

Využ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[editovat | editovat zdroj]

K 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[editovat | editovat zdroj]

import 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[editovat | editovat zdroj]

K 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 Grafická aplikace v Tkinteru Python

Ovládání sériové komunikace mezi PC a jednotkou USART mikrokontroléru ATmega16[editovat | editovat zdroj]

K 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[editovat | editovat zdroj]

Po 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[editovat | editovat zdroj]

Ve své práci jsem využil LCD 20 x 4 s řadičem SPLC780.

Ovládání LCD displeje[editovat | editovat zdroj]

K 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[editovat | editovat zdroj]

K 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 | editovat zdroj]

Č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í[editovat | editovat zdroj]

Př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