You are on page 1of 140

TEHNIČKO VELEUČILIŠTE U ZAGREBU

Ljubivoj Cvitaš

Brzi razvoj prototipova na bazi


mikroupravljača

Skripte, srpanj 2015.


Napomena autora

Mikroupravljači su jedna od važnijih karika elektrotehnike, te svojim širokim


spektrom mogućnosti predstavljaju neizostavni dio modernih tehnoloških rješenja.
Inženjeri elektrotehnike, računarstva, mehatronike i srodnih tehničkih grana imaju
potrebu za edukacijom i usvajanjem znanja iz područja mikroupravljača jer tržište
telekomunikacija, računarstva i automatizacije uvelike zahtjeva široko znanje i
usmjerenost na sva područja tehnologije.

Skripte su izražene na bazi nastavnog materijala koji se koristi na kolegiju


„Mikroupravljači“ na specijalističkom studiju elektrotehnike Tehničkog veleučilišta u
Zagrebu. Skripte sadrže i podloge za izvođenje laboratorijskih vježbi tog kolegija, a
mogu poslužiti i kao inženjerski priručnik prilikom brze izrade prototipova baziranih
na upotrebi mikroupravljača i elektroničkih sučelja.

Kolegij se neprekidno dorađuje dodatnim sadržajima i vježbama, a zbog


nedostatka adekvatnog materijala na hrvatskom jeziku, pokrenuta je inicijativa za
pripremom i prilagodbom literature studentima i ostalim korisnicima.

MBED mikroupravljači, u odnosu na konkurentne mikroupravljače, imaju mnoštvo


prednosti kojima se olakšava korištenje i upravljanje. Glavna prednost MBED
mikroupravljačke arhitekture, u odnosu na konkurentne mikroupravljače, je
mogućnost brzog razvoja i testiranja aplikacija uporabom korisničke podrške na web
stranici koja je iznimno praktična i pruža veliku podršku korisniku. Programsko
sučelje ne zahtjeva provođenje nikakve instalacije, te omogućuje rad na
najkorištenijim kompjutorskim platformama.

Skripte prate teoretski i praktično strukturu i funkcioniranje MBED


mikroupravljača od najjednostavnijih do složenijih primjera.

Zagreb, 9.srpnja 2014

Ljubivoj Cvitaš
Sadržaj

POPIS VJEŽBI ......................................................................................................................................... 1

POPIS TABLICA ...................................................................................................................................... 2

POPIS SLIKA ........................................................................................................................................... 4

1. UVOD ............................................................................................................................................ 8

2. UVOD U MIKROUPRAVLJAČE......................................................................................................... 9

2.1. SVIJET MIKROUPRAVLJAČA ................................................................................................................ 9


2.2. IZBOR MIKROUPRAVLJAČA .............................................................................................................. 12
2.2.1. Uvod u izbor mikroupravljača ........................................................................................ 12
2.2.2. Proces izbora mikroupravljača ....................................................................................... 13
2.2.3. Kriteriji izbora mikroupravljača ...................................................................................... 15
2.2.4. Zadani zahtjevi sustava .................................................................................................. 16
2.2.5. Konačan izbor mikroupravljača ...................................................................................... 16
2.3. MBED MIKROUPRAVLJAČI.............................................................................................................. 17
2.3.1. Specifičnost MBED mikroupravljača............................................................................... 18
2.3.2. Funkcioniranje MBED mikroupravljača .......................................................................... 21
2.3.3. Hardverske mogućnosti modula MBED LPC1768 ........................................................... 26

3. DIGITALNI ULAZI I IZLAZI ............................................................................................................. 29

3.1. DIGITALNI IZLAZI MBED-A ............................................................................................................. 29


3.2. DIGITALNI ULAZI MBED-A ............................................................................................................. 36

4. ANALOGNI ULAZI I IZLAZI ............................................................................................................ 41

4.1. POJMOVI ANALOGNO-DIGITALNE PRETVORBE ..................................................................................... 41


4.2. ANALOGNI ULAZI MBED-A............................................................................................................. 44
4.3. DIGITALNO-ANALOGNA PRETVORBA ................................................................................................. 48
4.4. ANALOGNI IZLAZ MBED-A ............................................................................................................. 49

5. PULSNO-ŠIRINSKA MODULACIJA ................................................................................................. 54

5.1. POJAM ŠIRINSKO-PULSNE MODULACIJE ............................................................................................. 54


5.2. PULSNO-ŠIRINSKA MODULACIJA NA MBED-U .................................................................................... 55

6. TAJMERI I PREKIDI ....................................................................................................................... 63

6.1. UPRAVLJANJE VREMENOM I DOGAĐAJIMA U UGRAĐENIM SUSTAVIMA ..................................................... 63


6.2. UPORABA MBED 'TICKER' OBJEKTA ................................................................................................. 67
6.3. HARDVERSKI PREKIDI ..................................................................................................................... 68
7. DIZAJN MODULA I TEHNIKE PROGRAMIRANJA ........................................................................... 72

7.1. RAZVOJ NAPREDNIH UGRAĐENIH SUSTAVA ......................................................................................... 72


7.2. RAD SA 7-SEGMENTNIM ZASLONIMA ................................................................................................ 73
7.3. C FUNKCIJE .................................................................................................................................. 78
7.4. MODULARNO PROGRAMIRANJE ....................................................................................................... 83
7.5. KREIRANJE BIBLIOTEKA ................................................................................................................... 90
7.6. KAKO OBJAVITI SVOJU BIBLIOTEKU .................................................................................................... 95

8. PARALELNI PODACI I KOMUNIKACIJA .......................................................................................... 98

8.1. UPOTREBA PARALELNIH DIGITALNIH IZLAZA SA BUSOUT OBJEKTOM ........................................................ 98


8.2. RAD S PARALELNIM LCD ZASLONOM............................................................................................... 102

9. SERIJSKA KOMUNIKACIJA SA I²C ................................................................................................ 109

9.1. UPOZNAVANJE SA I²C-OM ............................................................................................................ 109


9.2. FUNKCIONIRANJE MSP430G_I2C_SLAVE MODULA ....................................................................... 112
9.3. POVEZIVANJE VIŠE UREĐAJA NA I²C SABIRNICU ................................................................................. 117

10. SERIJSKA KOMUNIKACIJA SA SPI-OM .................................................................................... 119

10.1. UPOZNAVANJE SA SPI-OM ........................................................................................................... 119

11. MEMORIJA I UPRAVLJANJE PODACIMA ................................................................................ 123

11.1. TIPOVI ELEKTRONIČKE MEMORIJE ................................................................................................... 123


11.2. UPOTREBA PODATKOVNIH DATOTEKA NA MBED-U ........................................................................... 125

12. UPOTREBA MBED MIKROUPRAVLJAČA U PRAKSI ................................................................. 132

13. LITERATURA.......................................................................................................................... 136


Popis vježbi

Vježba 3-1: Spajanje LED dioda na digitalne izlaze. ................................................................................... 31


Vježba 3-2: Spajanje niza od 4 prekidača na MBED ................................................................................... 37
Vježba 3-3: LED projekt sa 4 prekidača korištenjem API komponente BusInOut ........................................ 39
Vježba 3-4: Pulsni valni izlaz ..................................................................................................................... 40
Vježba 3-5: Brojač do deset....................................................................................................................... 40
Vježba 4-1: Učitavanje i zapisivanje podataka s analognih ulaza ............................................................... 44
Vježba 4-2: LED VU metar ......................................................................................................................... 47
Vježba 4-3: Stepeničasti analogni izlazni napon ........................................................................................ 50
Vježba 4-4: Pilasti izlazni analogni napon .................................................................................................. 52
Vježba 4-5: Glatki pilasti izlazni analogni napon........................................................................................ 52
Vježba 4-6: Trokutasti izlazni analogni napon ........................................................................................... 53
Vježba 5-1:Dvostruki PWM izlaz ............................................................................................................... 57
Vježba 5-2: Upravljanje LED osvjetljenjem pomoću PWM-a ...................................................................... 58
Vježba 5-3: Upravljanje servo motorom.................................................................................................... 60
Vježba 5-4: Upravljanje servo pozicije potenciometrom ........................................................................... 60
Vježba 5-5: Proizvodnja piezo zvučnog signala ......................................................................................... 60
Vježba 5-6: Hrvatska himna ...................................................................................................................... 61
Vježba 5-7: Sviranje piezo zvučnikom ....................................................................................................... 62
Vježba 6-1: Jednostavna rutina tajmera .................................................................................................... 64
Vježba 6-2: Korištenje dva tajmera ........................................................................................................... 65
Vježba 6-3: Kvadratni izlazni signal uz primjenu 'Ticker'-a......................................................................... 67
Vježba 6-4: Ispitivanje hardverskog prekida.............................................................................................. 69
Vježba 6-5: Titranje kontakta .................................................................................................................... 70
Vježba 6-6: Kontrola signala tipkala osciloskopom.................................................................................... 71
Vježba 6-7: Paralelni rad tajmera i hardveskog prekida ............................................................................ 71
Vježba 7-1 Ispitivanje 7-segmentnog zaslona ............................................................................................ 76
Vježba 7-2: Ponovljeno ispitivanje kao na V7-1 ......................................................................................... 77
Vježba 7-3: Dizajniranje C funkcije ............................................................................................................ 78
Vježba 7-4: Izvršavanje C funkcije ............................................................................................................. 79
Vježba 7-5: Ponovna upotreba funkcija i promjena cpp koda ................................................................... 79
Vježba 7-6: Modularni MBED projekt ........................................................................................................ 81
Vježba 7-7: Projekt sa više izvornih datoteka ............................................................................................ 86
Vježba 7-8: Modularni projekt „Servo“ ..................................................................................................... 89
Vježba 8-1: „Knightrider“ LED efekt ........................................................................................................ 100
Vježba 8-2: „Knightrider“ LED efekt sa BusOut objektom........................................................................ 101

1
Vježba 8-3: Prikaz teksta na LCD zaslonu korištenjem objekta iz biblioteke ............................................ 105
Vježba 8-4: Prikaz varijabli na LCD-u ....................................................................................................... 106
Vježba 8-5: Prikaz analognih ulaznih podataka na LCD-u ........................................................................ 107
Vježba 8-6: Izrada voltmetra ................................................................................................................... 107
Vježba 9-1: Upotreba MSPG_I2C_SLAVE modula .................................................................................... 116
Vježba 9-2: Mjerenje napona na ulazu MSPG_I2C_SLAVE ....................................................................... 116
Vježba 9-3: Dva modula MSPG_I2C_SLAVE na istoj sabirnici ................................................................... 117
Vježba 9-4: Prikaz broja na LED displeju SLAVE modula .......................................................................... 118
Vježba 11-1: Stvaranje datoteke i upis .................................................................................................... 129
Vježba 11-2: Prikaz sadržaja datoteke na terminalu ................................................................................ 129
Vježba 11-3: Korištenje fprintf naredbe .................................................................................................. 130
Vježba 11-4: Unos teksta u terminal ....................................................................................................... 131
Vježba 11-5: Bilježenje analognih podataka ............................................................................................ 131

Popis tablica

Tablica 1: Opis priključnih signala MBED-a LPC1768 ................................................................................. 28


Tablica 2: Digitalne terminologije ............................................................................................................. 29
Tablica 3: Funkcija digitalnog izlaza........................................................................................................... 30
Tablica 4: Funkcija digitalnog ulaza ........................................................................................................... 36
Tablica 5: Funkcija analognog ulaza .......................................................................................................... 44
Tablica 6: Prikaz položaja potenciometra pomoću integriranih LED dioda ................................................ 47
Tablica 7: Funkcija analognog izlaza .......................................................................................................... 49
Tablica 8: Funkcija pulsno-širinske modulacije .......................................................................................... 56
Tablica 9 MBED Timer objekt .................................................................................................................... 64
Tablica 10: Funkcija MBED Ticker .............................................................................................................. 67
Tablica 11: Funkcija 'InterruptIn' ............................................................................................................... 69
Tablica 12: Kodiranje izlaznog bajta za pogon 7-segmentnog zaslona ....................................................... 73
Tablica 13: Funkcija digitalne izlazne sabirnice ......................................................................................... 98
Tablica 14: Priključci LCD zaslona ............................................................................................................ 102
Tablica 15: Spajanje LCD zaslona sa MBED-om ........................................................................................ 103
Tablica 16:Funkcija I²C ............................................................................................................................ 111
Tablica 17: Komunikacijski protokol MSPG_I2C_SLAVE .......................................................................... 114
Tablica 18 Povezivanje MBED-a sa MSP430G .......................................................................................... 115
Tablica 19: Funkcija SPI ........................................................................................................................... 122
2
Tablica 20: Biblioteka 'stdio.h' ................................................................................................................ 126
Tablica 21: Spajanje priključaka kojim je ostvaren primjer...................................................................... 132

3
Popis slika

Slika 1: Mikroupravljači .............................................................................................................................. 9


Slika 2: Mikroprocesor .............................................................................................................................. 10
Slika 3: Mikroupravljač ............................................................................................................................. 10
Slika 4: Tvrtka ARM Holdings .................................................................................................................... 11
Slika 5: Izbor mikroupravljača ................................................................................................................... 12
Slika 6: Stručna literatura.......................................................................................................................... 13
Slika 7: Konačan odabir mikroupravljača .................................................................................................. 14
Slika 8: MBED LPC1768 ............................................................................................................................. 17
Slika 9: Tehnologija 'Rapid Prototyping' .................................................................................................... 18
Slika 10: USB programsko sučelje.............................................................................................................. 18
Slika 11: Online prevoditelj ....................................................................................................................... 19
Slika 12: Apstraktna biblioteka ................................................................................................................. 20
Slika 13: Proces rada MBED-a ................................................................................................................... 21
Slika 14: Povezivanje MBED mikroupravljača sa računalom ...................................................................... 21
Slika 15: MBED modul prikazan kao USB disk ........................................................................................... 22
Slika 16: Web stranica www.mbed.org ..................................................................................................... 22
Slika 17: Pokretanje prevoditelja na MBED korisničkoj stranici ................................................................. 23
Slika 18: Otvaranje projekta u radnom prostoru ....................................................................................... 24
Slika 19: Online prevođenje programa ...................................................................................................... 24
Slika 20: Pohrana '.bin' datoteke na MBED USB disk ................................................................................. 25
Slika 21: Programiranje MBED-a pritiskom na plavu tipku ........................................................................ 25
Slika 22 Regulatori napona na MBED-u ..................................................................................................... 27
Slika 23 Priključci MBED-a LPC1768........................................................................................................... 27
Slika 24: Digitalni izlazi MBED-a ................................................................................................................ 30
Slika 25: Definiranje digitalnog izlaza ........................................................................................................ 30
Slika 26: Spajanje LED diode ..................................................................................................................... 31
Slika 27: Uporaba LED dioda na MBED priključcima .................................................................................. 32
Slika 28: Primjer cpp koda za LED projekt ................................................................................................. 32
Slika 29 Priključak osciloskopa na model .................................................................................................. 33
Slika 30 Y-t oscilogram izlaza na p5 i p6 .................................................................................................... 34
Slika 31 Pojačala digitalnih izlaza .............................................................................................................. 35
Slika 32: Definiranje digitalnog ulaza ........................................................................................................ 36
Slika 33 Sklopka kao digitalni ulaz ............................................................................................................. 37
Slika 34: Spajanje prekidača na MBED ...................................................................................................... 37
Slika 35: Uvođenje ulaznog digitalnog prekidača na MBED ....................................................................... 38
Slika 36 Programski kod za vježbu 3-3 ....................................................................................................... 39
4
Slika 37: Analogno-digitalna pretvorba ..................................................................................................... 42
Slika 38: Stepeničasti valni oblik ............................................................................................................... 42
Slika 39: Digitalno uzorkovanje analognog signala .................................................................................... 43
Slika 40: Analogni ulazi MBED-a ................................................................................................................ 44
Slika 41: Spajanje potenciometra na MBED .............................................................................................. 45
Slika 42: Primjer cpp koda za uporabu potenciometra .............................................................................. 45
Slika 43 Tera Term izbor komunikacijskog kanala ..................................................................................... 46
Slika 44 Tera term – postavke ................................................................................................................... 46
Slika 45 Tera Term - Prikaz vrijednost AIN20 ............................................................................................. 47
Slika 46: Digitalno-analogna pretvorba ..................................................................................................... 48
Slika 47: Analogni izlaz na MBED-u ........................................................................................................... 49
Slika 48: Primjer cpp koda sa upotrebom analognog izlaza ....................................................................... 50
Slika 49 Y-t oscilogram analognog izlaza ................................................................................................... 51
Slika 50: Primjer cpp koda sa signalom pilastog valnog oblika .................................................................. 52
Slika 51 Pilasti valni oblik .......................................................................................................................... 52
Slika 52 Trokutasti valni oblik ................................................................................................................... 53
Slika 53: Aktivni ciklus............................................................................................................................... 54
Slika 54: Niskopropusni filter .................................................................................................................... 55
Slika 55 Induktivno- radni teret ................................................................................................................ 55
Slika 56: Pulsno-širinska modulacija na MBED-u ....................................................................................... 56
Slika 57: Primjer cpp koda za PWM signal ................................................................................................. 57
Slika 58: Vrijednosti aktivnog ciklusa od 20% i 80% .................................................................................. 57
Slika 59: Upravljanje LED osvjetljenjem pomoću PWM-a .......................................................................... 58
Slika 60: Upravljanje pozicijom servo motora pomoću PWM-a ................................................................. 59
Slika 61: Vanjsko napajanje servo motora ................................................................................................ 59
Slika 62: Spajanje servo motora na MBED ................................................................................................. 60
Slika 63: Note hrvatske himne .................................................................................................................. 61
Slika 64 Piezo zvučnik na PWM izlazu ....................................................................................................... 62
Slika 65: Primjer cpp koda za upotrebu piezo zvučnika ............................................................................. 62
Slika 66: Jednostavna rutina tajmera ........................................................................................................ 64
Slika 67: Primjer cpp koda koji koristi tajmer ............................................................................................ 65
Slika 68: Primjer cpp koda koji koristi 2 tajmera ....................................................................................... 66
Slika 69: Primjer cpp koda koji koristi dva 'Ticker'-a .................................................................................. 68
Slika 70: Primjer cpp koda za vježbu 6-4 ................................................................................................... 69
Slika 71: Utjecaj titranja na upravljanje prekidima.................................................................................... 70
Slika 72: Primjer cpp koda za vježbu 6-5 ................................................................................................... 70
Slika 73: Pozivanje funkcije iz glavnog programa ...................................................................................... 72
Slika 74: 7-segmentni zaslon ..................................................................................................................... 73

5
Slika 75: Spajanje 7-segmentnog zaslona sa MBED-om ............................................................................. 74
Slika 76: Primjer cpp koda za 7-segmentni zaslon ..................................................................................... 74
Slika 77: Programski cpp kod za vježbu 7-1 ............................................................................................... 76
Slika 78: Programski cpp kod za vježbu 7-2 ............................................................................................... 77
Slika 79: Sintaksa C funkcije ...................................................................................................................... 78
Slika 80: Oblik prototipa funkcije .............................................................................................................. 78
Slika 81: Primjer dizajniranja funkcije ....................................................................................................... 79
Slika 82: Primjer izvršavanja C funkcije ..................................................................................................... 79
Slika 83: Dodavanje drugog 7-segmentnog zaslona na MBED ................................................................... 80
Slika 84: Programski cpp kod za vježbu 7-5 ............................................................................................... 80
Slika 85: Definiranje prototipa funkcija ..................................................................................................... 81
Slika 86: Programski cpp kod za vježbu 7-6 ............................................................................................... 82
Slika 87: Funkcije za vježbu 7-6 ................................................................................................................. 82
Slika 88: Modularno programiranje .......................................................................................................... 84
Slika 89: Pozivanje unaprijed zadanih C datoteka zaglavlja ....................................................................... 84
Slika 90: Pozivanje vlastitih datoteka zaglavlja ......................................................................................... 85
Slika 91: Prikaz pozivanja datoteka zaglavlja............................................................................................. 85
Slika 92: Predložak za datoteke zaglavlja .................................................................................................. 86
Slika 93: Vanjsko upravljanje nad izvornom datotekom............................................................................ 86
Slika 94: Dodavanje datoteka u projekt .................................................................................................... 87
Slika 95: Programski cpp kod za vježbu 7-7 ............................................................................................... 87
Slika 96: Datoteka 'SegDisplay.cpp' za vježbu 7-7 ..................................................................................... 88
Slika 97: Datoteka 'SegDisplay.h' za vježbu 7-7 ......................................................................................... 88
Slika 98: Datoteka 'HostIO.cpp' za vježbu 7-7............................................................................................ 89
Slika 99: Datoteka 'HostIO.h' za vježbu 7-7 ............................................................................................... 89
Slika 100: Primjer koda prije poboljšanja dizajna ...................................................................................... 91
Slika 101: Primjer koda nakon skraćivanja ................................................................................................ 92
Slika 102: Stvaranje klase .......................................................................................................................... 93
Slika 103: Datoteka Flasher.h .................................................................................................................... 94
Slika 104:Datoteka Flasher.cpp ................................................................................................................. 95
Slika 105: Primjer korištenja objekta iz biblioteke .................................................................................... 95
Slika 106: Izgled programa u razvojnom okruženju ................................................................................... 96
Slika 107: Stvaranje nove biblioteke „Flasher“ .......................................................................................... 96
Slika 108: Objavljivanje biblioteke ............................................................................................................ 97
Slika 109: Izmjena na projektu .................................................................................................................. 97
Slika 110: Primjer cpp koda kojim se upravlja sa integriranim diodama .................................................... 99
Slika 111: 'Knightrider' LED efekt upotrebom digitalnih izlaza ................................................................ 100
Slika 112: 'Knightrider' LED efekt upotrebom BusOut objekta ................................................................ 101

6
Slika 113: LCD zaslon 16x2 ...................................................................................................................... 102
Slika 114: Spajanje hardvera LCD zaslona i MBED-a ................................................................................ 104
Slika 115:Definiranje priključaka za biblioteku TextLCD .......................................................................... 105
Slika 116: Definiranje hardverskih priključaka za vježbu 8-4 ................................................................... 105
Slika 117: Primjer jednostavnijeg korištenja alfanumeričkog LCD-a ........................................................ 105
Slika 118: Odabir željene pozicije na LCD zaslonu.................................................................................... 105
Slika 119: Brisanje postojećeg sadržaja LCD zaslona................................................................................ 106
Slika 120: Prikaz cjelobrojne vrijednosti na LCD zaslonu ......................................................................... 106
Slika 121: Prikaz varijabli na LCD-u .......................................................................................................... 106
Slika 122: Primjer prikazivanja analognih ulaznih podataka na LCD-u ..................................................... 107
Slika 123: Shema povezivanja uređaja preko I²C sabirnice ...................................................................... 109
Slika 124: Funkcioniranje jednostavne I²C komunikacije ......................................................................... 110
Slika 125: Prijenos podataka kod jednostavne I²C komunikacije ............................................................. 111
Slika 126: I²C priključci na MBED-u .......................................................................................................... 112
Slika 127 MSP430G I2C SLAVE ................................................................................................................. 112
Slika 128 Shema modula MSPG_I2C_SLAVE ............................................................................................ 113
Slika 129: Povezivanje MSPG_I2C_SLAVE sa MBED-om ........................................................................... 115
Slika 130: Primjer cpp koda za temperaturni mod MSP430G modula ..................................................... 116
Slika 131 Dva MSPG_I2C_SLAVE na istoj sabirnici ................................................................................... 117
Slika 132 Programski kod uz vježbu 9-3 ................................................................................................... 118
Slika 133: Shema SPI protokola ............................................................................................................... 119
Slika 134: Dijagram funkcioniranja jednostavne SPI komunikacije .......................................................... 120
Slika 135: Modovi rada kod SPI komunikacije ......................................................................................... 121
Slika 136: SPI priključci na MBED-u ......................................................................................................... 122
Slika 137: Elektronička memorija ............................................................................................................ 123
Slika 138: Tipovi elektroničke memorije ................................................................................................. 124
Slika 139: 'LocalFileSystem' deklaracija ................................................................................................... 126
Slika 140: Naredba 'fopen' za otvaranje datoteka ................................................................................... 127
Slika 141: Naredba 'fclose' za zatvaranje datoteka.................................................................................. 127
Slika 142: Naredba 'fputc' omogućuje pisanje podataka ......................................................................... 127
Slika 143: Naredba 'fgetc' omogućuje čitanje podataka ......................................................................... 128
Slika 144: Primjer cpp koda za vježbu 11-1 .............................................................................................. 129
Slika 145: Primjer cpp koda za vježbu 11-2 .............................................................................................. 130
Slika 146: Primjer cpp koda za vježbu 11-3 .............................................................................................. 131
Slika 147: Spajanje hardvera u primjeru.................................................................................................. 133
Slika 148: Programski cpp kod za primjer ................................................................................................ 135

7
Uvod

1. Uvod

Kako bi korisnici, tj. studenti usvojili znanja o upotrebi mikroupravljača, prvo je


dan uvod u svijet mikroupravljača gdje se ukazuje da su mikroupravljači neizostavni
dio modernih tehnoloških rješenja, imaju široki krug korisnika, te nalaze široku
primjenu u mnogobrojnim granama industrije.

Također, navedeni su kriteriji u procesu izbora mikroupravljača te je jasno


navedeno zašto je izabran LPC1768 na modulu MBED i što ga čini 'drugačijim'.

Nadalje prikazano je teoretsko i praktično korištenje MBED-a kao novog


koncepta brzog razvoja prototipova. Detaljno su objašnjeni:

1. Digitalni ulazi i izlazi

2. Analogni ulazi i izlazi

3. Pulsno-širinska modulacija

4. Dizajn modula i tehnike programiranja

5. Paralelni podaci i komunikacija

6. Serijska komunikacija sa I²C-om

7. Serijska komunikacija sa SPI-om

8. Memorija i upravljanje podacima

9. Tajmeri i prekidi

Na kraju ove skripte, na proizvoljnom primjeru je demonstrirana upotreba MBED


mikroupravljača u TVZ-ovom laboratoriju za ugradbene sustave.

8
2. Uvod u mikroupravljače

2.1. Svijet mikroupravljača

Svakim danom, mikroupravljači postaju sve zastupnjeniji u svijetu i njihova


primjena konstantno raste.

Do 80-tih godina 20-tog stoljeća mikroračunala su koristili te primjenjivali


znanstvenici računarstva. Danas, mikroupravljači su neizostavni dio modernih
tehnoloških rješenja, te imaju široki krug korisnika.

Nalaze široku primjenu u uređajima za domaćinstvo, a također se upotrebljavaju


u područjima kao što su automobilska industrija, rasvjeta, komunikacije,
niskoenergetski potrošački uređaji, sustavi automatizacije, komunikacijski sustavi
itd.

Slika 1: Mikroupravljači

Mikroupravljač je cijeli računalni sustav sadržan na jedinstvenom integriranom


sklopu.

9
Međutim, postoji razlika između mikroprocesora i mikroupravljača:

Mikroprocesor je 'mozak' računala, te mu je potrebno dodati druge komponente


(memorija, ulazno/izlazne jedinice itd.) kako bi mogao funkcionirati.

Slika 2: Mikroprocesor

Mikroupravljač je sve u jednom, te mu nisu potrebne dodatne vanjske


komponente. Sve potrebne periferne jedinice nalaze se unutar uređaja.

Slika 3: Mikroupravljač
10
Aktualno, mikroupravljačku tehnologiju najviše koriste i primjenjuju profesionalci
za ugradbene sustave1. Konkretno, mikroupravljači se danas ugrađuju u sustave
kao što su automobili, telefoni, aparati i periferija računalnih sustava.

Dok su neki ugradbeni sustavi vrlo sofisticirani, mnogi pak imaju minimalne
zahtjeve za memoriju, dužinu programa, niske su softverske složenosti te nemaju
operativni sustav. Tipični ulazni i izlazni uređaji današnjih mikroupravljača su
prekidači, releji, zavojnice, LED diode, LCD zasloni, radijski uređaji, te senzori
podataka za primjerice temperaturu, vlagu i razinu svjetlosti. Ugradbeni sustavi
obično nemaju tipkovnicu, zaslon, diskove, printere, ili druge ulazno/izlazne uređaje
za osobna računala, te im nije potrebna nikakva ljudska interakcija prilikom rada.

Zbog masovne primjene u raznim područjima tehnologije mikroupravljači postaju


sve jeftiniji, moćniji te interaktivniji.

Upotrebu, razvitak i opće postojanje današnje tehnologije, a time i


mikroupravljača, među ostalima, omogućuje i kompanija ARM Holdings (ARM).

Slika 4: Tvrtka ARM Holdings

ARM je vodeći svjetski dobavljač poluvodiča intelektualnog vlasništva2, a time


predstavlja i "srce" razvoja digitalnih elektroničkih proizvoda. Sjedište ARM-a nalazi
se u Cambrige-u (Velika Britanija), te kompanija zapošljava više od 2000 ljudi. ARM

1 Embedded system (eng.) - ugradbeni sustav

2 Intelektualno vlasništvo (eng. intellectual property) je pravni pojam koji se odnosi na kreacije
uma za koje postoje zakonska autorska prava, a primjenjuje se primjerice za zaštitne znakove,
patente, industrijski dizajn, odjeću, a u nekim nadležnostima i poslovne tajne.

11
ima urede i dizajnerske centre širom svijeta (Tajvan, Francuska, Indija, Švedska i
SAD). ARM omogućuje i stvara novu tehnologiju koja se nalazi u jezgri naprednih
digitalnih proizvoda. Najveći i najpoznatiji klijeni ARM-a su Intel, TSMC, Samsung,
TI, NEC, ST, ZTE, Broadcom, AMD, Infineon, Apple, Qualcomm, Fujitsu, UMC,
Lenovo itd.

2.2. Izbor mikroupravljača

Odabir odgovarajućeg mikroupravljača za konkretnu aplikaciju je jedna od


ključnih odluka koje utječu na uspjeh ili neuspjeh projekta. Postoje brojni kriteriji koje
pri tom odabiru treba uzeti u obzir, pa će u nastavku isti biti prezentirani. Pregledno
će biti prikazan proces razmišljanja koji dovodi do pravilnog izbora mikroupravljača.

2.2.1. Uvod u izbor mikroupravljača

Osoba ili tim koji obavlja izbor treba se koristiti vlastitom ljestvicom ocjena u
odnosu na prezentirane kriterije za odabir, a zatim dati ukupnu osobnu ocjenu kako
bi se donijela ispravna odluka izbora.

Slika 5: Izbor mikroupravljača

Glavni cilj u procesu izbora mikroupravljača je odabrati najjeftiniji mikroupravljač


što minimizira ukupni trošak sustava, a pritom još uvijek ispunjava zadane zahtjeve
na performanse, pouzdanost i zaštitu okoliša. Ukupni trošak sustava uključuje sve,
kao što su: inženjering istraživanje i razvoj (R & D), proizvodnja (materijal i rad),
popravke unutar garancije, ažuriranja na terenu, kompatibilnosti prema postojećim
starijim sustavima, jednostavnost korištenja, i sl.
12
2.2.2. Proces izbora mikroupravljača

Dizajner se prilikom pokretanja procesa odabira mikroupravljača mora upitati:


"Koja je funkcija mikroupravljača u mom sustavu?". Odgovor na ovo jednostavno
pitanje diktira potrebne značajke mikroupravljača, a prema tome je i kontrolna točka
u procesu odabira. Provođenje potrage za mikroupravljačima koji ispunjavaju
zadane zahtjeve sustava započinje pretraživanjem literature (katalozi, tehnički
podaci, tehnički i stručni časopisi), a zatim uključuje i direktne konzultacije. U
posljednje vrijeme, stručni časopisi i posebice www izdanja su izvor "najsvježijih”
podataka iz tog područja.

Slika 6: Stručna literatura

Funkcije sustava mogu se riješiti sa "single-chip mikroupravljačem”, no u obzir


dolazi i upotreba više mikroupravljača ako se time štedi na dodatnom sklopovlju,
uzevši u obzir troškove te prostor na tiskanoj pločici. "Single-chip"3 rješenje je
poželjno sa cjenovnog aspekta, kao i iz razloga pouzdanosti. Naravno, ako postoji
politika tvrtke koja diktira izbor kod jednog proizvođača mikroupravljača, to će
znatno suziti pretraživanje.

Posljednji korak prilikom odabira mikroupravljača sastoji se od više faza (unutar


kojih se želi iz popisa prihvatljivih mikroupravljača donijeti jedan, konačan izbor), a
te faze uključuje i određuje:

cijena

3 Single chip (eng.) - rješenje sa jednim čipom tj. mikroupravljačem

13
raspoloživost

razvojni alati

podrška proizvođača

stabilnost i pouzdanost nabave.

Moguće je da se cijeli proces iterativno ponavlja dok se ne dođe do optimalnog


rješenja, odnosno odluke.

Slika 7: Konačan odabir mikroupravljača

14
2.2.3. Kriteriji izbora mikroupravljača

Opći prikaz glavnih kriterija pri odabiru mikroupravljača naveden je prema


redoslijedu važnosti.

1. Prikladnost za primjenu u sustavu — npr. upotreba jednog ili više


mikroupravljača?

Broj ulazno/izlaznih priključaka?

Potrebna sučelja; (npr. serijska komunikacija, RAM, A/D i D/A


pretvarači)?

Brzina središnjeg procesora?

Cijena?

2. Dostupnost hardvera?

Da li je mikroupravljač dostupan u dovoljnim količinama?

Da li je u sadašnjoj proizvodnji?

Izgledi u budućnosti?

3. Dostupnost razvojne podrške?

Asembleri

Prevoditelji (Compilers)

Alati za otkrivanje grešaka (Debugging tools)

Internetski forumi i zajednice

Podrška za primjenu

4. Povijest izabranog proizvođača i bilanca uspjeha

Dokazana sposobnost u dizajnu

Pouzdanost integriranih krugova

Učinkovitost isporuka na vrijeme

Broj godina u poslovanju

Financijsko izvješće

15
2.2.4. Zadani zahtjevi sustava

Primjena analize tehničkog sustava predviđenog u projektu određuje zahtjeve na


mikroupravljač. Ovdje su neka od pitanja koja treba postaviti i na njih odgovoriti.
Npr. …

Koji su periferni priključci (sučelja) potrebni?

Koliki broj bita mikroupravljač treba imati (8, 16, 32...) kako bi se mogao
implementirati algoritam dovoljne izlazne preciznosti?

Da li je možda potrebna floating point jedinica (FPU)?

Da li je jedan napon ili više njih potrebno za napajanje sustava?

Postoje li estetski preduvjeti, kao što su oblik i / ili boja?

Postoji li utjecaj radnog okruženja, kao što su vojne specifikacije,


temperatura, vlaga, atmosfera (eksplozivne, korozivne, čestice, itd.),
tlak / visina?

Što je sa autorskim naknadama i podrškom otkrivanja grešaka?

2.2.5. Konačan izbor mikroupravljača

Kao završni korak, kao pomoć u procesu odabira, može se izraditi tablica s
popisom svih mikroupravljača u izboru u jednom stupcu i svih važnih atributa na
drugom stupcu. Tablicu treba popuniti sa podacima iz kataloga proizvođača kako bi
se omogućila usporedba.

Među mogućim atributima su:

Cijena

RAM, ROM, EPROM, i EEPROM

Tajmeri

A/D i D/A

Serijski portovi i paralelni portovi (I / O kontrolne linije)

Veličina i tip kućišta

16
Zahtjevi na napajanje

2.3. MBED mikroupravljači

MBED je razvojno okruženje namijenjeno za brzi razvoj aplikacija na ARM


CORTEX M3 mikroupravljaču LPC1768.

Slika 8: MBED LPC1768

MBED mikroupravljači zasnivaju se na 'Rapid Prototyping' tehnologiji.

'Rapid Prototyping' tehnologija pomaže industriji kreirati nove proizvode, a


zasniva se na kontroli, komunikaciji, interakciji, te praćenju razvojnih ciklusa u
mikroelektronici

'Rapid Prototyping' tehnologija primjenom MBED-a je usmjerena na brzu izradu


prototipa za raznolike korisnike. Koriste se prednosti DIL (dual in-line) pakovanja,
razvijenih API (application programming interface) komponenti, te WEB stranica za
potporu i međusobnu komunikaciju razvojnih inženjera. Pri tom se ulazi i u
neophodne kompromise da bi se omogućilo brzo eksperimentiranje. Konačni
rezultat: stvaraju se nove primjene mikroupravljačke tehnologije.

17
Slika 9: Tehnologija 'Rapid Prototyping'

2.3.1. Specifičnost MBED mikroupravljača

Glavne značajke koje MBED čine drugačijim:

USB 'Drag and drop' programsko sučelje

Nema potrebe za provođenjem nikakve instalacije; programiranje se


odvija kopiranjem izvršnih datoteka na disk pritiskom jedne tipke. Radi na
Windows, Linux i Mac platformama, te nisu potrebni 'driver'-i. Povezuje se
pomoću web stranice

Slika 10: USB programsko sučelje

18
Online4 kompajler

Nema potrebe za provođenjem nikakve instalacije; IDE povezivanje


temeljeno je na Internet pretraživaču. Moguće je trenutno kompajliranje
primjera ili pisanje vlastitog koda. Koristi se najbolji u klasi RealView
C/C++ prevoditelj.

Izvorne datoteke, i prevoditelj (kompajler) nalaze se na zajedničkom


serveru („Cloudcomputing“) tako da registrirani korisnik može pristupiti
svom projektu sa svakog računala i svake lokacije gdje je pristupačna
internetska mreža. Izvršna datoteka, dobivena prevođenjem, prenosi se
(download) u memoriju računala.

Iz te memorije, datoteka se treba prenijeti u memoriju MBED-a koji se u


odnosu na računalo ponaša kao vanjska FLASH memorija.

Slika 11: Online prevoditelj

Visoka razina periferne apstraktne biblioteke

Nema specifične potrebe za učenjem jer je aplikacijsko programsko


sučelje (API) jasno i razumljivo. Objektno orijentirana hardversko-

4 Online (eng.) - pristup internet mreži

19
softverska apstrakcija omogućuje eksperimentiranje bez poznatih
mikroupravljačkih detalja.

Slika 12: Apstraktna biblioteka

Na slici 13 je shematski prikazan proces rada MBED-a:

20
Slika 13: Proces rada MBED-a

2.3.2. Funkcioniranje MBED mikroupravljača

Da bi se omogućilo korištenje i programiranje MBED mikroupravljača, najprije je


potrebno spojiti MBED sa računalom koristeći USB kabel.

Slika 14: Povezivanje MBED mikroupravljača sa računalom

21
Računalo prepoznaje MBED modul kao vanjski uređaj za podatkovnu pohranu,
tj. kao USB disk.

Slika 15: MBED modul prikazan kao USB disk

Potrebno je dvostruko kliknuti na ".htm" fajl na MBED USB disku ili pokrenuti
MBED korisničku podršku na web stranici www.develover.mbed.org. Zatim se
izvršava prijava ili registracija novog računa, čime se ujedno i omogućava početak
korištenja MBED mikroupravljača.

Slika 16: Web stranica www.mbed.org

22
Glavna prednost MBED arhitekture nad drugim arhitekturama je mogućnost
brzog razvoja i provjere koncepta ('proof-of-concept') aplikacija uporabom
korisničke podrške na web stranici www.mbed.org.

Nakon logiranja sa korisničkim imenom dobivenim registriranjem MBED-a,


korisnik ima pristup web sadržajima vezanim za standardnu zvaničnu MBED
biblioteku, ali i pristup bibliotekama i programima koje kreiraju drugi korisnici. Web
stranica je praktična i pruža veliku podršku korisniku. Na stranici se nalazi forum sa
pitanjima i iskustvima mnoštva korisnika diljem svijeta, što uvelike olakšava
korištenje i programiranje MBED mikroupravljača.

Kompajliranje5 tj. prevođenje projekta izvodi se na sljedeći način. Potrebno je


pokrenuti prevoditelj klikom na karticu 'Compiler' koja se nalazi u gornjem desnom
kutu početne MBED-ove korisničke stranice.

Slika 17: Pokretanje prevoditelja na MBED korisničkoj stranici

U radnom prostoru, potrebno je stvoriti novi projekt ili otvoriti postojeći.

5 Compile (eng.) - kompajliranje ili prevođenje

23
Slika 18: Otvaranje projekta u radnom prostoru

Za 'online' prevođenje programa potrebno je kliknuti na karticu 'Compile'. Ovdje


se provjerava točnost i strukturiranost programskog koda, te se u slučaju detekcije
greške onemogućava izvršavanje programa, tj. greška se mora ispraviti.

Slika 19: Online prevođenje programa

Zatim se kreira ".bin" datoteka koja se pohranjuje na računalo.

Preuzimanje6 i pokretanje MBED projekta na mikroupravljaču izvodi se na


sljedeći način. Potrebno je odabrati '.bin' datoteku i pohraniti je na MBED USB disk.
U primjeru je odabrana datoteka 'test2.bin'.

6 Download (eng.) - preuzimanje

24
Slika 20: Pohrana '.bin' datoteke na MBED USB disk

Prijenos izvršnog koda iz flash memorije MBED modula u memoriju


mikroupravljača te pokretanje netom prenesenog programa izvršava se pritiskom
na pripadajuću plavu tipku MBED modula, čime je proces rada MBED-a omogućen.

Slika 21: Programiranje MBED-a pritiskom na plavu tipku

25
2.3.3. Hardverske mogućnosti modula MBED LPC1768

Mikroupravljač LPC1768 koristi ARM procesor, opširan skup periferije, te USB


programsko i komunikacijsko sučelje. Modul MBED sa mikroupravljačem LPC1768
je idealan za eksperimentiranje na maketama, modelima, pogonskim trakama i PCB
pločama. Sastoji se od 40 pinova (tj. priključnih konektora na razmaku od 2,54 mm)
integriranih na DIP kućištu7. Podržava mnoštvo sučelja uključujući USB, SPI, I²C,
CAN, ethernet i serijsko povezivanje. Dimenzije tiskane pločice na kojoj se nalazi
mikroupravljač su 54mm x 26mm.

MBED LPC1768 ima Cortex-M3 hardver koji je najbolji u klasi, te koristi 32-bitni
ARM procesor od 100 Mhz, ima 512 kB programske Flash memorije te 2x32 kB
SRAM memorije. Ethernet povezivanje odvija se brzinama od 10/100 MBit.
Posjeduje RMI sučelje, te DMA kontroler. Također, ima 8 kanala koji omogućuju 12-
bitnu analogno-digitalnu pretvorbu; te jedan kanal koji omogućuje 10-bitnu digitalno-
analognu pretvorbu. Posjeduje četiri 32-bitna tajmera.

Ima 6 kanala za pulsno-širinsku modulaciju, 1 kanal za upravljanje motorom


pomoću pulsno-širinske modulacije, te ima 8 DMA kanala. Posjeduje USB 2.0
sučelje sa integriranim primopredajnikom, te CAN 2.0B sa 2 kanala. Ima 4 UART
kanala, 2 SSP, 1 SPI, 3 I²C, te 1 I²S. Posjeduje niskoenergetski RTC (real time
clock), te unikatan ID. Ima RC oscilator od 4 MHz.

Može biti napajan preko USB-a (napon VBUS) ili vanjskog napajanja VIN od 4,5V
do 9V. Čak i napajanje do 12V na VIN bi trebalo biti sigurno, no na tim naponima
može doći do pregrijavanja regulatora ako se koristi regulirani izlaz 3,3V za
napajanje vanjskih komponenti. Na slici 22 prikazana je shema regulatora napona
koji su dio hardverskog sklopa na pločici MBED-a.

7 Dual in-line package (kratica DIP ili DIL) oblik je pakiranja integriranih krugova za široku
uporabu, a čini ga pravokutno kućište sa dva reda metalnih nožica.

26
Slika 22 Regulatori napona na MBED-u

Na MBED postolju se nalaze 4 integrirane LED diode koje služe kao digitalni
izlazi, koji su posebno namijenjeni za rad bez potrebe za dodatnim žicama ili
spojevima. Na slici 23 prikazani su svih 40 priključaka MBED-a sa svojim oznakama.

Slika 23 Priključci MBED-a LPC1768

27
Funkcija i mogućnosti hardverskih priključnih signala MBED-a LPC1768
prikazani su u tablici 1:

Tablica 1: Opis priključnih signala MBED-a LPC1768

Signal Opis

GND Uzemljenje

VIN Napajanje od 4,5V do 9V

VB Napajanje od 3V za RTC

nR Glavni reset

p5...p30 Digitalni ulazno-izlazni priključci (26)

p5...p7; p11...p13 SPI sučelje

p9, p10; p13, p14; p27, p28 Serijsko povezivanje

p9, p10; p27, p28 I²C sučelje

p15...p20 Analogni ulazi (6)

p18 Analogni izlaz

p21...p26 Izlazi za pulsno-širinsku modulaciju (6)

p29, p30 CAN sučelje

D+ Ulazno-izlazna USB podatkovna linija

D- Ulazno-izlazna USB podatkovna linija

TD+ Izlazna ethernet odašiljačka linija, pozitivna


Izlazna ethernet odašiljačka linija,
TD-
negativna
RD+ Ulazna ethernet primajuća linija, pozitivna
RD- Ulazna ethernet primajuća linija, negativna
IF+ Izlazna primajuća linija za Bootloader mod

IF- Ulazna odašiljačka linija za Bootloader mod

VU Izlazni napon od 5.0V za USB

VOUT Izlazni napon od 3,3V

28
3. Digitalni ulazi i izlazi

U sljedećim poglavljima biti će detaljno opisana struktura i funkcioniranje MBED


mikroupravljača od najjednostavnijih do složenijih primjera.

MBED mikroupravljači koriste naponski raspon od 3,3V, gdje 0V predstavlja


stanje "OFF", a 3,3V predstavlja stanje "ON". Pojmovi koji su korišteni pri opisu
stanja digitalnih ulaza ili izlaza prikazani su na tablici 2:

Tablica 2: Digitalne terminologije

0V 3,3V
Open (otvoren spoj na 3,3V) Closed (zatvoren spoj na 3,3V)
Off (isključen) On (uključen)
Low (nisko stanje) High (visoko stanje)
Clear (nije postavljen) Set (postavljen)
logic 0 (logička nula) logic 1 (logička jedinica)
False (nije) True (je)

Napomena: termini "logička 0" i "logička 1" jednostavno se nazivaju "0" i "1"

3.1. Digitalni izlazi MBED-a

Na MBED modulu se nalaze 4 integrirane LED diode koje služe kao digitalni
izlazi, koji su posebno namijenjeni za rad bez potrebe za dodatnim žicama ili
spojevima. Na slici 25 prikazane su oznakama LED1, LED2, LED3 i LED4. MBED
također posjeduje 26 digitalnih IO priključaka (pinovi 5-30) koji mogu biti
konfigurirani kao digitalni ulazi ili digitalni izlazi.

29
Slika 24: Digitalni izlazi MBED-a

MBED biblioteka ima priređene i korisniku dostupne API komponente


(Application Programming Interface). Jedna od njih je i DigitalOut koja kreira C++
klasu nazvanu DigitalOut. Ta klasa ima niz funkcija (članova klase) koje su
prikazane su u tablici 3:

Tablica 3: Funkcija digitalnog izlaza

DigitalOut Digitalni izlaz


Funkcija Korištenje
DigitalOut stvori objekt DigitalOut koji je spojen na definirani pin izlaza
write postavi izlaz, definiran kao 0 ili 1 (int)
read čita postavljeni izlaz, prikazan kao 0 ili 1 (int)
operator = skraćenica za pisanje
operator int() skraćenica za čitanje

Digitalni IO priključci se konfiguriraju definiranjem na početku programskog koda


tako da se svakom digitalnom IO pridružuje ime i pripadajući priključak (slika 25):

DigitalOut izlaz1(p5);
DigitalOut izlaz2(p6);
DigitalOut izlaz3(p7);
DigitalOut semafor(LED1); // izlaz na ugrađenu svjetleću diodu LED1
itd…
Slika 25: Definiranje digitalnog izlaza

30
Sučelje DigitalOut koristi se za postavljanje stanja izlaznog priključka, a također
i za očitavanje trenutnog stanja izlaza. DigitalOut se postavlja u "0" za stanje
isključivanja, odnosno u "1" za stanje uključivanja

Uporaba LED dioda na MBED priključcima

Svjetleća dioda LED (eng. light emitting diode) emitira svijetlo odgovarajuće boje
kad je u stanju vođenja (prvi kvadrant I/U karatteristike prikazan je na slici 26a).
Prag vođenja je kad napon na diodi dostigne vrijednost koljena (1,7 – 2,2V). Struja
diode treba se ograničiti vanjskim otpornikom na vrijednosti tipično između 2 i 20mA.
Na slikama 26b i 26c prikazani su varijante spajanja svjetleće diode sa predotporom
na izlazni pin mikroupravljača. U slučaju b) izlaz je izvor struje, a u slučaju c) ponor
struje koja teče kroz LED diodu.

Slika 26: Spajanje LED diode

Vježba 3-1: Spajanje LED dioda na digitalne izlaze.

Potrebno je spojiti MBED na prototipnu pločicu i priključiti crvenu LED diodu u


seriji sa otpornikom 499 Ω na priključak 5, te zelenu LED diodu u seriji sa otpornikom
499 Ω na priključak 6 (slika 27). Važno je upamtiti da se na MBED priključuje
pozitivni pol diode odnosno anoda (strana s većom nožicom), dok se negativni pol
diode priključuje na GND. MBED ima zajedničko uzemljenje (GND) na priključku 1.

31
PC

IC1 V3.3
1 40
GND VOUT
2 39
3
VIN
USB VU
38
VB IF-
4 37
nR IF+
5 36
P5 RD-
6 35
P6 RD+
7 34
P7 TD-
8 33
P8 TD+
9 32
P9 D-
D1 D2 10
P10 D+
31
11
12
P11 MBED P30
30
29
13
P12 NXP P29
28
P13 P28
14 LPC1768 27
P14 P27
15 26
P15 P26
16 25
P16 P25
17 24
P17 P24
18 23
P18 P23
R1 R2 19
P19 P22
22

(499 ohm) (499 ohm) 20


P20 P21
21

a) shema b) prototipna pločica

Slika 27: Uporaba LED dioda na MBED priključcima

Kreirajte novi program za vanjski LED projekt i unesite sljedeći cpp kod (slika 28);

#include "mbed.h"
DigitalOut redled(p5);
DigitalOut greenled(p6);
int main() {
while(1) {
redled = 1;
greenled = 0;
wait(0.2);
redled = 0;
greenled = 1;
wait(0.2);
}
}
Slika 28: Primjer cpp koda za LED projekt

Nakon unosa cpp koda, program je potrebno prevesti, preuzeti i pokrenuti na


MBED-u. Analizom primjera programa uočavaju se sljedeći elementi programskog
jezika C:

naredbom '#include' iz biblioteke je pozvan mbed.h podatak

DigitalOut objekti su definirani imenom i odgovarajućim mbed priključkom

funkcija glavnog programa nalazi se unutar 'int main {...program...}'


32
beskonačna petlja izvršava se 'while(1)' naredbom, tako da program
nesprestano vrti petlju, a LED stalno trepće

digitalni izlazi su kontrolirani postavljanjem njihove vrijednosti u '0' ili '1'

funkcija 'wait()' se koristi za kontrolu vremena

Kontrola funkcionalnosti izvođenja programa:

1) Optička provjera da li se crvena i zelena ledica pale i gase naizmjenično

2) Provjera rada modela sa LED diodama uz pomoć osciloskopa (NI myDAQ)


(prema slici 30 prvi kanal spojen je na pin p6, a drugi kanal na p7)

Slika 29 Priključak osciloskopa na model

Dobiveni snimak prikazan je slici 30. Po vremenskoj osi postavljeno mjerilo je


50ms po dijelu, a amplituda je 1V po dijelu.

33
Slika 30 Y-t oscilogram izlaza na p5 i p6

Digitalni izlazi prema aktuatorima

Direktni digitalni izlazi sa pinova mikroupravljača na LED diode u funkciji su


signalizacije stanja. U praksi će biti češće potrebno da digitalni izlaz djeluje prema
nekom od aktuatora (npr. upravljanje motorom, zaklopkom, ventilom, grijačem, itd.)
gdje je za pogon potreban viši stupanj energije, veća izlazna struja ili veći iznos
napona. U takvim slučajevima na izlazne pinove mikroupravljača spajaju se
pogonski sklopovi koji će omogućiti strujno ili naponsko pojačanje pa po potrebi i
galvansko odvajanje prema izvršnom aktuatorskom elementu.

Na slici 31 a) prikazan je primjer korištenja bipolarnog tranzistora kao sklopke


koja uključuje ili isključuje struje u krugu kolektor-emiter koje mogu biti i 100 puta
većeg iznosa od onog koje daje digitalni izlaz mikroupravljača spojem na bazu
tranzistora. Trošilo (aktuatorski član) priključeno je između napona napajanja Vcc i
kolektora tranzistora. Napon na trošilu može biti veći od napona napajanja
mikroupravljača (npr. od 5 do 24V tipično, a struje tereta do maks. 200mA).

34
Slika 31 Pojačala digitalnih izlaza

U slučaju da se trošilo nalazi spojeno sa jednim priključkom prema 0V (GND),


može se koristiti spoj prikazan na slici 31, detalj b). Upotrebom para NPN/PNP
tranzistora dobiveno je još veće strujno pojačanje, a napon napajanja trošila Vdd
tipično je od 12V do 48V, maksimalne struje do cca 1A do 2A. Za preklapanje još
većih struja (cca 6A -10A) može se koristiti elektronička sklopka koja na svom
izlaznom dijelu ima unipolarni tranzistor (MOSFET). Na detalju c) slike 31 prikazan
je primjer upravljanja istosmjernim motorom. Tranzistor Q1 je naponski upravljan pa
je zato korišten otpornik od 10KΩ koji gate MOSFET-a pridiže na napon Vdd i
uključuje MOSFET kad NPN tranzistor ne vodi. Na detalju d) slike 31 prikazan je
primjer priključka releja (zapravo uzbude releja) na mikroupravljač. Tranzistorska
sklopka sa NPN tranzistorom ispred uzbude je nužna zbog struje koju pin
mikroupravljača ne može direktno dati ili povući. Paralelno sa uzbudom releja
postavlja se zaštitna dioda (ako već nije ugrađena u relej) koja sprečava pojavu
prenapona na kolektoru tranzistora. Uzbuda releja spaja se sa drugim krajem na
više napona (tipično 12V do 48V), a radni i mirni kontakti releja mogu uključiti ili
isključiti trošilo ili aktuator veće snage.

35
3.2. Digitalni ulazi MBED-a

Vrijednosti digitalnih ulaza mogu se očitati. MBED posjeduje 26 priključaka


(pinovi 5-30) koji se mogu se konfigurirati kao digitalni ulazi (isto kao i digitalni izlazi),
na sljedeći način (slika 32):

DigitalIn ulaz1(p5);
DigitalIn ulaz2(p6);
DigitalIn prekidac(p7);
Slika 32: Definiranje digitalnog ulaza

DigitalIn API komponenta određuje trenutno logičko stanje odabranog ulaznog


pina, npr. logički '0' ili logički '1'. 0V na digitalnom ulaznom priključku daje logičku
'0', dok 3,3V daje logičku '1'.

Dostupne funkcije iz biblioteke prikazane su u tablici 4:

Tablica 4: Funkcija digitalnog ulaza

DigitalIn Digitalni ulaz


Funkcija Korištenje
DigitalIn stvori objekt DigitalIn koji je spojen na definirani pin ulaza
read čita ulaz, prikazan kao 0 ili 1 (int)
mode postavi mod ulaznog pina (PullUp, PullDown, PullNone, OpenDrain)
operator int() skraćenica za čitanje

Na slici 33 prikazana su tri moguća načina; detalj (a) prikazuje dvopolnu sklopku
(eng. SPDT) koja preklapa digitalni ulaz mikroupravljača ili na GND ili na 3,3V. Detalj
(b) prikazuje jednopolni prekidač (eng. SPST) koji kada je spojen kratko spaja GND
potencijal na digitalni ulaz (logička 0), a kada je odspojen potencijal 3,3V preko
otpornika R dolazi na digitalni ulaz (logička 1). Detalj (c) prikazuje jednopolni
prekidač koji kada je spojen kratko spaja 3,3V potencijal na digitalni ulaz (logička
1), a kada je odspojen potencijal 0V preko otpornika R dolazi na digitalni ulaz
(logička 0). U slučaju (b) može se koristiti i ugrađeni otpornik u mikroupravljaču (eng.
PullUp), a u slučaju (c) ugrađeni otpornik (eng. PullDown).

36
Slika 33 Sklopka kao digitalni ulaz

Vježba 3-2: Spajanje niza od 4 prekidača na MBED

Blok od 4 prekidača SW1 do SW4 spaja se između 0V (GND, pin1) i četiri pina
na modulu MBED koje treba definirati kao digitalne ulaze. Koristi se prethodni model
opisan u vježbi 1 sa LED diodama, a prekidače 1,2,3 i 4 se spajaju na pin 7, 8, 9 i
10. U programu se ti ulazi moraju definirati sa objektom DigitalIn, a funkcija mode
tih ulaza treba se postaviti u stanje PullUp kako bi se aktivirao ugrađeni otpornik koji
spaja izabrani ulaz na 3,3V.

PC

IC1 V3.3
1 40
GND VOUT
2 39
3
VIN
USB VU
38
VB IF-
4 37
nR IF+
5 36
P5 RD-
6 35
P6 RD+
7 34
P7 TD-
SW1 8
P8 TD+
33
9 32
P9 D-
D1 D2 10
P10 D+
31
11
12
P11 MBED P30
30
29
13
P12 NXP P29
28
P13 P28
14 LPC1768 27
SW4 P14 P27
15 26
P15 P26
16 25
P16 P25
17 24
P17 P24
18 23
P18 P23
R1 R2 19
P19 P22
22
(499 ohm) (499 ohm) 20
P20 P21
21

a) shema b) prototipna pločica

Slika 34: Spajanje prekidača na MBED

37
-Kreirajte novi program za LED projekt sa prekidačem (slika 35)

#include "mbed.h"
DigitalOut redled(p5);
DigitalOut greenled(p6);
DigitalIn sw1(p7);
int main() {
sw1.mode(PullUp); // Pull up internal resistor
while(1) {
if (sw1==1) {
greenled = 0; //green led is off
redled = 1; // flash red led
wait(0.2);
redled = 0;
wait(0.2);
}
else if (sw1==0) {
redled = 0; //red led is off
greenled = 1; // flash green led
wait(0.2);
greenled = 0;
wait(0.2);
}
}
}

Slika 35: Uvođenje ulaznog digitalnog prekidača na MBED

Za umetanje korisnih komentara, koristi se simbol sa dvije kose linije usmjerene


prema naprijed (//), koje kompajler ignorira. Nakon unosa cpp koda, program je
potrebno prevesti, preuzeti i pokrenuti na MBED-u.

Pogledom na programski kod, uočava se da naredba 'if (sw1==1)' omogućuje da


se kod izvršava na dva različita načina, ovisno o vrijednosti digitalnog ulaza (tj.
položaju mehaničkog prekidača). Ako je vrijednost prekidača '1', zelena LED dioda
je postavljena u nulu (off) dok je crvena LED dioda programirana da trepće. Ako je
digitalni ulaz u stanju '0', tada su uloge LED dioda obrnute.

38
Vježba 3-3: LED projekt sa 4 prekidača korištenjem API komponente
BusInOut

Digitalni ulazi i izlazi mogu se korištenjem komponente BusInOut grupirati u skup


bitova (riječ odgovarajućeg broja bitova) neovisno o tome gdje su i u kojem
redoslijedu definirani ulazno-izlazni priključci. Pri tom se funkcijom mode može
zadati da se uključe „PullUp“ otpornici na tim pinovima. Na slici 37 prikazan se
programski kod koji koristi sva 4 priključena prekidača (varijabla inputSW) te na
temelju stanja ulaza postavlja kombinacije stanja LED dioda. Naredbom
'inputSW.mode(PullUp); ' uključuju se interni otpornici prema +3,3V. Stanje ulazne
include "mbed.h"

DigitalOut redled(p5);
DigitalOut greenled(p6);
BusInOut inputSW(p7, p8, p9, p10);

int main() {
inputSW.mode(PullUp); // Pull up internal resistor
while(1) {
switch(inputSW) {
case 0x1:
greenled = 1; //green led is on
redled = 0; //red led is off
break;
case 0x2:
greenled = 0; //green led is off
redled = 1; //red led is on
break;
case 0x4:
case 0x8:
greenled = 1; //green led is on
redled = 1; //red led is on
break;
default :
greenled = 0; //green led is off
redled = 0; //red led is off
}
}
}

varijable testira se naredbom ' switch(inputSW) '.

Slika 36 Programski kod za vježbu 3-3

39
Obzirom na sadržaj varijable (u heksadecimalnom obliku) izvršava se jedan od
predviđenih slučajeva, npr. ' case 0x1: ' koji pali zelenu LED diodu, a gasi crvenu.
Naredbe tog slučaja izvršavaju se sve do komande ' break; ' kada program preskače
na kraj 'switch' naredbe. U svim ostalim nenavedenim slučajevima izvršava se kod
koji slijedi iza naredbe 'default:' u tijelu 'switch' strukture.

Vježba 3-4: Pulsni valni izlaz

Upotrebom digitalnog ulaznog prekidača, kreirajte pulsni valni izlaz koji


udvostručuje frekvenciju kada je digitalni ulazni prekidač uključen.

Vježba 3-5: Brojač do deset

Napravite sustav koji broji koliko puta je digitalni prekidač pritisnut (tj. promijenjen
mu je položaj), a nakon što izbroji 10 puta, pali se LED dioda.

40
Analogni ulazi i izlazi MBED-a

4. Analogni ulazi i izlazi

Mikroupravljači su često korišteni u sučelju s analognim signalima, te stoga


moraju omogućavati pretvorbu ulaznih analognih signala (npr. iz mikrofona ili
temperaturnog senzora) u digitalan oblik signala. Također, moraju omogućavati
pretvorbu digitalnih signala u analogni oblik (npr. pokretanje zvučnika ili
istosmjernog motora). Za pretvorbu iz analognog oblika signala u digitalni ili obrnuto,
mikroupravljači koriste ili ugrađene A/D odnosno D/A pretvornike ili koriste vanjske
pretvornike (koji su u principu uvijek točniji i stabilniji) koji se priključuju na
mikroupravljač serijskom (češće) ili paralelnom vezom. Unutarnji A/D ili D/A
pretvornici su jednostavniji za korištenje. Prilikom takvog razmatranja treba uzeti u
obzir da je vrijeme A/D pretvorbe ugrađenog pretvornika u MBED-u 40 µS.

4.1. Pojmovi analogno-digitalne pretvorbe

Analogno-digitalni pretvornik ili konvertor (ADC) je elektronički krug čiji je digitalni


izlaz proporcionalan njegovom analognom ulazu. Naime, "mjeri" se ulazni napon, a
kao izlaz daje binarni broj proporcionalan veličini ulaznog napona. Ulazni raspon
ADC-a određen je vrijednošću referentnog napona u odnosu na koji se mjereni
napon uspoređuje.

Način odvijanja procesa analogno-digitalne pretvorbe prikazan je na slici 37:

41
Analogni ulazi i izlazi MBED-a

Slika 37: Analogno-digitalna pretvorba

Pretvorba se pokreće signalom SC (eng. Start Conversion). Nakon potrebnog


vremena pretvorba je izvršena, što se signalizira linijom za završetak pretvorbe EOC
(eng. End of Conversion). Stanje linije EOC se ispituje u kratkim vremenskim
razmacima (eng. pooling) ili promjena stanja te linije izazove prekid glavnog
programa te izvršenje prekidne rutine koja očitava rezultat pretvorbe. Rezultat
pretvorbe očitava je omogućenjem izlaza linijom OE (eng. Output Enable).

"Stepeničasti" valni oblik vidljiv u 3-bitnom ADC-u (prema slici 38):

Slika 38: Stepeničasti valni oblik

42
Analogni ulazi i izlazi MBED-a

Rezolucija i uzorkovanje ADC-a:

Pretvorbom analognog signala u digitalni, njegova se vrijednost aproksimira, te


svaka vrijednost digitalnog izlaza predstavlja promjenu ulaznog analognog napona.
Ako se pretvara analogni signal raspona od 0-3,3 V u 8-bitni digitalni signal, onda
postoji 256 (2^8) različitih izlaznih vrijednosti. Svaki uzorak ima širinu od 3,3/256 =
12.89 mV, a najveća greška pri kvantizaciji može biti 6,45 mV. MBED ima ugrađeni
12-bitni ADC, što ukazuje da ima širinu uzorkovanja od 0,8 mV (3,3/2^12), a najveća
greška pri kvantizaciji može biti 0,4 mV

Frekvencija uzorkovanja:
Prilikom pretvorbe analognog signala u digitalni, uzastopno se uzima 'uzorak' koji
se kvantizira sa točnošću koja je određena rezolucijom ADC-a, a time što je veći
broj uzoraka uzet, time će digitalni podaci biti točniji.

Uzorci se često uzimaju po fiksnim razdobljima (npr. svake 2 ms), te su definirani


frekvencijom uzorkovanja (broj uzetih uzoraka u sekundi). Frekvencija uzorkovanja
treba biti izabrana u ovisnosti o brzini promjene podataka koji se uzorkuju. Ako je
uzorak frekvencije prenizak u odnosu na brze promjene analognog signala, moguće
je da konačnim digitalnim podacima nedostaju neke promjene signala koji se
uzorkuje. Nyquist-ov kriterij uzorkovanja govori da frekvencija uzorkovanja mora biti
barem dvostruko veća od najveće frekvencije signala koji se uzorkuje.

Slika 39: Digitalno uzorkovanje analognog signala

43
Analogni ulazi i izlazi MBED-a

4.2. Analogni ulazi MBED-a

Na MBED je moguće spojiti 6 analognih ulaza (pinovi 15-20) kao što je prikazano
na slici 40.

Slika 40: Analogni ulazi MBED-a

Dostupne funkcije iz API biblioteke prikazane su u tablici 5:

Tablica 5: Funkcija analognog ulaza

AnalogIn Analogni ulaz


Funkcije Korištenje
AnalogIn Stvori objekt AnalogIn za analogni ulaz spojen na definirani pin
read čita ulazni napon prikazan u obliku realnog broja
u rasponu [0,0 do 1,0]
read_u16 čita ulazni napon prikazan u obliku cijelog broja (unsigned short)
u rasponu [0x0, 0xFFFF]
operator float operator float An -> skraćenica za čitanje

Vježba 4-1: Učitavanje i zapisivanje podataka s analognih ulaza

- Spojite srednji izvod potenciometra na pin 20 MBED-a prema shemi a) na slici


41. Obzirom na položaj klizača ulazni napon može se postaviti u rasponu od 0 do
3,3V.

44
Analogni ulazi i izlazi MBED-a

Slika 41: Spajanje potenciometra na MBED

Potrebno je pokrenuti novi MBED projekt i unijeti sljedeći cpp kod koji
kontinuirano prikazuje vrijednost analognog ulaza na monitoru PC-a na kojeg je
MBED modul priključen:

//Reads input through the ADC, and transfers to PC terminal

#include "mbed.h"
Serial pc(USBTX, USBRX);
AnalogIn Ain(p20);
float ADCdata;

int main() {
pc.printf("ADC Data Values... \n\r");
while (1) {
ADCdata=Ain;
pc.printf("%f \n\r",ADCdata);
wait (0.5);
}
}
Slika 42: Primjer cpp koda za uporabu potenciometra

API objekt „Serial pc(USBTX, USBRX)“ omogućuje slanje podataka serijskom


komunikacijom na priključeno računalo preko USB priključka. Komandom 'pc.printf'
pripremaju se i šalju podaci koji se mogu prikazati na ekranu monitora računala. Na
računalu se treba pokrenuti aplikacija „Tera Term“ te izabrati na prvom izborniku
serijski kanal gdje se priključen MBED (slika 43).

45
Analogni ulazi i izlazi MBED-a

Slika 43 Tera Term izbor komunikacijskog kanala

Prema osnovnim postavkama, serijska komunikacija je asihrona bidirekcionalna


sa brzinom prijenosa od 9600 b/s. Postavke se mogu provjeriti na slici 44.

Slika 44 Tera term – postavke

Pokretanjem programa na MBED modulu, u razmacima od cca. 0,5 s prikazuje


se na ekranu niz očitanja vrijednosti napona sa izabranog analognog ulaza (slika
46). Pri tom napon 0V na ulazu daje prikaz broja 0,00000, a napon 3,3V prikazuje
broj 1,000000. Ako se vrijednosti žele prikazati kao napon u voltima treba se

46
Analogni ulazi i izlazi MBED-a

naredba 'pc.printf("%f \n\r",ADCdata);' zamjeniti naredbom 'pc.printf("%f


\n\r",ADCdata*3.3);'

Slika 45 Tera Term - Prikaz vrijednost AIN20

Vježba 4-2: LED VU metar

Primjenom 4 integrirane LED diode MBED-a, napišite program koji će koristeći


ulaz potenciometra (pin 20) kontinuirano kontrolirati koliko je LED dioda uključeno.
Upotrijebite sljedeću tablicu za definiranje kontrole LED-a:

Tablica 6: Prikaz položaja potenciometra pomoću integriranih LED dioda

47
Analogni ulazi i izlazi MBED-a

4.3. Digitalno-analogna pretvorba

Digitalno-analogni pretvarač (DAC) može se predstaviti kao blok dijagram sa


digitalnim ulazom Dul i analogim izlazom Uiz (slika 46).

Slika 46: Digitalno-analogna pretvorba

Izlazni opseg Urange je razlika između maksimalnog i minimalnog izlaznog


napona.

Urange = Umax - Umin

Izlazni opseg je često definiran izlaznim naponom napajanim iz DAC-a. Digitalne


kontrolne linije omogućuju mikroupravljaču postavljanje i komuniciranje sa DAC-om.
Za svaku digitalnu vrijednost ulaza, postoji odgovarajuća analogna izlazna
vrijednost određena ovim izrazom:

Uiz = Dul/2n * Urange

MBED koristi vlastito napajanje od 3,3 V kao referentni napon. MBED LPC 1768
ima 10-bitni DAC, stoga će u izlaznoj karakteristici DAC-a biti 1024 koraka (2^10).
Dakle, veličina koraka ili rezolucija je 3,3/1024, tj. 3,2 mV po bitu.

48
Analogni ulazi i izlazi MBED-a

4.4. Analogni izlaz MBED-a

MBED ima jedan analogni izlaz (pin 18).

Slika 47: Analogni izlaz na MBED-u

Dostupne funkcije iz biblioteke prikazane su u tablici:

Tablica 7: Funkcija analognog izlaza

AnalogOut Analogni izlaz


Funkcija Korištenje
AnalogOut Stvori objekt AnalogOut za analogni izlaz spojen na definirani
pin
write Postavi izlazni napon, definiran kao postotak (float)
write_u16 Postavi izlazni napon, prikazan u obliku cijelog broja (unsigned
short) u području [0x0, 0xFFFF]
read Čita trenutno postavljeni izlazni napon, mjeren kao postotak
(float)
operator= skraćenica za pisanje
operator float() skraćenica za čitanje

MBED analogni izlaz (pin 18) se definira na sljedeći način:

'AnalogOut Aout(p18);'

49
Analogni ulazi i izlazi MBED-a

Analogni objekt zauzima decimalni broj između 0,0 i 1,0 koji se prosljeđuje na
izlaz (tj. pin 18). Stvarni izlazni napon na pinu 18 je između 0V i 3,3V, a decimalni
broj koji je prosljeđen izlazu 'postaje' napon skaliran sa faktorom 3,3.

Vježba 4-3: Stepeničasti analogni izlazni napon

Izradite program i koristeći osciloskop, upoznajte se sa upotrebom analognog


izlaza.

#include "mbed.h"
int main() {
AnalogOut Aout(p18);
while(1) {
Aout=0.25; // 0.25*3.3V = 0.825V
wait(0.1);
Aout=0.5; // 0.5*3.3V = 1.65V
wait(0.1);
Aout=0.75; // 0.75*3.3V = 2.475V
wait(0.1);
}
}
Slika 48: Primjer cpp koda sa upotrebom analognog izlaza

Na slici 49 prikazan je Y-t oscilogam dobiven korištenjem programa iz primjera.

50
Analogni ulazi i izlazi MBED-a

Slika 49 Y-t oscilogram analognog izlaza

51
Analogni ulazi i izlazi MBED-a

Vježba 4-4: Pilasti izlazni analogni napon

Napravite signal pilastog valnog oblika i snimite ga osciloskopom.

//Sawtooth waveform on DAC output to view on oscilloscope

#include "mbed.h"
AnalogOut Aout(p18);
float i;
int main() {
while(1)
{
for (i=0;i<1;i=i+0.1)
{
Aout=i;
wait(0.001);
}
}
}
Slika 50: Primjer cpp koda sa signalom pilastog valnog oblika

Slika 51 Pilasti valni oblik

Vježba 4-5: Glatki pilasti izlazni analogni napon

Promijenite kod i kreirajte signal glatkog pilastog valnog oblika, uvođenjem finijih
koraka u petlju.
52
Analogni ulazi i izlazi MBED-a

Vježba 4-6: Trokutasti izlazni analogni napon

Kreirajte signal glatkog trokutastog valnog oblika uvođenjem druge petlje koja broji
unatrag.

Slika 52 Trokutasti valni oblik

53
5. Pulsno-širinska modulacija

5.1. Pojam širinsko-pulsne modulacije

Pulsno-širinska modulacija (PWM) je jednostavna metoda korištenja pravokutnog


digitalnog oblika kojim se upravlja analognom varijablom, u večini slučajeva
naponom ili strujom. PWM se koristi kao jeftinija alternativa DAC konverziji u
različitim granama tehnike, tj. od komunikacija do automatskog upravljanja.

Perioda se obično održava konstantnom, a širina pulsa (vrijeme izlaza u logičkoj


„1“) se mijenja. Aktivni ciklus8 je dio vremena u kojem je puls u stanju "1", a izražava
se u postocima:

Aktivni ciklus = 100% * (pulsno "1" vrijeme) / (trajanje periode)

Slika 53: Aktivni ciklus

Aktivni ciklus toka PWM-a, ima svoju srednju vrijednost, koja je na slici 53
prikazana isprekidanom linijom. Ako je "1" vrijeme male vrijednosti, srednja
vrijednost je niska; a ako je "1" vrijeme velike vrijednosti, srednja vrijednost je visoka.
Upravljanjem aktivnog ciklusa, upravlja se prosječna vrijednost.

Srednja vrijednost napona može se dobiti iz PWM toka upotrebom


niskopropusnog filtera. U ovom slučaju (slika 54), ako su PWM frekvencija i
vrijednosti otpora (R) i kapaciteta (C) na odgovarajući način izabrani, Uiz postaje
analogni izlaz. U praksi, ova vrsta filtriranja nije uvijek potrebna jer mnogi fizikalni

8 Duty cycle (eng.) - aktivni ciklus ili faktor upravljanja

54
sustavi imaju odgovarajuće karakteristike koje, u stvarnosti, djeluju kao
niskopropusni filteri.

Slika 54: Niskopropusni filter

U drugom slučaju PWM signalom može se upravljati sklopkom koja uključuje


struju kroz induktivno-otporni teret (tipično namot motora) kao što je prikazano na
slici 55. Djelovanje induktiviteta je takvo da usrednjava struju Iiz koja teče kroz teret.

VDD

Uul D

Iiz

Slika 55 Induktivno- radni teret

5.2. Pulsno-širinska modulacija na MBED-u

PwmOut sučelje se koristi za kontroliranje frekvencije i aktivnog omjera9 (omjer


trajanje pozitivne i negativne amplitude) niza digitalnih impulsa. Na MBED je

9 Mark-space ratio (eng.) - aktivni omjer

55
moguće spojiti 6 PWM izlaza (pinovi 21-26). Svi PwmOut izlazi dijele isto vrijeme
periode (slika 56).

Slika 56: Pulsno-širinska modulacija na MBED-u

Dostupne funkcije iz biblioteke prikazane su u tablici:

Tablica 8: Funkcija pulsno-širinske modulacije

PwmOut Digitalni izlaz pulsno-širinske modulacije


Funkcije Korištenje
PwmOut Stvori objekt PwmOut spojen na definirani pin
write Postavi iznos aktivnog omjera (duty cycle), specificiran kao
normalizirani realni broj (0,0 – 1,0)
read Pročitaj postavljen iznos aktivnog omjera (duty cycle), izmjeren
kao normalizirani realni broj (0,0 – 1,0)
period Postavi periodu T PWM-a, specificiranu u sekundama (float),
period_ms millisekundama (int) ili mikrosekundama (int), a pritom ne
period_us mijenjajući iznos aktivnog omjera
pulsewidth Postavi PWM širinu impulsa t“1“, specificiranu u sekundama
pulsewidth_ms (float), millisekundama (int) ili mikrosekundama (int), a pritom ne
pulsewidth_us mijenjajući iznos periode
operator= skraćenica za pisanje
operator float() skraćenica za čitanje

56
Vježba 5-1:Dvostruki PWM izlaz

Kreirajte PWM signal koji se može vidjeti na osciloskopu. Sljedeći cpp kod (slika
57) će generirati puls od 100 Hz sa aktivnim ciklusom od 80% na pinu p21 te 20%
na pinu p22.

#include "mbed.h"
PwmOut PWM1(p21);
PwmOut PWM2(p22);
int main() {
PWM1.period(0.010); // set PWM period to 10 ms
PWM1=0.8; // set duty cycle to 80%
PWM2=0.2; // set duty cycle to 20%
}
Slika 57: Primjer cpp koda za PWM signal

Na slici 58 prikazan je oscilogram PWM signala, na kanalu 1 je izlaz na pinu p21


(80% aktivni ciklus), a na kanalu 2 (na oscilogamu dolje) je izlaz da pina p22,

Slika 58: Vrijednosti aktivnog ciklusa od 20% i 80%

57
Vježba 5-2: Upravljanje LED osvjetljenjem pomoću PWM-a

Navedeni primjer cpp koda na slici 59 koristi signal pulsno-širinske modulacije


za povećavanje i smanjivanje svjetline LED diode spojene na pin 21 preko serijskog
otpornika od 1 Kohm.

// host terminal LED dimmer control

#include "mbed.h"
Serial pc(USBTX, USBRX); // tx, rx
PwmOut PWM1(p21);
float brightness=0.0;

int main() {
PWM1.period(0.010); // set PWM period to 10 ms
PWM1=0.8; // set duty cycle to 80%

pc.printf("Control of LED dimmer by host terminal\n\r");


pc.printf("Press 'u' = brighter, 'd' = dimmer\n\r");

while(1) {
char c = pc.getc();
wait(0.001);
if((c == 'u') && (brightness < 1.0)) {
brightness += 0.1;
PWM1= brightness;
}
if((c == 'd') && (brightness > 0.0)) {
brightness -= 0.1;
PWM1= brightness;
}
pc.printf("%c %1.3f \n \r",c,brightness);
}
}
Slika 59: Upravljanje LED osvjetljenjem pomoću PWM-a

Program zahtjeva korištenje "host" priključne aplikacije za komunikaciju sa


vrijednošću svjetline LED-a, u ovom primjeru pomoću tipaka 'u' i 'd'. Na PC računalu
potrebno je aktivirati aplikacijju Tera Term (vidi sliku 43).

Upravljanje pozicijom servo motora pomoću PWM-a

Servo motor je uređaj koji omogućuje preciznu kontrolu kutnog položaja, brzine i
ubrzanja. Primjenjuje se primjerice u radijski upravljanim automobilima i
zrakoplovima za pozicioniranje kontrolera upravljača, dizala i kormila. Slanjem PWM
58
signala osovina servo motora može biti postavljena u određene kutne pozicije. Sve
dok na ulaznoj liniji postoji modulirani signal, servo će zadržavati kutnu poziciju
osovine. Promjenom moduliranog signala, mijenja se kutna pozicija osovine.

Dijagram na slici 60 prikazuje PWM vremenske uvjete za kontrolu pozicije servo


motora između 0 i 180 stupnjeva.

Slika 60: Upravljanje pozicijom servo motora pomoću PWM-a

Servo zahtjeva veće struje nego što USB standard omogućuje, stoga je bitno da
je servo napajan koristeći vanjsko napajanje od 4 baterije AA (6V).

Slika 61: Vanjsko napajanje servo motora

59
Vježba 5-3: Upravljanje servo motorom

: Spojite servo motor na MBED kako je naznačeno. Postavite PWM period na 20


ms. Pokušajte niz različitih aktivnih ciklusa i promatrajte pozicioniranje servo motora

Slika 62: Spajanje servo motora na MBED

Vježba 5-4: Upravljanje servo pozicije potenciometrom

Skalirajte ulazne vrijednosti tako da ukupan raspon podešavanja potenciometra


omogućuje promjenu ukupnog raspona10 pozicije servo motora

Vježba 5-5: Proizvodnja piezo zvučnog signala

Izlaz PWM-a može se spojiti na piezo zvučnik kako bi se proizveo zvuk. Ako je
aktivni ciklus postavljen na 50%, PWM frekvencija određuje visinu reproduciranog
zvuka

Spojite piezo zvučnik na jedan od PWM izlaza. Postavite aktivni ciklus na 50% i
frekvenciju na 500 Hz. Uvjerite se da PWM-om može biti stvoren zvuk. Promijenite
frekvenciju PWM izlaza i uočite razliku zvuka prilikom promjena frekvencije.

10 Full range (eng.) - ukupni raspon

60
Vježba 5-6: Hrvatska himna

Iskoristit ćemo PWM da bi odsvirali hrvatsku himu. Na slici 64 prikazane su note


hrvatske himne. Svaka nota obilježena je frekvencijom te trajanjem note.
Frekvencija pojedine note određuje periodu T PWM signala, a trajanje note je
vrijeme čekanja do iduće promjene frekvencije. Piezo zvučnik ili zujalo (eng, buzzer)
spojem je na pin 21 prema 0V (GND), prikaz na slici 64.

Slika 63: Note hrvatske himne

61
Slika 64 Piezo zvučnik na PWM izlazu

#include "mbed.h"
PwmOut buzzer(p21);
/frekvencija melodije "Lijepa naša"
float frequency[]={659.3, 659.3, 659.3, 587.3, 587.3, 523.3, 523.3, 392, 349.2, 329.6, 349.2,
392, 440, 392, 349.2, 329.6, 349.2, 392, 659.3, 659.3, 659.3, 587.3, 587.3, 523.3, 523.3, 392,
349.2, 329.6, 349.2, 392, 440, 493.9, 493.9, 587.3, 523.3, 493.9, 493.9, 493.9, 440, 493.9,
493.9, 523.3, 587.3, 493.9, 587.3, 587.3, 587.3, 587.3, 587.3, 523.3, 493.9, 440, 392, 659.3,
659.3, 659.3, 587.3, 587.3, 523.3, 523.3, 392, 349.2, 329.6, 349.2, 392, 440, 493.9, 493.9,
587.3, 523.3, 0};

//trajanje nota
float beat[]={1, 1, 1.5, 0.5, 0.5, 0.5, 1, 2, 0.5, 0.5, 0.5, 0.5, 2, 0.5, 0.5, 0.5, 0.5, 2, 1, 1, 1.5, 0.5,
0.5, 0.5, 1, 2, 0.5, 0.5, 0.5, 0.5, 2, 0.5, 0.5, 1, 2, 1, 1, 1.5, 0.5, 1, 0.5, 0.5, 1.5, 0.5, 0.5, 0.5, 0.5,
0.5, 1, 1, 1, 1, 2, 1, 1, 1.5, 0.5, 0.5, 0.5, 1, 2, 0.5, 0.5, 0.5, 0.5, 2, 0.5, 0.5, 1, 2, 0.5};
int main() {
while (1) {
for (int i=0; i<=70; i++) {
buzzer.period(1/(frequency[i])); // set PWM period
buzzer=0.5; // set duty cycle
wait(0.5*beat[i]); // hold for beat period
}}}
Slika 65: Primjer cpp koda za upotrebu piezo zvučnika

Vježba 5-7: Sviranje piezo zvučnikom

Eksperimentirajte s nekom drugom melodijom koja ima note drugih frekvencija i


drugačije duljine trajanja

62
6. Tajmeri i prekidi

6.1. Upravljanje vremenom i događajima u ugrađenim


sustavima

Mnogi ugrađeni sustavi zahtjevaju vremensko upravljanje visoke preciznosti, te


sposobnost da trenutno reagiraju u kritičnim slučajevima. Npr. video kamera mora
snimiti slikovne podatke u specifičnim vremenskim intervalima, sa visokim stupnjem
preciznosti, kako bi se omogućila besprijekorna reprodukcija. Automobilski sustav
mora biti u mogućnosti trenutno odgovoriti na senzor detekcije sudara, kako bi se
aktivirao putnikov zračni jastuk.

Prekidi omogućuju da softverski procesi budu zaustavljeni tijekom vremena


izvršavanja programskih procesa višeg prioriteta. Prekidne rutine mogu biti
programirane za izvršavanje vremenskih događaja ili pak događaja koje uzrokuje
vanjska pobuda u hardveru. Rutine čije je izvršavanje inicirano vanjskom pobudom
u hardveru (npr. klik miša ili ulazni signal iz drugog programa) nazivaju se 'rutine
upravljane događajem' (eng. event driven).

Upoznavanje s tajmerima11

Prekidi u ugrađenim sustavima se mogu promatrati kao funkcije koje su pozivane


specifičnim događajima, a ne izravno iz koda programa. Najjednostavniji tip prekida
je onaj u kojem se automatski povećava vrijednost brojača u periodičkim
vremenskim intervalima, stoga većina mikroupravljača ima ugrađene tajmere ili
'real-time' prekide koji su korišteni u tu svrhu. Kod glavnog programa se izvršava u
specifičnim vremenskim intervalima. Primjerice, može se postaviti neke dijelove
softvera da djeluju svakih 10ms, a druge dijelove svakih 100ms; to se naziva
'programiranje prema rasporedu' (eng. scheduled programming).

11 Timer (eng.) - tajmer, brojač

63
Za obavljanje 'programiranja prema rasporedu' koristi se MBED Timer objekt.

Tablica 9 MBED Timer objekt

Timer Tajmer opće namjene


Funkcije Korištenje
start Pokretanje tajmera
stop Zaustavljanje tajmera
reset Postavljanje tajmera u 0
read pročitaj vrijeme koje je proteklo u s
read_ms pročitaj vrijeme koje je proteklo u ms
read_us pročitaj vrijeme koje je proteklo u us

Vježba 6-1: Jednostavna rutina tajmera

Kreirajte izlazni kvadratni val (puls) koristeći 'programiranje prema rasporedu' i


provjerite točnost mjerenja vremena osciloskopom.

Slika 66: Jednostavna rutina tajmera

64
#include "mbed.h"

Timer timer1; // define timer object


DigitalOut output1(p5); // digital output
void task1(void); // task function prototype

//*** main code


int main() {
timer1.start(); // start timer counting
while(1) {
if (timer1.read_ms()>=200) // read time in ms
{
task1(); // call task function
timer1.reset(); // reset timer
}
}
}

void task1(void){ // task function


output1=!output1; // toggle output
}
Slika 67: Primjer cpp koda koji koristi tajmer

Korištenje više tajmera

Uporabom 'programiranja prema rasporedu' često je potrebno izvršiti različite


dijelove koda različitom brzinom, tj. tempom. Razmotrimo primjer iz automobilskog
sustava. Svjećice za paljenje na benzinskom motoru, ventili i sustav za ubrizgavanje
goriva moraju biti kontrolirani i izvođeni na velikim brzinama, čak do 1ms ili manje,
s obzirom da se motor vrti do 8000 okretaja u minuti. Sustav praćenja razine
spremnika goriva mora prijaviti nisku razinu goriva; u ovom slučaju potrebna brzina
izvođenja je otprilike 1000ms. Nema smisla izvršavati oba sustava (sustav za
upravljanje ubrizgavanja i sustav za upravljanje razinom goriva) istom brzinom.
Stoga, koriste se programi za sinkronizaciju kojima se poboljšava učinkovitost
sustava.

Vježba 6-2: Korištenje dva tajmera

: Dodajte drugi tajmer koji radi drugačijom brzinom. Da bi se provjerila točnost


izvršavanja oba tajmera, iskoristite LED diodu ili osciloskop na MBED pinovima.

65
Potrebno je definirati drugi tajmer objekt, digitalni izlaz i zadatak funkcije
prototipa.

//*** main code


int main() {
timer1.start(); // start timer1 counting
timer2.start(); // start timer2 counting
while(1) {
if (timer1.read_ms()>=200) // read time
{
task1(); // call task1 function
timer1.reset(); // reset timer
}
if (timer2.read_ms()>=1000) // read time
{
task2(); // call task2 function
timer2.reset(); // reset timer
}
}
}

//*** task functions


void task1(void){
output1=!output1; // toggle output1
}
void task2(void){
output2=!output2; // toggle output2
}
Slika 68: Primjer cpp koda koji koristi 2 tajmera

Specifičnosti tajmerskih prekida

-Koristeći 'programiranje prema rasporedu', potrebno je biti oprezan sa količinom


koda i vremenom koje je potrebno za izvršavanje koda, tj. programa. Primjerice, ako
je potrebno zadatak pokrenuti svakih 10 ms; izvršavanje tog zadatka mora trajati
manje od 10 ms, jer u protivnom bi se prekoračilo vrijeme te sustav više ne bi bio
sinkroniziran. Količina koda ujedno određuje potrebnu brzinu procesora. Ponekad
je potrebno zadacima dodijeliti prioritete; npr. ako imamo dva zadatka za
izvršavanje, jedan od 1ms, drugi od 100ms (nakon što prođe 100 ms, oba će se
zadatka htjeti pokrenuti u isto vrijeme). To također znači da se pauza, čekanje ili
kašnjenje (tj. vremensko upravljanje 'glasovanjem' ili 'prozivanjem') ne može koristiti
u sklopu 'programiranja po rasporedu'.

66
6.2. Uporaba MBED 'Ticker' objekta

'Ticker' sučelje se koristi za postavljanje ponavljajućih prekida da uzastopno


pozivaju neku funkciju određenim taktom. Ranije, prilikom korištenja 'Timer' objekta,
postojao je zahtjev da kod glavnog programa kontinuirano analizira tajmer kako bi
se utvrdilo pravo vrijeme kada specifična funkcija mora biti izvršena. Prednost
'Ticker' objekta je da nije potrebno očitavati vrijeme, tako da se može izvršavati drugi
kod za vrijeme dok je 'Ticker' pokrenut u pozadini i poziva priloženu funkciju po
potrebi. MBED Ticker objekt također se koristi za obavljanje 'programiranja prema
rasporedu':

Tablica 10: Funkcija MBED Ticker

Ticker Ticker
Funkcija Korištenje
attach Pridjelite funkciju koja se treba pozvati pojavom tickera,
navođenjem intervala u sekundama
attach Pridjelite funkciju (člana objekta ili klase) koja se treba pozvati
pojavom tickera, navođenjem intervala u sekundama
attach_us Pridjelite funkciju koja se treba pozvati pojavom tickera,
navođenjem intervala u us
attach_us Pridjelite funkciju (člana objekta ili klase) koja se treba pozvati
pojavom tickera, navođenjem intervala u us
detach Odvojite funkciju

Vježba 6-3: Kvadratni izlazni signal uz primjenu 'Ticker'-a

Iskoristite dva 'Ticker'-a za stvaranje kvadratnog izlaznog vala.

Upotrijebite LED diodu ili osciloskop na MBED pinovima da bi se provjerila


ispravnost izvršavanja dvaju 'Ticker'-a. Koristite kod prikazan na slici 69.
67
#include "mbed.h"
Ticker flipper1;
Ticker flipper2;
DigitalOut led1(p5);
DigitalOut led2(p6);
void flip1() { // flip 1 function
led1 = !led1;
}
void flip2() { // flip 2 function
led2 = !led2;
}

int main() {
led1 = 0;
led2 = 0;
flipper1.attach(&flip1, 0.2); // the address of the
// function to be attached
// and the interval (sec)
flipper2.attach(&flip2, 1.0);
// spin in a main loop
// flipper will interrupt it to call flip
while(1) {
wait(0.2);
}
}
Slika 69: Primjer cpp koda koji koristi dva 'Ticker'-a

6.3. Hardverski prekidi

Mikroupravljači mogu biti podešeni za obavljanje specifičnih zadataka u slučaju


vanjskih hardverskih pobuda ili događaja. To omogućuje glavnom kodu pokretanje
i obavljanje zadataka, a prilikom pojave nekog fizičkog podražaja, program mijenja
uobičajeni slijed i 'skače' na izvršavanje određenih potprograma i funkcija. Prekidi
se koriste kako bi se u procesu izvođenja programa osigurali odgovarajući odzivi za
održavanje sustava. Jedini pravi nedostatak prekidnih sustava je detaljnost i
složenost programiranja kodnih struktura.

68
Tablica 11: Funkcija 'InterruptIn'

InterruptIn Prekidni ulaz


Funkcija Korištenje
InterruptIn Kreiraj funkciju InterruptIn povezanu na navedeni priključak
rise Pridjeli funkciju koja se poziva ako se desi rastući brid signala na
ulazu
rise Pridjeli funkciju (člana objekta ili klase) koja se poziva ako se desi
rastući brid signala na ulazu
fall Pridjeli funkciju koja se poziva ako se desi padajući brid signala
na ulazu
fall Pridjeli funkciju (člana objekta ili klase) koja se poziva ako se desi
padajući brid signala na ulazu
mode Postavi mod ulaznog priključka (pull-up, pull-down, pull-none)

Napomena: svaki digitalni ulaz može se koristiti kao prekid osim pinova 19 i 20

Vježba 6-4: Ispitivanje hardverskog prekida

Korištenjem MBED InterruptIn biblioteke, kreirajte program za uključivanje, tj.


paljenje LED diode svaki put kad digitalno tipkalo ulaza dođe u visoko stanje, tj. u
'1'.

#include "mbed.h"
InterruptIn button(p18); // Interrupt on digital pushbutton input p18
DigitalOut led1(p5); // digital out to p5

void toggle(void); // function prototype

int main() {
button.rise(&toggle); // attach the address of the toggle
} // function to the rising edge

void toggle() {
led1=!led1;
}
Slika 70: Primjer cpp koda za vježbu 6-4

Možda ćete primjetiti neke probleme u ovom jednostavnom programu, koji su


oni?

69
Utjecaj titranja na upravljanje prekidima

Vježba 6-4 ne radi sasvim kako se očekuje; moguće je da tipkalo prestane


reagirati ili se poremeti sinkronizacija sa LED diodom. To se događa zbog čestog
problema nazivanog 'bouncing', koji predstavlja 'titranje' ili 'poskakivanje' signala
tipkala ili prekidača. U trenutku kada se tipkalo pritisne, ne događa se 'čisto', tj.
trenutno prebacivanje iz stanja '0' u '1', već se javi neko kratkotrajno titranje, kao što
je prikazano na slici 71.

Slika 71: Utjecaj titranja na upravljanje prekidima

Stoga, lako je uočiti kako jedan pritisak na tipkalo može izazvati više prekida, a
time LED dioda može postati nesinkronizirana sa tipkalom. Zato je potrebno
'debounsirati' prekidač, tj. ukloniti neželjeno titranje signala koje može uzrokovati
prestanak sinkronizacije sa tajmerom.

Vježba 6-5: Titranje kontakta

Korištenjem MBED InterruptIn biblioteke, kreirajte program za uključivanje, tj.


paljenje LED diode svaki put kad digitalno tipkalo ulaza dođe u stanje '1'. Kako bi se
izbjegli višestruki prekidi, provedite 'debounce' brojač.

#include "mbed.h"
InterruptIn button(p18); // Interrupt on digital pushbutton input p18
DigitalOut led1(p5); // digital out to p5
Timer debounce; // define debounce timer
void toggle(void); // function prototype
int main() {
debounce.start();
button.rise(&toggle); // attach the address of the toggle
} // function to the rising edge
void toggle() {
if (debounce.read_ms()>200) // only allow toggle if debounce timer
led1=!led1; // has passed 200 ms
debounce.reset(); // restart timer when the toggle is performed
}
Slika 72: Primjer cpp koda za vježbu 6-5

70
Uklanjanjem neželjenog titranja signala pomoću različitih hardverskih i
softverskih metoda, sustav se ponaša kao da prekidač ima idealan odziv. Primjer
klasičnog hardverskog 'debounce'-ra su dva unakrsno spojena NI (eng. NAND)
logička sklopa koja čine jednostavan Set-Reset (SR) bistabil. Primjer softverskog
'debounce'-ra je 'samoodržavanje' tipkala, tj. ako se ulazni signal tipkala mijenja iz
'0' u '1', a pritom tipkalo ostane pritisnuto, tada se javljaju sekvencijalna ili uzastopna
učitavanja sklopke (stanje '1') koja je potrebno softverski ukloniti kako bi program
uspješno funkcionirao

Dodatne vježbe

Vježba 6-6: Kontrola signala tipkala osciloskopom

: Upotrebom osciloskopa, procijenite 'debounce' karakteristiku vašeg tipkala.


Koje je idealno 'debounce' vrijeme za vaše tipkalo? Imajte na umu da duže
'debounce' vrijeme smanjuje sposobnost brzog prebacivanja. Stoga, u slučaju ako
je potrebno brzo prebacivanje, tada je drugačija vrsta tipkala jedino rješenje.

Vježba 6-7: Paralelni rad tajmera i hardveskog prekida

: U programu iskombinirajte tajmer i hardverski prekid, kako bi se prikazalo da


upisani program i fizičkom pobudom upravljani program mogu funkcionirati zajedno.
Omogućite treptanje dviju LED dioda različitim brzinama, te omogućite da
hardverski prekid pokrene zvučni signal na zujalici, u slučaju ako je tipkalo pritisnuto.

71
7. Dizajn modula i tehnike programiranja

7.1. Razvoj naprednih ugrađenih sustava

Prilikom rada s velikim i multifunkcionalnim projektima, osobito je važno uzeti u


obzir dizajn i strukturu softvera. Nije moguće isprogramirati sve funkcionalnosti u
jednu petlju. Tehnike korištene u velikim multifunkcionalnim projektima ujedno i
olakšavaju pojedincima koji rade na brojnim projektima sličnog dizajna i redovito
ponavljaju korištenje koda. Razvoj ugrađenih sustava ubuhvaća:

kod koji je čitljiv, strukturiran i dokumentiran

kod koji može biti ispitan u modularnom obliku

alate koji prilikom ponovnog korištenja postojećeg koda skraćuju vrijeme


razvoja

mogućnost da više inženjera radi na jednom projektu

mogućnost da buduće nadogradnje budu izvršene

Postoje mnogobrojne C/C++ programske tehnike koje omogućuju da se projektni


zahtjevi zadovolje, tj. ispune.

Funkcije i potprogrami

Funkcija (ponekad se naziva i potprogram) je dio koda unutar većeg programa,


te obavlja određeni zadatak i neovisna je o glavnom kodu.

Slika 73: Pozivanje funkcije iz glavnog programa


72
7.2. Rad sa 7-segmentnim zaslonima

7-segmentni zaslon je zapravo skup od 8 LED dioda. Da bi se prikazao odabrani


i željeni broj, svaki LED priključak se povezuje na jedan digitalni izlaz MBED-a. Nižih
7 bitova upravlja segmentima displeja, a najviši bit kontrolira stanje LED diode DP
te omogućava korištenje decimalne točke u više-cifrenom displeju (slika 74).

Slika 74: 7-segmentni zaslon

Ako 7-segmentni zaslon spojimo na MBED kao što je prikazano na slici 68 uz


odgovarajuću kombinaciju izlaznih bitova možemo prikazati na zaslonu brojeve od
0 do 9 te upravljati decimalnom točkom. Na tablici 12 su prikazana stanja izlaza
(bajt složen od osam bitova digitalnih izlaza) i na taj način prikazana znamenka.

Tablica 12: Kodiranje izlaznog bajta za pogon 7-segmentnog zaslona

Izlazni bajt
ZNAMENKA
(p12, p11, p10, p9, p8, p7, p6, p5)
00111111 0
00000110 1
01011011 2
01001111 3
01100110 4
01101101 5
01111101 6
00000111 7
01111111 8
01101111 9

73
Slika 75: Spajanje 7-segmentnog zaslona sa MBED-om

Navedeni cpp kod na slici 76 koristi digitalni izlaz za svaki LED segment i mijenja
stanja (on/off) LED dioda, kako bi se prikazao broj 3.

#include "mbed.h"
DigitalOut A(p5);
DigitalOut B(p6);
DigitalOut C(p7);
DigitalOut D(p8);
DigitalOut E(p9);
DigitalOut F(p10);
DigitalOut G(p11);
DigitalOut DP(p12);

int main() {
A=1;
B=1;
C=1;
D=1;
E=0;
F=0;
G=1;
DP=0;
}

Slika 76: Primjer cpp koda za 7-segmentni zaslon

Iako prikazani primjer cpp koda djeluje složen, u izvršnom dijelu to je vrlo
jednostavna operacija, međutim:
74
definiran je velik broj digitalnih izlaza

za prikaz jednog broja (broj 3), svakom digitalnom izlazu je dodijeljena


njegova specifična vrijednost

Ovdje nastaje problem:

što ako jednostavno želimo promijeniti broj?

što ako želimo prikazati broj koji je dobiven kao rezultat kalkulacije ili
izračuna?

što ako nam je potrebno više znamenaka (decimalni brojevi ili brojevi s
deseticama, stoticama ili tisućicama) ?

75
Vježba 7-1 Ispitivanje 7-segmentnog zaslona

: Spojite 7-segmentni zaslon na MBED i provjerite dali navedeni primjer cpp koda
kontinuirano broji od 0-9.

// program code for Exercise 19

#include "mbed.h"
DigitalOut A(p5); // segment A
DigitalOut B(p6); // segment B
DigitalOut C(p7); // segment C
DigitalOut D(p8); // segment D
DigitalOut E(p9); // segment E
DigitalOut F(p10); // segment F
DigitalOut G(p11); // segment G
DigitalOut DP(p12); // segment DP

int main() {
while (1) { // infinite loop
A=1; B=1; C=1; D=1; E=1; F=1; G=0; DP=0; // set LEDs '0'
wait(0.2);
A=0; B=1; C=1; D=0; E=0; F=0; G=0; DP=0; // set LEDs '1'
wait(0.2);
A=1; B=1; C=0; D=1; E=1; F=0; G=1; DP=0; // set LEDs '2'
wait(0.2);
A=1; B=1; C=1; D=1; E=0; F=0; G=1; DP=0; // set LEDs '3'
wait(0.2);
A=0; B=1; C=1; D=0; E=0; F=1; G=1; DP=0; // set LEDs '4'
wait(0.2);
A=1; B=0; C=1; D=1; E=0; F=1; G=1; DP=0; // set LEDs '5'
wait(0.2);
A=1; B=0; C=1; D=1; E=1; F=1; G=1; DP=0; // set LEDs '6'
wait(0.2);
A=1; B=1; C=1; D=0; E=0; F=0; G=0; DP=0; // set LEDs '7'
wait(0.2);
A=1; B=1; C=1; D=1; E=1; F=1; G=1; DP=0; // set LEDs '8'
wait(0.2);
A=1; B=1; C=1; D=1; E=0; F=1; G=1; DP=0; // set LEDs '9'
wait(0.2);
}
}
Slika 77: Programski cpp kod za vježbu 7-1

Programski cpp kod može se pojednostaviti uporabom BusOut objekta. BusOut


objekt omogućuje nizu digitalnih izlaza zajedničko konfiguriranje i upravljanje.
Stoga, može se definirati BusOut objekt za 7-segmentni zaslon i postaviti bajt čija
će vrijednost odrediti prikaz odabranog broja na zaslonu.

76
Vježba 7-2: Ponovljeno ispitivanje kao na V7-1

Provjerite da li cpp kod na slici 78 obavlja istu funkciju kao i cpp kod iz prethodne
vježbe.

// program code for Exercise 20

#include "mbed.h"
BusOut Seg1(p5,p6,p7,p8,p9,p10,p11,p12); // ABCDEFGDP

int main() {
while (1) { // infinite loop
Seg1=0x3F; // 00111111 binary LEDs to '0'
wait(0.2);
Seg1=0x06; // 00000110 binary LEDs to '1'
wait(0.2);
Seg1=0x5B; // 01011011 binary LEDs to '2'
wait(0.2);
Seg1=0x4F; // 01001111 binary LEDs to '3'
wait(0.2);
Seg1=0x66; // 01100110 binary LEDs to '4'
wait(0.2);
Seg1=0x6D; // 01101101 binary LEDs to '5'
wait(0.2);
Seg1=0x7D; // 01111101 binary LEDs to '6'
wait(0.2);
Seg1=0x07; // 00000111 binary LEDs to '7'
wait(0.2);
Seg1=0x7F; // 01111111 binary LEDs to '8'
wait(0.2);
Seg1=0x6F; // 01101111 binary LEDs to '9'
wait(0.2);
}
}
Slika 78: Programski cpp kod za vježbu 7-2

Nedostaci korištenja navedene metode za kodiranje 7-segmentnih zaslona su:

ako postoji potreba dodavanja još jednog 7-segmentnog zaslona kako bi


se brojalo od 0-99, tada cpp kod postaje iznimno opširan i složen

ako se žele uvesti male i neznatne promjene izvršavanja programa (npr.


prikaz svakog trećeg broja ili promjena vremena brojanja), cpp kod je
potrebno uvelike izmijeniti

Zbog navedenog postoji bolji način za programiranje ove vrste funkcionalnosti


programa -> uporabom funkcija.

77
7.3. C funkcije

Ispravan način sintakse C funkcije prikazan je na slici 79:

Povratni_tip Ime _funkcije (tip_varijable_1 Ime_varijable_1, tip_varijable_2


Ime_varijable_2,,…)
{
... ovdje upisati C kod
... ovdje upisati C kod
…return varijabla povratnog tipa
}
Slika 79: Sintaksa C funkcije

Kao i varijable, sve funkcije je potrebno deklarirati na samom početku programa.


Deklaracijske odredbe funkcija se nazivaju 'prototipi'. Ispravan oblik prototipa
funkcije je isti kao i sama funkcija, tj. kako slijedi prema slici 80:

Povratni_tip Ime _funkcije (tip_varijable_1 Ime_varijable_1, tip_varijable_2


Ime_varijable_2,,…)

Slika 80: Oblik prototipa funkcije

Vježba 7-3: Dizajniranje C funkcije

: Koristeći 7-segmentni zaslon, dizajnirajte C funkciju koja prepoznaje ulaznu


brojevnu varijablu i vraća 8-bitnu vrijednost.

char SegConvert(char SegValue) { // function 'SegConvert'


char SegByte=0x00;
switch (SegValue) { //DPGFEDCBA
case 0 : SegByte = 0x3F;break; // 00111111 binary
case 1 : SegByte = 0x06;break; // 00000110 binary
case 2 : SegByte = 0x5B;break; // 01011011 binary
case 3 : SegByte = 0x4F;break; // 01001111 binary
case 4 : SegByte = 0x66;break; // 01100110 binary
case 5 : SegByte = 0x6D;break; // 01101101 binary
case 6 : SegByte = 0x7D;break; // 01111101 binary
case 7 : SegByte = 0x07;break; // 00000111 binary
case 8 : SegByte = 0x7F;break; // 01111111 binary
case 9 : SegByte = 0x6F;break; // 01101111 binary
}
78
return SegByte;
}

Slika 81: Primjer dizajniranja funkcije

Ova funkcija koristi C 'switch/case' naredbu koja se izvršava identično kao 'if'
naredba, ali sa zadanim mogućim uvjetima

Vježba 7-4: Izvršavanje C funkcije

: Provjerite da li cpp kod na slici 82, upotrebom SegConvert funkcije, provodi istu
funkcionalnost kao programi iz vježbe 7-1 i 7-2.

#include "mbed.h"
BusOut Seg1(p5,p6,p7,p8,p9,p10,p11,p12); // A,B,C,D,E,F,G,DP
char SegConvert(char SegValue); // function prototype

int main() { // main program


while (1) { // infinite loop
for (char i=0;i<10;i++) {
Seg1=SegConvert(i);
wait(0.2);
}
}
}
char SegConvert(char SegValue) { // function 'SegConvert'
char SegByte=0x00;
switch (SegValue) { //DPGFEDCBA
case 0 : SegByte = 0x3F;break; // 00111111 binary
case 1 : SegByte = 0x06;break; // 00000110 binary
case 2 : SegByte = 0x5B;break; // 01011011 binary
case 3 : SegByte = 0x4F;break; // 01001111 binary
case 4 : SegByte = 0x66;break; // 01100110 binary
case 5 : SegByte = 0x6D;break; // 01101101 binary
case 6 : SegByte = 0x7D;break; // 01111101 binary
case 7 : SegByte = 0x07;break; // 00000111 binary
case 8 : SegByte = 0x7F;break; // 01111111 binary
case 9 : SegByte = 0x6F;break; // 01101111 binary
}
return SegByte;
}
Slika 82: Primjer izvršavanja C funkcije

Vježba 7-5: Ponovna upotreba funkcija i promjena cpp koda

79
: Dodajte drugi 7-segmentni zaslon na priključke MBED-a p13-p20. Sada se
može ažurirati kod glavnog programa i pozvati SegConvert funkciju po drugi put,
kako bi se implementirao brojač koji broji od 0-99.

Slika 83: Dodavanje drugog 7-segmentnog zaslona na MBED

// main program code for Exercise 7-5


#include "mbed.h"
BusOut Seg1(p5,p6,p7,p8,p9,p10,p11,p12); // A,B,C,D,E,F,G,DP
BusOut Seg2(p13,p14,p15,p16,p17,p18,p19,p20);
char SegConvert(char SegValue); // function prototype

int main() { // main program


while (1) { // infinite loop
for (char j=0;j<10;j++) { // counter loop 1
Seg2=SegConvert(j); // tens column
for (char i=0;i<10;i++) { // counter loop 2
Seg1=SegConvert(i); // units column
wait(0.2);
}
}
}
}

// SegConvert function here...


Slika 84: Programski cpp kod za vježbu 7-5

Glavne značajke C funkcija

Funkcije se na jednostavan način mogu ponovno upotrebljavati, što znači da


inženjeri ne moraju ponovno pisati cpp kod svaki put kada se pokreće novi projekt.

80
U svakom programu postoji main() funkcija, kojom se definira kod glavnog
programa

Funkcije se mogu koristiti za:

obrađivanje i upravljanje podacima (mogu se unijeti vrijednosti


podataka u funkciju, koja vraća upravljane podatke natrag u glavni
program. Npr., kodiranje matematičkih algoritama, pregled tablica i
podatkovnih pretvorbi, kao i upravljačke značajke kojima je moguće
upravljanje na nekoliko različitih i paralelnih tokova podataka)

dizajniranje i osmišljavanje učinkovitog i lako upravljivog cpp koda

omogućavanje da više razvojnih inženjera razvijaju softverske značajke


samostalno i neovisno o drugima, pa je time omogućeno provođenje
modularnog kodiranja u praksi.

Izrada složenih MBED projekata sa funkcijama

Prije rasprave o modularnom kodiranju, bit će dizajniran napredni MBED projekt


koji koristi niz funkcija.

Vježba 7-6: Modularni MBED projekt

Napišite program koji čita dvoznamenkasti broj unešen na tipkovnici i ispisuje taj
broj na 7-segmentnom zaslonu.

Četiri prototipa funkcija su deklarirana prije funkcije glavnog programa:

void SegInit(void); // function to initialise 7-seg displays


void HostInit(void); // function to initialise the host terminal
char GetKeyInput(void); // function to get a keyboard input from the
terminal
char SegConvert(char SegValue); // function to convert a number to a 7-segment
byte
Slika 85: Definiranje prototipa funkcija

Koristi se MBED serijsko USB sučelje za komunikaciju sa računalom, i dva 7-


segmentna zaslona kao u primjeru vježbe 7-5. Potrebno je kreirati novi projekt i
unijeti sljedeći cpp kod (slika 86).

81
// main program code for Exercise 7-6

#include "mbed.h"
Serial pc(USBTX, USBRX); // comms to host PC
BusOut Seg1(p5,p6,p7,p8,p9,p10,p11,p12); // A,B,C,D,E,F,G,DP
BusOut Seg2(p13,p14,p15,p16,p17,p18,p19,p20); // A,B,C,D,E,F,G,DP

void SegInit(void); // function prototype


void HostInit(void); // function prototype
char GetKeyInput(void); // function prototype
char SegConvert(char SegValue); // function prototype

char data1, data2; // variable declarations

int main() { // main program


SegInit(); // call function to initialise the 7-seg displays
HostInit(); // call function to initialise the host terminal
while (1) { // infinite loop
data2 = GetKeyInput(); // call function to get 1st key press
Seg2=SegConvert(data2); // call function to convert and output
data1 = GetKeyInput(); // call function to get 2nd key press
Seg1=SegConvert(data1); // call function to convert and output
pc.printf(" "); // display spaces between 2 digit numbers
}
}

// add function code here...


Slika 86: Programski cpp kod za vježbu 7-6

Sljedeće funkcije se dodaju nakon koda glavnog programa:

// functions for Exercise 7-6

void SegInit(void) {
Seg1=SegConvert(0); // initialise to zero
Seg2=SegConvert(0); // initialise to zero
}

void HostInit(void) {
pc.printf("\n\rType two digit numbers to be displayed on the 7-seg display\n\r");
}

char GetKeyInput(void) {
char c = pc.getc(); // get keyboard data (note num. ascii range 0x30-0x39)
pc.printf("%c",c); // print ascii value to host PC terminal
return (c&0x0F); // return value as non-ascii (bitmask c with value 0x0F)
}

// copy SegConvert function here too...


Slika 87: Funkcije za vježbu 7-6

Također je potrebno kopirati kod za SegConvert funkciju.


82
7.4. Modularno programiranje

Velike projekte u C i C++ potrebno je podijeliti na nekoliko različitih datoteka jer


tako se uvelike poboljšava čitljivost i održavanje. Kod za ugrađeni sustav može imati
jednu C datoteku za kontrolu priključene periferije, a uz to još jednu datoteku za
kontrolu korisničkog unosa, te nema smisla kombinirati značajke ova dva koda u
istu izvornu datoteku. Ako se dio periferije ažurira, samo je njegov dio koda potrebno
promijeniti, dok ostale datoteke nije potrebno mijenjati

Modularno kodiranje koristi datoteke zaglavlja za pridruživanje višestrukih


datoteka zajedno. Datoteka 'main.cpp' koristi se za poziv i uporabu funkcija, koje su
definirane u specifičnim .cpp datotekama. Svaka .cpp datoteka treba imati
pridruženu deklaracijsku datoteku, koja se naziva 'datoteka zaglavlja'. Datoteke
zaglavlja imaju .h ekstenziju i obično sadržavaju samo deklaracije, tj. direktive
kompajlera, promjenjive deklaracije i funkcijske prototipe. Unutar C-a postoje
mnogobrojne datoteke zaglavlja koje se koriste za rukovanje i aritmetiku podatcima,
npr. 'math.h' se koristi za jednostavnije obavljanje trigonometrijskih funkcija. Za
potpuno razumijevanje pristupa modularnom kodiranju, potrebno je razumijeti način
na koji su programi prethodno obrađivani, sastavljeni i povezani, kako bi potom bila
konstruirana binarna izvršna datoteka za mikroupravljač.

83
Slika 88: Modularno programiranje

Najprije predprocesor gleda pojedine izvorne (.cpp) datoteke, te implementira i


poziva sve predprocesorske direktive i pridružene datoteke zaglavlja (.h).
Predprocesorske direktive označene su simbolom '#'.

Kompajler stvara objektnu datoteku za pojedini izvorni kod. Zatim se objektne


datoteke i datoteke iz biblioteke povezuju zajedno kako bi se generirala izvršna
binarna datoteka (.bin).

Direktiva #include često se koristi za poziv pretprocesora, kojim se uključuje svaki


kod ili izjava sadržana unutar vanjske datoteke zaglavlja. Prilikom poziva unaprijed
zadanih C datoteka zaglavlja, potrebno je staviti naziv datoteke u <>, primjerice kao
na slici 89:

#include <string.h>
Slika 89: Pozivanje unaprijed zadanih C datoteka zaglavlja

84
Prilkom pozivanja naših vlastitih datoteka zaglavlja, potrebno je staviti naziv
datoteka u navodnike, primjerice kao na slici 90:

#include "myfile.h"
Slika 90: Pozivanje vlastitih datoteka zaglavlja

Važno je napomenuti da #include djeluje na način 'izreži i zalijepi'. Ako su pozvani


"afile.h" i "bfile.h", a obje datoteke u sebi uključuju "cfile.h", postojat će dvije kopije
sadržaja datoteke "cfile.h". Kompajler će, stoga, vidjeti slučajeve višestrukih
deklaracija foobar-a i javit će grešku.

Slika 91: Prikaz pozivanja datoteka zaglavlja

Upotreba datoteka zaglavlja12

Pretprocesorska direktiva #ifndef koristi se kako bi se osiguralo da je kod


zaglavlja samo jednom pozvan povezivačem. #ifndef doslovno znači 'if not defined',
a u prijevodu 'ako nije definirano'. Pretprocesorske varijable mogu se definirati
(upotrebom #define) na početku datoteke zaglavlja, te se zatim samo poziva kod
zaglavlja ako varijabla nije prethodno definirana. Ovim načinom kôd zaglavlja je
pozvan samo jednom za povezivanje. Stoga se za vježbu preporuča korištenje
predloška za datoteke zaglavlja prikazanog na slici 92.

12 Header file (eng.) - datoteka zaglavlja

85
// template for .h file

#ifndef VARIABLENAME_H // if VARIABLENAME_H has not previously been defined


#define VARIABLENAME_H // define it now

// header declarations here…


#endif // end of the if directive
Slika 92: Predložak za datoteke zaglavlja

Datoteke zaglavlja obično sadrže #include naredbe kojima se poziva i upravlja


ugrađenim C bibliotekama, odnosno funkcijskim bibliotekama. Također, sadrže i
funkcijske prototipe. Osim toga, potrebno je uključiti pojedinosti svih MBED objekata
koje su potrebne za vanjsko upravljanje, tj. rukovanje nad izvornom datotekom.
Datoteka nazvana 'functions.cpp' može definirati i koristiti digitalni izlazni objekt
nazvan 'RedLed'. Ako želimo da neke druge izvorne datoteke manipuliraju sa
'RedLed'-om, potrebno je također definirati objekt u datoteci zaglavlja koristeći
vanjski ili eksterni način, kako je prikazano na slici 93.

// functions.h file

#ifndef FUNCTIONS_H // if FUNCTIONS_H has not previously been


defined
#define FUNCTIONS_H // define it now

extern DigitalOut RedLed; // external object RedLed is defined in


functions.cpp
// other header declarations here…
#endif // end of the if directive
Slika 93: Vanjsko upravljanje nad izvornom datotekom

Važno je spomenuti, ovdje nije potrebno definirati specifične MBED priključke, jer
oni su već specificirani u objektnoj deklaraciji u 'functions.cpp'

Vježba 7-7: Projekt sa više izvornih datoteka

Napravite isti projekt kao u vježbi 7-6 (program učitava dvoznamenkasti broj
unešen na tipkovnici, te ga ispisuje na 7-segmentnom zaslonu) upotrebom
modularne tehnike kodiranja, tj. sa više izvornih datoteka.

Potrebne su sljedeće datoteke: main.cpp - sadrži funkciju glavnog programa;


hostIO.cpp - sadrži funkcije i objekte za upravljanje host terminalom;
SegDisplay.cpp - sadrži funkcije i objekte za izlaz 7-segmentnog zaslona.

86
Potrebne su i sljedeće datoteke zaglavlja: HostIO.h, SegDisplay.h, a prema
dogovoru, datoteci 'main.cpp' nije potrebna datoteka zaglavlja. U projekt je potrebno
dodati nove datoteke (slika 94).

Slika 94: Dodavanje datoteka u projekt

Datoteka 'main.cpp' zadržava isti glavni funkcijski kod kao i prije, ali poziva
(#include) uključene nove datoteka zaglavlja.

// main.cpp file for Exercise 7-7

#include "mbed.h"
#include "HostIO.h"
#include "SegDisplay.h"

char data1, data2; // variable declarations

int main() { // main program


SegInit(); // call function to initialise the 7-seg
displays
HostInit(); // call function to initialise the host terminal
while (1) { // infinite loop
data2 = GetKeyInput(); // call function to get 1st key press
Seg2 = SegConvert(data2); // call function to convert and output
data1 = GetKeyInput(); // call function to get 2nd key press
Seg1 = SegConvert(data1); // call function to convert and output
pc.printf(" "); // display spaces between 2 digit numbers
}
}
Slika 95: Programski cpp kod za vježbu 7-7
87
Funkcije SegInit i SegConvert su dio datoteke 'SegDisplay.cpp', kao što su i
BusOut objekti pod nazivom 'Seg1' i 'Seg2'. Datoteka 'SegDisplay.cpp' stoga treba
biti kako slijedi:

// SegDisplay.cpp file for Exercise 7-7

#include "SegDisplay.h"
BusOut Seg1(p5,p6,p7,p8,p9,p10,p11,p12); // A,B,C,D,E,F,G,DP
BusOut Seg2(p13,p14,p15,p16,p17,p18,p19,p20); // A,B,C,D,E,F,G,DP

void SegInit(void) {
Seg1=SegConvert(0); // initialise to zero
Seg2=SegConvert(0); // initialise to zero
}

char SegConvert(char SegValue) { // function 'SegConvert'


char SegByte=0x00;
switch (SegValue) { //DP G F E D C B A
case 0 : SegByte = 0x3F; break; // 0 0 1 1 1 1 1 1 binary
case 1 : SegByte = 0x06; break; // 0 0 0 0 0 1 1 0 binary
case 2 : SegByte = 0x5B; break; // 0 1 0 1 1 0 1 1 binary
case 3 : SegByte = 0x4F; break; // 0 1 0 0 1 1 1 1 binary
case 4 : SegByte = 0x66; break; // 0 1 1 0 0 1 1 0 binary
case 5 : SegByte = 0x6D; break; // 0 1 1 0 1 1 0 1 binary
case 6 : SegByte = 0x7D; break; // 0 1 1 1 1 1 0 1 binary
case 7 : SegByte = 0x07; break; // 0 0 0 0 0 1 1 1 binary
case 8 : SegByte = 0x7F; break; // 0 1 1 1 1 1 1 1 binary
case 9 : SegByte = 0x6F; break; // 0 1 1 0 1 1 1 1 binary
}
return SegByte;
}
Slika 96: Datoteka 'SegDisplay.cpp' za vježbu 7-7

Datoteci 'SegDisplay.cpp' je potrebno pozvati datoteku zaglavlja 'SegDisplay.h'.


Datoteka 'SegDisplay.h' treba biti kako slijedi:

// SegDisplay.h file for Exercise 24

#ifndef SEGDISPLAY_H
#define SEGDISPLAY_H

#include "mbed.h"

extern BusOut Seg1; // allow Seg1 to be manipulated by other files


extern BusOut Seg2; // allow Seg2 to be manipulated by other files

void SegInit(void); // function prototype


char SegConvert(char SegValue); // function prototype

#endif
Slika 97: Datoteka 'SegDisplay.h' za vježbu 7-7
88
Funkcije DisplaySet i GetKeyInput su dio datoteke 'HostIO.cpp', kao što je i objekt
serijskog USB sučelja pod nazivom 'pc'.

Datoteka 'HostIO.cpp' stoga treba biti kako slijedi:

// HostIO.cpp code for Exercise 7-7

#include "HostIO.h"
#include "SegDisplay.h" // allow access to functions and objects in
SegDisplay.cpp

Serial pc(USBTX, USBRX); // communication to host PC

void HostInit(void) {
pc.printf("\n\rType two digit numbers to be displayed on the 7-seg display\n\r");
}

char GetKeyInput(void) {
char c = pc.getc(); // get keyboard data (note numerical ascii range 0x30-
0x39) pc.printf("%c",c); // print ascii value to host PC terminal
return (c&0x0F); // return value as non-ascii (bitmask c with value 0x0F)
}
Slika 98: Datoteka 'HostIO.cpp' za vježbu 7-7

Datoteci 'HostIO.cpp' je potrebno pozvati datoteke zaglavlja 'HostIO.h' i


'SegDisplay.h'. Datoteka 'HostIO.h' treba biti kako slijedi:

// HostIO.h file for Exercise 7-7

#ifndef HOSTIO_H
#define HOSTIO_H

#include "mbed.h"
extern Serial pc; // allow pc to be manipulated by other files

void HostInit(void); // function prototype


char GetKeyInput(void); // function prototype

#endif
Slika 99: Datoteka 'HostIO.h' za vježbu 7-7

Vježba 7-8: Modularni projekt „Servo“

Kreirajte modularni projekt koji koristi host priključnu aplikaciju i servo


motor.Korisnik odabire ulaznu vrijednost između 1-9 koja pomiče servo motor u
određenu poziciju. Ulaz '1' pomiče servo motor ulijevo za 90 stupnjeva. Ulaz '9'

89
pomiče servo motor udesno za 90 stupnjeva. Brojevi između 1 i 9 pomiču servo
motor u relativni položaj. Ulaz '5' pomiče servo motor u centar, tj. u sredinu. Može
se iskoristiti funkcija GetKeyInput iz prethodne vježbe. Potrebno je kreirati 'look up'
tabličnu funkciju koja pretvara ulaznu vrijednost u razumnu vrijednost PWM aktivnog
ciklusa povezanu sa željenim servo položajem.

7.5. Kreiranje biblioteka

Biblioteka je skup izvornog koda, obično namjenjena za korištenje specifične


kompenente, sklopovske periferije ili funkcionalnosti.

Glavna ideja biblioteke je da se izradi i „spakuje“ nešto korisno da drugi


programeri ne moraju „ponovo izumiti kotač“ kada žele koristiti neku perifernu
jedinicu ili funkcionalnost. Pri tom se biblioteka može smatrati da je blok kojim se
gradi neki program. Biblioteka nije sam program odnosno nema main() funkciju, ali
može biti korisna i višekratno upotrebljiva komponenta programa.

Za usporedbu tu suneki od postojećih primjera:

Servo biblioteka služi za upravljanje R / C servo pogonom, sadrži Servo.h i


Servo.cpp datoteke. „Servo Hello World“ je program koji koristi ovu biblioteku za
upravljanje servo pogonom, sadrži main.cpp i Servo biblioteku.

Vidjet ćete da je servo biblioteka ponovno upotrebljiva komponenta, uključujući


API dokumentaciju kako bi se lakše koristila. Servo Hello World koristi ovu biblioteku
tako da programeru ostaje samo briga što želi učiniti sa servo pogonom

Pisanje koda za biblioteku

Dobar biblioteka ima jasnu svrhu, lijepo i čisto sučelje, i ne uključuje kôd koji služi
za neke druge svrhe - to je ono za što i je korisnički program.

Većina biblioteka zapravo nastaje na bazi nekog koda koji se već pokazao
korisnim, a zatim bude ponovno optimiran u vidu korisne klase ili skupa funkcija koje
se mogu ponovno upotrijebiti na više mjesta u programu, te se zatim konačno odvoji
tako da ga bilo koji program može uključiti i iskoristi. Pogledajmo kroz primjer u
nastavku kako bi to moglo funkcionirati….

90
Korak 1 – Refactoring (poboljšanje dizajna postojećeg koda)

Za početak, na slici 100 je prikazan primjer koda koji se dobio nakon uspješnog
programiranja:

#include "mbed.h"

DigitalOut pin(LED2);

int main() {
// do something...

// flash 5 times
for(int i=0; i<10; i++) {
pin = !pin;
wait(0.2);
}

// do something else

// flash 2 times
for(int i=0; i<4; i++) {
pin = !pin;
wait(0.2);
}

// do another thing
}
Slika 100: Primjer koda prije poboljšanja dizajna

Program može raditi to što smo htjeli, ali očito je da neki dijelovi koda rade slične
stvari, možda kao rezultat „copy-paste“ prijenosa bitova što smo smatrali korisnim.

Tako naš kod može postati kraći kao na slici 101:

#include "mbed.h"

DigitalOut pin(LED2);

void flash(int n) {
for(int i=0; i<n*2; i++) {
pin = !pin;
wait(0.2);
}
}

int main() {
// do something...

// flash 5 times
91
flash(5);

// do something else

// flash 2 times
flash(2);

// do another thing
}

Slika 101: Primjer koda nakon skraćivanja

Na prikazan način nismo promjenili funkcionalnost, međutim sam kod je sada


bolje strukturiran. Kratki pregled nekih prednosti:

• U slučaju da u logici treperenja postoji greška, ili je želimo promijeniti, to


se sad popravlja na jednom mjestu
• Komentar "flash n times" je sada suvišan! Izvorni kod govori sam za sebe

Korak 2 – Stvaranje klase

U primjeru kojeg koristimo, iako je logika treperenja stavljena u jednu funkciju, ali
ono što treperi (globalni pin) je fiksan. Mogli bi smatrati da bi bilo korisno da stvorimo
mogućnost treperenja na bilo kojem digitalnom izlazu.

Postoji nekoliko načina na koje to možemo učiniti:

• Kreirajte klasu za funkcionalnost, koja sadrži jedan vlastiti objekt


DigitalOut, tako da možemo stvoriti višekratne verzije na različitim
pinovima
• Stvorite funkciju kojoj možemo predati informaciju koji ppin treba treperiti
• Stvorite novu klasu, nasljednika od klase DigitalOut, kojoj treba dodati
funkcionalnost treperenja

Izabrat ćemo prvi način. Možda to za ovaj primjer nije najbolje rješenje, ali je u
praksi najčešće.

Stvorit ćemo klasu i nazvati je Flasher koja, kada je kreirana, postavlja DigitalOut
pin, te osigurava metodu treperenja na tom pinu kao što je prikazano na slici 102:

92
#include "mbed.h"

class Flasher {
public:
Flasher(PinName pin) : _pin(pin) {
// _pin(pin) means pass pin to the DigitalOut constructor
_pin = 0; // default the output to 0
}

void flash(int n) {
for(int i=0; i<n*2; i++) {
_pin = !_pin;
wait(0.2);
}
}

private:
DigitalOut _pin;
};

Flasher led(LED2);
Flasher out(p6);

int main() {
led.flash(5);
led.flash(2);
out.flash(10);
}

Slika 102: Stvaranje klase

Pomoću tog koda možemo stvoriti objekt Flasher povezan na izabrani pin, i
narediti mu da treperi. Naravno da pri tom možemo jednostavno stvoriti različite
bljeskalice na različitim izlaznim pinovima.
To jest sve malo kompleksnije, ali važno je naglasiti da taj uloženi dodatni napor
pretvaranja ovog korisnog koda u klasu rezultira jednostavnošću njegovog
korištenja u različitim programima.

Korak 3 – Odvajanje koda u datoteke

93
Zajedno sa trudom koji smo uložili da bi se ovaj kod mogao višekratno koristiti,
vjerojatno bismo htjeli olakšati njegovo uključivanje u druge programe. Da bismo to
učinili, možemo staviti kod u vlastite datoteke koje jednostavno mogu biti uključene
u druge programe.

U C jeziku možemo to učiniti stvaranjem datoteka zaglavlja koje se mogu uključiti


od strane drugog koda, tako da znamo što je raspoloživo (deklaracije) te izvorne
datoteke koje sadrže implementaciju koja generira kod (definicije).

Uobičajeno je da ako imamo klasu Flasher, tada ćemo stvoriti zaglavnu i izvornu
datoteku istog naziva; Flasher.h i Flasher.cpp (slike 103 i 104).

#ifndef MBED_FLASHER_H
#define MBED_FLASHER_H

#include "mbed.h"

class Flasher {
public:
Flasher(PinName pin);
void flash(int n);

private:
DigitalOut _pin;
};

#endif

Slika 103: Datoteka Flasher.h

#include "Flasher.h"
#include "mbed.h"

Flasher::Flasher(PinName pin) : _pin(pin) {


_pin = 0;
}

void Flasher::flash(int n) {
for(int i=0; i<n*2; i++) {
_pin = !_pin;
wait(0.2);
}
}
94
Slika 104:Datoteka Flasher.cpp

Osnovno znanje o C/C++ jeziku te pre-procesoru biti će potrebno da bi znali što


se događa u nastavku. Korištenje do sada naposanog koda zahtjeva da ga
uključimo sa oznakom #include „……..“ na početku programa koji ga treba koristiti.

Rezultirajući program, main.cpp datoteka prikazana je na slici 105:

#include "mbed.h"
#include "Flasher.h"

Flasher led(LED2);

int main() {
led.flash(5);
led.flash(2);
}

Slika 105: Primjer korištenja objekta iz biblioteke

Naš program koristi novo stvorenu funkcionalnost, bez potrebe da znamo kako
je ona kodirana.

7.6. Kako objaviti svoju biblioteku

Sada kada ste napisali neki dobar i funkcionakni kod, postavlja se pitanje kako
omogućiti i drugima da ga koriste? MBED prevoditelj je izgrađen tako da ima
ugrađenu podršku za biblioteke i omogućava da „zapakirate“ svoj kod i objavite ga
za sveopću upotrebu.

Iz prije pokazanog postupka dobili smo program koji može biti kao što je prikazan
na slici 106:

95
Slika 106: Izgled programa u razvojnom okruženju

Using the same convention that a class called Flasher should have a header file
Flasher.h, we suggest you make your library have the same name i.e. "Flasher".

Primjenjujući istu konvenciju po kojoj klasa nazvana „Flasher“ treba imati


zaglavnu datoteku „Flasher.h“, predlažemo da napravite biblioteku sa istim imenom,
tj. „Flasher“.

Da biste stvorili biblioteku, desnim klikom na svom programu, odaberite "New


Library ..." i upišite "Flasher"; to će dodati mapu u vašem programu, a vi ćete
primijetiti simbol kotačića na mapi što znači da je to zapravo biblioteka u načinu
uređivanja. Sada možete na mapu povući datoteke koje će biti dio biblioteke, pa
ćete dobiti prikaz na slici 107:

Slika 107: Stvaranje nove biblioteke „Flasher“

Sljedeći korak je objava biblioteke. Da biste to učinili jednostavno desnim klikom


označite biblioteku te izaberite "Publish Library...". Tražit će vas se da unesete opis,

96
pojedine oznake i određenu poruku koja je specifična za tu verziju biblioteke ( npr.
prva verzija, ispravljene greške). Nakon unosa pritisnite OK pa ćete dobiti poruku
kao na slici 108:

Slika 108: Objavljivanje biblioteke

Vaša biblioteka je sada živa! Možete ići na URL i vidjeti na web stranici
mbed.org, informirati svoje kolege! Također ćete vidjeti da je vaš projekt ažuriran:

Slika 109: Izmjena na projektu

97
8. Paralelni podaci i komunikacija

8.1. Upotreba paralelnih digitalnih izlaza sa BusOut


objektom

Digitalna sabirnica je sustav za prijenos podataka između komponenti, ili između


kontrolera. Sabirnice mogu biti:

paralelne (prenose podatke brojnim žicama) - PCI, paralelni ATA i


PCMCIA

serijske (prenose podatke redom na jednoj žici) - Ethernet, FireWire, USB,


I²C, SPI i drugi

BusOut sučelje se koristi za stvaranje niza paralelnih DigitalOut priključaka koji


može biti izražen kao jedna numerička vrijednost. BusOut sučelje koristi se za
postavljanje stanja izlaznih pinova, a također i za očitavanje trenutnog izlaznog
stanja. Na MBED-u, četiri (4) integrirane LED diode koriste se za kreiranje BusOut
sučelja, te su posebno konfigurirane za rad bez potrebe za dodatnim žicama ili
spojevima. MBED također posjeduje 26 digitalnih IO priključaka (pinovi 5-30) koji
mogu biti konfigurirani kao digitalna sabirnica za korištenje sa BusOut i BusIn
sučeljima. BusOut funkcije iz biblioteke prikazane su u tablici 10:

Tablica 13: Funkcija digitalne izlazne sabirnice

BusOut Digitalna izlazna sabirnica


BusOut stvori objekt BusOut povezan sa definiranim izlaznim pinovima
write postavi vrijednost na izlaz sabirnice
read čita postavljeni izlaz na sabirnici
operator= skraćenica za pisanje
operator int() skraćenica za čitanje

Digitalni izlazi mogu se koristiti za promjenu stanja integriranih LED dioda u


određenom redoslijedu.

Prikazani cpp kôd na slici 110 koristi se da generira svjetlo koje se kreće
horizontalno preko 4 integrirane LED diode. Kôd je jednostavan, ali bi mogao postati
poprilično složen ako bi postojao zahtjev za više izlaza, ili obavljanje većeg broja
izmjena on/off stanja LED dioda.
98
#include "mbed.h"

DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);

int main() {
while(1) {
led1 = 1;
led2 = 0;
led3 = 0;
led4 = 0;
wait(0.25);
led1 = 0;
led2 = 1;
led3 = 0;
led4 = 0;
wait(0.25);
led1 = 0;
led2 = 0;
led3 = 1;
led4 = 0;
wait(0.25);
led1 = 0;
led2 = 0;
led3 = 0;
led4 = 1;
wait(0.25);
}
}
Slika 110: Primjer cpp koda kojim se upravlja sa integriranim diodama

99
Vježba 8-1: „Knightrider“ LED efekt

Korištenjem digitalnih izlaza, kreirajte program za izradu "Knightrider"13 LED


efekta na integriranim LED diodama.

#include "mbed.h"
DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);

int main() {
while(1) {
led1 = 1; led2 = 0; led3 = 0; led4 = 0;
wait(0.25);
led1 = 0; led2 = 1; led3 = 0; led4 = 0;
wait(0.25);
led1 = 0; led2 = 0; led3 = 1; led4 = 0;
wait(0.25);
led1 = 0; led2 = 0; led3 = 0; led4 = 1;
wait(0.25);
led1 = 0; led2 = 0; led3 = 1; led4 = 0;
wait(0.25);
led1 = 0; led2 = 1; led3 = 0; led4 = 0;
wait(0.25);
}
}
Slika 111: 'Knightrider' LED efekt upotrebom digitalnih izlaza

13 'Knightrider' LED efekt - svjetlosni filmski efekt iz 80-ih

100
Vježba 8-2: „Knightrider“ LED efekt sa BusOut objektom

Korištenjem BusOut objekta, kreirajte program za izradu "Knightrider" LED efekta


na integriranim LED diodama.

#include "mbed.h"

BusOut myleds(LED4, LED3, LED2, LED1);


char x=1;
int main() {
while(1) {
for(int i=0; i<3; i++) { // x = a << b then x = a*2^b;
x = x << 1; // x=1,2,4,8 or x=0001,0010,0100,1000
myleds=x; // sweep left
wait(0.2);
}
for(int i=0; i<3; i++) { // x = a >> b then x = a/2^b;
x = x >> 1; // x=8,4,2,1 or x=1000,0100,0010,0001
myleds=x; // sweep right
wait(0.2);
}
}
}
Slika 112: 'Knightrider' LED efekt upotrebom BusOut objekta

'Shift' operatori, << i >>, koriste se za množenje i dijeljanje sa dva.

101
8.2. Rad s paralelnim LCD zaslonom

Na vježbama se koristi 16x2 znakovni LCD zaslon prikazan na slici 113 ili 16x1
znakovni zaslon GDM1601, međutim postoje mnogobrojni slični LCD zasloni iste
hardverske konfiguracije i funkcionalnosti.

Slika 113: LCD zaslon 16x2

Da bi se LCD povezao potrebno je ispuniti sljedeće uvjete:

hardverska integracija: potrebno je spojiti LCD na odgovarajuće MBED


priključke

korištenje biblioteke TextLCD

Hardverska integracija

LCD zaslon ima 16 priključaka prikazanih u tablici 14.

Tablica 14: Priključci LCD zaslona

Priključak br. Naziv priključka Funkcija


1 VSS Napajanje (GND)
2 VDD Napajanje (5V)
3 V0 podešenje kontrasta
4 RS signal odabira registra
5 R/W čitaj/piši
6 E signal omogućenja
7 DB0 sabirnica podataka bit 0
8 DB1 sabirnica podataka bit 1
9 DB2 sabirnica podataka bit 2
10 DB3 sabirnica podataka bit 3
11 DB4 sabirnica podataka bit 4
12 DB5 sabirnica podataka bit 5
13 DB6 sabirnica podataka bit 6
102
14 DB7 sabirnica podataka bit 7
15 A pozadinsko osv. (5V)
16 K pozadinsko osv. (GND)

Zaslon se inicijalizira slanjem kontrolnih uputa relevantnim konfiguracijskim


registrima LCD-a. To se postiže postavljanjem RS, R/W i E u stanje 'low' (stanje '0'),
te zatim slanjem točnih podataka do bitova DB0-DB7. Koristi se LCD u 4-bitnom
modu, što znači da je potrebno koristiti samo zadnja 4 bita podatkovne sabirnice
(DB4-DB7). To znači da je moguće kontrolirati LCD sa samo 7 digitalnih linija, za
razliku od 8-bitnog moda gdje je potrebno 11 digitalnih linija. Nakon što je svaki
podatkovni bajt poslan, 'Enable' bit se postavlja u stanje 'on', te se ponovno vraća u
'off' stanje, što govori LCD-u da su podaci spremni i trebaju biti obrađeni. Kada se
LCD inicijalizira, zaslonski podaci (display data) mogu biti poslani postavljanjem RS
bita. Ponovno, nakon što je svaki bajt zaslonskih podataka poslan, 'Enable' bit treba
biti prebačen kako bi omogućio obradu podataka.

Potrebno je priključiti digitalni MBED priključak (pin) pojedinim LCD podatkovnim


pinovima. Potrebni su sljedeći izlazi:

jedan izlaz (4 bita), za zaslonske podatke LCD-a

3 izlaza, za upravljanje RS, R/W i E kontrolnim signalima

LCD zaslon se spaja sa MBED-om korištenjem konfiguracije sučelja prema tablici


15.

Tablica 15: Spajanje LCD zaslona sa MBED-om

MBED LCD
Naziv priključka Napajanje
priključak priključak
1 1 VSS 0V
39 2 VDD 5V
vanjski pot. 3 V0 cca 1V
19 4 RS
1 5 R/W 0V
20 6 E
21 11 DB4
22 12 DB5
23 13 DB6
24 14 DB7
39 15 A 5V
1 16 K 0V

103
Općenito, LCD se koristi samo u 'write' načinu rada (upis i promjena podataka),
stoga se R/W trajno spaja na masu (MBED pin 1). Na priključak 3 LCD-a spaja se
srednji izvod potenciometra (1 KΩ ili 10 KΩ) kojim sa podesi kontrast na displeju.
Kontrast se može podesiti i postavljanjem otporničkog djelila sa dva vanjska
otpornika (npr 150 Ω i 1 KΩ).

Hardver se postavlja na sljedeći način prikazan na slici 114:

Slika 114: Spajanje hardvera LCD zaslona i MBED-a

Korištenje MBED biblioteke TextLCD

MBED biblioteka 'TextLCD' naprednija je od jednostavnih funkcija koje su dosad


kreirane. TextLCD biblioteka samostalno obavlja složeno 'setiranje' LCD-a.
Također, definicija TextLCD-a govori LCD-ovom objektu koji priključci14 se koriste
za koje funkcije. Definiranje priključaka određeno je prema slici 115.

14 Priključak - pin

104
TextLCD lcd(int rs, int e, int d0, int d1, int d2, int d3);
Slika 115:Definiranje priključaka za biblioteku TextLCD

Potrebno je osigurati da su priključci definirani istim redoslijedom. Za postavke


prethodno opisanog hardverskog sklopa to će biti kao na slici 114.

TextLCD lcd(p19, p20, p21, p22, p23, p24);


Slika 116: Definiranje hardverskih priključaka za vježbu 8-4

Za prikaz znakova za LCD zaslonu koristi se naredba 'printf'.

Vježba 8-3: Prikaz teksta na LCD zaslonu korištenjem objekta iz biblioteke

Kompajlirajte primjer "Hello World" korištenjem MBED biblioteke, koja omogućuje


jednostavnije i brže korištenje alfanumeričkog LCD-a:

#include "mbed.h"
#include "TextLCD.h"
TextLCD lcd(p19, p20, p21, p22, p23, p24); //rs,e,d0,d1,d2,d3
// TextLCD lcd(p19, p20, p21, p22, p23, p24,TextLCD::LCD8x2);

int main() {
lcd.printf("Hello World!");
}
Slika 117: Primjer jednostavnijeg korištenja alfanumeričkog LCD-a

Potrebno je izvršiti unos MBED datoteke iz biblioteke15 'TextLCD.h' u projekt


(desni klik i odabrati 'import library'). Ova biblioteka posjeduje mnogobrojne
unaprijed napisane specifične funkcije LCD-a. Sljedeći link ukazuje na datoteke iz
biblioteke:

https://developer.mbed.org/cookbook/Text-LCD-Enhanced#new-features

Pokazivač se može pomicati u željeni položaj što omogućuje odabir pozicije koja
prikazuje podatke, primjer na slici 118.

lcd.locate(3,1);
Slika 118: Odabir željene pozicije na LCD zaslonu

15 Library file - biblioteka

105
Zaslon se rasprostire na 2 reda (0,1) i 16 stupaca (0-15). Funkcija lociranja
('lcd.locate') najprije definira stupce, a zatim redove. Navedeni primjer pomiče
pokazivač u 4. stupac i 2. red. Nakon naredbe lociranja, svaka 'printf' naredba
prikazuje se na novoj lokaciji pokazivača.

Također, moguće je očistiti zaslon naredbom:

lcd.cls();
Slika 119: Brisanje postojećeg sadržaja LCD zaslona

Za prikaz podataka na zaslonu koristi se standardna 'printf' naredba. Za prikaz


cjelobrojne vrijednosti na zaslonu, potrebno je deklarirati varijablu, pridružiti
vrijednost varijabli, te prikazati varijablu na zaslonu koristeći naredbu 'printf'.

x = 1028
lcd.printf("%i",x);

Slika 120: Prikaz cjelobrojne vrijednosti na LCD zaslonu

Imajte na umu, naredba "%i" se koristi za označavanje tipa izlazne varijable (u


ovom slučaju cijeli broj - integer), a zatim slijedi naziv varijable.

Vježba 8-4: Prikaz varijabli na LCD-u

Prikažite kontinuiranu varijablu brojanja na LCD zaslonu provođenjem kôda na


slici 121. Povećajte brzinu brojanja te istražite kako se položaj pokazivača mijenja
dok se vrijednost prebrojavanja povećava.

#include "mbed.h“
#include "TextLCD.h“
TextLCD lcd(p19, p20, p21, p22, p23, p24); // rs, e, d0, d1, d2, d3
//TextLCD lcd(p19, p20, p21, p22, p23, p24,TextLCD::LCD8x2);
int x=0;
int main() {
lcd.printf("LCD Counter");
while (1) {
lcd.locate(5,1);
lcd.printf("%i",x);
wait(1);
x++;
}
}
Slika 121: Prikaz varijabli na LCD-u

106
Vježba 8-5: Prikaz analognih ulaznih podataka na LCD-u

Prikažite analognu vrijednost na zaslonu.

Potrebno je koristiti potenciometar kako bi se omogućio analogni ulaz. Varijabla


analognog ulaza ima varirajuću vrijednost između '0' i '1', gdje '0' je 0V, a '1'
predstavlja 3,3V. Za prikaz analogne ulazne vrijednosti u postocima između
0-100%, potrebno je pomnožiti njezinu vrijednost sa 100. Kako bi se zaslon
kontinuirano automatski ažurirao, koristi se beskonačna petlja. Stoga je potrebno
očistiti zaslon te dodati vremensku odgodu kojom se podešava frekvencija
ažuriranja.

Potrebno je dodati stavke prikazane na slici 122 u 'main.cpp', a zatim program


prevesti i pokrenuti na MBED-u:

#include "mbed.h"
#include "TextLCD.h"

TextLCD lcd(p19, p20, p21, p22, p23, p24); //rs,e,d0, d1,d2,d3


AnalogIn Ain(p17);
int percentage;

int main() {
while(1){
percentage=Ain*100;
lcd.printf("%i",percentage);
wait(0.002);
lcd.cls();
}
}
Slika 122: Primjer prikazivanja analognih ulaznih podataka na LCD-u

Analogna vrijednost mijenja se promjenom pozicije potenciometra.

Dodatni zadatak

Vježba 8-6: Izrada voltmetra

Kreirajte program koji MBED-u omogućuje funkciju standardnog voltmetra.


Razlika potencijala mjeri se između 0 - 3,3 V i prikazuje se na zaslonu.

107
Potrebno je konvertirati 0,0 - 1,0 analognu ulaznu vrijednost u srazmjernu
vrijednost koja predstavlja 0 - 3,3 V. Potrebno je koristiti beskonačnu petlju kojom
se omogućava kontinuirano ažuriranje vrijednosti napona prilikom promjene pozicije
potenciometra. Usporedite očitavanje zaslona sa stvarnim voltmetrom.

108
9. Serijska komunikacija sa I²C

9.1. Upoznavanje sa I²C-om

Naziv I²C je skraćenica za 'Standard Inter-Integrated Circuit bus' što bi u prijevodu


značilo 'standardni među-integrirani sabirnički sklop'. I²C je serijski podatkovni
protokol koji djeluje na bazi master/slave odnosa. Koristi samo dvije fizičke žice, što
znači da se podaci prenose pod kontrolom mastera istovremeno samo u jednom
smjeru. Protokol I²C je dvožično serijsko sučelje i omogućuje jeftinu i jednostavnu
primjenu u hardveru.

Slika 123: Shema povezivanja uređaja preko I²C sabirnice

I²C komunikacijski signali su serijski podaci (serial data, tj. 'SDA') i serijski sat
(serial clock, tj. 'SCL'). Oba signala omogućavaju serijsku komunikaciju 8-bitnih
podatkovnih bajtova, 7-bitnih adresnih uređaja te kontrolnih bitova.

Funkcioniranje jednostavne I²C komunikacije

I²C ima ugrađenu shemu adresiranja, koja pojednostavljuje povezivanje više


uređaja zajedno. Općenito, uređaj koji započinje komunikaciju naziva se 'master'16,
a uređaj koji je pozivan 'master'-om, naziva se 'slave'17. Svaki I²C kompatibilni 'slave'
uređaj ima unaprijed definirane adrese uređaja. 'Slave'-ovi nadziru stanje sabirnice,
te reagiraju isključivo na podatke i naredbe povezane sa njihovim pripadajućim

16 Master (eng.) - gospodar

17 Slave (eng.) - rob

109
adresama. Međutim, ova metoda adresiranja, ograničava broj identičnih 'slave'
uređaja koji mogu postojati na jednoj sabirnici, jer svaki uređaj mora imati
jedinstvenu adresu. Kod nekih uređaja, moguće je nekoliko adresnih bitova
konfigurirati od strane korisnika.

Prijenos podataka započinje 'Master'-ovom signalizacijom 'Start' stanja, koja je


praćena sa jednim ili dva bajta u kojima su sadržane adrese i kontrolne informacije.

'Start' stanje je definirano prijelazom SDA iz '1' u '0' dok je SCL u '1'.

'Stop' stanje je definirano prijelazom SDA iz '0' u '1' dok je SCL u '1'.

Za svaki SDA podatkovni bit, generira se jedan SCL 'clock' impuls, te se podaci
mogu jedino mijenjati kada je 'clock' u '0'.

Slika 124: Funkcioniranje jednostavne I²C komunikacije

Bajt koji indicira 'Start' stanje sastoji se od 7 adresnih bitova, te jednog


podatkovnog 'direction' bita zaduženog za čitanje ili pisanje (Read/Write). Svi
preneseni podaci su u jedinicama od jednog bita, i ne postoje ograničenja na broj
bajtova prenesenih u jednoj poruci. Svaki bajt mora biti popraćen sa 1-bitnim
podatkom 'potvrde' koja dolazi od strane prijemnika signala, a za to vrijeme
predajnik signala zanemaruje SDA podatkovno upravljanje.

110
Slika 125: Prijenos podataka kod jednostavne I²C komunikacije

I²C na MBED-u

MBED I²C funkcije iz biblioteke prikazane su u tablici:

Tablica 16:Funkcija I²C

I²C I²C Master, korišten za komunikaciju sa I²C 'slave' uređajima


Funkcija Korištenje
I2C Stvori I²C Master sučelje, povezano na specificirane priključke
frequency postavljanje frekvencije I²C sučelja
read prijem podatka sa I²C slave
read čitanje jednog bajta sa I²C sabirnice
write predaja podataka na I²C slave
write pisanje jednog bajta na I²C sabirnicu
start stvaranje uvjeta za start na I²C sabirnici
stop stvaranje uvjeta za stop na I²C sabirnici

I²C sučelje koristi se na MBED-ovim pinovima p9/p10 i p28/p27.

Podatkovni signali SDA i SCL trebaju biti napajani sa 3,3V, te se za ispravnu


konfiguraciju kruga koristi otpornik optimalne vrijednosti. U ovom sustavu potrebno
je izabrati otpornik vrijednosti od 2,2 kΩ

111
Slika 126: I²C priključci na MBED-u

9.2. Funkcioniranje MSP430G_I2C_SLAVE modula

Upotrebom MSP430G2553 mikroupravljača proizvođača TI izrađen je na TVZ-u


modul pod nazivom MSPG_I2C_SLAVE (slika 127).

Slika 127 MSP430G I2C SLAVE

112
Mikroupravljač MSP430G sa upisanim programom može se koristiti i zasebno na
eksperimentalnoj pločici u vježbama komunikacije sa MBED modulom. Shema
MSPG_I2C_SLAVE modula prikazana je na slici 128.

Slika 128 Shema modula MSPG_I2C_SLAVE

Za konfiguriranje modula MSPG_I2C_SLAVE potrebno je:

Koristiti nizove 8-bitnih vrijednosti za podatkovne varijable, jer I²C


sabirnica može komunicirati samo sa podacima vrijednosti jednog bajta.

Poslati sa Master mikroupravljača na Slave dva bajta (TX_0 i TX_1) pri


čemu bajt TX_0 određuje komandu odnosno postavlja Slave u jedno od tri
moguća načina rada, a bajt TX_1 nosi podatak koji treba biti postavljen na
izlazni port BOut mikroupravljača MSP430G.

Primiti na Master mikroupravljač dva bajta koje kao odgovor šalje Slave
(RX_0 i RX_1). Sadržaj tih bajtova određen je prethodnom komandom sa

113
Mastera. Na tablici 17 prikazan je sažetak protokola koji je programiran za
modul MSPG_I2C_SLAVE.

Tablica 17: Komunikacijski protokol MSPG_I2C_SLAVE

MASTER SLAVE
NAČIN RADA
TX_0 TX_1 RX_0 RX_1
Temperatura u
0xC0 podatak ->BOut INT-Temp (0-7) INT-Temp(8-9)
0,1 °C
A/D (10 bita),
0xC1 podatak ->BOut Ain0 (0-7) Ain0 (8-9)
Uref = 1,5V
0xC2 podatak ->BOut 0x23 0x45 ispitni mod

Za očitavanje temperature koje mjeri MSP430G treba preuzeti dva bajta podatka
koje šalje Slave te zbrojiti niži bajt (RX_0) da višim bajtom kojeg smo prethodno
pomnožili sa 256. Dobiveni cijeli broj daje desetinke stupnjeva Celzijusa. Za prikaz
temperature u °C taj broj se treba podijeliti sa 10.

Za očitavanje rezultata A/D pretvorbe 10-bitnog pretvarača treba učiniti slićno


(RX_0+ 256* RX_1). Dobiveni broj u rasponu od 0 do 1023 odnosi se na ugrađenu
referencu od 1,5 V.

Povezivanje MSPG_I2C_SLAVE sa MBED-om

Modul MSPG_I2C_SLAVE se spaja sa MBED-om na način prikazan na slici 129:

114
Slika 129: Povezivanje MSPG_I2C_SLAVE sa MBED-om

Hardverski priključci potrebni za povezivanje prikazani su u tablici 18.

Tablica 18 Povezivanje MBED-a sa MSP430G

Priključak MBED pin MSP430G pin Napomena

VCC (3,3V) 40 1

GND (0V) 1 20

SDA 9 15 2,2 KΩ otpornik prema Vcc

SCL 10 14 2,2 KΩ otpornik prema Vcc

115
Vježba 9-1: Upotreba MSPG_I2C_SLAVE modula

:Spojite modul na I²C sabirnicu. Provjerite točnost podataka koji se kontinuiranim


ažuriranjem promjene temperature mogu očitati na zaslonu. Kako bi se provjerila
ispravnost očitavanja podataka tj. temperature, ispitajte promjene koje nastaju
ukoliko se integrirani krug MSP430G pritisne prstom, ili se zagrije na neki drugi
način.

Program na slici 130 konfigurira MSPG_I2C_SLAVE modul, očitava i pretvara


podatke u stupnjeve Celzijusa (°C), te zatim svake sekunde prikazuje vrijednosti na
zaslonu.

#include "mbed.h"
I2C MSP430G(p9, p10); //sda, sc1
Serial pc(USBTX, USBRX); //tx, rx
const int addr = 0x92;
char config_t[2]; // transmitt buffer
char temp_read[2]; // read buffer
float temp;
int main() {
while(1) {
config_t[0] = 0xC0; //config slave to int temp
config_t[1] = 0x55; // config data byte1, BOut

MSP430G.write(addr, config_t, 2);


wait_us(20);
MSP430G.read(addr, temp_read, 2); //read the two-byte temp data
float temp = temp_read[0]+temp_read[1]*256;
pc.printf("Temp = %.1f degC\n\r", temp/10); // print on screen
wait(1);
}
}

Slika 130: Primjer cpp koda za temperaturni mod MSP430G modula

Vježba 9-2: Mjerenje napona na ulazu MSPG_I2C_SLAVE

Konfigurirajte MSPG_I2C_SLAVE modul da mjeri napon na analognom ulazu


Ain0. Izmjerene podatke vrijednosti napona prikažite na zaslonu.

116
9.3. Povezivanje više uređaja na I²C sabirnicu

Vježba 9-3: Dva modula MSPG_I2C_SLAVE na istoj sabirnici

Spojite dva modula MSPG_I2C_SLAVE na istu I²C sabirnicu. Pazite da moduli


imaju različite vlastite adrese (ulazi Adr0 i Adr1). Ažurirajte zaslon da kontinuirano
prikazuje promjene temperature sa oba modula.

Slika 131 Dva MSPG_I2C_SLAVE na istoj sabirnici

#include "mbed.h"
I2C MSP430G(p9, p10); //sda, sc1
Serial pc(USBTX, USBRX); //tx, rx
const int addr0 = 0x92;
const int addr1 = 0x90;
char config_t[2]; // transmitt buffer
char temp_read[2]; // read buffer
float temp, Uin;
int main() {

while(1) {
config_t[0] = 0xC1; //config slave to Ain
config_t[1] = 0xff; // config data byte1, BOut
MSP430G.write(addr0, config_t, 2);
wait_us(20);
MSP430G.read(addr0, temp_read, 2); //read the two-byte temp data
float Uin = temp_read[0]+temp_read[1]*256;
Uin = Uin/1023;
pc.printf("Ain = %.4f V\n\r", Uin*1.5); // print on screen
117
wait(0.5);

config_t[0] = 0xC1; //config slave to int temp


config_t[1] = 0xff;
MSP430G.write(addr1, config_t, 2);
wait_us(20);
MSP430G.read(addr1, temp_read, 2); //read the two-byte temp data
float temp = temp_read[0]+temp_read[1]*256;
pc.printf("Temp = %.1f degC\n\r", temp/10); // print on screen
wait(0.5);
}
}

Slika 132 Programski kod uz vježbu 9-3

Dodatne vježbe

Vježba 9-4: Prikaz broja na LED displeju SLAVE modula

Izradite program koji će omogučiti da MBED čita analogne vrijednosti napona sa


MSPG_I2C_SLAVE modula te ih u obliku postotka x 10 prikazuje na LED displeju
tog istog modula.

118
10. Serijska komunikacija sa SPI-om

10.1. Upoznavanje sa SPI-om

Naziv SPI je skraćenica za 'Serial Peripheral Interface Bus' što bi u prijevodu


značilo 'serijsko periferno sabirničko sučelje'. SPI je serijski podatkovni protokol koji
djeluje sa master/slave odnosom. Kada 'master' inicijalizira komunikaciju i odabire
'slave' uređaj, podaci mogu biti istodobno prenešeni u jednom ili oba smjera.
'Master' mora poslati bajt kako bi primio bajt - prijenos 'dummy bajt'18-a je tipičan
način koji omogućava čitanje transakcije

SPI protokol koristi četiri signala:

serial clock (SCLK)

'master' data output, 'slave' data input (MOSI)

'master' data input, 'slave' data output (MISO)

slave chip select (CS)

Slika 133: Shema SPI protokola

18 dummy byte>bajt koji služi kao popunjavač ili filer

119
U slučaju kada postoji više 'slave' uređaja, 'master' mora davati jedinstveni izlazni
CS signal za svaki 'slave'.

Funkcioniranje jednostavne SPI komunikacije

SPI je pogodan za prijenos podatkovnih tokova, npr. za podatkovnu komunikaciju


između mikroupravljača ili za prijenos podataka iz analogno-digitalnog pretvarača.
SPI može postići veće brzine prijenosa podataka od I²C-a, jer ne šalje adresne i
kontrolne informacije, te ne uključuje 'bit potvrde' za svaki bit. SPI podatkovna
komunikacija je idealna za korištenje u aplikacijama digitalne obrade signala, gdje
se redovito razmjenjuju podaci između 'master'-a i 'slave'-a.

SPI prijenos podataka se inicijalizira na sljedeći način. Najprije 'master'


konfigurira SPI takt (SCLK) kako bi bio frekvencijski podržan od strane 'slave'
uređaja koji prima informacije (do 70 MHz). 'Master' postavlja chip select signal (CS)
namijenjenog primajućeg 'slave'-a na 0V. 'Master' zatim uključuje pulsiranje takta
SCLK, čime se ukazuje na početak prijenosa podataka. 'Master' istovremeno šalje
podatke (kao uzastopne bitove) na MOSI. Broj bitova (u svakom podatkovnom
okviru) može biti konfiguriran, ali obično je između 4 i 16 bita. 'Slave' istim načinom
vraća podatke na MISO. Također, 'master' mora konfigurirati polaritet takta CPOL
(eng. clock polarity), te fazu takta CPHA (eng. clock phase).

Slika 134: Dijagram funkcioniranja jednostavne SPI komunikacije

Stoga, kod SPI-a postoje četiri moda, tj. načina rada prama slici 133.
120
Slika 135: Modovi rada kod SPI komunikacije

Općenito, SPI uređaji su konstruirani za rad u jednom od četiri moda rada, a to je


opisano u podatkovnoj tablici svakog uređaja.

121
SPI na MBED-u

MBED SPI funkcije iz biblioteke prikazane su u tablici 19:

Tablica 19: Funkcija SPI

SPI SPI Master, korišten za komunikaciju sa SPI 'slave' uređajima


Funkcija Korištenje
SPI Oformi SPI mastera na specificiranim pinovima
format Konfiguriraj mod prijenosa podataka i dužinu podataka
frequency Postavi frekvenciju takta sabirnice
write Piši na SPI Slave i vrati odgovor

Napomena: ova tablica je za SPI 'master' biblioteku. Postoji i SPI 'slave' biblioteka
koja se koristi za komunikaciju sa SPI 'master' uređajima. SPI 'slave' biblioteka nije
ohuhvaćena u ovom radu.

SPI sučelje koristi se na MBED-ovim pinovima p5/p6/p7 i p11/p12/p13.

Slika 136: SPI priključci na MBED-u

Pridružene (eng. default) postavke SPI sučelja na MBED-u su:

Frekvencija sata od 1 MHz


122
Podatkovna duljina od 8 bita

Pridruženi mod rada 0

11. Memorija i upravljanje podacima

11.1. Tipovi elektroničke memorije

Jednostavna jednobitna memorija je kao 'kovanica'. To je "bistabil", ima dva


položaja; 'pismo' ili 'glava'. Dogovorno, 'glava' predstavlja logičku '1', a 'pismo'
predstavlja logičku '0'. Sa 8 kovanica, 8-bitni broj može biti zastupljen i pohranjen.

Alternativno 'kovanici', koristi se sklop elektroničkog bistabila ("flip-flop").

Krugovi b) i c) su također stabilni u samo dva stanja, te se svaki može koristiti za


spremanje podatka od jednog bita

Slika 137: Elektronička memorija

123
Slika 138: Tipovi elektroničke memorije

Izbrisiva memorija (eng. volatile memory) zahtjeva napajanje za


održavanje pohranjenih informacija.

Postojana memorija (eng. non-volatile memory) održava pohranjene


informacije, čak i bez napajanja.

Izbrisiva memorija (eng. Volatile Memory)

Primjer izbrisive memorije je RAM memorija (eng. Random Access Memory), u


prijevodu 'memorija s nasumičnim pristupom'.

SRAM (u prijevodu 'statički RAM') pohranjuje podatke koji koriste "flip-flop"


stanje. Obično postoje 6 tranzistora u jednoj SRAM jedinici. Zahtjeva nisko
naponsko napajanje, jednostavnog je sučelja i relativno je jeftin.

DRAM (u prijevodu 'dinamički RAM') koristi jedan tranzistor i jedan kondenzator


za pohranjivanje podatka od jednog bita. DRAM zauzima reducirani silicijski prostor.
Također, zahtjeva logiku osvježavanja kako bi se punio kondenzator svakih 10 do
100 ms. Zahtjevi napajanja su također veći u odnosu na SRAM

Postojana memorija (eng. Non-Volatile Memory)

Memorije koje su samo jednom programabilne:

ROM memorija (eng. Read Only Memory), u prijevodu 'memorija iz koje


se podaci mogu samo čitati'

PROM memorija (Programmable ROM)


124
EPROM memorija (eng. Electrically Programmable Read Only Memory),
u prijevodu 'izbrisiva programabilna ispisna memorija'

Glavna osobina je trajna pohrana podataka koji se mogu samo čitati, sve dok se
posebnim postupkom ne izbrišu stari i upišu novi podaci. Briše se osvjetljavanjem
jakim ultraljubičastim svjetlom kroz poseban prozirni prozorčić na gornjoj strani
integriranog sklopa.

EEPROM memorija (eng. Electrically Erasable and Programable Read Only


Memory), u prijevodu 'električno izbrisiva programabilna ispisna memorija';
omogućava pojedinačno pisanje, čitanje i brisanje bajtova podataka.

Flash memorija je tip EEPROM-a, ali bez sposobnosti za brisanjem pojedinačnih


podatkovnih bajtova. Više bajtova moraju biti izbrisani u bilo kojem trenutku, 'u trenu'
(eng. flash). Flash i EEPROM memorije mogu podnijeti do 100.000 ciklusa pisanja
i brisanja

Tip i funkcija memorije

Mikroprocesori koriste memoriju za održavanje programskog koda (programska


memorija) i radnih podataka u ugrađenom sustavu (podatkovna memorija).

Kada se procesor uključi (tj. pokrene), programski podaci moraju biti učitani i
spremni. Općenito, postojana memorija (eng. Non-Volatile Memory) je potrebna za
programsku memoriju. Često nema potrebe za zadržavanjem (tj. pamćenjem)
podataka kada je proizvod isključen, stoga se izbrisiva memorija (eng. Volatile
Memory) preferira za podatkovnu memoriju.

11.2. Upotreba podatkovnih datoteka na MBED-u

Programski jezici C/C++ omogućuju:

otvaranje podataka (eng. open)

čitanje podataka (eng. read)

125
pisanje podataka (eng. write)

skeniranje podataka (eng. scan) na određenim mjestima

Također, podaci se mogu pohranjivati:

kao znakovi (eng. char)

kao riječi ili nizovi podatka, u karaktere polja

Moguće je spremanje podatkovnih datoteka u određena područja 'flash' memorije


instalirane na MBED-u.

-Prilikom povezivanja sa MBED-ovom podatkovnom memorijom, koriste se


standardne C/C++ naredbe definirane u ulazno-izlaznoj biblioteci 'stdio.h'.

Tablica 20: Biblioteka 'stdio.h'

Sažetak korisnih 'stdio.h' funkcija za provedbu pristupa datotekama na


MBED-u:

str - sadrži niz znakova koji trebaju biti napisani

stream - pokazivač na objektnu datoteku koja identificira tok u koji će niz


podataka (eng. string) biti napisan

Kompajleru mora biti rečeno gdje se spremaju podatkovne datoteke, a to se


obavlja upotrebom MBED-ove 'LocalFileSystem' deklaracije:

LocalFileSystem local("local");
Slika 139: 'LocalFileSystem' deklaracija

126
Time se programima omogućuje čitanje i pisanje podataka na istom disku koji se
koristi za programiranje MBED mikroupravljača. Nakon što je datoteka stvorena,
koriste se standardne C pristupne funkcije za rad s datotekom (tj . za otvaranje,
čitanje i pisanje).

Datoteku je moguće otvoriti sljedećom naredbom:

FILE* pFile = fopen("/local/datafile.txt","w");


Slika 140: Naredba 'fopen' za otvaranje datoteka

Ovime se pokazivač skraćenog imena 'pFile' pridružuje datoteci na specificiranoj


lokaciji koja je određena 'fopen' naredbom. Također, kompajleru je potrebno
specificirati kakav pristup se pridodaje datoteci:

'read or write' pristup datoteci određuje se "w" sintaksom

'read only' pristup datoteci određuje se "r" sintaksom

Ako datoteka već ne postoji, 'fopen' naredba automatski kreira datoteku na


specificiranoj lokaciji.

Prilikom završetka korištenja datoteke za čitanje ili pisanje, dobra praksa je


zatvoriti datoteku:

fclose(pFile);
Slika 141: Naredba 'fclose' za zatvaranje datoteka

Pisanje podataka u datoteku

Pohrana numeričkih podataka obavlja se na jednostavan način, tj. pohranom


pojedinačnih 8-bitnih podatkovnih vrijednosti ('char'). Naredba 'fputc' omogućuje
navedeno na sljedeći način:

char write_var=0x0F; fputc(write_var, pFile);


Slika 142: Naredba 'fputc' omogućuje pisanje podataka

Ovime se varijabla 'write_var' pohranjuje na podatkovnu datoteku

Čitanje podataka iz datoteke

127
Podaci se očitavaju iz datoteke u varijabli na sljedeći način:

read_var = fgetc(pFile);
Slika 143: Naredba 'fgetc' omogućuje čitanje podataka

Upotrebom 'stdio.h' naredbi moguće je čitati i pisati riječi i nizove podataka, te


pretraživati ili se kretati kroz datoteke u potrazi za pojedinim podatkovnim
elementima.

128
Vježba 11-1: Stvaranje datoteke i upis

Kompajlirajte program koji stvara podatkovnu datoteku i upisuje vrijednost 0x23


u tu datoteku. Datoteka se sprema na MBED. Program zatim otvara i očitava
podatkovnu vrijednost te je prikazuje na zaslonu terminalne aplikacije.

#include "mbed.h"
Serial pc(USBTX,USBRX); // setup terminal link
LocalFileSystem local("local"); // define local file system
int write_var;
int read_var; // create data variables
int main ()
{
FILE* File1 = fopen("/local/datafile.txt","w"); // open file
write_var=0x23; // example data
fputc(write_var, File1); // put char (data value) into file
fclose(File1); // close file

FILE* File2 = fopen ("/local/datafile.txt","r"); // open file for reading


read_var = fgetc(File2); // read first data value
fclose(File2); // close file
pc.printf("input value = %i \n",read_var); // display read data value
}
Slika 144: Primjer cpp koda za vježbu 11-1

Potrebno je otvoriti kreiranu datoteku 'datafile.txt' u programu za obradu teksta i


trebao bi se vidjeti znak ljestvi (#) u gornjem lijevom kutu. Inače, ASCII znak za 0x23
je znak '#'.

Vježba 11-2: Prikaz sadržaja datoteke na terminalu

: Kompajlirajte program koji stvara datoteku i upisuje tekst u tu datoteku. Datoteka


se sprema na MBED. Program zatim otvara i očitava tekst te ga prikazuje na zaslonu
terminalne aplikacije.

#include "mbed.h"
Serial pc(USBTX,USBRX); // setup terminal link
LocalFileSystem local("local"); // define local file system
char write_string[64]; // character array up to 64 characters
char read_string[64]; // create character arrays(strings)
int main ()
{
FILE* File1 = fopen("/local/textfile.txt","w"); // open file access
fputs("lots and lots of words and letters", File1); // put text into file
fclose(File1); // close file
129
FILE* File2 = fopen ("/local/textfile.txt","r"); // open file for reading
fgets(read_string,256,File2); // read first data value
fclose(File2); // close file
pc.printf("text data: %s \n",read_string); // display read data string
}
Slika 145: Primjer cpp koda za vježbu 11-2

Potrebno je otvoriti datoteku 'textfile.txt' i trebao bi se vidjeti ispravan tekst.

Upotreba formatiranih podataka

Naredba 'fprintf' se koristi za formatiranje podataka prilikom rada sa datotekama,


te ima vrlo sličnu sintaksu kao i 'printf', osim što je potrebno unijeti pokazivač sa
imenom datoteke. Primjer 'fprintf' naredbe je unos specifičnih zgoda (eng. event)
podatkovnim datotekama i obuhvaćanje promijenjivih podatkovnih vrijednosti, kao
što su vrijeme, senzorsko mjerenje ulaznih podataka i izlazne kontrolne postavke.

Vježba koristi 'fprintf' naredbu u projektu koji je kontroliran prekidom prekidača.


Svaki put kad je tipkalo prekidača pritisnuto, LED dioda mijenja stanje. Također, za
svaki preklopni slučaj, podatak 'log.txt' se ažurira kako bi se zabilježilo proteklo
vrijeme od prethodnog pritiska na tipkalo prekidača, te kako bi se zabilježilo tekuće
stanje LED diode. Također, u vježbi 3, ako je tipkalo prekidača pritisnuto više no
jednom u kratkom vremenskom intervalu (tapkanje ili je dugotrajno tritisnuto),
provodi jednostavan 'debounce' brojač vremena kojim se izbjegavaju višestruki
prekidi, a time i operacije upisivanja.

Vježba 11-3: Korištenje fprintf naredbe

Kompajlirajte program koji koristi naredbu 'fprintf' u projektu koji je kontroliran


prekidom prekidača. Svakim preklopnim slučajem prebacuje se stanje LED diode,
a datoteka 'log.txt' se ažurira kako bi zabilježilo vrijeme koje je proteklo od
prethodnog pritiska na tipkalo prekidača, te kako bi se zabilježilo tekuće stanje LED
diode.

#include "mbed.h"
InterruptIn button(p30); // Interrupt on digital input p30
130
DigitalOut led1(LED1); // digital out to onboard LED1
Timer debounce; // define debounce timer
LocalFileSystem local("local"); // define local file system
void toggle(void); // function prototype
int main() {
debounce.start(); // start debounce timer
button.rise(&toggle); // attach the toggle function to the rising edge
}
void toggle() { // perform toggle if debounce time has elapsed
if (debounce.read_ms()>200) {
led1=!led1; // toggle LED
FILE* Logfile = fopen ("/local/log.txt","a"); // open file for appending
fprintf(Logfile,"time=%.3fs: setting led=%d\n\r",debounce.read(),led1.read());
fclose(Logfile); // close file
debounce.reset(); // reset debounce timer
}
}
Slika 146: Primjer cpp koda za vježbu 11-3

Dodatne vježbe

Vježba 11-4: Unos teksta u terminal

Kreirajte program koji od korisnika traži unos teksta u aplikaciju terminala. Kada
korisnik pritisne tipku Enter (na tipkovnici), tekst se sprema u datoteku na MBED.

Vježba 11-5: Bilježenje analognih podataka

Kreirajte program koji bilježi vrijednost analognog signala u trajanju od 5 sekundi.


Koristite potenciometar za generiranje analognog ulaznog signala.

Potrebno je specificirati vrijeme uzorkovanja za pohranu analognih vrijednosti,


recimo na 100ms. Također, potrebno je osigurati da mjereni podaci zapisuju vrijeme
i vrijednosti napona, kako bi se mogao iscrtati dijagram izmjerenih podataka, čime
bi se vizualizirala ulazna očitanja.

131
12. Upotreba MBED mikroupravljača u praksi

U ovom dijelu rada, na proizvoljnom primjeru je demonstrirana upotreba MBED


LPC1768 mikroupravljača u TVZ-ovom laboratoriju za mikroračunala.

Primjer je je proizvoljan. Na LCD zaslonu se ispisuju podaci, uz kontinuiranu


promjenu svaku sekundu, ispisuje se sljedeći sadržaj:

TVZ > SPEC ELO > Dipl.> Zadatak > E334> **MBED** > Tomislav > Hadrovic

Nakon što se sadržaj jednom ispiše na LCD zaslonu, tipkalom se određuje


početak sviranja melodije iz piezo zvučnika. Kada je tipkalo pritisnuto, upali se
zelena LED dioda i piezo zvučnik počinje svirati melodiju hrvatske himne "Lijepa
naša". Nakon što je melodija završena, pali se crvena LED dioda koja označava kraj
izvođenja programa.

Sljedeća tablica govori o potrebnom spajanju hardvera kojim je primjer izvršen:

Tablica 21: Spajanje priključaka kojim je ostvaren primjer

Priključak Priključak
MBED
LCD LCD
priključak, Napomena Boja žice u primjeru
zaslona, zaslona,
broj
ime broj
GND 1 1 GND Zelena
VDD 2 39 5V Narančasta
Vo 3 Potenciometar, OV Smeđa Plava
RS 4 20 Zelenoplava
R/W 5 GND Zelena
E 6 18 Narančasta
DB4 11 13 Zelena
DB5 12 12 Smeđa
DB6 13 11 Plava
DB7 14 10 Narančasta
8 Tipkalo, OV Zelenoplava Smeđa
5 Zelena LED dioda
6 Crvena LED dioda
21 Piezo zvučnik Plava

132
Kompletan hardver spojen je na maketi19.

Potenciometar koji je upotrebljen je 1kΩ. Klizač potenciometra je spojen na


priključak 3 LCD zaslona, a drugi kraj potenciometra je spojen na OV. Inače,
potenciometrom se određuje kontrast.

Jedan kraj tipkala je spojen na priključak 8 MBED-a, a drugi kraj je spojen na 0V.
LED diode spojene su sa MBED-om, tako da je pozitivni pol diode (anoda) spojen
sa MBED-om, a negativni pol (katoda) je spojen na GND. Piezo zvučnik je jednim
krajem (+) spojen na priključak 21 MBED-a, a sa drugim krajem je spojen na GND.

Hardver je spojen na sljedeći način:

Slika 147: Spajanje hardvera u primjeru

19 Breadboard (eng.) - maketa

133
Programski cpp kod kojim je primjer ostvaren.

//*primjer Hadrovic*
#include "mbed.h"
#include "TextLCD.h"
TextLCD lcd(p20, p18, p13, p12, p11, p10); // rs, e, d4-d7
DigitalIn tipkalo(p8);
DigitalOut zelenaled(p5);
DigitalOut crvenaled(p6);
PwmOut buzzer(p21);

//frekvencija melodije "Lijepa naša"


float frequency[]={659.3, 659.3, 659.3, 587.3, 587.3, 523.3, 523.3, 392, 349.2, 329.6,
349.2, 392, 440, 392, 349.2, 329.6, 349.2, 392, 659.3, 659.3, 659.3, 587.3, 587.3,
523.3, 523.3, 392, 349.2, 329.6, 349.2, 392, 440, 493.9, 493.9, 587.3, 523.3, 493.9,
493.9, 493.9, 440, 493.9, 493.9, 523.3, 587.3, 493.9, 587.3, 587.3, 587.3, 587.3, 587.3,
523.3, 493.9, 440, 392, 659.3, 659.3, 659.3, 587.3, 587.3, 523.3, 523.3, 392, 349.2,
329.6, 349.2, 392, 440, 493.9, 493.9, 587.3, 523.3, 0};

//trajanje nota
float beat[]={1, 1, 1.5, 0.5, 0.5, 0.5, 1, 2, 0.5, 0.5, 0.5, 0.5, 2, 0.5, 0.5, 0.5, 0.5, 2, 1, 1,
1.5, 0.5, 0.5, 0.5, 1, 2, 0.5, 0.5, 0.5, 0.5, 2, 0.5, 0.5, 1, 2, 1, 1, 1.5, 0.5, 1, 0.5, 0.5, 1.5,
0.5, 0.5, 0.5, 0.5, 0.5, 1, 1, 1, 1, 2, 1, 1, 1.5, 0.5, 0.5, 0.5, 1, 2, 0.5, 0.5, 0.5, 0.5, 2, 0.5,
0.5, 1, 2, 0.5};

int main() {
int start=0;
zelenaled=0; //početno stanje dioda
crvenaled=0;

lcd.cls(); //brisanje postojećeg sadržaja zaslona


wait(1);
lcd.printf("TVZ");
wait(1);
lcd.cls();
lcd.printf("SPEC ELO");
wait(1);
lcd.cls();
lcd.printf("Dipl.");
wait(1);
lcd.cls();
lcd.printf("zadatak");
wait(1);
lcd.cls();
lcd.printf("E334");
wait(1);
lcd.cls();
lcd.printf("**MBED**");
wait(1);
lcd.cls();
134
lcd.printf("Tomislav");
wait(1);
lcd.cls();
lcd.printf("Hadrovic");
wait(1);
lcd.cls();
wait(1);
tipkalo.mode(PullUp);
wait(.001);
while(1) {
if (tipkalo==0){
zelenaled=1;
crvenaled=0;
start=1;
}
if(start==1){ ///// pokretanje melodije
for (int i=0; i<=70; i++) {
buzzer.period(1/(frequency[i])); // set PWM period
buzzer=0.5; // set duty cycle
wait(0.5*beat[i]); // hold for beat period
}
crvenaled=1;
zelenaled=0;
start=0;
}
}
}
Slika 148: Programski cpp kod za primjer

135
13. Literatura

1. "Embedded Systems Design Course: Applying the mbed microcontroller",


preuzeto 29.04.2014. s http://mbed.org/cookbook/Course-Notes
2. William Hohl: "ARM Assembly Language: Fundamentals and Techniques",
CRC Press, 2009., 371 str.
3. Joseph Yiu: "The Definitive Guide to the ARM Cortex-M3", Newness, 2011.,
384 str.
4. Bruce Eckel; Chuck Allison: "Thinking in C++: Practical Programming",
Prentice Hall, 2004., 806. str
5. Brian W. Kernighan; Dennis M. Ritchie: "C Programming Language",
Prentice Hall, 1988., 285 str.
6. Bert van Dam: "ARM Microcontrollers (part1) - 35 projects for beginners",
Elektor Verlag, 2010., 250 str.
7. Rob Toulson; Tim Wilmshurst: "Fast and Effective Embedded Systems
Design: Applying the ARM mbed", Newness, 2012., 373 str.

You might also like