Professional Documents
Culture Documents
Mikroupravljači Skripte V8 PDF
Mikroupravljači Skripte V8 PDF
Ljubivoj Cvitaš
Ljubivoj Cvitaš
Sadržaj
1. UVOD ............................................................................................................................................ 8
2. UVOD U MIKROUPRAVLJAČE......................................................................................................... 9
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
3
Popis slika
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
3. Pulsno-širinska modulacija
9. Tajmeri i prekidi
8
2. Uvod u mikroupravljače
Slika 1: Mikroupravljači
9
Međutim, postoji razlika između mikroprocesora i mikroupravljača:
Slika 2: Mikroprocesor
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.
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.
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.
cijena
13
raspoloživost
razvojni alati
podrška proizvođača
14
2.2.3. Kriteriji izbora mikroupravljača
Cijena?
2. Dostupnost hardvera?
Da li je u sadašnjoj proizvodnji?
Izgledi u budućnosti?
Asembleri
Prevoditelji (Compilers)
Podrška za primjenu
Financijsko izvješće
15
2.2.4. Zadani zahtjevi sustava
Koliki broj bita mikroupravljač treba imati (8, 16, 32...) kako bi se mogao
implementirati algoritam dovoljne izlazne preciznosti?
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.
Cijena
Tajmeri
A/D i D/A
16
Zahtjevi na napajanje
17
Slika 9: Tehnologija 'Rapid Prototyping'
18
Online4 kompajler
19
softverska apstrakcija omogućuje eksperimentiranje bez poznatih
mikroupravljačkih detalja.
20
Slika 13: Proces rada MBED-a
21
Računalo prepoznaje MBED modul kao vanjski uređaj za podatkovnu pohranu,
tj. 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.
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.
23
Slika 18: Otvaranje projekta u radnom prostoru
24
Slika 20: Pohrana '.bin' datoteke na MBED USB disk
25
2.3.3. Hardverske mogućnosti modula MBED LPC1768
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.
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.
27
Funkcija i mogućnosti hardverskih priključnih signala MBED-a LPC1768
prikazani su u tablici 1:
Signal Opis
GND Uzemljenje
VB Napajanje od 3V za RTC
nR Glavni reset
28
3. Digitalni ulazi i izlazi
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"
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
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
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.
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
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
33
Slika 30 Y-t oscilogram izlaza na p5 i p6
34
Slika 31 Pojačala digitalnih izlaza
35
3.2. Digitalni ulazi MBED-a
DigitalIn ulaz1(p5);
DigitalIn ulaz2(p6);
DigitalIn prekidac(p7);
Slika 32: Definiranje digitalnog ulaza
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
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
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);
}
}
}
38
Vježba 3-3: LED projekt sa 4 prekidača korištenjem API komponente
BusInOut
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
}
}
}
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.
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
41
Analogni ulazi i izlazi MBED-a
42
Analogni ulazi i izlazi MBED-a
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.
43
Analogni ulazi i izlazi MBED-a
Na MBED je moguće spojiti 6 analognih ulaza (pinovi 15-20) kao što je prikazano
na slici 40.
44
Analogni ulazi i izlazi MBED-a
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:
#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
45
Analogni ulazi i izlazi MBED-a
46
Analogni ulazi i izlazi MBED-a
47
Analogni ulazi i izlazi MBED-a
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
'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.
#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
50
Analogni ulazi i izlazi MBED-a
51
Analogni ulazi i izlazi MBED-a
#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
Promijenite kod i kreirajte signal glatkog pilastog valnog oblika, uvođenjem finijih
koraka u petlju.
52
Analogni ulazi i izlazi MBED-a
Kreirajte signal glatkog trokutastog valnog oblika uvođenjem druge petlje koja broji
unatrag.
53
5. Pulsno-širinska modulacija
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.
54
sustavi imaju odgovarajuće karakteristike koje, u stvarnosti, djeluju kao
niskopropusni filteri.
VDD
Uul D
Iiz
55
moguće spojiti 6 PWM izlaza (pinovi 21-26). Svi PwmOut izlazi dijele isto vrijeme
periode (slika 56).
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
57
Vježba 5-2: Upravljanje LED osvjetljenjem pomoću PWM-a
#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%
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
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.
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).
59
Vježba 5-3: Upravljanje servo motorom
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.
60
Vježba 5-6: Hrvatska himna
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
62
6. Tajmeri i prekidi
Upoznavanje s tajmerima11
63
Za obavljanje 'programiranja prema rasporedu' koristi se MBED Timer objekt.
64
#include "mbed.h"
65
Potrebno je definirati drugi tajmer objekt, digitalni izlaz i zadatak funkcije
prototipa.
66
6.2. Uporaba MBED 'Ticker' objekta
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
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
68
Tablica 11: Funkcija 'InterruptIn'
Napomena: svaki digitalni ulaz može se koristiti kao prekid osim pinova 19 i 20
#include "mbed.h"
InterruptIn button(p18); // Interrupt on digital pushbutton input p18
DigitalOut led1(p5); // digital out to p5
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
69
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.
#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
71
7. Dizajn modula i tehnike programiranja
Funkcije i potprogrami
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;
}
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
š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.
#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
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.
#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
77
7.3. C funkcije
Ova funkcija koristi C 'switch/case' naredbu koja se izvršava identično kao 'if'
naredba, ali sa zadanim mogućim uvjetima
: 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
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.
80
U svakom programu postoji main() funkcija, kojom se definira kod glavnog
programa
Napišite program koji čita dvoznamenkasti broj unešen na tipkovnici i ispisuje taj
broj na 7-segmentnom zaslonu.
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) {
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)
}
83
Slika 88: Modularno programiranje
#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
85
// template for .h file
// functions.h file
Važno je spomenuti, ovdje nije potrebno definirati specifične MBED priključke, jer
oni su već specificirani u objektnoj deklaraciji u 'functions.cpp'
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.
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).
Datoteka 'main.cpp' zadržava isti glavni funkcijski kod kao i prije, ali poziva
(#include) uključene nove datoteka zaglavlja.
#include "mbed.h"
#include "HostIO.h"
#include "SegDisplay.h"
#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
}
#ifndef SEGDISPLAY_H
#define SEGDISPLAY_H
#include "mbed.h"
#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'.
#include "HostIO.h"
#include "SegDisplay.h" // allow access to functions and objects in
SegDisplay.cpp
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
#ifndef HOSTIO_H
#define HOSTIO_H
#include "mbed.h"
extern Serial pc; // allow pc to be manipulated by other files
#endif
Slika 99: Datoteka 'HostIO.h' za vježbu 7-7
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.
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.
#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
}
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.
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);
}
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.
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.
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
#include "Flasher.h"
#include "mbed.h"
void Flasher::flash(int n) {
for(int i=0; i<n*2; i++) {
_pin = !_pin;
wait(0.2);
}
}
94
Slika 104:Datoteka Flasher.cpp
#include "mbed.h"
#include "Flasher.h"
Flasher led(LED2);
int main() {
led.flash(5);
led.flash(2);
}
Naš program koristi novo stvorenu funkcionalnost, bez potrebe da znamo kako
je ona kodirana.
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".
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:
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:
97
8. Paralelni podaci i komunikacija
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
#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
100
Vježba 8-2: „Knightrider“ LED efekt sa BusOut objektom
#include "mbed.h"
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.
Hardverska integracija
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Ω).
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
#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
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
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.
lcd.cls();
Slika 119: Brisanje postojećeg sadržaja LCD zaslona
x = 1028
lcd.printf("%i",x);
#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
#include "mbed.h"
#include "TextLCD.h"
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
Dodatni zadatak
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
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.
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.
'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'.
110
Slika 125: Prijenos podataka kod jednostavne I²C komunikacije
I²C na MBED-u
111
Slika 126: I²C priključci na MBED-u
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.
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.
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.
114
Slika 129: Povezivanje MSPG_I2C_SLAVE sa MBED-om
VCC (3,3V) 40 1
GND (0V) 1 20
115
Vježba 9-1: Upotreba MSPG_I2C_SLAVE modula
#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
116
9.3. Povezivanje više uređaja na I²C sabirnicu
#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);
Dodatne vježbe
118
10. Serijska komunikacija sa SPI-om
119
U slučaju kada postoji više 'slave' uređaja, 'master' mora davati jedinstveni izlazni
CS signal za svaki 'slave'.
Stoga, kod SPI-a postoje četiri moda, tj. načina rada prama slici 133.
120
Slika 135: Modovi rada kod SPI komunikacije
121
SPI na MBED-u
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.
123
Slika 138: Tipovi elektroničke memorije
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.
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.
125
pisanje podataka (eng. write)
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).
fclose(pFile);
Slika 141: Naredba 'fclose' za zatvaranje datoteka
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
128
Vježba 11-1: Stvaranje datoteke i upis
#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
#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
#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
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.
131
12. Upotreba MBED mikroupravljača u praksi
TVZ > SPEC ELO > Dipl.> Zadatak > E334> **MBED** > Tomislav > Hadrovic
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.
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.
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);
//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;
135
13. Literatura