Bevezetés a mikrovezérlők programozásába: Vezérlési szerkezetek, relációs operátorok

Hasonló dokumentumok
Bevezetés az elektronikába

Bevezetés a mikrovezérlők programozásába: I/O portok kezelése, számrendszerek, bitműveletek

MSP430 programozás Energia környezetben

Bevezetés a mikrovezérlők programozásába: Programciklusok szervezése, analóg I/O

MSP430 programozás Energia környezetben. Az I/O portok kezelése

Bevezetés a mikrovezérlők programozásába: Ismerkedés az Arduino fejlesztői környezettel

Mintavételes szabályozás mikrovezérlő segítségével

MSP430 programozás Energia környezetben. Az első lépések

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

A C# programozási nyelv alapjai

Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)

Vezérlési szerkezetek

Járműfedélzeti rendszerek II. 1. előadás Dr. Bécsi Tamás

MSP430 programozás Energia környezetben. Analóg jelek mérése

Webprogramozás szakkör

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

Szoftvertervezés és -fejlesztés I.

Bevezetés az elektronikába

A C programozási nyelv II. Utasítások. A függvény.

C programozás. 1 óra Bevezetés

Java programozási nyelv

Java II. I A Java programozási nyelv alapelemei

Internet programozása. 3. előadás

Labor gyakorlat Mikrovezérlők

Informatika terméktervezőknek

Labor gyakorlat Mikrovezérlők

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós február 18. Széchenyi István Egyetem, Gy r

Megjegyzés: A leírás abszolút kezdők számára készült elnézést azoktól, akik ezen a szinten már túlvannak!

Programozás BMEKOKAA146. Dr. Bécsi Tamás 3. előadás

Java II. I A Java programozási nyelv alapelemei

MSP430 programozás Energia környezetben. Szervó motorok vezérlése

Bevezetés a mikrovezérlők programozásába: WS2812 RGB LED-ek vezérlése

Komputeralgebra Rendszerek

S z á m í t ó g é p e s a l a p i s m e r e t e k

MSP430 programozás Energia környezetben. LED kijelzok második rész

Az MSP430 mikrovezérlők digitális I/O programozása

Járműfedélzeti rendszerek II. 2. előadás Dr. Bécsi Tamás

Programozás és Digitális technika I. Pógár István eng.unideb.hu/pogari

MSP430 programozás Energia környezetben. Kitekintés, további lehetőségek

1. Alapok. #!/bin/bash

Programozás C nyelven (3. ELŐADÁS) Sapientia EMTE

MSP430 programozás Energia környezetben. Digitális szenzorok

Algoritmus fogalma. Mi az algoritmus? HF: Al Khwarizmi. Egy adott probléma megoldásának leírása elemi lépések sorozatával

Programozás BMEKOKAA146. Dr. Bécsi Tamás 2. előadás

Megszólal a Kütyü. Arduino bevezető hangszóró vezérlése 1 / 5 oldal

Szelekció. Döntéshozatal

A C programozási nyelv I. Bevezetés

Újrakonfigurálható eszközök

Programozási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával)

Operációs rendszerek. 11. gyakorlat. AWK - szintaxis, vezérlési szerkezetek UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

A C programozási nyelv I. Bevezetés

Imperatív és procedurális programozás a Javában

Bevezetés az elektronikába

Mérési útmutató. A/D konverteres mérés. // Első lépésként tanulmányozzuk a digitális jelfeldolgozás előnyeit és határait.

Szoftvertechnológia alapjai Java előadások

Kifejezések. Kozsik Tamás. December 11, 2016

Programozási nyelvek JAVA EA+GY 1. gyakolat

Forráskód formázási szabályok

Labor gyakorlat Mikrovezérlők

AWK programozás, minták, vezérlési szerkezetek

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Occam 1. Készítette: Szabó Éva

Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás 2. előadás

Bevezetés az elektronikába

C programozási nyelv

Labor 2 Mikrovezérlők

Bevezetés a mikrovezérlők programozásába: Kommunikáció

PHP. Telepítése: Indítás/újraindítás/leállítás: Beállítások: A PHP nyelv

A programozás alapjai

AWK programozás, minták, vezérlési szerkezetek

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

MSP430 programozás Energia környezetben. Nem élhetek muzsikaszó nélkül

Gyakorló feladatok Gyakorló feladatok

A C# PROGRAMOZÁSI NYELV

Python bevezető foglalkozás Python bevezető foglalkozás

Bevezetés a mikrovezérlők programozásába: Fényérzékelés, fénymérés

Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás 3. előadás

Óbudai Egyetem. C programozási nyelv

Algoritmizálás + kódolás C++ nyelven és Pascalban

Operációs rendszerek gyak.

Bevezetés a mikrovezérlők programozásába: DC motorok vezérlése

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

MSP430 programozás Energia környezetben. LED kijelzok második rész

Szkriptnyelvek. 1. UNIX shell

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

Bevezetés a mikrovezérlők programozásába: Digitális szenzorok

Vezérlési szerkezetek. Szelekció Ciklusok

Készítette: Ruzsinszki Gábor webmaster442

BASH script programozás II. Vezérlési szerkezetek

Pénzügyi algoritmusok

Kezdő programozók hibái Azok a buktatók, amikről ha nem tudsz, napokat töprenghetsz hiába programozás-tanulás közben

MSP430 programozás Energia környezetben. Hétszegmenses LED kijelzok

Hardver leíró nyelvek (HDL)

Objektumorientált Programozás III.

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Vegyes témakörök. A KAT120B kijelző vezérlése Arduinoval

Készítette: Nagy Tibor István

Programozás alapjai 5. gyakorlat Vezérlési szerkezetek egymásba ágyazása

Programozás BMEKOKAA146. Dr. Bécsi Tamás 1. Előadás

Objektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése

Átírás:

Bevezetés a mikrovezérlők programozásába: Vezérlési szerkezetek, relációs operátorok 1

Ajánlott irodalom Aduino LLC.: Arduino Language Reference ATMEL: ATmega328p mikrovezérlő adatlapja Brian W. Kernighan, Dennis Ritchie: A C programozási nyelv Cseh Róbert: Arduino programozási kézikönyv Ruzsinszki Gábor: Mikrovezérlős rendszerfejlesztés C/C++ nyelven I. PIC mikrovezérlők Ruzsinszki Gábor: Mikrovezérlős rendszerfejlesztés C/C++ nyelven II. Arduino Lab 12 projektek ledswitch LED ki-bekapcsolgatása nyomógomb segítségével (nyomógomb kezelés alapprogram!) LEDtristate LED három állapotának (ki, be, villog) ciklikus váltogatása nyomógomb segítségével RGBledswitch RGB LED színeinek ciklikus váltogatása nyomógomb segítségével (8 állapot: 0 7 színkód) 2

Vezérlési szerkezetek Egy nyelv vezérlésátadó utasításai az egyes műveletek végrehajtási sorrendjét határozzák meg. Ebben az előadásban az alábbi szerkezetek tulajdonságairól lesz szó: Utasítások és blokkok Feltételes elágazás if else utasítás else if utasítás switch utasítás Ciklusszervezés while utasítás for utasítás do while utasítás A break és continue utasítások A goto utasítás és a címkék Forrás: BRIAN W. KERNIGHAN DENNIS M. RITCHIE: A C programozási nyelv, 3. fejezet 3

Utasítások és blokkok Egy olyan kifejezés, mint x = 0, i++ vagy digitalwrite(led,high) utasítássá válik, ha egy pontosvesszőt írunk utána. Például: x = 0; i++; digitalwrite(led,high); A C nyelvben a pontosvessző az utasításlezáró jel (terminátor) A { kapcsos zárójelekkel deklarációk és utasítások csoportját fogjuk össze egyetlen összetett utasításba vagy blokkba. Ilyen a függvények utasításait összefogó zárójelpár, vagy az if, else, while, for, ill. hasonló utasítások utáni utasításokat összefogó zárójelpár. A blokk végét jelző jobb kapcsos zárójel után soha nincs pontosvessző. A változók bármelyik blokk belsejében deklarálhatók. void loop() { Blokk kezdete float h = dht.readhumidity(); float t = dht.readtemperature(); Serial.print("Humidity: "); Serial.print(h,1); Serial.print(" Temperature: "); Serial.print(t,1); Blokk vége Folyamatábra rajzjele Utasítás vagy blokk Részletek egy tavalyi mintaprogramunkból (DHT22 hőmérő és relatív páratartalom mérő) 4

Feltételes elágazás: if else utasítás Feltételvizsgálat, s ezt követően a végrehajtás menete a feltételvizsgálat eredményétől függ. Szintaxis: if(feltétel) utasítás1 else utasítás2 Az else ág opcionális A feltétel itt egy kifejezés, ami aritmetikai és relációs operátorokat is tartalmazhat. A kiértékelés eredménye igaz, ha a kifejezés értéke true, vagy 0-tól különböző, és hamis akkor, ha a kifejezés értéke false, vagy nulla. Ha a feltétel teljesül, akkor utasítás1 kerül végrehajtásra, egyébként pedig utasítás2 lesz végrehajtva. Példa: Feltétel? utasítás2 utasítás1 if(digitalread(push2)) digitalwrite(red_led,low); else digitalwrite(red_led,high); //Amíg a gomb lenyomva, a LED világít Speciális esetben (értékadásnál) használható a rövid alak (melyben a baloldal elhagyható ): (változó = )feltétel?érték1:érték2; A feltétel teljesülése esetén érték1, egyébként érték2 lesz a visszatérési érték. Példa: inline maximum függvény definíciója a rendszerkönyvtárakban: #define max(a,b) ((a)>(b)?(a):(b)) nem igen 5

Relációs és logikai operátorok Logikai kifejezésekben, illetve feltételvizsgálatoknál az alábbi operátorok (műveletek) állnak rendelkezésre: Relációs operátorok == egyenlő pl. x == y!= nem egyenlő pl. x!= y < kisebb mint pl. x < y > nagyobb mint pl. x > y <= kisebb, vagy egyenlő >= nagyobb, vagy egyenlő Logikai operátorok Logikai változókon vagy logikai kifejezéseken végezett műveletekhez használhatók! Tagadás (negáció) pl.!a && ÉS művelet pl. a && b VAGY művelet pl. a b Megjegyzések: 1. A relációs, illetve a logikai műveletek eredménye egy logikai (boolean) mennyiség, ami csak 0 (ha hamis) vagy 1 (ha igaz) értéket vehet fel. 2. A C fordítók kiterjesztett értelmezéssel bármilyen 0-tól különböző számot is elfogadnak igaz értékkent. Így például if(x!= 0) helyett egyszerűen if(x) -et is írhatunk. 3. Ne keverjük össze a logikai operátorokat a bitenként logikai operátorokkal! Bitenkénti műveletek: ~, &,, ^ Logikai műveletek:!, &&, 6

if utasítások egymásba ágyazása Egymásba ágyazott if-else szerkezeteknél, hiányzó else ágak esetén nem világos, hogy a meglévő else ág melyik if utasításhoz tartozik. Például az if (n > 0) if (a > b) z = a; else z = b; programrészletben az else a belső if utasításhoz tartozik. Általános szabály: az else mindig a hozzá legközelebb eső, else ág nélküli if utasításhoz tartozik. Ha nem így szeretnénk, akkor használjunk kapcsos zárójeleket! Például: if (n > 0) { if (a > b) z = a; else z = b; A nem egyértelmű helyzet különösen zavaró az olyan szerkezetekben, mint az alábbi: if (n >= 0) for (i = 0; i < n; i++) if (s[i] > 0) { printf("..."); return i; else /* ez így hibás */ printf("n értéke negatív") ; A tagolás ellenére a fordító itt az else ágat a belső if utasításhoz kapcsolja. Az ilyen, nehezen felderíthető hibák megelőzésére használjunk kapcsos zárójeleket a második if utasítás körül! 7

Az else if szerkezet Az else if szerkezet adja a többszörös elágazások programozásának egyik legáltalánosabb lehetőségét. Szintaxis: A szerkezet úgy működik, hogy a program sorra kiértékeli a kifejezéseket és ha bármelyik ezek közül igaz, akkor végrehajtja a megfelelő utasítást, majd befejezi az egész vizsgáló láncot. Itt is, mint bárhol hasonló esetben, az utasítás helyén kapcsos zárójelek között elhelyezett blokk is állhat. Az utolsó else ág alapértelmezés szerint a fentiek közül egyik sem esetet kezeli. Ha ilyenkor semmit sem kell csinálni, ez az ág elhagyható. 8

A switch utasítás A switch utasítás is a többirányú programelágaztatás egyik eszköze. Az utasítás úgy működik, hogy összehasonlítja egy kifejezés értékét több egész értékű állandó kifejezés értékével, és az ennek megfelelő utasítást hajtja végre. A switch utasítás általános felépítése: switch (kifejezés) { case állandó kifejezés: utasítások case állandó kifejezés: utasítások... default: utasítások Példa: switch (led_state) { case 0: digitalwrite(led,0); case 1: digitalwrite(led,1);... default: digitalwrite(!digitalread(led)); delay(250); 9

Példaprogramok feltételes elágazással 1. ledswitch.ino: Írjunk programot, amelyben egy nyomógomb segítségével kibe kapcsolgatunk egy LED-et! 2. LEDtristate.ino: Írjunk programot, amelyben egy nyomógomb segítségével vezérelünk egy LED-et, melynek a ki- és bekapcsolt állapota mellett egy harmadik, villogó állapota is van! 3. RGBswitch.ino: Váltogassuk egy nyomógombbal egy RGB LED színeit! 10

Emlékeztető: egyszerű I/O vezérlés Digitális I/O pinmode(pin, mode) kivezetés üzemmódjának beállítása digitalwrite(pin, state) - kimenetvezérlés digitalread(pin) bemenet állapotának lekérdezése mode: OUTPUT, INPUT, INPUT_PULLUP state: LOW, HIGH Analóg I/O analogreference(ref) ADC referenciájának megadása analogread(chan) analóg-digitális konverzió eredménye analogwrite(pin) - PWM teljesítményvezérlés ahol: ref: DEFAULT (VCC), INTERNAL (1V1) vagy EXTERNAL (Arduino) Energia esetén INTERNAL helyett INTERNAL1V5 vagy INTERNAL2V5 használható 11

Emlékeztető: Arduino nano v3.0 12

MSP430 Launchpad : Energia Pinout http://github.com/energia/energia/wiki/hardware Arduino/Energia logical pin # s

A kapcsolási elrendezés 1. Feladat: A piros LED kapcsolgatjuk a nyomógomb segítségével: Első (minden páratlan) lenyomásra a piros LED világítson! Második (minden páros) lenyomásra a piros LED kialszik! A kapcsolás lehet ugyanaz, amit az előző foglalkozáson használtunk! Megjegyzés: Az MSP430 Launchpad kártya esetében a gyárilag ráépített LED-et és az SW2 nyomógombot használhatjuk. Arduino kártya esetén az alábbi kapcsolást építsük meg! 14

1. ledswitch.ino const int RED_LED = 5; const int PUSH2 = 3; Hardverfüggő rész, csak az Arduino kártyához kell! //Hardverfüggetlen rész, MSP430 Launchpad kártyán is futtatható boolean led_state = false; //Kezdetben a LED ki van kapcsolva boolean waitforpress = true; //Kezdetben lenyomásra várunk void setup() { pinmode(red_led,output); pinmode(push2,input_pullup); //legyen kimenet //Bemenet belső felhúzással Folytatás a következő oldalon A változók szerepe: led_state: ebben tartjuk nyilván a LED állapotát (true = világít, false = nem világít) waitforpress: a nyomógomb lenyomás felengedés ciklusának nyilvántartására használjuk (true = lenyomásra várunk, false = felengedésre várunk) 15

void loop() { if(waitforpress) { if(!digitalread(push2)) { else { led_state =!led_state; 1. ledswitch.ino digitalwrite(red_led, led_state); waitforpress = false; if(digitalread(push2)) { waitforpress = true; delay(20); //Ha lenyomásra várunk és //Ha lenyomás történt... //LED állapotának átbillentése //Következő stáció: felengedésre várunk //Ha felengedésre vártunk és //Ha felengedést észlelünk... //Következő stáció: lenyomásra várunk //pergésmentesítő késleltetés Nyomógomb esetében lenyomás felengedés ciklusokban kell gondolkodni: Ha lenyomásra vártunk és lenyomva találjuk a gombot, akkor átkapcsoljuk a LED állapotát és átlépünk a felengedés várása állapotba. Ha felengedésre vártunk és felengedve (magas állapotban) találjuk a nyomógombot, akkor vége egy lenyomás-felengedés ciklusnak, újra lenyomásra várunk. 16

2. LEDtristate.ino const int RED_LED = 5; const int PUSH2 = 3; Hardverfüggő rész, csak az Arduino kártyához kell! //Hardverfüggetlen rész, MSP430 Launchpad kártyán is futtatható boolean waitforpress = true; //Kezdetben lenyomásra várunk int led_state = 0; //Kezdetben a LED ki van kapcsolva int timecount = 25; //Villogás félperiódusának ideje Csak itt változtattunk void setup() { pinmode(red_led,output); pinmode(push2,input_pullup); Folytatás a következő oldalon //legyen kimenet //Bemenet belső felhúzással A változók szerepe: waitforpress: a nyomógomb lenyomás felengedés ciklusának nyilvántartására használjuk (true = lenyomásra várunk, false = felengedésre várunk) led_state: ebben tartjuk nyilván a LED állapotát (0 = nem világít, 1 = világít, 2 = villog) timecount: a 20 ms-os időszeletek (vissza)számlálója villogtatáskor 17

void loop() { if(waitforpress) { if(!digitalread(push2)) { else { //Ha lenyomásra várunk és //Ha lenyomás történt... if(++led_state > 2) led_state = 0; //Állapot léptetés (2 után körülfordul) digitalwrite(red_led,led_state > 0);//LED állapot beállítása waitforpress = false; if(digitalread(push2)) { waitforpress = true; delay(20); if(led_state == 2) if(--timecount == 0) { 2. LEDtristate.ino //Következő stáció: felengedésre várunk //Ha felengedésre vártunk és //Ha felengedést észlelünk... //Következő stáció: lenyomásra várunk //pergésmentesítő késleltetés //Ha villogtatás állapotban vagyunk //Ha az eltelt idő 25*20 ms, akkor digitalwrite(red_led,!digitalread(red_led)); //LED állapot átbillentése timecount = 25; //Következő billentés újabb 25*20 ms múlva... Ügyeljünk rá, hogy a villogtatást a nyomógomb állapotát figyelő feltételeken kívül kell végezni! 18

Az RGB LED bemutatása Az RGB LED három, különböző színű LED egy közös tokban. A három szín a három alapszín, amelyből minden más szín kikeverhető (additív színkeveréssel): Red = piros Green = zöld Blue = kék D3 D3 D6 D6 D5 D5 MSP430 Arduino MSP430 Arduino Arduino esetén 470Ω-os ellenállásokat használjunk! 19

Huzalozási vázlat R LED = D3 G LED = D6 B LED = D5 PUSH2 = D4 R LED = P2_2 G LED = P1_6 B LED = P2_4 PUSH2 = P1_3 20

3. RGBledswitch.ino Nyomógombbal 0 és 7 között sorban léptetjük az RGB LED színkódjait, melynek értelmezése: 0. bit = piros, 1. bit = zöld 2. bit = kék alapszín. Hardverfüggő rész ARDUINO kártyához #define LED_RED 3 #define LED_GREEN 6 #define LED_BLUE 5 #define PUSH2 4 MSP430 Launchpad kártyához #define LED_RED P2_2 #define LED_GREEN P1_6 #define LED_BLUE P2_4 #define PUSH2 P1_3 //--- Hardverfüggetlen rész ---- int color = 0; //színkód (0..7) boolean waitforpress = true; void setup() { // Inicialzáljuk a ki- és bemeneteket pinmode(led_red, OUTPUT); pinmode(led_blue, OUTPUT); pinmode(led_green, OUTPUT); pinmode(push2,input_pullup); 21 Folytatás a következő oldalon

A nyomógomb lenyomás felengedés ciklusainak lekezelése itt is ugyanúgy történik, mint az 1. példaprogramban. Az RGB LED színváltásainak megvalósítása a bekeretezett sorokban történik csak ez az új elem ebben a programrészben. void loop() { if(waitforpress) { //Ha lenyomásra várunk és if(!digitalread(push2)) { //Ha lenyomás történt... color = ++color & 0x07; //Szín léptetése digitalwrite(led_red, color & 1); // piros LED ki digitalwrite(led_green,color & 2); // zöld LED ki digitalwrite(led_blue, color & 4); // kék LED ki waitforpress = false; //Következő stáció: felengedésre várunk else { //Ha felengedésre vártunk és if(digitalread(push2)) { //Ha felengedést észlelünk... waitforpress = true; //Következő stáció: lenyomásra várunk delay(20); //pergésmentesítő késleltetés 22