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

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

MSP430 programozás Energia környezetben

Bevezetés az elektronikába

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

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

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

MSP430 programozás Energia környezetben. Alfanumerikus LCD kijelzok

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

Bevezetés a mikrovezérlők programozásába: LCD kijelzők

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

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

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

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

A Hobbielektronika csoport. bemutatója

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

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

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

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

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

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.

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

Bevezetés az elektronikába

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

MSP430 programozás Energia környezetben. Nokia 5110 grafikus kijelzo vezérlése

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

Labor 2 Mikrovezérlők

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

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

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

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

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

Webprogramozás szakkör

Labor gyakorlat Mikrovezérlők

Vezérlési szerkezetek

A C# programozási nyelv alapjai

MSP430 programozás Energia környezetben. LED mátrix vezérlése MAX7219 IC-vel

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

Bevezetés az elektronikába

Arduino bevezető Szenzorhálózatok és alkalmazásaik

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

Labor gyakorlat Mikrovezérlők

Óbudai Egyetem. C programozási nyelv

6. fejezet: Ciklusok

Labor gyakorlat Mikrovezérlők

Informatika terméktervezőknek

Java programozási nyelv

Objektumorientált Programozás III.

Bevezetés az elektronikába

A programozás alapjai

Nézzük tovább a lexikai egységeket!

C programozás. 1 óra Bevezetés

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

2.3. Soros adatkommunikációs rendszerek CAN (Harmadik rész alapfogalmak II.)

ALPHA és ALPHA XL műszaki leírás

The modular mitmót system. DPY kijelző kártya C API

Vezérlési szerkezetek. Szelekció Ciklusok

I. C8051Fxxx mikrovezérlők hardverfelépítése, működése. II. C8051Fxxx mikrovezérlők programozása. III. Digitális perifériák

Fizikai mérések Arduino-val

Multi-20 modul. Felhasználói dokumentáció 1.1. Készítette: Parrag László. Jóváhagyta: Rubin Informatikai Zrt.

Hobbi Elektronika. 1. Témakörök, célkitűzés, hozzávalók

Ismerkedés az MSP430 mikrovezérlőkkel

I. ALAPALGORITMUSOK. I. Pszeudokódban beolvas n prim igaz minden i 2,gyök(n) végezd el ha n % i = 0 akkor prim hamis

Készítette: Ruzsinszki Gábor webmaster442

A/D és D/A konverterek vezérlése számítógéppel

Mikrokontrollerek és alkalmazásaik Beadandó feladat

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

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

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

A kódgenerálás helye a fordítási folyamatban. Kódgenerálás I. (kifejezések és vezérlési szerkezetek) A kódgenerálás feladata. Ebben az előadásban...

Szoftvertervezés és -fejlesztés I.

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

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!

T Bird 2. AVR fejlesztőpanel. Használati utasítás. Gyártja: BioDigit Kft. Forgalmazza: HEStore.hu webáruház. BioDigit Kft, Minden jog fenntartva

Újrakonfigurálható eszközök

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

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. Digitális szenzorok I2C kommunikációval

ATMEL ATMEGA MIKROVEZÉRLŐ-CSALÁD

Jelfeldolgozás a közlekedésben. 2017/2018 II. félév. Analóg-digitális átalakítás ADC, DAC

Bevezetés a mikrovezérlők programozásába: MAX6958: Hétszegmenses LED kijelző vezérlő

Imperatív programozás

T Bird 2. AVR fejlesztőpanel. Használati utasítás. Gyártja: BioDigit Kft. Forgalmazza: HEStore.hu webáruház. BioDigit Kft, Minden jog fenntartva

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

Haladó DBMS ismeretek 1

Java II. I A Java programozási nyelv alapelemei

Iványi László ARM programozás. Szabó Béla 6. Óra ADC és DAC elmélete és használata

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

Programozási nyelvek JAVA EA+GY 1. gyakolat

MaxiCont. MOM690 Mikroohm mérő

Az AVR programozás alapjai. Előadja: Both Tamás

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

Többfunkciós hobbirobot építése és vezérlése Arduino UNO mikrovezérlő kártya segítségével

Programozás alapjai 3.Gy: C elágazások, ciklusok P R O

C programozás. { Márton Gyöngyvér, 2009 } { Sapientia, Erdélyi Magyar Tudományegyetem }

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

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

Vegyes témakörök. 1. Soros vezérlésű LCD számkijelző. Hobbielektronika csoport 2018/2019. Debreceni Megtestesülés Plébánia

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

1. Metrológiai alapfogalmak. 2. Egységrendszerek. 2.0 verzió

Átírás:

Bevezetés a mikrovezérlők programozásába: Programciklusok szervezése, analóg I/O 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 13 projektek AnalogThermometer Hőmérséklet mérése MCP9700 analóg hőmérő szenzorral AnalogThermometer2 Hőmérséklet mérése MCP9700 analóg hőmérő szenzorral, átlagolással AnalogThermometer3 Hőmérséklet mérése MCP9700 analóg hőmérő szenzorral, átlagolással, grafikus kijelzéssel Photoresistor Fény érzékelése fényérzékeny ellenállás segítségével RGB_led RGB LED színeinek véletlenszerű váltogatása, folytonos színátmenettel (PWM mintapélda) 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 A talk12 előadásban tárgyalt vezérlési szerkezetek Forrás: BRIAN W. KERNIGHAN DENNIS M. RITCHIE: A C programozási nyelv, 3. fejezet 3

Ciklusszervezés while utasítással while (feltétel) utasítás vagy blokk (elöltesztelő ciklus ) A feltétel itt egy kifejezést jelent, melynek bármely nullától különböző értéke igaz jelentéssel bír. Ha a feltétel igaz, a while utasításhoz kapcsolódó utasítás (vagy blokk) végrehajtásra kerül, majd a végrehajtás visszakerül a feltétel kiértékeléséhez. A programciklus addig ismétlődik, amíg a feltétel hamissá (nulla értékűvé) nem válik. Példák: 1. while (true) { //LED villogtatás végtelen ciklusban digitalwrite(led,!digitalread(led)); delay(500); 2. while (false)digitalwrite(led, HIGH); //Sohasem hajtódik végre! 3. int i = 0; while (i < 5) { //ötszöri LED villantás digitalwrite(led,high); delay(50); digitalwrite(led,low); delay(500); i++; //Ciklusváltozó léptetése (FONTOS!) 4

Nyomógomb kezelése mégegyszer const int RED_LED = 5; const int PUSH2 = 3; Hardverfüggő rész, csak az Arduino kártyához kell! void setup() { pinmode(red_led,output); pinmode(push2,input_pullup); //legyen kimenet //Bemenet belső felhúzással void loop() { # while(digitalread(push2); //Lenyomásra várunk... digitalwrite(red_led,!digitaread(red_led)); //LED átbillentés delay(20); //pergésmentesítő késleltetés # while(!digitalread(push2); //Felengedésre várunk... delay(20); //pergésmentesítő késleltetés Ez a múlt órai ledswitch.ino program egyszerűsített megvalósítása, while utasítás segítségével. Előnye: egyszerű, áttekinthető struktúra Hátránya: blokkoló várakozások, amelyek megakasztják a programot (#-vel jelölt sorok) 5

Ciklusszervezés for utasítással for (1. kifejezés; 2. kifejezés; 3. kifejezés) utasítás ami egyenértékű az alábbival: 1. kifejezés; while(2. kifejezés) { 3. kifejezés; ( a for ciklus is elöltesztelő ciklus ) utasítás Az előző oldal 3. példáját például így írhatjuk át: for(i = 0; i < 5; i++) { kezdőérték feltétel ciklusváltozó léptetés digitalwrite(led,high); delay(50); digitalwrite(led,low); delay(500); FOR ciklus int i = 0; while (i < 5) { digitalwrite(led,high); delay(50); digitalwrite(led,low); delay(500); i++; WHILE ciklus kezdőérték feltétel ciklusváltozó léptetés 6

Ciklusszervezés do - while utasítással A while és for utasításokkal szemben a do while utasítás ún. hátultesztelő ciklust szervez, azaz a ciklusmag legalább egyszer végrehajtásra kerül. Általános formája: do utasítás while (kifejezés); A mikrovezérlő először végrehajtja az utasítást és csak utána értékeli ki a kifejezést. Ha a kifejezés értéke igaz, az utasítás újból végrehajtódik. Ez ismétlődik mindaddig, amíg a kifejezés értéke hamis nem lesz, ekkor a ciklus lezárul és a végrehajtás az utána következő utasítással folytatódik. Példa: /* uitoa: az n előjel nélküli számot s karaktersorozattá alakítja */ void uitoa(int n, char s[]) { int i; i = 0; do { /* fordított sorrendben generálja a számjegyeket */ s[i++] = n % 10 + '0'; /* a következő számjegy */ while((n /= 10) > 0); /* törli azt */ s[i] = '\0'; reverse(s); 7

A break és continue utasítások A break utasítás lehetővé teszi a for, while vagy do utasításokkal szervezett ciklusok idő előtti elhagyását, valamint a switch utasításból való kilépést. A break hatására a legbelső ciklus vagy a teljes switch utasítás fejeződik be. Példa: for (x = 0; x < 255; x ++) { analogwrite(pwmpin, x); sens = analogread(sensorpin); if (sens > threshold)break; delay(50); Kilépünk a ciklusból, ha elértük a küszöböt A continue utasítás lehetővé teszi a ciklusmag hátralevő részének átugrását (a programvégrehajtás a ciklusváltozó léptetéséhez ugrik). for (x = 0; x < 255; x ++) { if (x > 40 && x < 120) continue; //így pl. kihagyunk egy sávot analogwrite(pwmpin, x); delay(50); 8

A goto utasítás és a címkék A goto utasítás segítségével megadott címkékre ugorhatunk. Nagyon ritkán használjuk, Például többszörös ciklusból történő kiugráshoz (ahol a break utasítás nem használható, mert csak a legbelső ciklusból ugrana ki ) for(...) for(...) {... if (zavar)... hiba: goto hiba; a hiba kezelése //ugrás //címke 9

Analóg jelfeldolgozás Analóg világban élünk, de digitális mikrovezérlővel dolgozunk Analóg vezérlés/beavatkozás Analóg adatgyűjtés 10

Az analóg adatgyűjtő ág elemei 11

Analóg digitális átalakító (ADC) Egy 3-bites átalakító ideális átviteli függvénye A konverzió digitális értéke (N ADC ): Végkitérés: N ADC = 1023, ha a bemenő jel V R+ -0.5*LSB Nulla: N ADC = 0, ha a bemenő jel V R- + 0.5 LSB Közbeeső értékekre: N ADC = 1023 * (V IN - V R- )/(V R+ - V R- ) V R- esetünkben = 0 V (VSS, a közös pont) V R+ az, amit az analogreference() függvényhívással beállítunk (VCC, belső-, vagy külső referencia) Többnyire a konverzió N ADC eredményéből a V IN bemenő feszültséget kell meghatároznunk. A fenti képletből V IN -t kifejezve, ezt kapjuk: V IN = (V R+ - V R- ) * N ADC /1023 + V R- 12

Hőmérés analóg hőmérővel Microchip MCP9700 VDD = 2,5 5,5 V Mérési tart.: -40 150 :C Érzékenység: 10 mv / :C Nullapont: 500 mv @ 0 :C 13

AnalogThermometer.ino void setup() { Serial.begin(9600); analogreference(internal); Vref void loop() { delay(1000); int reading = analogread(a4); //Soros kapcsolat 9600 bit/s //1,1 V-os belső referencia //egy kis várakozás //a hőmérő leolvasása ADC felbontása //--- millivolt ------- float voltage = ((long)reading * 1100) / 1023; Serial.print (voltage,0); //Kiírás mv-okban Serial.print (" mv, "); //--- Celsius --------- float tempc = (voltage - 500)/10; //Átszámítás C fokokra Serial.print (tempc,1); Serial.print (" C, "); //--- Fahrenheit ------ float tempf = (tempc * 9/5) + 32; //Átszámítás F fokokra Serial.print (tempf,1); Serial.println (" F"); delay (1000); Megjegyzés: Arduino-nál 1.1V, az MSP430 Launchpad esetében pedig 1.5V a belső referencia, ezért az utóbbinál INTERNAL helyett INTERNAL1V5-öt, 1100 helyett pedig 1500-at kell írnunk! 14

AnalogThermometer2.ino A zavaró ingadozások kiszűrésére sok mérést végzünk, és a kapott adatokat átlagoljuk. Az összegző változó long (vagy uint32_t) típusú legyen, nehogy túlcsorduljon! long mysum; //ebben összegezzük az eredményt void setup() { Serial.begin(9600); //Soros kapcsolat 9600 bit/s analogreference(internal); //1,1 V-os belső referencia void loop() { //--- Mérés átlagolással --- mysum = 0; for(int i=0; i<1100; i++) { mysum += analogread(a4); //Rendre hozzáadjuk az új kiolvasást //--- Átszámítás mv-okra ---- float voltage = mysum>>10; //Osztás 1024-gyel //A program többi része változatlan... ============================================ 15

Megjelenítés a PC-n Ebben a változatban csak a kiíratás formátumát változtatjuk meg, hogy az egy hasonló projekthez készült TRHlogger alkalmazással kompatibilis legyen. A hőmérés eredményét a PC-n futó alkalmazás grafikusan megjeleníti és kívánságra naplózza is. A Lab13.zip csomagban mellékelt TRHlogger alkalmazás csak akkor működik, ha az Arduino a legkisebb sorszámú soros port a rendszerben a program indításakor (a program automatikusan az elsőhöz próbál csatlakozni). 16

Fényérzékeny ellenállás A kapcsolás feszültségosztóként működik, amelyikben a felső tag egy CdS fényérzékeny ellenállás, melynek ellenállása a megvilágítástól függően széles határok között változik. A megvilágítás hatására az ellenállása csökken Az ellenállásosztó közös pontját az A3 analóg bemenetre kössük! Az eredményt soros porton kiküldjük a számítógépre, s a terminálablakban jelenik meg. 17

Photoresistor.ino Hardverfüggő paraméter: Arduino esetén 5000, MSP430 esetén 3500 long mysum; const int VCC = 5000; void setup() { Serial.begin(9600); analogreference(default); //ebben összegezzük majd az eredményt //A tápfeszültség mv-ban //Soros kapcsolat 9600 bit/s //VCC a referencia void loop() { //--- Mérés átlagolással --- mysum = 0; for(int i=0; i<vcc; i++) { mysum += analogread (A3); //Rendre hozzáadjuk az új kiolvasást //--- Átszámítás mv-okra ---- float voltage = mysum>>10; //Osztás 1024-gyel Serial.print (voltage,0); //Feszültség kiírása Serial.print (" mv "); // Átszámítás kohm-ra Rx = VCC*10k/voltage - 10k float rx = 10*VCC/voltage - 10; Serial.print(rx,3); Serial.println(" kohm"); delay (2000); 18

PWM: impulzus-szélesség moduláció PWM = pulse width modulation (impulzusszélesség moduláció) A frekvencia állandó, a kitöltés változtatható 0-255 között. Az analogwrite() függvény csak bizonyos lábakra vonatkozóan használható Arduino Időzítő Csatorna Digitális kimenet Timer0 OC0A, OC0B 6,5 Timer1 OC1A, OC1B 9,10 Timer2 OC2A, OC2B 11,3 MSP430 Launchpad Időzítő Timer0 Csatorna TA0.1 Választható kivezetés P1_2, P1_6 vagy P2_6 Timer1 TA1.1 P2_1 vagy P2_2 Timer1 TA1.2 P2_4 vagy P2_5 19

Emlékeztető: Arduino nano v3.0 20

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

Huzalozási vázlat R LED = D3 G LED = D6 B LED = D5 R LED = P2_2 G LED = P1_6 B LED = P2_4 22

RGB_led.ino program #define LED_RED 3 //Launchpad: P2_2 #define LED_BLUE 5 //Launchpad: P2_4 #define LED_GREEN 6 //Launchpad: P1_6 float RGB1[3]; float RGB2[3]; float INC[3]; float SUM; int red, green, blue; void setup() { //--- Kiindulási színek generálása, véletlenszerűen randomseed(analogread(0)); for (int x=0; x<3; x++) { RGB1[x] = random(256); RGB2[x] = random(256); 23

RGB_led.ino program void loop() { //--- Az 1. színből a 2. színbe történő átmenet lépéseinek meghatározása for (int x=0; x<3; x++) { INC[x] = (RGB1[x] - RGB2[x]) / 256; //--- Közelítés 256 lépésben for (int s=0; s<256; s++) { red = int(rgb1[0]); green = int(rgb1[1]); blue = int(rgb1[2]); //--- A közelítő szín kijelzése analogwrite (LED_RED, red); analogwrite (LED_GREEN, green); analogwrite (LED_BLUE, blue); delay(20); for (int x=0; x<3; x++) { RGB1[x] -= INC[x]; //folyt. köv. //Közelítünk a másik színhez 24

RGB_led.ino program //--- Új színt konstruálunk, véletlen számok generálásával do { //Ciklikus ismétlés, míg SUM >= 300 nem teljesül SUM = 0; for (int x=0; x<3; x++) { RGB2[x] = random(956)-700; RGB2[x] = constrain(rgb2[x], 0, 255); SUM += RGB2[x]; while(sum < 300); //Nem engedjük túlságosan elsötétedni 25

Alkalmazás a gyakorlatban: Hangulatlámpa folytonos színátmenettel Projektleírás és a képek forrása: http://users.atw.hu/wattmep/rgb_led_627a/rgb_led_627a.html 26