PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 11



Podobné dokumenty
PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 2

PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 3

PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 10

PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 7

PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 8

PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 1

Algoritmizace a programování

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

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

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

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

5 Přehled operátorů, příkazy, přetypování

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

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 6

Operační systémy. Cvičení 3: Programování v C pod Unixem

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

Assembler - 5.část. poslední změna této stránky: Zpět

Programování v C++ 1, 1. cvičení

6 Příkazy řízení toku

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

8 Třídy, objekty, metody, předávání argumentů metod

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky -

Úvod do programovacích jazyků (Java)

1. Téma 03 - Rozhodování

MIKROPROCESORY PRO VÝKONOVÉ SYSTÉMY

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

10 Algoritmizace Příklad 2 Word 2007/ VBA

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

Algoritmy I. Cvičení č. 2, 3 ALGI 2018/19

VISUAL BASIC. Přehled témat

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Operační systémy. Cvičení 4: Programování v C pod Unixem

Řídicí struktury. alg3 1

Základy algoritmizace a programování

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný

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

Paměť počítače. alg2 1

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Jako pomůcka jsou v pravém dolním rohu vypsány binární kódy čísel od 0 do 15 a binární kódy příkazů, které máme dispozici (obr.21). Obr.

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

GEOGRAFICKÉ INFORMAČNÍ SYSTÉMY CVIČENÍ 5

C# konzole Podíl dvou čísel, podmínka IF

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

Algoritmy a datové struktury

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Algoritmizace a programování

Algoritmizace prostorových úloh

Program "Světla" pro mikropočítač PMI-80

Úvod do programování - Java. Cvičení č.4

Výčtový typ strana 67

Z. Kotala, P. Toman: Java ( Obsah )

2 Datové typy v jazyce C

Algoritmizace prostorových úloh

Návod na práci s přípravkem a programem uscope na cvičeních

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Program a životní cyklus programu

Operátory. Základy programování 1 Tomáš Kühr

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

DUM 06 téma: Tvorba makra pomocí VBA

Programování v C++ Úplnej úvod. Peta (maj@arcig.cz, SPR AG )

Strukturu lze funkci předat: (pole[i])+j. switch(výraz) velikost ukazatele

Větvení a cykly. Úvod do programování 1 Tomáš Kühr

8. Laboratoř: Aritmetika a řídicí struktury programu

Funkce, podmíněný příkaz if-else, příkaz cyklu for

Funkce, intuitivní chápání složitosti

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

IPA - Lab.1 Úvod do programování v ASM

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

8 Makra Příklad 4 Excel 2007

Fz =a z + a z +...+a z +a z =

Masarykova střední škola zemědělská a Vyšší odborná škola, Opava, příspěvková organizace

Algoritmizace a programování

GEOGRAFICKÉ INFORMAČNÍ SYSTÉMY CVIČENÍ 4

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

Programování v C++, 2. cvičení

Inovace výuky prostřednictvím šablon pro SŠ

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Jazyk C Program v jazyku C má následující strukturu: konstanty nebo proměnné musí Jednoduché datové typy: Strukturované datové typy Výrazy operátory

Základy programování (IZP)

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

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

MAXScript výukový kurz

Vstupní požadavky, doporučení a metodické pokyny

Operátory. Základy programování 1 Martin Kauer (Tomáš Kühr)

Téma 8: Konfigurace počítačů se systémem Windows 7 IV

Více o konstruktorech a destruktorech

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Opakování programování

Použití programu uscope k simulaci výukového přípravku pro předmět PMP

Vlastnosti algoritmu. elementárnost. determinovanost. rezultativnost. konečnost. hromadnost. efektivnost

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

Úvod do programování 7. hodina

GEOGRAFICKÉ INFORMAČNÍ SYSTÉMY CVIČENÍ 9

C2110 Operační systém UNIX a základy programování

Transkript:

UNIVERZITA TOMÁŠE BATI VE ZLÍNĚ FAKULTA APLIKOVANÉ INFORMATIKY PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 11 Programování mikropočítačů v jazyce C Jan Dolinay Petr Dostálek Zlín 2013 Tento studijní materiál vznikl za finanční podpory Evropského sociálního fondu (ESF) a rozpočtu České republiky v rámci řešení projektu: MODERNIZACE VÝUKOVÝCH MATERIÁLŮ A DIDAKTICKÝCH METOD

2 Cvičení 11 Programování mikropočítačů v jazyce C STRUČNÝ OBSAH CVIČENÍ: První program v jazyce C v prostředí CodeWarrior aritmetické operace Příklad na podmínky a cyklus Příklad s využitím vlastní funkce Úkoly k procvičení VSTUPNÍ ZNALOSTI: Toto cvičení předpokládá znalosti základů programování v jazyce C. CÍL: Na tomto cvičení se seznámíme s využitím jazyka C pro programování mikropočítačů. Jazyk C je nejrozšířenějším programovacím jazykem pro tvorbu aplikací pro mikropočítače, a proto je jeho znalost jedním z hlavních předpokladů úspěšného uplatnění v praxi. Cvičení se vztahuje k těmto otázkám Základní pojmy mikroprocesorové techniky, mikropočítač, mikroprocesor, sběrnice, periferní zařízení, registry,

3 Řešené příklady Nyní si ukážeme jak vytvořit program v jazyce C v prostředí CodeWarrior. CodeWarrior umožňuje jak programování v assembleru (což jsme používali dosud), tak i jazyce C. Výhodou je, že i při použití jazyka C budeme stále pracovat ve známém vývojovém prostředí V ukázkových programech vyřešíme stejná zadání jako v našich prvních programech v assembleru. Příklad 1 Základní aritmetické operace v jazyku C Úkol 1 Proveďte vyhodnocení výrazu ((c1+c2) (c3+c4))*c5. Řešení: Zatímco v assembleru zabralo vytvoření takovéhoto programu mnoho řádků kódu, v jazyce C prakticky jen přepíšeme zadaný výraz a překladač sám zajistí jeho převod do řeči procesoru, tj. jeho rozložení na instrukce procesoru. Nejprve samozřejmě definujeme proměnné, do kterých budou uložena zpracovávaná čísla a výsledek. Použijeme datový typ int jazyka C tj. celé číslo se znaménkem. Definice proměnných v jazyku C bude vypadat následovně: int c1, c2, c3, c4, c5, vysledek; Samotný kód programu, který vyhodnocuje zadaný výraz je velmi jednoduchý: vysledek = ((c1+c2) (c3+c4))*c5; Překlad programu Spusťte CodeWarrior a vytvořte nový projekt. V prvním okně průvodce novým projektem zaškrtněte políčko C a odškrtněte políčka ASM a C++, viz obr. 1. Tím zvolíte jako programovací jazyk pro tento projekt jazyk C.

4 Obr. 1 Vytváření nového projektu v jazyku C v prostředí CodeWarrior Další kroky jsou už stejné jako při vytváření projektu v assembleru. Tedy, vyberte typ mikropočítače (GB60) a jako připojení (connection) zvolte simulátor. Po dokončení průvodce se opět vygeneruje kostra programu, viz. Obr. 2. Podívejme se na vygenerovaný kód. Obr. 2 Kostra programu v C vygenerovaná CodeWarriorem

5 Základní struktura programu na obrázku 2 by vám měla být známá. Je totiž stejná jako u programu v C pro osobní počítač. Kód začíná direktivami #include, která vkládají do našeho zdrojového kódu definice základních portů a registrů zvoleného mikropočítače. Deklarace funkce void MCU_init(void) pro nás není důležitá, protože ji nebudeme využívat. Důležitá je ovšem funkce main, která, jak víme, představuje základní výkonnou jednotku programu v jazyku C. Program začíná vstupem do této funkce a opuštěním této funkce celý program končí. Vidíme, že průvodce už do funkce main vložil makro EnableInterupts, které povoluje přerušení. Toto makro je ekvivalentní provedení instrukce SEI v assembleru. Na konec funkce main pak průvodce vložil cyklus for, který v nekonečné smyčce provádí resetování watchdogu pomocí makra RESET_WATCHDOG();. Takto vytvořený program by tedy nic užitečného nedělal. Po spuštění by pouze v nekonečné smyčce resetoval obvod watchdog. Definice proměnných zapíšeme na začátek programu, ještě před funkci main. Náš kód pak zapíšeme dovnitř funkce main, za makro EnableInterups, ale před cyklus for. Nyní tedy dopište do kostry programu vlastní kód dle obrázku 3. Obr. 3 Zdrojový kód programu pro úkol 1

6 Námi vytvořený kód se skládá ze dvou bloků, které bychom mohli označit jako definici proměnných a samotný kód programu. Oproti zadání je v kódu navíc ukázáno i dělení celých čísel a získání zbytku po celočíselném dělení. Hned za direktivy #include na začátku programu jsme dopsali definici potřebných proměnných, tj. c1 až c5, vysledek a zbytek. Protože proměnné nejsou definovány uvnitř žádné funkce, budou globální, stejně jako bychom je v assembleru vytvořili direktivou RMB nebo DS.B. Náš kód je vložen do těla funkce main, za komentář insert your code here (sem vložte svůj kód). Nejprve do proměnných c1 až c5 vkládáme nějaké konkrétní hodnoty, abychom mohli otestovat funkčnost programu. Se zadanými čísly by výsledek měl vyjít 14. Samotný kód vyhodnocení výrazu zabírá pouhý jeden řádek a jedná se vlastně jen o přepis zadání do jazyka C, což je velmi podobné jako běžný matematický zápis. Na dalším řádku pak vidíme, že dělení se v C zapíše pomocí lomítka a zbytek po celočíselném dělení získáme pomocí operátoru modulo (%). S čísly dle obrázku dělíme 5/2 a tedy výsledek bude 2 a zbytek 1. Testování programu Program přeložíme stejným způsobem jako dříve u programů v assembleru, tedy např. tlačítkem Build na panelu nástrojů. Po překladu a odstranění případných chyb program spusťte v debuggeru. Krokujte program a všimněte si následujícího: o Po prvním kroku, před vykonáním přiřazení c1 = 5; je ve všech proměnných nula, viz okno Data. Toto je výchozí hodnota pro globální proměnné, kterou jim nastavil překladač. o Po přiřazení do proměnných c1 až c5 by v nich měla být zadaná čísla. o Po vykonání řádku vysledek = bude v proměnné vysledek číslo 14. o Po provedení dělení bude v proměnné vysledek hodnota 2 o Po provedení modula: zbytek = c1 % c2 bude v proměnné zbytek číslo 1, tedy zbytek po celočíselném dělení 5 / 2. o Program se pak neustále točí v cyklu for. Můžete si také prohlédnout kód našeho programu v assembleru, tak jak jej přeložil překladač jazyka C a to v okně Assembly vpravo nahoře. Např. příkaz c1 = 5; je přeložen jako: LDX #5

7 CLRH STHX 0x0100 Se znalostmi assembleru získanými dříve z toho dokážeme odvodit, že překladač C rezervuje pro proměnnou typu int dva bajty paměti a přiřazení provádí přes registry H:X. Proto nahrává číslo 5 do registru X a registr H nuluje. Oba registry pak ukládá do paměti na adresu 100 hexadecimálně. Na této adrese se tedy bude nacházet proměnná c1. V dalším příkladu se podíváme na zápis podmínek a cyklů v C. Úkol 2 podmínky, cykly a pole Porovnejte čísla c1 a c2 a větší z nich uložte do proměnné vysledek. Dále definujte pole M o pěti prvcích a toto pole vynulujte. Řešení Podívejme se na výpis programu na obrázku 4. Proměnné c1 a c2 tentokrát definujeme uvnitř funkce main a zároveň jim přiřazujeme hodnoty 5 a 3. Dále definujeme proměnné vetsi, i a M. M je přitom pole o pěti prvcích. První část kódu porovnává čísla c1 a c2 a pokud je c1 větší než c2, ukládá do proměnné vetsi c1 (c1 = vetsi;), v opačném případě (else) ukládá do proměnné vetsi c2. Zápis je vám jistě srozumitelný, jedná se o podmínku if (podmínka) vyraz else vyraz. Druhá část programu vyplní pole M nulami. K tomu potřebujeme cyklus. Jedním z cyklů v jazyce C je for, který je použit v naší ukázce. Zápis cyklu for je obecně: for ( inicializační příkaz; podmínka trvání cyklu; příkaz prováděný na konci cyklu ) { } tělo cyklu V našem příkladě se nejprve inicializuje proměnná i (počitadlo cyklu) na nulu. Podmínka běhu cyklu je i < 5, takže cyklus se zopakuje právě 5-krát (pro i =0, 1, 2, 3 a 4). Uvnitř složených závorek (v těle cyklu) se provádí příkaz M[i] = 0; Ten do i-tého prvku pole M přiřazuje nulu.

8 Obr. 4 Zdrojový kód programu dle zadání 2 Překlad a ladění programu Vytvořte nový projekt stejným způsobem jako u předchozího úkolu. Do kostry programu pak dopište zdrojový kód dle obr. 4. Po překladu a odstranění případných chyb program spusťte v simulátoru. S čísly podle ukázkového kódu bude splněna podmínka if (c1 je větší než c2) a proto se provede příkaz vetsi = c1 a větev else se přeskočí. Př krokování pole sledujte jak se jednotlivé prvky pole M plní nulami. Pokud pole již obsahuje nuly, upravte program tak, aby místo nuly přiřazoval jiné číslo, např. 3. Úkol 3 funkce Napište program, který spočítá, kolik z čísel c1 a c2 je sudých a výsledek uloží do proměnné nsude. Pro určení, zda je číslo sudé napište funkci, která jako vstupní parametr dostane číslo, které má otestovat a vrátí 1 jestliže je sudé a 0 jestliže není. Řešení Podobný příklad jsme již řešili v assembleru. Pro určení, zda je číslo sudé jsme použili dělení daného čísla dvěmi. Pak jestliže je zbytek roven nule, číslo je sudé. Zápis tohoto algoritmu v jazyku C bude mnohem jednodušší než v assembleru. Podívejte se na obr. 5 na výpis

9 zdrojového kódu. V zeleném rámečku v pravé části obrázku je kód funkce (podprogramu) pro určení zda je předané číslo sudé. Funkce se jmenuje JeSude. Levá část obrázku obsahuje kód hlavního programu, tedy funkce main. Šedě je zde uveden kód který vygeneroval průvodce novou aplikací. Podívejme se nejprve na kód hlavního programu. Uvnitř funkce main jsou definovány proměnné c1, c2 a nsude. C1 a c2 jsou přímo inicializovány na určité hodnoty. nsude bude po skončení programu obsahovat počet sudých čísel v těchto dvou proměnných, což může být buď 0 nebo 1 nebo 2. S konkrétními čísly dle uvedeného kódu bude v proměnné nsude číslo 1, protože proměnná c2 obsahuje sudé číslo, kdežto c1 obsahuje číslo liché. Vlastní kód začíná přiřazením nuly do proměnné nsude. Mohli bychom to samozřejmě udělat už v definici proměnné jako je tomu u c1 a c2. Zde se jedná jen o ukázku různých možností pro dosažení stejného cíle. Dále je zapsána podmínka if. Výraz v závorce je poněkud složitější než u předchozího příkladu. Provádí se zde volání funkce JeSude s číslem c1 jako parametrem. Výsledek vrácený funkcí JeSude() je pak porovnán s číslem 1. Podle zadání má funkce JeSude vrátit 1 jestliže je předané číslo (její parametr) sudé. Je proto celkem logické, že jestliže číslo vrácené funkcí JeSude() bude rovno jedné a tudíž podmínka if bude splněna, zvětšíme hodnotu v proměnné nsude o 1 (nsude = nsude + 1). Jestliže funkce JeSude nevrátí jedničku, podmínka splněna nebude a inkrementace proměnné nsude se neprovede. Druhá podmínka if testuje sudost proměnné c2. Je ale zapsána úspornějším způsobem bez operátoru porovnání. Využívá toho, že v jazyce C se podmínka vyhodnotí jako nesplněná (nepravda), jestliže je výsledkem výrazu 0 a jako splněná, pokud je výsledek nenulový. Jestliže c2 bude sudé číslo, vrátí funkce JeSude jedničku, což bude vyhodnoceno jako splněná podmínka (nenulový výsledek) a provede se inkrementace proměnné nsude. Jestliže c2 nebude sudé a funkce JeSude tudíž vrátí nulu, bude to vyhodnoceno jako nesplněná podmínka. Inkrementace proměnné je u druhé podmínky také zapsána úsporným způsobem: nsude++, což je ekvivalentní zápisu nsude = nsude + 1;.

10 Obr. 5 Zdrojový kód programu na počítání sudých čísel Kód funkce JeSude je uveden v zeleném rámečku na obr. 5. První řádek kódu: int JeSude(int cislo) říká, že funkce JeSude vrací celé číslo (int) a jako vstupní parametr má jedno celé číslo (int cislo). Podle zadání má funkce otestovat předaný parametr a v případě, že je to sudé číslo, vrátit hodnotu 1, jinak vrátit hodnotu 0. Uvnitř funkce je nejprve definována proměnná int zbytek. Na dalším řádku je do ní uložen zbytek po celočíselném dělení vstupního parametru cislo dvěmi. K tomu slouží operátor modulo (%), se kterým už jsme se setkali v prvním programu. Podmínka if ( zbytek == 0) je pak splněna, jestliže cislo bylo dělitelné 2 bez zbytku. Což znamená, že je sudé. Proto jestliže je podmínka splněna, funkce končí příkazem return 1, čímž vrací volajícímu hodnotu 1. (volajícím je zde funkce main). Pokud podmínka není splněna, provede se větev else, což znamená, že funkce JeSude skončí příkazem return 0, tedy vrátí volajícímu nulu.

11 Testování programu Vytvořte nový projekt v jazyku C, opět nastavený pro spuštění v simulátoru. Přepište kód z výpisu o vašeho programu. Kód funkce JeSude() napište za funkci main(), tj. za uzavírací závorku ( } ) funkce main, viz šipka na obrázku. Po překladu a odstranění případných chyb spusťte program v simulátoru a zkuste jej odkrokovat. Vyzkoušejte příkaz Step into, který bude krokovat dovnitř funkce JeSude() i příkaz Step Over, který funkci JeSude provede v jediném kroku. Zkuste změnit hodnoty v proměnných c1 a c2 tak, aby výsledkem byla 0 sudých čísel a 2 sudá čísla. Změnu je možno provést přímo v simulátoru poklepáním na proměnnou v okně Data stejně jako u programu v assembleru. Příklady k procvičení 1. Vytvořte program, který vyhledá v poli pěti čísel minimální a maximální hodnotu a uloží je do proměnných min a max. Pole naplňte libovolnými hodnotami podle uvážení. 2. Vytvořte program, který bude pomocí funkce faktor počítat faktoriál z čísel uložených v poli z předchozího příkladu. Faktoriály uloží do nového pole f_pole. Vzhledem k omezenému rozsahu celočíselné proměnné int (2 bajty tj. max 65535) nepoužívejte pro výpočet faktoriálu čísla větší než 8. Doplňující zdroje [1] Freescale: Firemní dokumentace pro mikropočítače HCS08, dostupné online: http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=s08gb&nodeid= 01624684491437EDD5