ROBOTIKA ZÁKLADY. verze 0.4 ze dne 5.9.2012. Rudolf Hlaváček a kolektiv



Podobné dokumenty
LED_007.c Strana: 1/5 C:\Michal\AVR\Výukové programy\archiv\ Poslední změna: :01:48

ROBOTIKA - ZÁKLADY. Sestaveno dne: verze 0.2. Rudolf Hlaváček

Laboratorní zdroj - 6. část

Střední odborná škola a Střední odborné učiliště, Dubno Ing. Miroslav Krýdl Tematická oblast ELEKTRONIKA

Registrační teploměr

PK Design. MB-ATmega16/32 v2.0. Uživatelský manuál. Základová deska modulárního vývojového systému MVS. Verze dokumentu 1.0 (21.12.

1 Podrobná specifikace Yunifly Datasheet

Úvod do mobilní robotiky AIL028

Univerzální jednočipový modul pro řízení krokových motorů

Intervalové stromy. Představme si, že máme posloupnost celých čísel p 0, p 1,... p N 1, se kterou budeme. 1. Změna jednoho čísla v posloupnosti.

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Kolekce ArrayList. Deklarace proměnných. Import. Vytvoření prázdné kolekce. napsal Pajclín

Kroužek elektroniky

Úvod do mobilní robotiky NAIL028

STŘEDOŠKOLSKÁ TECHNIKA 2013

Stopař pro začátečníky

Robot Lego Mindstorms NXT doplněný o kamerku a software v jazyce C#

Cílem této kapitoly je seznámit s parametry a moduly stavebnice NXT. Obr. 1: Brick s moduly [3]

Tranzistor polopatě. Tranzistor jako spínač

Číslicový otáčkoměr TD 5.1 AS

Krokové motory. Klady a zápory

Klíčové pojmy: Cyklus, řídící proměnná, inicializace, test podmínky, přerušení cyklu, vnořování cyklů.

XXXIII Celostátní olympiáda znalostí elektriky a elektroniky Krosno 25. března 2010 TEST PRO ELEKTRONICKOU SKUPINU

3. D/A a A/D převodníky

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Maturitní témata - PRT 4M

V 70. letech výzkumy četnosti výskytu instrukcí ukázaly, že programátoři a

Střední škola informačních technologií a sociální péče, Brno, Purkyňova 97. Vybrané části Excelu. Ing. Petr Adamec

9. Robot pro Robotický den 2012

Návod na vkládání videogalerií na stránky klubu SIG-N.A.L. Třebíč

Datum tvorby


11. Odporový snímač teploty, měřicí systém a bezkontaktní teploměr

4. Zpracování signálu ze snímačů

Jízda po čáře pro reklamní robot

Arduino digitální multimetr

Obecný úvod do autoelektroniky

Microchip. PICmicro Microcontrollers

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Název projektu: EU peníze školám. Základní škola, Hradec Králové, M. Horákové 258

SNÍMAČE PRO MĚŘENÍ VZDÁLENOSTI A POSUVU

SVAZ SKAUTŮ A SKAUTEK ČESKÉ REPUBLIKY Skautské oddíly Brno Tuřany. zájmové soboty

int => unsigned int => long => unsigned long => float => double => long double - tj. bude-li:

Servisní návod [CZ] VMS 08. Øídící jednotka pro pøesné mìøení spotøeby nápojù. Verze: 1.4 Datum: Vypracoval: Vilímek

DUM 01 téma: Obecné vlastnosti tabulkového editoru, rozsah, zápis do buňky, klávesové zkratky

Sirénka. Jan Perný

LOGIC. Stavebnice PROMOS Line 2. Technický manuál

Atmega801A modul procesoru Atmega8. Milan Horkel

Rozhraní mikrořadiče, SPI, IIC bus,..


10. Editor databází dotazy a relace

PK Design. MB-S2-150-PQ208 v1.4. Základová deska modulárního vývojového systému MVS. Verze dokumentu 1.0 ( )

5 Rekurze a zásobník. Rekurzivní volání metody

Zkouškové otázky z A7B31ELI

DM4.3 odmagnetovací modul

Univerzita Pardubice. Fakulta Elektrotechniky a Informatiky. Monitoring rozhraní I2C Autor práce: Radek Šplíchal. Vedoucí práce: Ing.

Digitalizace signálu (obraz, zvuk)

TCL. Měřící modul proudu 4-20mA s výstupem RS485

Detektor plynu. Srdcem zapojení je senzor plynu od firmy Figaro, která má v této oblasti dlouhou tradici.

Laboratorní zdroj - 1. část

Maticové operace projekt č. 3

varikapy na vstupu a v oscilátoru (nebo s ladicím kondenzátorem) se dá citlivost nenároèných aplikacích zpravidla nevadí.

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

Predispozice pro výuku IKT (2015/2016)

STŘEDOŠKOLSKÁ ODBORNÁ ČINNOST UNIVRZÁLNÍ VYSÍLAČKA Jaroslav Páral Brno 2011

Architektura počítačů Logické obvody

enos dat rnici inicializaci adresování adresu enosu zprávy start bit átek zprávy paritními bity Ukon ení zprávy stop bitu ijíma potvrzuje p

Jak pracovat s absolutními hodnotami

Popis zapojení: < 27 dbµv. < 33 dbµv LW. S/N ratio (60 dbµv): > 57 db FM mono > 52 db AM

Melodický zvonek. Milan Horkel

Úloha 1 Multimetr. 9. Snižte napájecí napětí na 0V (otočením ovládacího knoflíku výstupního napětí zcela doleva).

Základy číslicové techniky z, zk

Vysoká škola chemicko-technologická v Praze Fakulta chemicko-inženýrská Ústav počítačové a řídicí techniky. Aplikace mikroprocesorů.

Popis zapojení a návod k osazení desky plošných spojů STN-A varianta Tower

Architektura počítačů Logické obvody

Inovace výuky předmětu Robotika v lékařství

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

stavební návod: SKUPINOVÝ ADAPTIBILNÍ IR SPÍNAČ SÍŤOVÉHO NAPÁJENÍ

Architektura počítače

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

PocketHome R CENTRÁLNÍ OVLÁDÁNÍ VYTÁPĚNÍ VAŠEHO DOMU REFERENČNÍ MÍSTNOST

Signálové a mezisystémové převodníky

maxon motor maxon motor řídicí jednotka ADS 50/10 Objednací číslo Návod k obsluze vydání duben 2006

Název projektu: Život s počítačem. Číslo projektu: OPVK.CZ.1.07/1.2.32/

NÁVOD K OBSLUZE ELEKTRONICKÁ OBCHODNÍ VÁHA S POČÍTÁNÍM KUSŮ. řady. Strana 1. Dovozce do ČR:

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

Osnova: 1. Klopné obvody 2. Univerzálníobvod Oscilátory

2. Matice, soustavy lineárních rovnic

PŘÍRUČKA UŽIVATELE REGULÁTORU ZP2 RE5

Regulovatelný síťový adaptér NT 255

TEPLOMĚR S DIGITÁLNÍM ZOBRAZENÍM TD

TENZOMETRICKÝ MĚŘIČ. typ Tenz

Digitronové digitální hodiny

Obor: počítačové systémy

ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE

ETC Embedded Technology Club setkání 3, 3B zahájení třetího ročníku

8. Operaèní zesilovaèe

Regulátor krokových motorů

Transkript:

ROBOTIKA ZÁKLADY verze 0.4 ze dne 5.9.2012 Rudolf Hlaváček a kolektiv

Obsah 1 Úvod.................................. 4 1.1 Týmy pro stavbu robotů....................... 4 1.2 Co budeme stavět přehled kapitol................. 4 1.3 Orientace v textu........................... 4 2 Soutěže................................. 5 2.1 Eurobot starter a Bear Rescue Beginner.............. 5 2.2 Pravidla kategorie Stopár v soutěži Istrobot............ 5 2.3 Robotchallenge............................ 5 3 Doporučení k mechanické konstrukci robota........... 6 3.1 Ovládání robotů............................ 6 3.2 Velikost robotů............................ 6 3.3 Konstrukce velkých robotů...................... 6 4 Nezbytné součástky.......................... 6 4.1 Datasheet............................... 6 4.2 Mikroprocesor, mikrokontrolér.................... 7 4.3 Rezistor................................ 7 4.4 Kondenzátor.............................. 7 4.5 Dioda................................. 7 4.6 LED.................................. 8 4.7 Tranzistor............................... 8 4.8 Cívka................................. 8 4.9 Driver................................. 8 4.10 Stabilizátor.............................. 8 4.11 Krystal................................. 8 5 Postup při programování čipu.................... 9 5.1 Úvod.................................. 9 5.1.1 Postup programování robota................. 9 5.1.2 Potřebné programy...................... 9 5.2 Nastavení a práce v AVR Studiu................... 9 5.3 WinAVR................................ 10 5.4 Nastavení programu Up....................... 10 5.5 Práce s programátorem........................ 10 6 Základy syntaxe v jazyce C..................... 11 6.1 Základní pojmy............................ 11 6.2 Výrazy a operátory.......................... 12 6.2.1 Aritmetické operátory.................... 12 6.2.2 Operátory inkrementace a dekrementace.......... 13 6.2.3 Logické výrazy a operátory.................. 13 6.3 Příkazy................................ 14 6.3.1 Přiřazovací příkaz....................... 14 1

6.3.2 Blok příkazů.......................... 14 6.3.3 Podmiňovací příkaz (if)................... 14 6.3.4 Příkaz několikanásobného větvení (switch)......... 16 6.3.5 Cyklus for (cyklus řízený proměnou )........... 17 6.3.6 Cyklus while (cyklus s podmínkou na začátku )...... 18 6.4 Funkce a procedury.......................... 19 6.5 Knihovny............................... 20 6.5.1 Vlastní knihovny....................... 20 6.5.2 Použité knihovny....................... 20 7 Bity a bajty.............................. 20 7.1 Desítková soustava a dvojková soustava.............. 20 7.1.1 Desítková soustava...................... 20 7.1.2 Dvojková soustava...................... 20 7.1.3 Převod z desítkové soustavy do dvojkové.......... 20 7.1.4 Bity a bajty.......................... 22 7.1.5 Převod z dvojkové soustavy do desítkové.......... 22 7.2 Bitové výrazy a práce s nimi..................... 22 7.2.1 Bitové operátory....................... 22 7.2.2 Bitový součet......................... 23 7.2.3 Bitový součin......................... 23 7.2.4 Bitová negace......................... 23 7.2.5 Bitový exklusivní součet................... 24 7.2.6 Bitový posun doleva..................... 24 7.2.7 Bitový posun doprava.................... 25 8 Periferie................................. 25 8.1 Co jsou to periferie.......................... 25 8.2 Jaké periferie Atmega16 má?..................... 25 8.3 Obecné použití periferií........................ 26 9 Práce s ATMega16 v C........................ 26 9.1 Piny.................................. 26 9.2 Přehled pinů.............................. 26 9.2.1 Připojení na programátor.................. 27 9.3 Práce s registry............................ 27 9.4 Registry pro řízení pinů....................... 27 9.5 Základní vstup a výstup....................... 27 9.6 Nastavování bitu zapsání jedničky................. 28 9.7 Sesazení bitu zapsání nuly..................... 29 9.8 Příklad pro vstup a výstup...................... 29 9.9 Registry časovačů/čítačů....................... 29 9.10 PWM řízení motorů........................ 30 9.11 Řízení serva.............................. 30 9.12 Přerušení............................... 31 10 Základy elektroniky.......................... 31

10.1 Proud................................. 32 10.2 Napětí................................. 32 10.3 Odpor................................. 32 10.4 Výkon................................. 32 10.5 Výpočet tepelného výkonu (ztrátového)............... 32 10.6 Dioda................................. 33 10.7 Výpočet rezistoru pro LED-diodu.................. 34 10.8 Tranzistory.............................. 35 10.9 Stabilizátor.............................. 36 Literatura................................. 37 Rejstřík................................... 38 3

1 Úvod Tento text chce čtenáři naprostému začátečníkovi pomoct stavět a programovat amatérské roboty, pro zábavu a nebo pro účast v různých robotických soutěžích. 1.1 Týmy pro stavbu robotů Stavba robotů zahrnuje tři propojené, ale relativně nezávislé okruhy: návrh a výrobu mechanické konstrukce, návrh a zapojení elektroniky a programování. Proto je dobré roboty stavět v týmech, kde se jednotliví členové zaměřují na tyto oblasti a navzájem se doplňují. Navíc každý tým potřebuje řadu pomocných činností (nákup součástek, vyhledávání údajů na internetu a pod.). Je dobré mít proto v každém týmu ještě pomocníka, který podporuje ostatní a umožňuje jim soustředit se na jejich hlavní úkoly. Úplně ideální potom je, když každou funkci v týmu zastávají dva lidé, takže se mohou vzájemně zastupovat. Tým by potom měl celkem osm členů dva mechaniky, dva elektroniky, dva programátory a dva pomocníky. To se ale v praxi téměř nikdy nepodaří. Často nastane právě opačný případ, kdy tým má pouze dva nebo tři členy, kteří se o všechny činnosti musí nějak podělit. V každém případě ale platí, že je výhoda, pokud lidé v týmu znají i věci mimo jejich hlavní obor, tj. když například programátor zná základy elekroniky. 1.2 Co budeme stavět přehled kapitol Většina studentů si na začátku vybere robotickou soutěž (viz kapitola 2 ) a pro ni staví robota. Základní zásady mechanické stavby robotů jsou popsány v kapitole 3. Nezbytné elektronické součástky pro výrobu robotů, které by měli znát všichni, jsou v kapitole 4. Další informace k elektronice jsou v kapitole 10. Ostatní kapitoly postupně popisují programování robotů. 1.3 Orientace v textu Čísla ve hranatých závorkách odkazují na seznam literatury na straně 37. Pro stavbu robotů, především elektroniku a programování, je potřebná řada pojmů. Měli jsme snahu uvádět nové informace postupně, ale vždycky to nebylo možné. Pokud narazíte na neznámý pojem, použijte rejstřík (strana 38). Pokud něco v rejsříku nenajdete, přijďte to reklamovat :-). Pokud už budete některé pasáže znát, můžete je přeskočit. Toto je první verze textu, proto mohou být některé pasáže nesrozumitelné. Pokud Vám nebude něco jasné, přijďte se zeptat nebo použijte Google. 4

2 Soutěže 2.1 Eurobot starter a Bear Rescue Beginner Toto je soutěž, na kterou se přednostě zaměřujeme. Koná se každoročně v Praze. Cílem je sestrojit robota, který plní soutěžní úkoly. Hřiště a úkoly se každoročně mění. Nicméně je jedna věc, kterou musí umět každopádně: jezdit. Takže se stavbou funkčního podvozku se dá začít ještě než výjdou oficiální pravidla. Většinou musí umět něco tlačit před sebou, zvedat, stavět na sebe, to záleží na zadání. Roboti jsou ovládání před kabel řidičem, takže odpadá složité programování. Nicméně naprogramování řízení například přes joystick usnadňuje řidiči manipulaci s robotem, což je základ úspěchu. Dále je nezbytný trénink. I pár dní ježdění způsobí umístění v první osmičce robotů, které postupují do vyřazování. V roce 2012 byla soutěž Eurobot starter nahrazena soutěží Bear Rescue Beginner. Základní charakter soutěže zůstal zachován. 2.2 Pravidla kategorie Stopár v soutěži Istrobot Stopár je kategorie soutěže Istrobot, která se koná v Bratislavě. Cílem je sestrojit zcela samostatného robota, který bude sledovat černou čáru na bílém podkladu a projede soutěžní trať co nejrychleji. Na trati se přitom mohou vyskytovat tyto překážky: tunel, přerušení čáry, cihla, reflektor (změna osvětlení trati), most, rozdvojení čáry, dveře [13]. Konstrukce a materiály nejsou omezeny, je povoleno i používat zakoupené stavebnice robotů, podmínkou je pouze, aby autor napsal aspoň program. To je také důvod, proč se na soutěži vyskytují v hojné míře roboti, kteří jsou postaveni ze stavebnice Lego. Roboti musí být autonomní a nesmí být ovládáni dálkově. Omezeno je nejvyšší napětí, se kterým mohou roboti pracovat, a to na 24 V. Proudový odběr je povolen maximálně do 20 A. Počet nebo druh senzorů není omezen. Na soutěži byl robot s jedním senzorem (kamera), ale objevil se i robot s dvaceti čtyřmi senzory. Šířka a výška robota nesmí přesáhnout 20 cm. Délka není omezená. 2.3 Robotchallenge Ve Vídni pořádají soutěž s názvem Robot Challenge [12], jen asi větší. Je zde více kategorií, nás bude nejvíce zajímat kategorie Line Follower a Line Follower Enhanced. Ta poslední zmíněná je podobná té na soutěži Istrobot. Zatímco kategorie Line Follower je jednodušší v tom, že neobsahuje překážky jako přerušení čáry, cihlu, tunel. Šířka robota nesmí přesáhnout 30 cm. Co se týče vlastních poznatků musím zmínit, že v soutěži Robotchallenge je důležité mít senzory na detekci čáry zakrytovaané. Samozřejmě je vhodné je mít zaktytovány i v soutěži Istrobot, tam to ale není tak nutné, protože světelné podmínky mi připadaly během soutěže neměnné. Nicméně na Robotchallenge se světelné podmínky dost měnily. Zde je velice nutné myslet na zakrytování všech IR senzorů. 5

3 Doporučení k mechanické konstrukci robota Roboty rozlišujeme podle způsobu ovládání a podle velikosti. 3.1 Ovládání robotů Každý robot může být buď řízený nebo autonomní. Autonomní znamená, že je naprogramovaný a během soutěže nebo prezentace se pohybuje samostatně. Roboty můžeme řídit po kabelu nebo bezdrátově, například přes bluetooth. 3.2 Velikost robotů Na škole a v DDM Junior stavíme a programujeme hlavně roboty dvojího typu : střední a velké. Jako střední používáme roboty yunimin a 3pi - jsou v zásadě hotové a pouze se programují, jsou určené pro soutěže typu sledování čáry (Robotchallege, Istrobot, nově i Robotický den v Praze), minisumo a další. Pro střední roboty neexistuje soutěž, kde by se ovládali po kabelu, musí proto být autonomní. Velké roboty (typicky pro soutěž Eurobot a Robotický den) si stavíme sami. Mohou být dálkově řízené i autonomní. Začátečníkům se silně doporučuje začít s dálkově řízeným robotem a nebo se přidat k týmu zkušenějších konstruktérů. 3.3 Konstrukce velkých robotů Při stavbě velkých robotů se držíme osvědčeného schématu: Podvozek tvoří základní deska z překližky nebo rám z hliníkových profilů typu L tvaru obdélníku, osmiúhelníku nebo kruhu. Na podvozku jsou připevněné dva motory z akušroubováků nebo z akuvrtaček včetně převodovek, které se koupí hotové. Jiné typy motorů jsou buď pomalé nebo slabé. V žádném případě se nepokoušejte koupit pouze motor (např. protože je levnější) a vyrábět si převody sami. Dále jsou zde dvě kola, každé připojené ke svému motoru a jedna nebo více podpěr podvozku, obvykle z kartáčku na zuby. Motory s koly lze umístit doprostřed nebo dozadu, podle toho, co má robot na hřišti dělat. Na podvozek se umisťuje konstrukce z hliníkových tyčí, profilů nebo z merkuru, s pomocí které robot plní svoje úkoly. Méně tuhé materiály se neosvědčily. 4 Nezbytné součástky 4.1 Datasheet Datasheet je dokument, ve kterém jsou detailně popsány vlastnosti a možnosti dané elektronické součástky. Každá součástka má svůj datasheet. Datasheet je možné najít na internetu, například na stránce www.datasheetcatalog.com 6

nebo na stránkách výrobce nebo prodejce součástky. Bohužel jsou všechny datasheety anglicky. 4.2 Mikroprocesor, mikrokontrolér Mikroprocesor, mikrokontrolér, čip znamenají totéž integrovaný obvod, který se snažíme naprogramovat, aby řídil robota nebo jeho část. Pin je vývod (nožička) čipu (podrobněji viz 9.1). Jednoduché čipy (např. ATtiny) mají osm pinů, složitější čipy mají 32, 40, nebo také 100 pinů. 4.3 Rezistor Rezistor nebo také odpor 1 je součástka, která klade elektrickému proudu určitý odpor neboli ho omezuje. A to podle vzorce: U = R I, kde U je napětí, R je odpor a I elektrický proud (viz str. 32). Tento vztah je znám pod názvem Ohmův zákon a můžeme z něj vyjádřit proud I: I = U/R. Ze vzorce je vidět, že pokud použijeme rezistor s větším odporem při stejném napětí, tak se protékající proud zmenší (použití viz 10.7). Odpor rezistoru měříme v ohmech, značka Ω. 4.4 Kondenzátor Kondenzátor je součástka, která uchovává elektrický náboj. Jeho hlavní vlastností je kapacita. Jednotkou kapacity je Farad, značka F. V praxi se používají násobky jako mikrofarad (µf), nanofarad (nf) a pikofarad 2 (pf). Kondenzátory se nabíjí a vybíjí různě rychle a mají různou kapacitu. Keramické kondenzátory mají nejmenší kapacitu(pf, nf) a jsou nejrychlejší, tantalové mívají kapacitu okolo pár µf a jsou pomalejší a nejpomalejší jsou elektrolytické s kapacitou stovek až tisíců µf. U tantalových a elektrolytických kondenzátorů musíme dát pozor na polaritu, tj. kam připojujeme + a kam -. Další důležitý údaj je maximální hodnota napětí, kterou kondenzátor snese. 4.5 Dioda Dioda je součástka, která usměrňuje elektrický proud. To znamená, že pokud ji zapojíme do elektrického obvodu, tak zajistí, že proud bude téct pouze jedním směrem. Proto budeme diodu používat jako ochranu proti tzv. přepólování chybnému zapojení baterie nebo součástky do obvodu, které obvykle vede ke zničení součástky (podrobněji viz 10.6). 1 Správně se součástce říká rezistor, odpor je její vlastnost. Ale mnoho lidí používá pro označení součástky slovo odpor. 2 Mikrofarad je miliontina faradu, nanofarad je tisíckrát menší a pikofarad milionkrát menší než mikrofarad. 7

4.6 LED LED 3 je součástka, která není primárně určená k usměrnění proudu, ale k signalizaci, zda obvodem protéká proud. K LED se vždy musí připojit rezistor (viz 10.7). 4.7 Tranzistor Tranzistor je součástka, která umožňuje pomocí malých proudů z čipu řídit větší proudy, například do reproduktoru nebo motorku (viz 10.8). 4.8 Cívka Cívka neboli tlumivka je součástka, jejíž hlavní vlastností je indukčnost, jednotka henry, značka H. V praxi se používají milihenry (mh) a mikrohenry (µh). 4.9 Driver Čip nemůže řídit například motor přímo, protože jedním pinem může protékat obvykle maximálně 40 ma většina motorů potřebuje mnohem větší proud. Proto se používají součástky zvané drivery, které podle pokynů z čipu řídí proud z baterií do motorů a servomotorů. 4.10 Stabilizátor Většinu čipů je potřeba napájet přesně 5 V. Jak toho docílit z baterií, na kterých je například 9 V nebo 12 V, zkrátka více než 5 V. Navíc napětí na bateriích kolísá podle toho, jak moc proudu zrovna odebírají motory. Pro napájení čipů je proto nutné použít stabilizátor. Stabilizátor je součástka, která z kolísavého vyššího napětí vyrobí přesné napětí nižší. Nejčastěji se používají stabilizátory řady 78XX, kde XX značí, na kolik voltů součástka stabilizuje, například 7805 stabilizuje na 5 V. Stabilizátor má tři piny (vstup, zem, výstup). Zapojí se takto: Kladný pól baterie (+) se napojí na vstup, záporný pól na zem (-). Mikrokontrolér se zapojí pinem VCC na výstup stabilizátoru a GND (pin 11 - digitální zem) se zapojí na zem stabilizátoru. Tímto máme připojený mikrokontrolér na napájení. 4.11 Krystal Pokud budeme potřebovat vyšší frekvenci procesoru, použijeme krystal. Původní frekvence mikrokontroléru ATMega16 je nastavena na 1 MHz. S pomocí krystalu ji můžeme zvýšit až na 16 MHz. Krystal zapojíme takto: Jeden pin krystalu (je jedno, který) připojíme na pin XTAL1 a druhý na XTAL2. Dále na pin XTAL1 připojíme jednu nožičku kondenzátoru a druhou na digitální zem (11- GND). To samé u pinu XTAL2. Hodnotu kondenzátoru můžeme volit od 12pF do 22pF. 3 Light emitting diode světlo vysílající dioda 8

5 Postup při programování čipu 5.1 Úvod Roboty programujeme v jazyce C++, a to z několika důvodů. Zaprvé je to mnohem jednodušší než programovat v Assembleru. Zadruhé je to jazyk běžně používaný pro programování čipů. Většina informací o programování je pro řadu čipů společná, pro konkrétní ukázky je použitý čip ATMega16 [1]. 5.1.1 Postup programování robota 1. Napsání a přeložení programu v AVR Studiu 2. Nahrání přeloženého souboru *.hex do mikrokontroléru 5.1.2 Potřebné programy 1. AVR Studio 4 v něm budeme psát zdrojový kód 2. WinAVR použijeme pro překlad 3. Up tímto programem nahrajeme *.hex soubor do mikrokontroléru 5.2 Nastavení a práce v AVR Studiu 1. Spustíme AVR Studio 2. Klikneme na New project 3. V kolonce Project type zvolíme AVR GCC 4. Do kolonky Project name napíšeme jméno projektu bez diakritiky 5. Zaškrtneme Create initial file a Create folder 6. Do kolonky Location napíšeme adresu, kam se má projekt uložit 7. Vlevo vybereme AVR Simulator a vpravo námi použitý mikrokontrolér (např. ATmega16) 8. Klikneme na Finish 9. Klikneme na záložku Project a dáme položku Configuration Options 10. Zvolíme Custom Options a nyní přepíšeme text -std=gnu99 v levém okně na -x c++ a dáme Add a potom OK 11. Nyní můžeme psát program, poté ho přeložíme klávesou F7 nebo tlačítkem Build Active Configuration 12. Zkontrolujeme, zda se v programu vyskytují chyby či nikoli 9

13. Pokud tu chyby jsou, musíme najít první v pořadí, dvakrát na ní klikneme a objeví se nám modrá šipka ukazující na místo, kde se chyba vyskytuje 5.3 WinAVR Abychom mohli zdrojový kód přeložit, zavolá AVR Studio překladač, který kód přeloží do souboru typu *.hex, který potom můžeme nahrát do mikrokontroléru. Na to ale musíme mít nainstalovaný překladač WinAVR [8]. Po vytvoření souboru *.hex ze zdrojového kódu můžeme tento soubor nahrát do mikrokontroléru. 5.4 Nastavení programu Up Do mikrokontroléru nahrajeme *.hex soubor programem Up pomocí programátoru 4 PRESTO. Nejprve upravíme nastavení programu Up (stačí jednou). 1. klikneme na záložku Nastavení, dále vybereme Klávesové zkratky..., potom vyberu pro tlačítko GO Programování paměti programu. 5 2. klikneme na záložku Nastavení a zvolíme Nastavení programu 3. zaškrtneme Načíst hex soubor vždy znovu před programováním 4. dále necháme zaškrtlé pouze Zobrazovat varovné hlášky k pojistkám, Pro čtení: Automaticky zavřít stavové okno, Delší čas pro zapojení napětí při ICSP 5. nastavíme čas na 10000 µs, a odklikneme OK 5.5 Práce s programátorem 1. Spustíme programu Up 2. Klikneme na Otevřít a najdeme si cestu k projektu, který jsme si vytvořili v AVR Studiu 3. Až to najdeme, tak klikneme na adresář default a najdeme hex soubor a dáme otevřít 4. Teď zbývá nahrát ho do mikrokontroléru 5. Nastavíme a nebo zkontrolujeme Konfiguraci 6. Propojku BODLEVEL nastavíme na co nejvyšší hodnotu menší, než hodnotu napájení mikroprocesoru a propojku BODEN na Enable 4 Zařízení pro naprogramování součástek. 5 Tím zajistíme, že se při zmáčknutí tlačítka GO na programátoru přeprogramuje pouze paměť pro program a ne například paměť EEPROM. Dále tím dosáhnu toho, že se nepřenastaví propojky pro mikrokontrolér. 10

7. Propojku SUT, CKSEL nastavíme na námi požadovanou frekvenci danou vnějším oscilátorem. V našem případě máme krystal 16MHz, a proto nastavíme SUT, CKSEL na XT 3.0-8.0MHz, 16Kck+65ms tím říkáme, že krystal je od 3 do 8 MHz, 16Kck+65ms říká, že než začne procesor pracovat, uplyne 16 tisíc tiků kryslalu naprázdno plus ještě 65 ms počká, je to kvůli stabilitě hodin v čipu, zkrátka, aby procesor pracoval správně. 8. Propojku CKOPT nastavíme na XT up to 16MHz, rail to rail tím řekneme, že krystal připojený k čipu je 16 MHz a ne 8 MHz, které jsme si zvolili v propojkách SUT, CKSEL 9. Při prvním programovaní musíme upravit frekvenci programátoru, protože mikrokontrolér je z výroby nastaven na 1 MHz. V kolonce Frekvence krystalu zvolíme menší než 1 MHz například >100 khz 10. Důležité jsou i kolonky Napájení v klidu a Napájení během programování. Pokud máme na procesoru napětí 5 V, tak dáme Žádné/externí a Externí 2,7 V až 5,5 V. Pokud chceme procesor napájet z programátoru, tak nastavíme políčko Napájení během programování na interní 5 V. Políčkem Napájení v klidu pak zapínáme a vypínáme procesor. 11. Klikneme na Konfigurační tabulku pravým tlačítkem a dáme Zapamatovat pojistky, pak znovu pravé tlačítko a dáme Naprogramovat konfigurační paměť. 12. Nyní můžeme stisknout tlačítko GO na programátoru. 6 Základy syntaxe v jazyce C 6.1 Základní pojmy příkaz povel pro procesor, říká procesoru, co má dělat. Příkazy probíhají postupně, nejprve se udělá jeden a pak další, který je na řadě Za příkazy dáváme středník (;). syntaxe pravopis programovacího jazyka, říká, jak psát příkazy programovacího jazyka tak, aby nám počítač rozuměl preprocesor před samotným překladem programu do *.hex souboru proběhnou tzv. direktivy preprocesoru (něco jako příkazy, podrobně viz [3], str. 18). Příklady: #include <> pro vkládání hlavičkových souborů #include "" pro vkládání vlastních hlavičkových souborů #define KONSTANTA HODNOTA_KONSTANTY pro definici konstanty, všude kde se v kódu vyskytne text KONSTANTA bude tento text nahrazen HODNOTA_KONSTANTY proměnná je místo v paměti, kde jsou uložena nějaké data 11

datový typ říká nám, v jaké podobě jsou data v proměnné uložena. V proměnné jsou pouze jedničky a nuly, Pomocí datového typu mikrokontrolér pozná, jestli ta data jsou čísla, nebo znak, v jakém rozsahu jsou čísla, atd... používané datové typy: uint8_t celá čísla od 0 do 255 int8_t celá čísla od -127 do 127 uint16_t celá čísla od 0 do 65535 int16_t celá čísla od -32767 do 32767 uint32_t celá čísla od 0 do 4294967296 int32_t celá čísla od -2147483647 do 2147483647 operandy jsou čísla nebo výrazy, které vstupují do operace operátory nám říká, jaké operace provedeme s operandy (co s nimi uděláme) Příklad: 5 + 2, přitom 5 a 2 jsou operandy a znaménko plus je operátor, který nám říká, že čísla chceme sečíst (provést operaci sečítání) poznámka cokoliv se objeví v kódu mezi znaky /* a */, tak je poznámka a bude před překladem odstraněno z kódu. Pokud chceme zapoznámkovat pouze jeden řádek, použijeme // Příklady: /* Vše co napsáno zde je poznámka a nebude překládáno */ // Toto je poznámka, která může popsat funkci nějakého úseku kódu 6.2 Výrazy a operátory Výraz je něco co nabývá nějaké hodnoty, např.: 5 + 3 je výraz, který nabývá hodnoty 8. 5 > 3 je výraz nabývající hodnoty true neboli pravda, x <= 10 je výraz který je pravdivý, pokud proměnná x(kterou musíme mít deklarovanou) menší nebo rovna číslu 10. 6.2.1 Aritmetické operátory + sčítání - odčítaní * násobení / dělení 12

6.2.2 Operátory inkrementace a dekrementace pokud chceme zvýšit hodnotu proměnné o jedničku, napíšeme ++název_proměnné; pokud chceme snížit hodnotu proměnné o jedničku, napíšeme --název_proměnné; Příklad: uint8_t i = 5; // Vytvoření proměnné i a dosazení hodnoty 5 do ní. uint8_t j = 42; // Vytvoření proměnné j a dosazení hodnoty 42 do ní. ++i; // Hodnota i se zvýší o jedničku na číslo 6. --j; // Hodnota j se sníží o jedničku na číslo 41. 6.2.3 Logické výrazy a operátory Přehled logických operátorů: == porovnání - rovnost!= porovnání - nerovnost && logický součin logický součet! negace < menší než <= menší nebo rovno > větší než >= větší nebo rovno Logický výraz může nabývat pouze dvou hodnot pravda (true) a nepravda (false). Obvykle je nepravda reprezentovaná nulou a pravda každým nenulovým číslem. Logické výrazy se používají v podmínkách (viz např. 6.3.3). Logické operace se používají při vyhodnocování logických výrazů. Příklady: a == b výraz je pravdivý, pokud se a rovná b a!= b výraz je pravdivý, pokud se a nerovná b lze to napsat i konkrétněji, např.: a!= 5, výraz je pravda pokud se a nerovná 5, pokud se rovná výsledkem výrazu je nepravda(false) b > c výraz je pravdivý, pokud je b větší než c b >= d výraz je pravdivý, pokud je b větší nebo rovný d!(a > b) výraz v závorce je pravdivý, pokud je a větší než b, ale pak je negováno(z pravdy se stává nepravda a naopak ), tj. celý výraz je nepravdivý, pokud je a větší než b, pokud je a menší nebo rovno, tak je výraz pravdivý.!(a == b) výraz (a == b) je negován znaménkem!, to znamená, že výraz je pravdivý, pokud se výraz a nerovná výrazu b, v podstatě se to dá napsat i takto: a!= b Pozor: negace výrazu (a > b), tj.!(a > b) není to samé jako výraz (a < b), 13

ale správně je to (a <= b) 6 Logický součin && se používá, pokud budeme potřebovat spojit dva nebo více výrazů dohromady, např.: (a > b)&&(c == d), výsledkem tohoto výrazu bude logický součin výrazů v závorkách, pro logický součin platí, že je pravda pokud oba výrazy jsou pravdivé, jinak je výsledek nepravda, tj. zde bude pravda pouze pokud bude a větší než b a zároveň bude platit, že c se rovná d. Logický součin použijeme, pokud musí všechny výryzy být pravda. Logický součet je pravdivý, pokud alespoň jeden výraz je pravdivý. Např.: (e <= f) (g!= 3) výraz bude pravda, pokud bude platit, že e je menší nebo roven f, nebo bude platit, že g se nerovná 3, anebo klidně budou platit oba výrazy. 6.3 Příkazy 6.3.1 Přiřazovací příkaz Použijeme, pokud chceme, aby se do proměnné uložila nějaká data. Syntaxe: datový_typ název_proměnné; syntaxe vkládání: název_proměnné = hodnota_která_se_má_uložit; Data do proměnné můžeme vložit rovnou při vytváření proměnných: datový_typ název_proměnné = hodnota; Příklad: uint8_t b = 5; Vytvoří se proměnná pojmenovaná b (která je v rozsahu od 0 do 255) a uloží se do ní číslo 5. int16_t B; Vytvoří se proměnná B. B není to samé jako b, protože jazyk C rozlišuje VELKÁ a malá písmena. B = 1024; Do proměnné B se uloží hodnota 1024; 6.3.2 Blok příkazů Pokud chceme někam dát více příkazů, ale můžeme tam dát pouze jeden příkaz, tak je dáme do složených závorek Příklad: PŘÍKAZ1; PŘÍKAZ2; PŘÍKAZ3; 6.3.3 Podmiňovací příkaz (if) Použijeme, pokud chceme, aby se program mohl rozhodnout na základě nějaké podmínky. 6 Platí zde určité zákonitosti viz De Morganovy zákony 14

syntaxe: if(podmínka) PŘÍKAZ1; else PŘÍKAZ2; Pokud platí PODMÍNKA v kulaté závorce, vykoná se PŘÍKAZ1, pokud neplatí, vykoná se PŘÍKAZ2. Za if nebo else může být pouze jeden příkaz, pokud jich tam chceme dát více, použijeme blok. Větev else je nepovinná. Příklad: if(a > 5) // Pokud platí, že //proměnná a je větší něž 5, tak se b = a; // do proměnné b uloží hodnota, která je v proměnné a c = 2; // do proměnné c se uloží číslo 2. // Pokud podmínka neplatí, tak se nevykoná nic. podmínka může být výraz např.: a > 5 // podmínka bude platit, // pokud proměnná a je větší než 5 podmíněné příkazy lze vnořovat - v bloku příkazů může být další if Příklad: if(podmínka1) PŘÍKAZ1; if(podmínka2) PŘÍKAZ2; PŘÍKAZ3; else PŘÍKAZ4; Pokud platí PODMÍNKA1 tak se vykoná PŘÍKAZ1, pak se zkontroluje PODMÍNKA2, pokud platí, tak se vykoná PŘÍKAZ2, pokud ne, program pokračuje dál a vykoná PŘÍKAZ3. V případě, že neplatí ani PODMÍNKA1, tak se blok příkazů přeskočí a vykoná se blok příkazů za else, tj. PŘÍKAZ4. Je tu možnost také do větve else napsat daší if else, vypadá to takto: if(podmínka1) PRÍKAZ1; 15

else if(podmínka2) PRÍKAZ2; else PRÍKAZ3; Pokud platí PODMÍNKA1, tak se vykoná PŘÍKAZ1, pokud ne, tak se zkontroluje PODMÍNKA2, pokud platí tak se vykoná PŘÍKAZ2, pokud neplatí, tak se vykoná PŘÍKAZ3. Výše zapsaný kód sice bude fungovat, ale není přehledný, a proto z důvodu lepší orientace v kódu zvolíme tento zápis: if(podmínka1) PRÍKAZ1; else if(podmínka2) PRÍKAZ2; else PRÍKAZ3; 6.3.4 Příkaz několikanásobného větvení (switch) Pokud by takto zapsaných podmínek bylo moc a vztahovali by se k jedné řídící proměnné lze použít příkaz několikanásobného větvění neboli switch. Tak například místo zápisu: if(a == 1) PŘÍKAZ1; else if(a == 2) PŘÍKAZ2; else if(a == 3) PŘÍKAZ3; 16

else if(a == 4) PŘÍKAZ4; else PŘÍKAZ5; Lze napsat: switch(a) case 1: PŘÍKAZ1; break; case 2: PŘÍKAZ2; break; case 3: PŘÍKAZ3; break; case 4: PŘÍKAZ4; break; default: PŘÍKAZ5; break; Čím se to celé zjednodušuje. 6.3.5 Cyklus for (cyklus řízený proměnou ) Tento cyklu použijeme, pokud předem známe kolikrát se má opakovat určitá operace Syntaxe: for(řidící_proměnná; podmínka; zvýšení_nebo_snížení_hodnoty_proměnné ) PŘÍKAZ1; PŘÍKAZ2; Příklad: for(uint8_t i=0; i<4; i++) rozsvit_ledku(); 17

pockej_sekundu(); zhasni ledku(); Co tento kód udělá? Dejme tomu, že máme už předem vytvořené funkce rozsvit_ledku(), atd... Potom cyklus udělá následující: vytvoří proměnnou i datového typu uint8_t (celá čísla od 0 do 255), uloží do ní číslo 0. Potom zkontroluje podmínku, zda je proměnná i menší než 4, pak se provedou příkazy či funkce v těle cyklu, tj. rozsvítí se LED-dioda, bude svítit jednu sekundu, a pak zhasne. Pak se provede příkaz i++, ten zvýší hodnotu proměnné o jednu, tj. na číslo 1. Potom se kontroluje znovu podmínka, zdali je proměnná i (která má teď hodnotu 1) menší než 4, atd... Celkem se tělo cyklu vykoná čtyřikrát. Cyklus for lze použít i bez proměnné, podmínky a zvýšení hodnoty, potom bude probíhat donekonečna. Příklad: for(;;) rozsvit_ledku(); pockej_sekundu(); zhasni ledku(); Tento cyklus bude dělat to samé, co předchozí, s tím rozdílem, že to bude dělat donekonečna a nebude se ptát na podmínku. Použití v programu pro robota: Nekonečný cyklus, ve kterém se kontrolují podmínky, zda je na čáře, zda je před ním soupeř, zda má udělat to či ono. 6.3.6 Cyklus while (cyklus s podmínkou na začátku ) Použijeme, pokud nebudeme vědět kolikrát mají proběhnout příkazy a funkce v těle cyklu. Syntaxe: while(podmínka) PŘÍKAZ1;... Příklad: while(!je_tlacitko_stiskle()) ujed_1_cm(); Tento cyklus bude stát, dokud nezmáčkneme tlačítko. Vyžaduje mít předem naprogramovanou funkci ujed_1_cm() a je_tlacitko_stiskle(). 18

6.4 Funkce a procedury Pokud se nám v zdrojovém kódu opakují dokola stejné příkazy, můžeme vytvořit funkce nebo procedury, které potom voláme a které nám usnadní kód. syntaxe: datový_typ_který_funkce_vrací název_funkce(datový_typ_parametru1 parametr1, datový_typ_parametru2 parametr2) // Parametry jsou nepovinné PŘÍKAZ1; // Nepovinné příkazy PŘÍKAZ2; return HODNOTA_KTEROU_FUNKCE_VRACI; // Za return se napíše výraz, který funkce vrací. Příklad: // Funkce na sčítání dvou čísel, každé od 0 do 255. uint16_t umocni(uint8_t zakl, uint8_t exp) uint16_t vys = 1; if(exp > 0) for(uint8_t i = 0; i < exp; i++) vys = vys * zakl; return vys; pokud někde v programu použiji funkci secti(10, 2), tak výsledkem bude, jako bych napsal 10*10, tj. 100. Příklad: c = umocni(a, b); // Do proměnné c se uloží b-tá mocnina čísla a. procedura je vlastně funkce, jen s tím rozdílem, že procedura má datový typ void a nemá return (tj. nevrací žádnou hodnotu). Příklad: void rozsvitledku() DDRB = (1<<PB0); /* Co dělá tento příkaz nemusíte zatím řešit, pak se k tomu dostaneme. */ Pokud někde v programu napíšu rozsvitledku(), tak se rozsvítí LEDka na robotovi. tělo funkce main všechny příkazy, které jsou mezi složenými závorkami, se po zahajení programu postupně vykonají 19

6.5 Knihovny 6.5.1 Vlastní knihovny Z funkcí a procedur se mohou vytvářet soubory pro usnadnění práce. těmto souborům se říká knihovny. Soubory mají koncovku.h Příklad: avr/io.h moje_knihovna.h Vlastní knihovnu poté mohu vložit direktivou #include Příklad: #include "moje_knihovna.h" 6.5.2 Použité knihovny Pro práci s mikrokontroléry budeme potřebovat některé už vytvořené knihovny Příklad: avr/io.h pro základní vstup a výstup avr/interrupt.h pro práci s přerušením stdint.h zde je definovány datové typy (viz 6.1) 7 Bity a bajty 7.1 Desítková soustava a dvojková soustava V počítači jsou všechna data uložena pouze v podobě jedniček a nul. A proto se nám bude hodit, když se budeme aspoň trochu orientovat v převodech mezi dvojkovou a desítkovou soustavou. 7.1.1 Desítková soustava V desítkové soustavě je základem číslo deset. Příklad: číslo 156 si můžeme rozložit jako 1*10^2 + 5*10^1 + 6*10^0, přitom 10^0=1, 10^1=10, 10^2=10*10=100, 10^3=10*10*10=1000 atd..., takže naše číslo potom vypadá takto: 1*100 + 5*10 + 6*1 = 156. 7.1.2 Dvojková soustava Ve dvojkové soustavě je základem číslo dva. Příklad: číslo 11001010 rozložíme na 1*2^7 + 1*2^6 + 0*2^5 + 0*2^4 + 1*2^3 + 0*2^2 + 1*2^1 + 0*2^0, přitom 2^0=1, 2^1=2, 2^2=2*2=4, 2^3=2*2*2=8, 2^4=2*2*2*2=16, 2^5=32, atd..., proto naše číslo má hodnotu: 1*128 + 1*64 + 0*32 + 0*16 + 1*8 + 0*4 + 1*2 + 0*1 = 202. 7.1.3 Převod z desítkové soustavy do dvojkové Jak na to, když chceme převádět číslo z desítkové soustavy do dvojkové? Například převedeme číslo 97. Nejprve je potřeba, abychom znali násobky čísla dva: 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, atd... 20

Napíšeme jedničku. 1 Najdeme nejbližší nižší násobek dvou k našemu číslu, v našem případě je nejblíže 64. Odečteme si od 97 číslo 64, 97-64=33. Odečítali jsme číslo 64, další v pořadí je číslo 32, je 32 obsaženo v 33? Ano, proto napíšeme další jedničku. 11 Dále 33-32=1, další číslo je 16, je 16 obsaženo v 1? Ne, proto napíšeme nulu. 110 Další číslo je 8, také není obsaženo v 1, takže napíšeme nulu. 1100 Čísla 4 a 2 také nejsou obsažena v čísle 1, proto napíšeme nuly. 110000 A nakonec, je číslo jedna obsaženo v čísle jedna? Ano, napíšeme jedničku. Náš binární zápis čísla 97 vypadá takto:1100001. Čísla v binární soustavě by měla mít počet cifer rovno 8, 16, 32, podle toho s kolika bitovými čísly počítáme. V našem případě musíme doplnit jednu nulu. Pokud bychom počítali s 16 bitovými čísly doplníme o 8 nul více. Nuly doplňujeme zleva. Zapamatujeme si to snadno v desítkové soustavě se číslo 128 také nezmění pokud před něj dáme nuly, 000128. Nuly navíc nebudeme psát v desítkové soustavě, ale v dvojkové nám to pomůže se lépe orientovat. Takže to bude vypadat: 01100001 No a to ještě není všechno. Aby mělo číslo správný tvar musí mít před číslem uvedeno 0b(nula a malé B), tím říkáme v jazyce C, že číslo je v (binární) dvojkové soustavě. Pozor: Čísla 101 a 0b101 nejsou to samé!je to jednoduché, pokud 0b neuvedeme bude překladač číslo brát jakože je v desítkové soustavě. Tj. 101 => číslo sto jedna, 0b101 => číslo pět. Další příklad: Převedeme číslo 237. Nejbližší nižší číslo je 128. 1 237-128=109 je číslo 64 obsaženo v čísle 109? ANO, další jednička. 11 109-64=45 je číslo 32 obsaženo v 45? ANO, jednička. 111 45-32=13 je 16 obsaženo v čísle 13? NE, nula. 1110 je číslo 8 obsaženo v 13? ANO, jednička. 11101 13-8=5 je 4 obsaženo v 5? ANO, jednička. 111011 5-4=1 je obsažena v 1? NE, nula. 1110110 je 1 obsažena v 1? ANO, jednička. 11101101 Binární zápis čísla 237 vypadá takto:11101101. 21

7.1.4 Bity a bajty Každá číslice ve dvojkové soustavě reprezentuje jeden bit (nabývá hodnot 0 nebo 1). Osm bitů dohromady tvoří bajt. Nejnižší bit v bajtu leží vpravo (tzv nultý bit), další je nalevo od něj (první bit), až do sedmého bitu, který je nejvíce vlevo. 7.1.5 Převod z dvojkové soustavy do desítkové Vezmeme si například binární číslo 1011. Očíslujeme si pozice zprava doleva od nuly, tj.: 1 0 1 1 3 2 1 0 Pohybujeme se v dvojkové soustavě, tj. základ bude 2. Vezmeme nultou číslici a vynásobíme s ní číslo 2^0. Dostáváme 1*2^0 = 1. Dále první číslici vynásobíme číslem 2^1, tj. 1*2^1 = 2. Dále druhou číslici vynásobíme číslem 2^2, tj. 0*2^2 = 0. A to samé provedeme s číslicí na třetí pozici: 1*2^3 = 8. A nyní čísla sečteme 8 + 0 + 2 + 1 = 11, takže binární číslo 1011 převedené do desítkové soustavy je 11. Příklad 2: Převeďte binární číslo 11101001 do desítkové soustavy. 1*2^0 + 0*2^1 + 0*2^2 + 1*2^3 + 0*2^4 + 1*2^5 + 1*2^6 + 1*2^7 To je: 1 + 0 + 0 + 8 + 0 + 32 + 64 + 128 = 233 Binární číslo 11101001 převedeno do desítkové soustavy je 233. Příklad 3: Převeďte binární číslo 00010101. 1*2^0 + 0*2^1 + 1*2^2 + 0*2^3 + 1*2^4 + 0*2^5 + 0*2^6 + 0*2^7, samozřejmě členy 2^x, které násobíme nulou budou nulové a tudíž je můžeme beztrestně vynechat, tj. 1*2^0 + 1*2^2 + 1*2^4 = 1 + 4 + 16 = 21 Binární číslo 00010101 má v desítkové soustavě hodnotu 21. 7.2 Bitové výrazy a práce s nimi Bitové operace se od logických operací (viz 6.2.3) liší tím, že se neaplikují na číslo jako celek, ale bit po bitu, viz níže. My budeme potřebovat následující bitové operace: bitový součet, bitový součin, bitovou negaci, bitový posun doleva. 7.2.1 Bitové operátory bitový součet & bitový součin ~ bitová negace ^ bitový exluzivní součet << bitový posuv doleva >> bitový posuv doprava 22

7.2.2 Bitový součet Platí, že 0 0=0, 0 1=1, 1 0=1, 1 1=1, sčítají se vždy pouze bity, které leží pod sebou. Zkrátka pokud je aspoň jeden bit jedna, výsledek je také jedna. Příklad: máme dvě binární čísla 00000100 a 01100001 a chceme je bitově sečíst. Když sečteme nulté bity zadaných čísel, dostamene 0 1=1. Pak provedeme bitový součet i pro první, druhé a další bity. Zapíšeme: (0b00000100 0b01100001); Nebo pokud budeme mít čísla v proměnných: uint8_t a = 0b00000100; uint8_t b = 0b01100001; uint8_t c; c = (a b); Do proměnné c se zapíše výsledná hodnota. 00000100 - první číslo 01100001 - druhé číslo -------- 01100101 - výsledek po bitovém logickém součtu Výsledek: 01100101. 7.2.3 Bitový součin Platí, že 0&0=0, 0&1=0, 1&0=0, 1&1=1, tady platí, že výsledek je jedna, pokud oba bity jsou jedna. Příklad: bitový součin čísel 00110011 a 01000001 Zapíšeme: (0b00110011 & 0b01000001); Nebo pokud budeme mít čísla v proměnných: uint8_t c = 0b00110011; uint8_t d = 0b01000001; uint8_t e; e = (c&d); Výsledná hodnota se zapíše do proměnné e. 00110011 - první číslo 01000001 - druhé číslo -------- 00000001 - výsledek bitového logického součinu 7.2.4 Bitová negace Tam, kde byla jednička, bude nula, a kde byla nula, bude jednička. Příklad: znegujte číslo 00110101 Zapíšeme: ~(0b00110101); Nebo pokud budeme mít číslo v proměnné: uint8_t a = 0b00110101; uint8_t b; b = ~a; 23

Do proměnné b se zapíše výsledná hodnota. 00110101 - číslo, které bude logicky znegováno -------- 11001010 - výsledek 7.2.5 Bitový exklusivní součet Výsledkem exklusivního součinu je pravda, pokud se hodnoty liší, tj. nejsou stejné. Takže platí 0^0=0, 0^1=1, 1^0=1, 1^1=0 Zapíšeme: (0b00110011 ^ 0b01000001); Nebo pokud budeme mít čísla v proměnných: uint8_t c = 0b00110011; uint8_t d = 0b01000001; uint8_t e; e = (c^d); Výsledná hodnota se zapíše do proměnné e. 00110011 - první číslo 01000001 - druhé číslo -------- 01110010 - výsledek bitového exklusivního součtu 7.2.6 Bitový posun doleva Vezmeme celé osmibitové číslo a posuneme ho o určitý počet míst doleva. Přitom čísla vlevo zmizí a na na uprázdněné místo vpravo přijdou vždy nuly. Zapíšeme: (0b01000101 << 3); Nebo pokud budeme mít číslo v proměnné: uint8_t c = 0b01000101; uint8_t d; d = (c << 3); Do proměnné d se přiřadí výsledek operace. Pokud například už nebudeme potřebovat původní hodnotu proměnné c, lze to napsat i takto: uint8_t c = 0b01000101; c = (c << 3); Hodnota v proměnné c se nejprve posune o tři pozice a pak se výsledná pozice zapíše na stejnou pozici v paměti mikrokontroléru. Příklad: proveďte bitový posun doleva o tři s číslem 00000101 01000101 -------- 10001010 - posun o jedno doleva 00010100 - znovu o jedno doleva (celkem o dvě místa) 00101000 - celkový posun o tři bity doleva 24

7.2.7 Bitový posun doprava Bitový posun doprava je podobný jako operace bitový posun doleva, liší se jen ve směru posunu, tj. posouvá se na opačnou stranu. Příklad 1: Proveďte bitový posun doprava o tři pozice s binárním číslem 00000101. Zapíšeme: (0b00000101 >> 3); Výsledkem bude toto: 00000101 -------- 00000010 - posun o jednu pozici doprava 00000001 - posun o druhou pozici 00000000 - posun o třetí pozici Příklad 2: Proveďte bitový posun o dvě pozice doprava a potom o tři doleva s binárním číslem 11110111. Zapíšeme: ((0b11110111 >> 2) << 3); Výsledkem bude toto: 11110111 -------- 00111101 - posun o dvě pozice doprava 11101000 - posun o tři pozice doleva, toto je výsledek. Příklad 3: Ale co když zadám číslo do proměnné v desítkové soustavě, například 189 a provedu bitový posun o dvě pozice doprava? Co dostanu? Dostanu snad 1? Ne, i když jsme číslo zadali v desítkové soustavě, v mikrokontroléru je stejně uloženo jako jedničky a nuly, takže číslo musíme nejprve převést do dvojkové soustavy. 189 = 0b10111101 A teď posun o dvě pozice doprava: 00101111 a to je číslo 47. Takže 47 je výsledek bitového posunu čísla 189 o dvě pozice doprava. Zapíšeme takto: uint8_t a = 189; uint8_t b; b = (a >> 2); No a výsledek(tj. číslo 47 ) se uloží do proměnné b. 8 Periferie 8.1 Co jsou to periferie Periferie je nějaké rozšíření funkce jednotlivých pinů procesoru. Periferie rozšiřují použití mikrokontrolérů téměř na jakékoliv použití od blikání LED, přes různé časovače, digitální hodiny, teploměry až k menší autonomním robotům. 8.2 Jaké periferie Atmega16 má? Atmega16 má dva 8-bitové časovače/čítače, jeden 16-bitový časovač/čítač, osm kanálů 10-bitového A/D (analogově/digitálního) převodníku, analogový komparátor, tři druhy komunikací (TWI, SPI, USART), které lze použít ke komunikaci mikrokontroléru s okolím. 25

8.3 Obecné použití periferií Vstupně/výstupní pin lze použít k rozsvěcení LED (v sérii s LED musí být rezistor, viz ). Lze zjišťovat, zda je nebo není tlačítko zmáčknuté. Časovače/čítače mohou být zdrojem času pro určité aplikace, ale nejužitečnější je použití č/č jako generátor obdélníkového signálu, která bude sloužit jako pwm k řízení motoru. Kdykoliv potřebujeme získat nějaký rozumný údaj z analogových senzorů, to jest ne pouze 5 V nebo 0 V, ale cokoliv co se nachází mezi např.: 2,14 V. Použití například údaj z potenciometru nebo senzoru(fototranzistor, elektronický kompas či akcelerometr). Komunikaci mikrokontroléru s jiným mikrokontrolérem budeme řešit přes USART, TWI nebo SPI. 9 Práce s ATMega16 v C 9.1 Piny Pin je nožička procesoru. Může být nastavený jako vstupní nebo jako výstupní. Pokud je pin nastavený jako vstupní, umí určit, zda na něm je napětí odpovídající logické jedničce (5 V) nebo logické nule (0 V). Pokud je pin nastavený jako výstupní, umí se nastavit na logickou jedničku nebo logickou nulu. Další funkce pinů jsou popsány níže. 9.2 Přehled pinů Na druhé straně nahoře v [1] najdete podobu mikrokontroléru a popis jeho pinů. Pro nás jsou nejdůležitější tyto piny (čísla v závorce jsou čísla pinů podle obrázku): VCC(10) napájení digitální části mikrokontroléru 5 V GND(11) zem digitální části AVCC(30) napájení analogové části(a/d převodník na portu A) GND(31) zem pro analogovou část AREF(32) referenční napětí pro A/D převodník RESET(9) přivedením logické nuly (0 V) po krátkou dobu se procesor resetuje a program začne běžet od začátku XTAL1(13) a XTAL2(12) piny pro připojení krystalu Pak jsou tu piny jako PB0 až PB7, je to označení základní vstupně výstupního pinu druhé písmeno nám říká z jakého je portu a číslo pořadí pinu (pozor:začíná od nuly). Každý takto označený pin lze nastavit na logickou jedničku (5V) nebo logickou nulu (0V), nebo lze například číst, zda je na pinu logická jednička či nula (testování stisklého tlačítka). V závorkách je uvedena alternativní funkce pinu. Nás zajímají tyto: ADC0(40) až ADC7(33) A/D(Analogově/digitální) převodník, pro získání hodnot z nějakého analogového senzoru (např.: teplotní čidlo, IR senzor, čtení napětí na bateriích přes odporový dělič). 26

OC0(4), OC1A(19), OC1B(18), OC2(21) výstupy č/č(časovače/čítače), které lze použít ke generování PWM signálu pro řízení motorů, ale ne přímo z mikrokontroléru, ale pouze pomocí driveru. MOSI(6), MISO(7), SCK(8), RESET(9), GND(11) piny používané pro programování mikrokontroléru. INT0(16), INT1(17), INT2(3) vnější přerušení, například pro detekci stisknutí tlačítka. 9.2.1 Připojení na programátor Programátor má některé piny pojmenovány odlišně: VPP(13V), VDD, GND, DATA/MOSI, CLOCK, MISO VPP programátoru připojíme na RESET mikrokontroléru, VDD připojíme na VCC, GND na GND, DATA/MOSI na MOSI, CLOCK na SCK, MISO na MISO. 9.3 Práce s registry Při práci s mikrokontrolérem budeme pracovat s menšími úseky paměti, tzv. osmibitovými registry. Registr se chová jako proměnná můžeme z něj číst údaj nebo ho tam vkládat. Tím řídíme chod mikrokontroléru. Registry jsou pojmenovány velkými písmeny, například: DDRD, PORTD, PIND, OCR1, atd... 9.4 Registry pro řízení pinů Piny jsou označeny PA0 až PA7, PB0 až PB7, atd... Písmeno za P říká, z jakého portu je pin, číslo udává pořadí pinu (čísluje se od nuly). Např.: PD5 pátý pin portu D, PA4 čtvrtý pin portu A, PC0 - nultý pin portu C. 9.5 Základní vstup a výstup Díky registrům DDRA, DDRB, DDRC a DDRD mikrokontroléru řekneme, který pin má být vstupní či výstupní. Na začátku jsou všechny bity těchto registrů nastaveny na nulu, tj. všechny nožičky mikrokontroléru jsou vstupní. Piny jsou rozděleny do portů A, B, C a D, každý port má maximálně osm pinů. Každému pinu je přiřazen jeden bit v registru. Každý pin je značen PXn, kde X je port, kterému pin náleží(a,b,c,d), a n je číslo pinu(od 0 do 7). Například PB5 je pátý pin portu B, kterému odpovídá pátý bit v registru DDRB, tj. bit označený jako X v čísle 00X00000. Totéž trochu jinak: Vstupně/výstupní piny ( [1] str.48) Pro práci s vstupně/výstupními piny jsou k dispozici tři registry DDRX, PORTX, PINX, kde X je označení portu (A,B,C,D). DDRX tímto registrem říkáme, zda je pin v portu X vstupní (0) či výstupní(1). PORTX pokud je pin vstupní, tak logickou nulou vypínáme pull-up (zdvihávací) rezistor a logickou jedničkou zapínáme pull-up 7. PORTX pokud je pin výstupní, 7 Pull-up rezistor je rezistor, který zajistí, že na pinu bude logická jednička(5 V ), je to rezistor, kde jedna nožička je na VCC a druhá na pinu. 27

tak logickou nulou nastavíme na pinu logickou nulu a logickou jedničkou jedničku. PINX tento registr slouží pouze a jen pro čtení, a udává aktuální hodnotu na portu X 9.6 Nastavování bitu zapsání jedničky Například: DDRB = DDRB (1<<PB5); // Tento příkaz nastaví pátý bit v~registru DDRB. Co jednotlivé znaky v příkaze znamenají? Výraz v závorce (1<<PB5) udělá bitový posuv čísla 1 o PB5 míst doleva. PB5 je symbolická konstanta, která má hodnotu 5, místo PB5 lze použít jen číslo 5. Takže (1<<5) je vlastně posunutí čísla 00000001 o pět míst doleva, výsledek 00100000. Znak svislé čáry je operátor pro bitový součet. DDRB je registr pro určení vstupu a výstupu pro port B. Takže příkaz DDRB = DDRB (1<<5); udělá to, že do registru DDRB uloží hodnotu vzniklou bitovým součtem z původní hodnoty registru DDRB a čísla 00100000. Takto postupujeme, protože neznáme hodnoty v registru DDRB a chceme nastavit jen pátý bit a ostatní chceme nechat nezměněny. Pokud bychom chtěli nastavit jen pátý bit nehledě na ostatní, použijeme příkaz: DDRB = 0b00100000; // 0b - říká překladači, že se jedná o binární číslo Co by se stalo, kdyby v registru už nějaké hodnoty byly nastaveny a my bychom napsali pouze DDRB = 0b00100000;? 01001111 // předchozí hodnota, kterou neznáme, ale chceme ji tam mít 00100000 // výsledná hodnota, která se tam dosadí // výsledek - krom jednoho bitu se všechny další sesadily Při použití příkazu DDRB = DDRB (1<<5); to bude vypadat takto: 01001111 // předchozí hodnota 00100000 // hodnota, která se má nastavit -------- // bitový součet 01101111 // nastavili jsme pátý bit a ostatní jsme ponechali Příkaz DDRB = DDRB (1<<5); lze zkrátit na DDRB = (1<<5);. 28

9.7 Sesazení bitu zapsání nuly Ze stejného důvodu jako při nastavování bitu použijeme sice složitější zápis, ale bezchybný. Příklad: chceme sesadit pátý bit a ostatní chceme nechat takové, jaké jsou. DDRB = DDRB & ~(1<<5); Vlnka (~) před výrazem v závorce je bitová negace, ampérsand (&) je znak bitového součinu. Nejprve se vyhodnotí výraz v závorce: 00100000 // výraz v~závorce 11011111 // negace výrazu v závorce // s~výsledkem negace se provede logický součin //s~původní hodnotou v~registru 01101111 // příklad původní hodnoty 11011111 // výsledek negace -------- // logický součin 01001111 // výsledek se oproti původní hodnotě liší jen tím, // že je sesazen pátý bit Příkaz na sesazení bitu lze také zkrátit na DDRB &= ~(1<<5);. 9.8 Příklad pro vstup a výstup Příklad: Napište program, kde nastavíte piny PB0, PB1, PB3, sesadíte piny PC5, PC6, vytvoříte proměnou d a uložíte do ní stav portu D. Řešení: #include <avr/io.h> int main() DDRB = (1<<PB0) (1<<PB1) (1<<PB3); DDRC &= ~((1<<PC5) (1<<PC6)); uint8_t d = PIND; 9.9 Registry časovačů/čítačů Pro řízení motorů nám postačí osmibitový časovač/čítače (č/č0, č/č2). Signál pro servo získáme z kanálů šestnáctibitového č/č1. V registrech jsou bity pojmenovány např.: pátý bit v registru COM01. Můžeme napsat (1<<5), ale raději kvůli přehlednosti budeme psát (1<<COM01). č/č0(datasheet str.68): TCCR0 pro nastavení časovače na PWM TCNT0 aktuální hodnota č/č OCR0 hodnota v porovnávacím registru 29

TIMSK zde můžeme nastavit přerušení po dosažení shody registru OCR0 s registrem TCNT0 nastavením bitu OCIE0, nebo nastavit přerušení při přetečení č/č nastavením bitu TOIE0. TIFR pokud nastala shoda registru OCR0 s registrem TCNT0 nastaví se bit OCF0, pokud přeteče č/č nastaví se bit TOV0, bity se nulují samy po vstupu do obslužné rutiny přerušení, nebo pokud nastavíme na jedničku bit TOV. 9.10 PWM řízení motorů Pro nastavení PWM se podíváme do tabulky na straně 80: Zvolíme mód FastPWM pro tento mód musíme nastavit bity WGM01 a WGM00 v registru TCCR0, nyní se podíváme na tabulku 40 na straně 81 a budeme chtít použít mód, kdy se při shodě registrů ORC0 a TCNT0 nastaví na pinu OC0 logická nula a při přetečení se nastaví logická jednička musíme nastavit bit COM01 v registru TCCR0. Teď se podíváme na tabulku 42. V tabulce vidíme různé předděličky CO TO JE, které můžeme použít pro generování PWM. Po dosazení do vzorce na straně 75, kde N je předdělička. Nastavení předděličky bychom měli volit tak, aby frekvence podle vzorce vyšla taková, kterou lidské ucho neslyší (nad 16kHz), ale zase nesmí být větší, něž dokáže zvládnout náš driver CO TO JE(najdeme v datasheetu). Já volil předěličku 64 - výsledná frekvence je kolem 1kHz NEODPOVÍDÁ PŘEDCHOZÍ PODMÍNCE: TCCR0 = (1<<WGM01) (1<<WGM00) (COM01) (1<<CS01) (1<<CS00); č/č2(datasheet str.115): K ovládání č/č2 slouží registry TCCR2, TCNT2, OCR2, TIMSK, TIFR a navíc registr ASSR, ten by nás zajímal, pokud bychom č/č2 asynchronní(tj. nepoužíval by frekvenci krystalu na pinech XTAL1 a XTAL2, ale krystal na pinech TOSC1 a TOSC2). Pro stejné nastavení č/č2 se podíváme na odpovídající tabulky:50(str 126), 52(str 127), 54(str 128) Příkaz bude vypadat takto: TCCR2 = (1<<WGM21) (1<<WGM20) (1<<COM21) (1<<CS22); 9.11 Řízení serva č/č1(datasheet str.86): S č/č1 to bude trochu složitější. Č/č1 má více možných použití, také se dá použít na pwm pro motory, ale my ho použijeme pro řízení servomotoru (serva). Jak se řídí pohyb serva? Servo se řídí logickým signálem (jedničkou) po dobu od 1 ms do 2 ms (často i od 0,5 ms do 2,5 ms), a celková perioda je 20 ms. Podle toho, jak dlouho signál trvá, tak se servo natočí. Tj. pokud budeme chtít servo maximálně natočit na jednu stranu, nastavíme pin, který slouží jako řídící signál pro servo, na logickou jedničku po dobu 1 ms a pak 19 ms logickou nulu a pak zase logickou jedničku, logickou nulu, atd... Pokud budeme chtít servo posunout do druhé krajní polohy, necháme logickou jedničku po dobu 2 ms a logickou nulu po dobu 18 ms. Pokud budeme chtít střední polohu, tak jedničku nastavíme na 1,5 ms a nulu na 18,5 ms. Jestliže budeme potřebovat jiný úhel natočení, nastavíme logickou jedničku na odpovídající dobu. Nastavení č/č1 pro řízení až dvou serv: Registrů, které ovládájí č/č1 je více než u předchozích č/č: 30