Upload
airpop24
View
218
Download
5
Embed Size (px)
Citation preview
UNIVERZA V LJUBLJANI
PEDAGOŠKA FAKULTETA
FAKULTETA ZA MATEMATIKO IN FIZIKO
Program: fizika - tehnika
ENJE PROGRAMSKEGA JEZIKA C++NA PRIMERIH S PODRO JA MERJENJA
IN KRMILJENJADIPLOMSKO DELO
Mentor: dr. Slavko Kocijan , izr. prof. Kandidat: Primož Hladnik
Somentor: dr. Boštjan Murovec, doc.
Ljubljana, september, 2008
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
II
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
III
ZahvalaNajprej bi se rad zahvalil mentorju, izrednemu profesorju dr. Slavku Kocijan u,
za potrpežljivo branje diplomskega dela in vseh predlaganih popravkov; dr.
Boštjanu Murovcu za vso pomo pri literaturi, programiranju in za moralno
vzpodbudo. Zahvala pa gre seveda tudi ženi Mojci in staršem, ki so me ves as
spremljali in me vzpodbujali pri študiju.
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
IV
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
V
Povzetek
Programski jezik C++ velja za enega najbolj univerzalnih programskih jezikov. V
okviru brezpla nega programskega razvojnega okolja Microsoft Visual C++
Express, ki je del Microsoft Visual Studio Express 2008, je odli no razvojno
orodje C++ dostopno komurkoli.
Diplomsko delo, za razliko od tradicionalnega spoznavanja sintakse
programskega jezika, temelji na u enju preko že narejenih osnovnih primerov
programske kode, temelje ih na ra unalniškem krmiljenju in merjenju. Prvi koraki
v u enje jezika temeljijo na prižiganju posameznih LED diod (lu k), branju stanja
stikal, signalov s potenciometra ali fotoupora itd. Pri tem je osnova USB vhodno-
izhodni merilno-krmilni vmesnik eProDas-SC1, v nadaljevanju vmesnik, razvit v
okviru projekta ComLab.
Klju ne besede: eProDas, u enje programiranja, C++, merjenje, krmiljenje,
programiranje, ra unalništvo, pou evanje robotike
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
VI
Abstract
Learning programming language C++ based on dataacquisition examples
The C++ Programming language is known to be one of the most universal
programming languages. Within the framework of Microsoft Visual Studio
Express 2008, it is possible to obtain a free copy of Microsoft Visual C++ Express
2008, which is an excellent development tool accessible to everybody.
Contrary to traditional teaching of programming languages, this thesis
approaches teaching through prepared pieces of code, based on computer data
acquisition system. First steps into teaching starts with turning on LED diodes,
reading of switches as well as signals from potentiometer, photo resistor etc. An
USB data acquisition module eProDas-SC1, which was developed within the
ComLab Project, is used for the task of communication between personal
computer and attached periphery.
Keywords: eProDas, learning programming, C++, data acquisition,
microcontroller, programming, teaching robotics
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
VII
Kazalo
1 Uvod...............................................................................................................12 Programski jezik C++ .....................................................................................3
2.1 Zgodovina C++........................................................................................4
2.2 C++ v šolstvu ..........................................................................................5
2.3 C++ v Industriji ........................................................................................5
2.4 Prednosti in slabosti jezika C++ ..............................................................6
3 Koncept u enja programskih jezikov na primerih s podro ja merjenja inkrmiljenja. ..............................................................................................................74 Priprava programske opreme.......................................................................11
4.1 Namestitev vmesnika eProDas-SC1 .....................................................12
5 Primeri vzor nih nalog v Visual C++.............................................................135.1 Prvi koraki .............................................................................................13
5.2 Nastavljanje enega bita – prižiganje ene LED diode – DOutBit.............15
5.3 Prižiganje ve LED diod hkrati – DOutNum...........................................17
5.4 Branje digitalnega vhoda - DInBit..........................................................18
5.5 Branje bitov na celem portu – DInNum..................................................20
5.6 Prikaz smeri vrtenja motorja - DOutDir..................................................22
5.7 Branje analognega vhoda – AIn10bNum in izpis zajetega števila .........24
5.8 Branje analognega vhoda – AIn10bVol in izpis napetosti......................26
5.9 Utripa ...................................................................................................27
5.10 Povzetek ukazov za vmesnik ................................................................28
5.11 Krmiljenje kora nega motorja................................................................29
6 Za etek novega projekta ..............................................................................326.1 Gradnja programa »Model uli ne razsvetljave« ....................................35
6.2 Lu ke Knight Rider................................................................................41
6.3 Iskalec svetlobe.....................................................................................45
7 Sestava programov v konzoli .......................................................................497.1 Naloge za izpis v konzoli .......................................................................50
7.2 Digitalni izhod........................................................................................52
7.2.1 Prižiganje lu ke (Digitalni izhod) ....................................................52
7.2.2 Prižiganje ve lu k .........................................................................54
7.2.3 Prižiganje ve lu k naenkrat ..........................................................55
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
VIII
7.2.4 Utripanje lu k ................................................................................ 56
7.2.5 Utripanje lu k (for zanka) .............................................................. 58
7.3 Digitalni vhod........................................................................................ 59
7.3.1 Vklop LED diode s stikalom........................................................... 59
7.3.2 Prekinitev utripanja lu k s stikalom ............................................... 61
7.4 Analogni vhod....................................................................................... 62
7.4.1 Branje numeri ne vrednosti in izpis na zaslon .............................. 62
7.4.2 Branje analognega vhoda in izpis napetosti na zaslon.................. 64
7.4.3 Model uli ne razsvetljave v konzolskem na inu ............................ 65
7.5 Shranjevanje podatkov meritev ............................................................ 66
7.5.1 Shranjevanje vrstice v datoteko .................................................... 66
7.5.2 Shranjevanje meritve praznjenja kondenzatorja v datoteko .......... 67
8 Zaklju ek ..................................................................................................... 699 Viri: .............................................................................................................. 7010 Priloge na zgoš enki ................................................................................... 72
Kazalo slik
Slika 3.1: Diagram delovanja in komunikacije....................................................... 8
Slika 3.2: Diagram eProDas ................................................................................. 9
Slika 4.1: Spletna stran za prenos Visual C++ 2008 Express Edition................. 11
Slika 4.2: Dodamo datoteko eProDasCPPLib.h v mapo..................................... 12
Slika 5.1: Izbira za etnega programa ................................................................. 13
Slika 5.2: Start Debugging .................................................................................. 14
Slika 5.3: Aplikacija Start .................................................................................... 14
Slika 5.4: Vezava diode ...................................................................................... 15
Slika 5.5: Okno DOutBit...................................................................................... 15
Slika 5.6: DOutNum program.............................................................................. 17
Slika 5.7: Shema vezave ve LED diod .............................................................. 17
Slika 5.8: Shema vezave stikala ......................................................................... 18
Slika 5.9: Vezava stikala 5 V levo, 0 V desno..................................................... 18
Slika 5.10: DInBit okno - stanje na bitu 0 ............................................................ 19
Slika 5.11: Shema priklopa ve mikrostikal......................................................... 20
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
IX
Slika 5.12: Okno za prikaz DInNum.....................................................................20
Slika 5.13: Okno Vrtenje motorja – DOutDir ........................................................22
Slika 5.14: Enosmerni motor v pogonu................................................................22
Slika 5.15: 1 - izhod na vmesniku (8 bitov iz PortD), 2 - DC napajanje 9 V na H-
krmilju, 3 - vhod na H-krmilje, 4 - Izhodi iz H-krmilja...........................................23
Slika 5.16: Vezava potenciometra .......................................................................25
Slika 5.17: Okno programa AIn10bNum ..............................................................25
Slika 5.18: Okno programa AIn10bVol ................................................................26
Slika 5.19: Utripa ...............................................................................................27
Slika 5.20: Vezava kora nega motorja ................................................................29
Slika 5.21: Krmiljenje kora nega motorja ............................................................30
Slika 6.1: Za etek novega projekta......................................................................32
Slika 6.2: Okno Windows Forms Application .......................................................32
Slika 6.3: Dodamo datoteko eProDasCPPLib.cpp...............................................33
Slika 6.4: Dodajanje eProDasCPPLib.cpp...........................................................33
Slika 6.5: Vpis knjižnic eProDasCPPLib.h in windows.h......................................34
Slika 6.6: Vezava fotoupora.................................................................................35
Slika 6.7: Izbira forme Form1.h............................................................................35
Slika 6.8: Prazna forma Form1............................................................................36
Slika 6.9: Dodajanje asovnika timer1.................................................................37
Slika 6.10: asovnik pod formo...........................................................................38
Slika 6.11: Nastavitve asovnika .........................................................................39
Slika 6.12: Program Model uli ne razsvetljave in koda........................................40
Slika 6.13: Knight Rider .......................................................................................41
Slika 6.14: Vezava osmih LED diod.....................................................................41
Slika 6.15: Iskalec svetlobe .................................................................................45
Slika 6.16: Shema iskalca svetlobe .....................................................................46
Slika 7.1: Izbira novega projekta v konzoli...........................................................50
Slika 7.2: Izbira nastavitev projekta .....................................................................51
Slika 7.3: Dodajanje nove CPP datoteke.............................................................51
Slika 7.4: Brezvija ne sponke (ang. Cage-clamp) ...............................................52
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
X
Slika 7.5: Vezava svetle e diode ........................................................................ 52
Slika 7.6: Vezava stikala in LED diode, vklop pri + 5 V....................................... 59
Slika 7.7: Vezava stikala in LED diode, vklop pri 0 V.......................................... 60
Slika 7.8: Vezava stikala na vmesnik + 5 V in 0 V. ............................................. 61
Slika 7.9: Vezava modela uli ne razsvetljave ..................................................... 65
Slika 7.10: Vezava vezja za merjenje praznjenja kondenzatorja ........................ 67
Kazalo tabel
Tabela 5.1: Analogni vhodi in poimenovanje na vmesniku ................................. 24
Tabela 5.2: Vsi prototipi ukazov za krmiljenje napreave..................................... 28
Tabela 5.3: Povzetek rabe argumentov funkcij vmesnika................................... 28
Tabela 5.4: Koraki kora nega motorja................................................................ 29
Kazalo programskih kod
Programska koda 5.1: Primer uporabe ukaza DOutBit ....................................... 16
Programska koda 5.2: Uporaba ukaza DOutNum .............................................. 17
Programska koda 5.3: Uporaba ukaza DInBit..................................................... 19
Programska koda 5.4: Uporaba ukaza DInNum ................................................. 21
Programska koda 5.5: Prikaz uporabe ukaza Da DoutDuir ................................ 23
Programska koda 5.7: Primer uporabe ukaza AIn10bNum................................. 25
Programska koda 5.8: Primer uporabe ukaza AIn10bVol ................................... 26
Programska koda 5.9: Koda programa Utripa ................................................... 27
Programska koda 5.10: Utripa .......................................................................... 27
Programska koda 5.11: Primer krmiljenja kora nega motorja ............................ 31
Programska koda 6.1: Zgenerirana koda ob dvokliku na formo.......................... 36
Programska koda 6.2: V pripravljeno kodo vstavimo ukaz ................................. 36
Programska koda 6.3: Zgenerirana koda po dvojnem kliku na ikono timer1...... 38
Programska koda 6.4: Vstavljanje kode med zavita oklepaja ............................. 38
Programska koda 6.5: Koda za vklop asovkinka ob kliku na gumb .................. 39
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
XI
Programska koda 6.6: Koda za ustavitev asovnika ob kliku na gumb ...............40
Programska koda 6.7: Koda programa Knight Rider ...........................................42
Programska koda 6.8: Prototip for zanke ............................................................44
Programska koda 6.9: Koda programa Iskalec svetlobe .....................................47
Programska koda 7.1: Primer kode za konzolo ...................................................49
Programska koda 7.2: Prižiganje lu ke na digitalnem izhodu..............................53
Programska koda 7.3: Prižiganje ve lu k naenkrat ............................................54
Programska koda 7.4: Prižiganje ve lu k naenkrat for zanka ............................55
Programska koda 7.5: Utripanje lu k...................................................................56
Programska koda 7.6: Utripanje lu k...................................................................56
Programska koda 7.7: Utripanje lu k s for zanko ................................................58
Programska koda 7.8: Vklop LED diode s stikalom.............................................60
Programska koda 7.9: prekinitev utripanja lu k s stikalom ..................................61
Programska koda 7.10: Branje numeri ne vrednosti in izpis na zaslon...............63
Programska koda 7.11: Branje analognega vhoda in izpis napetosti na zaslon ..64
Programska koda 7.12: Model uli ne razsvetljave...............................................65
Programska koda 7.13: Shranjevanje vrstice v datoteko.....................................66
Programska koda 7.14: Zapis meritve praznjenja kondenzatorja v datoteko.......68
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
1
1 UvodPrvi koraki pri u enju in pou evanju programiranja predstavljajo velik izziv.
Problem predstavlja predvsem motivacija in precejšnja koli ina znanja, ki je
potrebna za prve uspehe. Pomembna ugotovitev anket na Fakulteti za
Ra unalništvo in informatiko je tudi dejstvo, da je v zadnjih desetih letih mo no
upadlo znanje programiranja pri srednješolski populaciji. Delež študentov, ki ob
vpisu na študij ra unalništva nima nobenih izkušenj iz programiranja, že presega
50 odstotkov (leta 1995 je bilo takih študentov samo 2,56%) [1].
Zakaj je pou evanje programiranja tako zahtevno? Kdaj naj se lotimo pou evanja
programiranja [2]?
Koncepti robotike so dostopni že otrokom od 12 leta dalje. Mednarodna podjetja,
kot so LEGO ali FischerTechnik, razvijajo pakete, ki že vsebujejo vse potrebno za
sestavljanje in programiranje robotov. Paketi so vnaprej pripravljeni in precej
dragi.
Primer takšnega paketa je LEGO Mindstorms, ki že vsebuje enote z motorji,
senzorji, LED diodami, gonili (osi, gredi, zobniki, jermeni … ) in seveda LEGO
kockami, ki se jih lahko sestavlja med sabo in programira z razli nimi
programskimi jeziki, ki že pridejo s paketom, lahko pa jih programiramo tudi z
drugimi popularnimi programskimi jeziki, med drugim tudi C in C++ [3].
S pedagoškega stališ a je bilo spoznano, da je možnost za transfer znanja z
uporabo teh paketov precej slaba. Uporabljena programska orodja so specifi na
(LEGO ponuja RCX kodo, ki je že vklju ena v LEGO Mindstorms, ter ROBOLAB,
ki temelji na programskem jeziku LabWiev, razvit na univerzi Tufts v Bostonu,
ZDA). Otroci se tako ne morejo veliko nau iti o konstrukcijah, elektroniki in
mehanskih sistemih [4]. Poleg tega so vsi deli že izdelani iz primernih materialov,
tako spoznavanje lastnosti le-teh ter njihova obdelava izgublja pomen v osnovni
šoli. V pouk se vklju ujejo dragi in skopi paketi, ki vsebujejo le vzorce razli nih
materialov. Prav tako se je število ur namenjenih tehniki in tehnologiji v zadnjem
asu zmanjšalo.
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
2
Za u enje programiranja je na in dela jasen: e želimo pou evati programiranje,
se je le-tega treba lotiti na prakti nih primerih. Na žalost je ve ina knjig, ki u ijo
programiranje napisanih na na in, ki u ence ne motivira dovolj. Tipi ni za etek
enja programskega jezika se za ne s prikazom vrstice »Hello World!«, nato
sledi razlaga novih ukazov, funkcij, orodij. Pri tem je potrebna razlaga vsake
vrstice kode posebej (npr. #include "eProDasCPPLib.h", std::cout<<,
return();, zakaj se vsaka ukazna vrstica kon a s »;« itd. ).
Alternativni pristop k za etkom u enja programiranja in uvajanju v krmiljenje in
merjenje, ki je predmet diplomske naloge, že vsebuje vrsto napisanih kratkih
primerov kode v jeziku C++. Izhajamo iz tega, da otroci že poznajo okolje
Windows, obvladajo miško in lahko uporabijo tudi znanje iz Worda (spreminjanje
pisave, vnos slik, oblikovanje). Zato so naloge vizualne, u enci pa spoznavajo
pomen kode tako, da spreminjajo parametre, kombinirajo razli ne primere kode,
dodajajo gumbe, ponavljajo vrstice, s poskusi ugotavljajo pravilnost napisane
kode in se na ta na in bolj izkustveno nau ijo programiranja v jeziku C++. Pri
tem se ni potrebno nau iti ukazov na pamet (sicer je zaželeno, ker na ta na in
programiranje poteka hitreje).
Vizualni in izkustveni pristop programiranja otroke bolj motivira, saj nekaj tega že
poznajo iz vsakdanje uporabe ra unalnika in nameš ene programske opreme.
Kon ni izdelek pa je zelo podoben tistemu, kar že poznajo. Na ta na in lahko s
kratkimi ukazi hitro pridejo do želenih rezultatov (vrte ega motorja, utripanja lu k
itd.), kar jim vlije pogum, da raziskujejo, spoznavajo in samostojno iš ejo rešitve
za naloge, ki so jim predstavljene. Za pedagoško delo je zaželeno, da u enje
poteka v parih, ki se tekom pou evanja programiranja preko vmesnika tudi
izmenjujejo. Na ta na in dosežemo pri pou evanju ve jo efektivnost, vloga
posameznika v paru je natan no dolo ena in razdeljena, zato so rezultati na
koncu veliko bolje vidni - ve ji odstotek u encev uspešno dokon a delujo
program ali vsaj delno delujo program; odstotek tistih, ki ga ne dokon ajo, ali pa
je neuporaben oz. nedelujo , pa se zelo zmanjša [5].
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
3
2 Programski jezik C++
Programski jezik C++ je splošno namenski programski jezik, kjer so vsi
podatkovni tipi stati ni, zapis kode je preprost, jezik sam pa podpira
ve paradigmati no, proceduralno programiranje, podatkovno abstrakcijo ter
objektno usmerjeno in generi no programiranje.
C++ je eden izmed najširše uporabljenih programskih jezikov. Je tudi eden izmed
najve jih programskih jezikov, ki so bili kadarkoli zasnovani. Bjarne Stroustrup je
kot enega izmed kriterijev pri na rtovanju jezika dolo il, da med C++ in strojno
kodo ne sme biti prostora za jezik na nižji ravni. Zelo malo programerjev
uporablja najnižjo raven jezika C++ in mnogi sploh ne vedo, da obstaja klju na
beseda »asm«, ki omogo a podporo pisanju kode v zbirnem jeziku [6].
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
4
2.1 Zgodovina C++
V šestdesetih letih, ko so bili ra unalniki še v povojih, so se pojavili mnogi novi
programski jeziki. Med njimi ALGOL 60, ki se je razvil kot alternativa
FORTRANU, a je od njega vzel nekaj konceptov strukturnega programiranja, ki je
kasneje navdihnilo ve proceduralnih jezikov, kot sta CPL in njegovi nasledniki
(npr. C++). ALGOL 68 je neposredno vplival na razvoj podatkovnih tipov v C.
Vendar je bil ALGOL 68 nespecifi en jezik in njegova abstraktnost je bila
neprakti na za reševanje ve ine komercialnih nalog.
V letu 1963 se je CPL (Combined Programming Language) pojavil z idejo biti bolj
specifi en za reševanje konkretnih problemov kot ALGOL ali FORTRAN.
Kakorkoli že, ista specifi nost ga je naredila za velik programski jezik, zato je
težak za u enje in implementacijo [7].
V letu 1967 je Martin Richards razvil BCPL (Basic Combined Programming
Language), ki je pravzaprav poenostavitev jezika CPL, ampak je ohranil najbolj
pomembne zna ilnosti, ki jih je jezik ponujal. eprav je bil tudi abstrakten in
nekoliko velik jezik [7].
Leta 1970 se je Ken Thompson potopil v razvoj UNIX-a v Bellovih laboratorijih
(Bell Labs) in razvil jezik B. To je bil del jezika BCPL za specifi ne naprave in
sisteme (DEC PDP-7 in UNIX) in je bil prilagojen za njegov okus in potrebe.
Kon ni rezultat je bila še ve ja poenostavitev CPL, eprav odvisna od sistema.
Imela je veliko omejitev, recimo zaradi specifi nega sestavljanja strojne kode, so
bile izvršljive datoteke po asnejše in tako je bil jezik neprimeren za izdelavo
operacijskih sistemov. Zaradi tega je Dennis Ritchie iz Bellovih laboratorijev za el
z razvojem prevajalnika jezika B (ang. Compiler), ki je med drugim bil sposoben
direktno izdelati izvršljivo kodo. Ta »novi B«, kon no imenovan C, je med drugim
dodal nove koncepte, kot so podatkovni tipi, npr. »char«.
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
5
V letu 1973 je Dennis Ritchie razvil osnove jezika C: vklju evanje podatkovnih
tipov, ravnanje z njimi, izboljšanje polj (ang. arrays), kazalcev (ang. pointers) …
Vse te nadgradnje so, s kasnejšimi zmožnostmi prenosljivosti, prispevale k
razvoju jezika C. Povzeto je bilo v knjigi The C Programming Language, ki je
postala de facto standard do formalne objave ANSI standarda leta 1989.
Programski jezik C++ je leta 1983 razvil Bjarne Stroustrup, ki je delal v Bellovih
laboratorijih. C++ je naslednik oziroma nadgradnja programskega jezika C. Ime
izhaja iz oznake »++«, ki pomeni »pove anje«, v matemati nem smislu pa
pove anje pomeni naslednika ne esa. Prav zato bi lahko ime prevedli tudi v
»Naslednik jezika C«[6]. Prva komercialna izdaja jezika C++ se je pojavila hkrati
s knjigo The C++ Programming Language, ki jo je spisal prav Bjarne Stroustrup.
Od takrat vsakih nekaj let sledijo nove izdaje standarda, popravki in izboljšave
[7].
2.2 C++ v šolstvu
V Sloveniji pouk programskega jezika C++ poteka na srednjih tehni nih šolah
(npr. Šolski center Ptuj) ter fakultetah, kot sta Fakulteta za Elektrotehniko in
Fakulteta za Ra unalništvo in Informatiko. V osnovnih šolah se ga ne uporablja,
ker je za za etnike zaradi pomanjkanja motivacije in obilice znanja, ki je potrebno
za pou evanje tega univerzalnega jezika, prezahtevno.
2.3 C++ v Industriji
C++ se najve krat uporablja za programiranje zahtevnih aplikacij, operacijskih
sistemov ali naprav, ki zahtevajo dobro izkoriš eno ra unsko mo in jih poganjajo
mikrokrmilniki. Za enostavne probleme se lahko uporabi katerikoli programski
jezik. Ko pa pride do kompleksnejših problemov, potrebujemo zmogljiv jezik.
Vsaka odlika programskega jezika C++ obstaja samo zato, ker se je izkazala za
zelo uporabno na dolo enih podro jih industrijskega programiranja [8].
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
6
Programerje v realnem svetu bolj zanimajo problemi kot jezik sam; programski
jezik je tako samo pod do rešitve problema, poti pa je lahko ve . Ko je
uporabljena pravilna mešanica jezikov in njihovih zmogljivosti, je rešitev problema
mnogo lažje opisati in implementirati z boljšimi rezultati.
C++ ne ostaja pomembno orodje za razvijalce programov zato, ker bi kdorkoli
mislil, da je najboljše, pa pa zato, ker je prenosljiv jezik, ki deluje bolje kot
njegove alternative na mnogih podro jih [9].
2.4 Prednosti in slabosti jezika C++
Jezik C++ je po sintaksi enostaven, uporablja veliko logi nih operaterjev, veliko
paleto že standardiziranih knjižnic, funkcij, razli nih orodij, knjižnic za skoraj vse
mikrokrmilnike. Slaba stran univerzalnosti je zahtevnost jezika (npr. raba
znakovnih nizov in podatkovnih tipov je zahtevnejša kot pri drugih programskih
jezikih). Prav zato je pou evanje tega jezika zahtevnejše.
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
7
3 Koncept u enja programskih jezikov na primerih s podro jamerjenja in krmiljenja.
Pred 25 leti so mikrora unalniki postali dostopni za vse nivoje izobraževanja
zaradi nizke cene in sorazmerne funkcionalnosti. Spomnimo se ZX spectruma,
Commodore itd.
Ti ra unalniki so bili dobro sprejeti med otroci od desetega leta starosti dalje.
Programski jeziki kot je Basic, so bili del mikrora unalnika in so imeli vlogo
operacijskega sistema. Vendar pa je u enje programiranja, ki je bilo v za etku
razvoja informacijske tehnologije precej popularno, postopoma izgubilo
privla nost. Zmogljivosti današnjih osebnih ra unalnikov so neprimerljivo boljše,
inkovita programska podprtost je dostopna tako komercialno kot prosto in na
pokušino preko spleta.
Te aji programiranja konceptualno težko sledijo naglemu razvoju IKT
(informacijsko-komunikacijski tehnologiji), še posebej kar se ti e motivacije
encev ali študentov. eprav se koncept programskih jezikov kot so Basic, C,
C++, Pascal idr. ni kaj dosti spremenil, so vaje, ki so bile uporabljene za
pou evanje jezikov postale zastarele, neuporabne in nevzpodbudne. Aplikacije
za u enje programiranja na spletu so sicer bolj privla ne, vendar je spletno
programiranje preve specifi no in kompleksno (npr. Java Script) [10].
Splošna okolja za programiranje, kot so Visual Basic, C++, Delphi itd., utegnejo
priskrbeti bolj temeljne in prenosljive veš ine programiranja. Da bi priskrbeli bolj
privla ne in vzpodbudne naloge za u ence v srednjih tehni nih šolah, je bil
izdelan te aj osnovan na merilno-krmilnem vmesniku eProDas-SC1, ki je zgrajen
na mikrokrmilniku PIC18F4550 podjetja Microchip [11].
Naprava in firmware (program, ki je zapisan na mikrokrmilniku, na njem tudi te e
in skrbi za komunikacijo med PC in mikrokrmilnikom preko USB povezave (Slika
3.1), na mikrokrmilnik se ga naloži s pomo jo programatorja) sta bila razvita na
Fakulteti za Elektrotehniko Univerze v Ljubljani v sodelovanju s Pedagoško
Fakulteto Univerze v Ljubljani v okviru programa Leonardo da Vinci, projekt
Comlab 2 [12].
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
8
Slika 3.1: Diagram delovanja in komunikacije
Naprava je namenjena splošni rabi. Izkazalo pa se je, da se zaradi svoje
zahtevnosti za za etnike (dokumentacija obsega ez 300 strani [11]) ni obnesla.
Zato je bila izdelana dodatna datoteka eProDasHL.dll, odvisna od že obstoje e
eProDas.dll (HL pomeni High Level), ki vsebuje nabor najosnovnejših funkcij za
krmiljenje naprave. Za ciljne programske jezike Visual Basic, Labview in Delphi
so bile izdelane knjižni ne datoteke (eProDasVBLib.vb za Visual Basic,
eProDasBDLib.pas za Borland Delphi in eProDas sub VI funkcije za Labview).
Kon ni izdelki vseh programskih jezikov so tako enako funkcionalni (Slika 3.2).
Naloge ki so predstavljene v diplomskem delu že obstajajo za programske jezike
Visual Basic, Labview in Delphi na strani Comlab [13]. Poleg teh pa so v
diplomski pripravljene še dodatne naloge in naloge napisane v konzolskem
na inu.
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
9
Slika 3.2: Diagram eProDas
Namen izdelave in organizacije te ajev je bilo seznanjanje srednješolskih in
osnovnošolskih u iteljev s problemskih pristopom k u enju programiranja. Za to
pa je seveda potrebna cenovno ugodna in robustna strojna oprema, ki je bila
razvita ravno v ta namen.
Seminarji z naslovom Ra unalniško podprto laboratorijsko delo s podro ja
elektrotehnike in elektronike – srednje poklicno izobraževanje so bili izvedeni na
štirih šolskih centrih (Šolski center Ptuj, Šolski center Celje, Šolski center Novo
Mesto in Šolski center Kranj). Udeleženih je bilo skupaj 57 osnovnošolskih in
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
10
srednješolskih u iteljev. Odzivi in ocene povzete po anketah so bili zelo pozitivni
(ocena 5 od 6). Za izvedbo in primernost so izvajalci te aja dobili same pohvale.
Komentar enega izmed udeležencev na anketnem vprašalniku, na katerega so
odgovarjali po zaklju ku seminarja: »Eden redkih koristnih seminarjev, ki je zelo
prakti no obarvan.« Kritike in predlogi so bili le na ra un opremljenosti in
primernosti prostorov ter pomanjkanje asa za izvedbo zahtevnejših vsebin.
Za seminarje Robotike za osnovnošolske u itelje sta se uporabljala programska
jezika Visual Basic in Bascom, za tehniške šole pa Visual Basic in Labview.
S seminarji pa se celoten projekt ni zaklju il. Po seminarjih so u itelji samostojno
pripravili projekte v obliki seminarskih nalog z uporabo vmesnika. Nekaj od teh je
bilo predstavljenih tudi na mednarodni konferenci Comlab 2, kjer so se izkazali z
iznajdljivimi rešitvami, kot je npr. krmiljenje trofaznega motorja [14].
Izkušnje iz seminarjev so pokazale, da za te aje manjka programski jezik C++ in
da bi tudi za C++ bilo smiselno napraviti enako podporo kot za preostale tri
jezike.
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
11
4 Priprava programske opreme
Za programiranje je v našem primeru uporabljen programerski paket Microsoft
Visual Studio 2008 Express Edition, ki je prosto dostopen na internetu (Slika 4.).
Brezpla na je tudi registracija. Iz paketa izberemo Visual C++ 2008 Express
Edition, prenesemo na lokalni ra unalnik, zaženemo in namestimo.
Celotno u enje je osnovano na tem izdelku.
Slika 4.1: Spletna stran za prenos Visual C++ 2008 Express Edition
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
12
4.1 Namestitev vmesnika eProDas-SC1
Celotno programsko opremo z gonilniki, osnovnimi knjižnicami, nadgradnjo
programske opreme (firmware) za vmesnik, lahko naložimo iz priložene
zgoš enke ali iz spletne strani Comlab [15].
Za namestitev gonilnikov za vmesnik prenesemo datoteko
eProLab_200X_XX_XX.exe, jo poženemo in namestimo.
Celoten potek namestitve (v angleš ini), se nahaja na spletni stran projekta
Comlab [16].
Poleg namestitve potrebujete za C++ še dve datoteki, datoteko
eProDasCPPLib.h in datoteko eProDasCPPLib.cpp (datoteki se nahajata na
priloženi zgoš enki).
Datoteko eProDasCPPLib.h dodate v mapo include (Slika 4.2), ki se nahaja v
namestitveni mapi Visual Studia, ki smo ga predhodno namestili.
Slika 4.2: Dodamo datoteko eProDasCPPLib.h v mapo
To je potrebno narediti na vsakem ra unalniku ob namestitvi samo enkrat.
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
13
5 Primeri vzor nih nalog v Visual C++
Vzor ne naloge so nadaljevanje in dopolnjevanje projekta Comlab. Na spletni
strani Comlab se nahajajo primeri, ki že opisujejo postopke programiranja
vmesnika v programskih jezikih Visual Basic, Borland Delphi in LabWiev. V
nadaljevanju so enake naloge predstavljene v Visual C++.
5.1 Prvi koraki
Preden pri nemo s programiranjem, poglejmo, kako delati z že obstoje o Visual
C++ aplikacijo, ki upravlja z vmesnikom. Iz priložene zgoš enke prenesemo
mapo primeri, poiš emo mapo Start (Slika 5.1) in v njej poženemo datoteko Start
s kon nico .sln, ki je datoteka tipa Microsoft Visual Studio Solution. POZOR:
Kon nice v Windows okolju so privzeto skrite, zato je potrebno spremeniti
nastavitve mape (Folder Options).
Slika 5.1: Izbira za etnega programa
Z dvojnim klikom na to datoteko, se nam odpre prva aplikacija. e ne vidite
osnovne forme programa, izberite Form1.h. V meniju Solution Explorer. e ni niti
tega menija, potem izberite Wiew Solution Explorer ali izberite Ctrl+Alt+L.
Program lahko sedaj zaženemo na dva na ina. To je s pritiskom na funkcijsko
tipko F5 ali pa kliknemo na zelen trikotnik Start Debugging (Slika 5.2).
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
14
Slika 5.2: Start Debugging
Po pritisku na Start Debugging gumb (ang. »za ni razhroš evanje«) se program
najprej prevede v strojni jezik, pri emer preveri vse napake in nas v slednjem
primeru nanje tudi opozori, izpiše vrstico z napako, prevajanje v strojni jezik pa
prekine. e je vse v redu in koda ne vsebuje napak, se nam prikaže forma
programa Start (Slika 5.3).
S tem programom lahko prižigamo LED diode in beremo analogne vhode in
izhode na vmesnik. Uporabimo ga zato, da preverimo pravilno delovanje naprave
in njenih digitalnih vhodov in izhodov ter analognih vhodov.
Slika 5.3: Aplikacija Start
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
15
5.2 Nastavljanje enega bita – prižiganje ene LED diode –DOutBit
DOutBit(unsigned int Port, char nBit, char BitState);
Z vmesnikom lahko krmilimo lu i, motorje, releje, integrirana vezja itd. Digitalni
izhod lahko vklju i ali izklju i lu , požene motor naprej, nazaj ali ga ustavi.
Poglejmo si naslednji primer kako kontroliramo eno samo LED diodo.
Najprej pripravimo vezje z LED diodo in uporom, kot kaže slika (Slika 5.4):
Slika 5.4: Vezava diode
Nato poženemo datoteko DOutBit.sln, podobno kot pri predhodni vaji (Slika 5.5).
Po pritisku na gumb prižgi, se prižge prva LED dioda priklopljena na PortB (B0).
Slika 5.5: Okno DOutBit
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
16
Programska koda 5.1: Primer uporabe ukaza DOutBit111112113114115116117118119120121122
private: System::Void Form1_Load(System::Object^ sender,System::EventArgs^ e) {eProDasInit(1);}private: System::Void button1_Click(System::Object^ sender,System::EventArgs^ e) {DOutBit(PortB, 0,1);}private: System::Void button2_Click(System::Object^ sender,System::EventArgs^ e) {DOutBit(PortB, 0, 0);}
Koda pisana krepko je tista, ki prižge in ugasne LED diodo. V oklepaje za
funkcijami vpisujemo parametre in v našem primeru so to Device_Index, ki
ozna uje številko naprave. e imamo samo en vmesnik priklopljen na ra unalnik,
ima vrednost 0. Naslednji parameter je Port, (od PortA do PortE), ki ozna uje
skupine bitov z oznako nBit. Na vsakem portu pa jih je ve in jih izbiramo s števili
od 0 do 7. Zadnji parameter je stanje v katerem je bit. Le-ta je lahko le 0 ali 1.
Pozor! Za pravilno delovanje vmesnika je potrebno na za etku vsakega
programa vmesnik povezati z ra unalnikom. To naredimo z ukazom
»eProDasInit(InfoPrint);«, kjer je število InfoPrint lahko 0, 1 ali 2.
e za parameter InfoPrint vpišemo število 2, bo program ob zagonu
prikazal stanje, verzijo firmwarea, in verzijo .dll datoteke.
e vpišemo število 1, se izpiše opozorilno okno »Check connection!« v
primeru, da vmesnik ni priklopljen na USB vrata.
e vpišemo 0, potem ne dobimo opozorila. Program se še vedno zažene,
vendar v primeru, da ni povezave z ra unalnikom preko USB vrat, naprava
ne bo delovala.
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
17
5.3 Prižiganje ve LED diod hkrati – DOutNum
DOutNum(unsigned int Port, char Num);
Za prikaz tega poženimo naslednjo vajo - DOutNum.sln.
Po prevajanju datoteke se zažene program (Slika 5.6).
Slika 5.6: DOutNum program
Kot pri prejšnji vaji tudi pri tej vaji prižigamo LED diode na vmesniku. Tokrat jih
prižigamo ve naenkrat z ukazom DOutNum. Vežemo jih tako kot kaže slika
(Slika 5.7). S parametrom Num zapišemo na PortB števila od 0 do 255.
Slika 5.7: Shema vezave ve LED diodProgramska koda 5.2: Uporaba ukaza DOutNum111112113114115116117118
private: System::Void button1_Click(System::Object^ sender,System::EventArgs^ e) {DOutNum(PortB, 7);}private: System::Void button2_Click(System::Object^ sender,System::EventArgs^ e) {DOutNum(PortB, 0);}
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
18
5.4 Branje digitalnega vhoda - DInBit
DInBit(unsigned int Port, char nBit);
Za branje digitalnega vhoda potrebujemo izvor napetosti, ki jo priklju imo na
napravo tako, da le-ta lahko zajema napetost, ki predstavlja logi no ni ali logi no
ena. Tipi en predstavnik za to je stikalo, ki ima dve stanji – e je vklju eno,
potem lu sveti, e je izklju eno, je lu ugasnjena.
Stikalo vežemo kot na sliki (Slika 5.8). Stikalo lahko vežemo na dva na ina in
sicer tako, da ob vklopu kaže logi no 1 in ob izklopu logi no 0, ali pa ob vklopu
kaže logi no 0 in ob izklopu logi no 1 (Slika 5.9).
Slika 5.8: Shema vezave stikala
Slika 5.9: Vezava stikala 5 V levo, 0 V desno
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
19
Poženimo datoteko DInBit.sln in prevedimo program (Slika 5.10).
Slika 5.10: DInBit okno - stanje na bitu 0
Programska koda 5.3: Uporaba ukaza DInBit111112113114
private: System::Void timer1_Tick(System::Object^ sender,System::EventArgs^ e) {label2->Text=(DInBit(PortD, 0));}
Stanje se zapisuje na oznako label2 ob vsakem proženju asovnika timer1 z
ukazom label2->Text=(DInBit(PortD,0));. Zapisana vrednost na napravi
eProDas je prebrana z ukazom DInBit(PortD,0).
Za vajo lahko dodaš v formo še eno oznako (label) in jo spreminjaš tako, da
priklju iš na napravo še eno mikrostikalo.
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
20
5.5 Branje bitov na celem portu – DInNum
DInNum(unsigned int Port);
Za izvedbo potrebujemo ve mikrostikal vezanih na eProDas. Priklju imo jih na
PortD kot kaže shema (Slika 5.11).
Slika 5.11: Shema priklopa ve mikrostikal
e imamo stikal dovolj, lahko zapolnimo celoten PortD.
Zaženimo datoteko DInNum.sln. Po zagonu zopet prevedimo program ek in si
podrobneje oglejmo kodo programa.
Slika 5.12: Okno za prikaz DInNum
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
21
Programska koda 5.4: Uporaba ukaza DInNum111112113114
private: System::Void timer1_Tick(System::Object^ sender,System::EventArgs^ e) {label1->Text="Stanje na PortD=" + DInNum(PortD);}
Da se sproti izpisuje desetiško število, vrednost funkcije DInNum, smo zopet
uporabili asovnik.
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
22
5.6 Prikaz smeri vrtenja motorja - DOutDir
DOutDir(unsigned int Port, char nBitB, char nBitB, char Bitstate);
Ta funkcija ima vlogo upravljanja z enosmernim elektromotorjem (Slika 5.14).
Dolo imo dva bita in tri možna stanja v katerih se nahajajo.
Slika 5.13: Okno Vrtenje motorja – DOutDir
POZOR! Za ve je tokove je potrebno dodati oja evalno vezje. Za vmesnik se
uporabi H-krmilje (H-bridge), ki potrebuje zunanje napajanje (od 5 do 9 V) in
uporabi izhodni portD (Slika 5.15).
Slika 5.14: Enosmerni motor v pogonu
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
23
Slika 5.15: 1 - izhod na vmesniku (8 bitov iz PortD), 2 - DC napajanje 9 V na H-krmilju,3 - vhod na H-krmilje, 4 - Izhodi iz H-krmilja
Programska koda 5.5: Prikaz uporabe ukaza Da DoutDuir111112113114115116117118119120121122
private: System::Void button1_Click(System::Object^ sender,System::EventArgs^ e) {
DOutDir(PortD, 0, 1, Plus); }
private: System::Void button2_Click(System::Object^ sender,System::EventArgs^ e) {
DOutDir(PortD, 0, 1, Minus); }
private: System::Void button3_Click(System::Object^ sender,System::EventArgs^ e) { DOutDir(PortD, 0, 1, Off);
}
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
24
5.7 Branje analognega vhoda – AIn10bNum in izpis zajetegaštevila
AIn10bNum(unsigned int Ch);
Vmesnik je opremljen tudi z analognimi vhodi. Le-teh je 12 in eden z referen no
napetostjo +5 V. Vseh 12 analognih vhodov na vmesniku je zapisanih tabeli
(Tabela 5.1):Tabela 5.1: Analogni vhodi in poimenovanje na vmesniku
ADC vhod (na vmesniku)
Ch0 A0
Ch1 A1
Ch2 A2
Ch3 zunanja napetost +5 V
Ch4 A5
Ch5 E0
Ch6 E1
Ch7 E2
Ch8 B2
Ch9 B3
Ch10 B1
Ch11 B4
Ch12 B0
Oznaka »10b« v imenu funkcije pomeni, da zajemamo z desetimi biti. Število, ki
ga pri tem dobimo, predstavlja dvojiško število od 20 do 210. Funkcija tako vrne
število od 0 do 1023. Na analogni vhod vežemo potenciometer ali fotoupor kot
kaže slika (Slika 5.16).
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
25
Slika 5.16: Vezava potenciometra
e tako poženemo AIn10bNum.sln in poženemo debug, zagledamo naslednje
okno (Slika 5.17).
Slika 5.17: Okno programa AIn10bNum
Programska koda 5.6: Primer uporabe ukaza AIn10bNum111112113114115116117118119120121
private: System::Void Form1_Load(System::Object^ sender,System::EventArgs^ e) {
eProDasInit(1); }
private: System::Void timer1_Tick(System::Object^ sender,System::EventArgs^ e) {
label1->Text="Stevilo na vhodu je:" +AIn10bNum(Ch0);
}
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
26
5.8 Branje analognega vhoda – AIn10bVol in izpis napetosti
AIn10bVol(unsigned int Ch);
Zajete podatke iz analognih vhodov lahko predstavimo tudi z napetostjo med 0 in
+5 V. Potenciometer ali upor vežimo enako kot na sliki (Slika 5.16). Poženimo
torej AIn10bVol.sln in prevedimo program prikazati se mora okno, v katerem je
zapisana trenutna napetost na Ch0 v voltih (Slika 5.18).
Slika 5.18: Okno programa AIn10bVol
Ker ta napetost ni ni drugega kot prera unana 10-bitna vrednost, je njena
natan nost omejena na korake po približno 0,0049 V (Ena ba 5.1).
5V 0,00491024bitov
V
Ena ba 5.1: Lo ljivost 10-bitnega analognega vhoda
To pomeni, da tretja decimalka v dobljenem rezultatu ni ve natan na.
Programska koda 5.7: Primer uporabe ukaza AIn10bVol112113114115116117118119
private: System::Void Form1_Load(System::Object^ sender,System::EventArgs^ e) {
eProDasInit(1); }
private: System::Void timer1_Tick(System::Object^ sender,System::EventArgs^ e) {
label1->Text=AIn10bVol(Ch0) + "V"; }
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
27
5.9 Utripa
Wait(double dbDelay);
Naslednji program bo ob pritisku na gumb Utripanje na vmesniku na portu PortB
petkrat utripnil s tremi LED diodami vezanimi kot na sliki (Slika 5.7). Vsak utrip in
mrk trajata po 0,5 s. Poženimo program Utripac.sln in prevedimo program (Slika
5.19). Program bi se brez funkcije Wait(0.5) za vsakim prižigom lu i v trenutku
izvršil in bi videli samo en kratek utrip. S funkcijo Wait() pa zadržimo trenutno
stanje na izhodih vmesnika.
Slika 5.19: UtripaProgramska koda 5.8: Koda programa Utripa
private: System::Void button1_Click(System::Object^ sender,System::EventArgs^ e) {
DOutNum(PortB, 7); Wait(0.5); DOutNum(PortB, 0); Wait(0.5); DOutNum(PortB, 7); Wait(0.5); DOutNum(PortB, 0); Wait(0.5);
DOutNum(PortB, 7); Wait(0.5); DOutNum(PortB, 0); Wait(0.5); DOutNum(PortB, 7); Wait(0.5); DOutNum(PortB, 0);
Wait(0.5); DOutNum(PortB, 7); Wait(0.5); DOutNum(PortB, 0);
}
Programska koda 5.9: Utripa
Do zdaj smo spoznali vse funkcije, ki krmilijo napravo eProDas. Pa jih
povzemimo še enkrat.
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
28
5.10 Povzetek ukazov za vmesnik
Povzetek vseh ukazov se nahaja v tabeli (Tabela 5.2)
Tabela 5.2: Vsi prototipi ukazov za krmiljenje napreaveeProDasInit(unsigned InfoPrint)
DOutBit(unsigned int Port, char nBit, char BitState)
DOutNum(unsigned int Port, char Num)
DOutDir(unsigned int Port, char nBitA, char nBitB, char DirState)
DInNum(unsigned int Port)
DInBit(unsigned int Port, char nBit)
AIn10bNum(unsigned int Ch)
AIn10bVol(unsigned int Ch)
Wait(double dbDelay)
eProDasClose()
Razlaga parametrov se nahaja v tabeli (Tabela 5.3).
Tabela 5.3: Povzetek rabe argumentov funkcij vmesnika
InfoPrint: 0-brez sporo ila ob zagonu, 1-javi odsotnost naprave ob zagonu,
2-informacije o napravi
Port: PortA, PortB, PortC, PortD, PortE
nBit: števila od 0 do 7
nBitA in nBitB: od 0 do 7, vendar za smotrnost morata biti oba bita razli na
BitState: 0 ali 1
DirState: 0 za mirovanje, 1 za vrtenje v + smer, 2 za vrtenje v – smer
Num: število od 0 do 255
Ch: od Ch0 do Ch12, glej tabelo (Tabela 5.1)
dbDelay: katerokoli pozitivno število npr 5, 5.543, 0.227 ... Decimalna
mesta v programski kodi lo imo z decimalno piko.
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
29
5.11 Krmiljenje kora nega motorja
Za krmiljenje kora nega motorja potrebujemo na vmesnik pritrjeno H-krmilje, in
kora ni motor. Program poženemo s klikom na
Kora ni motor vežemo na vmesnik tako, kot kaže slika (Slika 5.20).
Slika 5.20: Vezava kora nega motorja
rn vodnik vežemo na D0, zelen vodnik na D1, rde vodnik na D2 in rjav vodnik
na D3.
Enostaven primer kora nega motorja ima štiri korake (Tabela 5.4):
Tabela 5.4: Koraki kora nega motorja
korak D0 D1 D2 D3
1 rna 1 0 1 0
2 zelena 1 0 0 1
3 rde a 0 1 0 1
4 rjava 0 1 1 0
e zamenjamo vrstni red korakov, se motor za ne vrteti v nasprotno smer.
Hitrost vrtenja nadziramo s asom v katerem je dolo eno stanje na pinih.
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
30
Poženimo Krmiljenje_kora nega_motorja.sln in prevedimo program (Slika 5.21).
Slika 5.21: Krmiljenje kora nega motorja
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
31
Programska koda 5.10: Primer krmiljenja kora nega motorjaint smer; //globalna spremenjivkaprivate: System::Void Form1_Load(System::Object^ sender,System::EventArgs^ e) {
eProDasInit(1); //inicializacija vmesnikatimer1->Enabled=true; //zagon asovnika
}private: System::Void button1_Click(System::Object^ sender,System::EventArgs^ e) {
smer=1; //smer, ki jo dolo i klik na gumb}private: System::Void button2_Click(System::Object^ sender,System::EventArgs^ e) {
smer=2; //smer, ki jo dolo i klik na gumb}private: System::Void button3_Click(System::Object^ sender,System::EventArgs^ e) {
smer=0; //ustavimo kora ni motor}private: System::Void timer1_Tick(System::Object^ sender,System::EventArgs^ e) {
if (smer==1){ //pogoj, koda v zavtih oklepajih se izvrši vprimeru, da je smer enaka 1
DOutNum(PortD, 5);Wait(System::Convert::ToDouble(trackBar1->Value)/1000);//števko,
ki nam jo vrne trackbar1 moramo konvertirati v decimalni zapis (double)DOutNum(PortD, 9);Wait(System::Convert::ToDouble(trackBar1->Value)/1000);DOutNum(PortD, 10);Wait(System::Convert::ToDouble(trackBar1->Value)/1000);DOutNum(PortD, 6);Wait(System::Convert::ToDouble(trackBar1->Value)/1000);}if (smer==2){//pogoj, koda v zavitih oklepajih se izvrši v
primeru, da je smer enaka 2DOutNum(PortD, 6);Wait(System::Convert::ToDouble(trackBar1->Value)/1000);DOutNum(PortD, 10);Wait(System::Convert::ToDouble(trackBar1->Value)/1000);DOutNum(PortD, 9);Wait(System::Convert::ToDouble(trackBar1->Value)/1000);DOutNum(PortD, 5);Wait(System::Convert::ToDouble(trackBar1->Value)/1000);}
}private: System::Void Form1_FormClosing(System::Object^ sender,System::Windows::Forms::FormClosingEventArgs^ e) {
DOutNum(PortD, 0); //vse pine postavimo na stanje 0eProDasClose(); //odklopimo vmesnik
}
Prva vrstica int smer; deklarira globalno spremenljivko, ki jo spreminjamo s kliki
na gumbe.
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
32
6 Za etek novega projekta
Za za etek novega projekta sledimo navodilom in slikam.
Nov projekt za nemo tako, da kliknemo file>New>Project (Slika 6.1). Odpre se
nam novo pogovorno okno, v katerem izberemo Windows Forms Aplication,
vpišemo ime novega projekta in pritisnemo gumb OK (Slika 6.2).
Slika 6.1: Za etek novega projekta
Slika 6.2: Okno Windows Forms Application
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
33
V nov projekt moramo vklju iti kazalce na funkcije naprave, to naredimo tako, da
dodamo datoteko eProDasCPPLib.cpp med Source Files (izvorne datoteke)
(Slika 6.3 in Slika 6.4).
Slika 6.3: Dodamo datoteko eProDasCPPLib.cpp
Slika 6.4: Dodajanje eProDasCPPLib.cpp
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
34
Preden pri nemo s pisanjem našega novega programa, je potrebno vklju iti še
knjižnice. To storimo tako, da vpišemo v datoteko stdafx.h vse knjižnice, ki jih
potrebujemo (Slika 6.5). Zaenkrat potrebujemo le knjižnico naše naprave, ki jo
vpišemo z ukazom #include "eProDasCPPLib.h", ter knjižnico "windows.h", ki jo
potrebujemo za komunikacijo z DLL knjižnicami (Dynamic Link Library), ki smo jih
namestili z namestitvijo programskega paketa eProLab.
Slika 6.5: Vpis knjižnic eProDasCPPLib.h in windows.h
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
35
6.1 Gradnja programa »Model uli ne razsvetljave«
V tem poglavju je napisan postopek gradnje programa »Model uli ne
razsvetljave«. Ta program vklju i lu , ko se stemni in jo izklju i, ko je svetlo. Za
vajo moramo na vmesniku priklju iti naslednje elemente:
Fotoupor in 1k upor, ki ga vežemo kot kaže slika (Slika 6.6). Princip delovanja
je enostaven. e na fotoupor pada mo nejša svetloba, bo izhodna napetost
ve ja.
Torej priklju imo en konec fotoupora na +5 V, drugo konec na A0, upor 1k pa
vežemo med A0 in GND.
Slika 6.6: Vezava fotoupora
Formo programa gradimo tako, da najprej izberemo formo Form1.h (Slika 6.7)
Slika 6.7: Izbira forme Form1.h
in dvokliknemo nanjo. Pokaže se nam prazna forma (Slika 6.8), v katero lahko
povle emo gradnike iz orodjarne (ang. Toolbox) po principu povleci in spusti. V
formo Form1 spustimo želene gumbe (ang. Button), oznake (and. Label), in
druge želene elemente.
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
36
Slika 6.8: Prazna forma Form1
Preden pa za nemo z dodajanjem gumbov je potrebno dodati ukaz za
inicializacijo vmesnika. Visual C++ nam postreže z rešitvijo. Ob dvokliku na
prazno formo Form1 se nam prikaže dogodek (Programska koda 6.1):
Programska koda 6.1: Zgenerirana koda ob dvokliku na formoprivate: System::Void Form1_Load(System::Object^ sender,System::EventArgs^ e) {
}
Med zavite oklepaje zapišemo tisto, kar se mora zgoditi ob nalaganju tega
programa. V našem primeru je najbolj smotrno, da v istem trenutku, ko se naloži
program, vmesnik povežemo z ra unalnikom z ukazom eProDasInit(1);. Ta
vrstica mora sedaj izgledati tako:
Programska koda 6.2: V pripravljeno kodo vstavimo ukazprivate: System::Void Form1_Load(System::Object^ sender,System::EventArgs^ e) {
eProDasInit(1); }
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
37
Krepko je natisnjena koda, ki smo jo dodali ro no, ostalo se samodejno zgenerira
ob dvokliku na Form1.
Preidimo k bistvu našega programa. Program mora biti zasnovan tako, da
neprestano gleda in preverja jakost svetlobe. Ko pade jakost pod dolo eno mejo,
se vklopijo lu i. V ta namen uporabljamo asovnik (Timer), ki ga prav tako
povle emo in spustimo v formo (Slika 6.9).
Slika 6.9: Dodajanje asovnika timer1
Ker asovnik ni viden objekt v formi, se nam pojavi v okvirju pod formo (Slika
6.10).
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
38
Slika 6.10: asovnik pod formo
Dvokliknemo nanj in zgenerira se nam koda, ki proži dogodek ob vsakem taktu
oziroma intervalu asovnika (Programska koda 6.3).
Programska koda 6.3: Zgenerirana koda po dvojnem kliku na ikono timer1private: System::Void timer1_Tick(System::Object^ sender,System::EventArgs^ e) { }
Med zavita oklepaja dodamo kodo, ki preveri, e je še dovolj svetlobe na
fotouporu, priklju enem na A1 (Ch0) (Programska koda 6.4).
Programska koda 6.4: Vstavljanje kode med zavita oklepajaprivate: System::Void timer1_Tick(System::Object^ sender,System::EventArgs^ e) {
if ( AIn10bNum(Ch0)<200 ){ DOutNum(PortB, 7); }else DOutNum(PortB, 0);
}
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
39
asovnik je privzeto ustavljen (stop). Mi ga bomo zagnali s pritiskom na gumb. Z
drugim gumbom pa ga bomo ustavili (Slika 6.12). Zato dodamo na Form1 dva
gumba.
Gumb povle emo na Form1, izberemo in ga lahko nato poljubno oblikujemo in
nastavimo želeno velikost pisave.
Ob dvojnem kliku na gumb Visual C++ samodejno pripravi vrstico v Form1.h, ki
sproži dogodek. Potrebno je samo vpisati, da je asovnik (timer1) zagnan.
Programska koda 6.5: Koda za vklop asovkinka ob kliku na gumbprivate: System::Void button1_Click(System::Object^ sender,System::EventArgs^ e) {
timer1->Start(); }
Tako smo povedali s pritiskom na gumb asovniku, naj se za ne. Privzeto se
asovnik sproži vsakih 100 ms. To nastavitev lahko tudi popravimo v nastavitvah
asovnika (Slika 6.11).
Slika 6.11: Nastavitve asovnika
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
40
Postopek ponovimo še za drugi gumb, ki bo asovnik ustavil (Programska koda
6.6).
Programska koda 6.6: Koda za ustavitev asovnika ob kliku na gumbprivate: System::Void button2_Click(System::Object^ sender,System::EventArgs^ e) {
timer1->Stop(); }
Slika 6.12: Program Model uli ne razsvetljave in koda
Za pregled že napisane kode poženemo Model ulicne razsvetljave.sln v mapi
primeri.
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
41
6.2 Lu ke Knight Rider
Verjetno vas ve ina pozna ameriško nadaljevanko Knight Rider (Slika 6.13), kjer
ima avtomobil Davida Hasselhoffa na sprednjem delu avtomobila lu ke, ki se
prižigajo in ugašajo od sredine navzven in/ali iz enega dela na drugi del. Naša
naslednja naloga je, da spišemo takšen program ek, ki bo LED diode na PortB
izrisoval v ve razli nih zaporedjih, odvisno od tega na kateri gumb bomo
pritisnili. Diode vežemo zaporedno z uporom tako kot na sliki (Slika 6.14: Vezava
osmih LED diod).
Imamo torej osem LED diod in sestavimo program, ki bo lu ke prižigal tako kot
na tem avtomobilu. Sestavimo ga tako, da bomo umestili tri gumbe. S prvim
sprožimo LED diode tako, da se bodo prižigale od enega do drugega konca. Z
drugim gumbom pa bomo ugasnili prvi na in prižiganja lu k in sprožili drugi
na in. Tretji na in pa bo enak kot prvi s to razliko, da bo zapisan krajše, s for
zanko.
Slika 6.13: Knight Rider
Slika 6.14: Vezava osmih LED diod
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
42
Programska koda 6.7: Koda programa Knight Riderprivate: System::Void button1_Click(System::Object^ sender,System::EventArgs^ e) {
for(int i=0;i<10;i++){ Wait(0.1); DOutBit(PortB, 3, 1); DOutBit(PortB, 4, 1); Wait(0.1); DOutBit(PortB, 3, 0); DOutBit(PortB, 4, 0); DOutBit(PortB, 2, 1); DOutBit(PortB, 5, 1); Wait(0.1); DOutBit(PortB, 2, 0); DOutBit(PortB, 5, 0); DOutBit(PortB, 1, 1); DOutBit(PortB, 6, 1); Wait(0.1); DOutBit(PortB, 1, 0); DOutBit(PortB, 6, 0); DOutBit(PortB, 0, 1); DOutBit(PortB, 7, 1); Wait(0.1); DOutBit(PortB, 0, 0); DOutBit(PortB, 7, 0); Wait(0.1); DOutBit(PortB, 0, 1); DOutBit(PortB, 7, 1); Wait(0.1); DOutBit(PortB, 0, 0); DOutBit(PortB, 7, 0); DOutBit(PortB, 1, 1); DOutBit(PortB, 6, 1); Wait(0.1); DOutBit(PortB, 1, 0); DOutBit(PortB, 6, 0); DOutBit(PortB, 2, 1); DOutBit(PortB, 5, 1); Wait(0.1); DOutBit(PortB, 2, 0); DOutBit(PortB, 5, 0); DOutBit(PortB, 3, 1); DOutBit(PortB, 4, 1); Wait(0.1); DOutBit(PortB, 3, 0); DOutBit(PortB, 4, 0); } }
private: System::Void button2_Click(System::Object^ sender,System::EventArgs^ e) {
for(int i=0; i<10; i++){ DOutNum(PortB, 1); Wait(0.1); DOutNum(PortB, 2); Wait(0.1); DOutNum(PortB, 4);
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
43
Wait(0.1); DOutNum(PortB, 8); Wait(0.1); DOutNum(PortB, 16); Wait(0.1); DOutNum(PortB, 32); Wait(0.1); DOutNum(PortB, 64); Wait(0.1); DOutNum(PortB, 128); Wait(0.1); DOutNum(PortB, 64); Wait(0.1); DOutNum(PortB, 32); Wait(0.1); DOutNum(PortB, 16); Wait(0.1); DOutNum(PortB, 8); Wait(0.1); DOutNum(PortB, 4); Wait(0.1); DOutNum(PortB, 2); Wait(0.1); DOutNum(PortB, 1); Wait(0.1); }
DOutNum(PortB, 0); }
private: System::Void button3_Click(System::Object^ sender,System::EventArgs^ e) {
for(int i=0; i<8; i++){//za nemo šteti pri i=0 izvedemo stavke in i pove ujemo za 1 dokler jemanjši od 8// i je v vsakem krogu/zanki število nBit, se pravi številka bita
DOutBit(PortB, i, 1); Wait(0.1); DOutBit(PortB, i, 0); }for(int i=6; i>-1; i--){
//za nemo šteti pri i=6 (7 lu ka od 8), in i zmanjšujemo za 1 dokler jeve ji od -1//i je v vsakem krogu/zanki enak nBit, se pravi številki bita na portuPortB
DOutBit(PortB, i, 1); Wait(0.1); DOutBit(PortB, i, 0); }
For zanka je zelo uporabna, saj nam prihrani veliko pisanja takrat, ko se del kode
pove a ali pomanjša za 1. For zanka je oblike kot v programski kodi (Programska
koda 6.8).
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
44
Programska koda 6.8: Prototip for zankefor(za etništevec; pogoj; pove anještevca){stavek;stavek;…}
Takoj za oklepajem se nahaja stavek z za etnim števcem, številom, ki mu
dolo imo za etno vrednost; nato primerjamo v drugem stavku vrednost s
pogojem, ki smo ga postavili (npr.: i<8; ) in nazadnje še pove amo ali
pomanjšamo števec za 1, da se le-ta z vsakim naslednjim obhodom približa
pogoju (npr.:i++ ali i--).
Za pregled že napisane kode poženemo Knight rider.sln v mapi primeri.
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
45
6.3 Iskalec svetlobe
V tej nalogi bomo uporabili vse dosedanje znanje programiranja vmesnika.
Sestavimo napravo Iskalec svetlobe (Slika 6.15). Napravo bomo krmilili tako, da
bo obra ala son ne celice proti izvoru svetlobe, da le-te ujamejo najve svetlobe
na svojo površino in tako proizvedejo im ve ji tok. Za pogon bomo uporabili
kora ni motor, ki ga krmilimo preko H-krmilja, ki nam omogo a ve je tokove,
primerne za poganjanje manjših nizkonapetostnih motorjev. Klju ni sestavni deli
na sliki (Slika 6.15): 1 - varnostno stikalo, 2 - son ne celice, 3 - fotoupor, 4 -
kora ni motor, 5 - izhod iz son nih celic, 6 - sponke, priklopljene na analogni
vhod Ch1 s katerimi merimo napetost na son nih celicah.
Slika 6.15: Iskalec svetlobe
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
46
Za varnost konstrukcije pa uporabimo stikalo, ki se sproži, e se celice preve
obrnejo v eno ali drugo smer. Shema vezave je na sliki (Slika 6.16).
Slika 6.16: Shema iskalca svetlobe
Osnovna ideja ja, da se smer vrtenja motorja spremeni, e se po primerjavi
zadnjih dveh meritev svetlobe vrednost na analognem vhodu, ki meri jakost
svetlobe, zmanjša. Koda s komentarji in razlago je v programski kodi
(Programska koda 6.9).
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
47
Programska koda 6.9: Koda programa Iskalec svetlobe/////////////deklaracija globalnih spremenljivk//////////////////////int svetloba1, svetloba2, svetloba3, smer;/////////////globalne funkcije, ki jih kli emo v asovniku///////////void test(){
if (DInBit(PortB, 0)==1) obrni(); //proženje varnostnstenga stikala}void obrni(){
Wait(0.1);if (smer==1) smer=2;else if (smer==2) smer=1;
}void branje(){ //branje iz izpis na zaslonsvetloba1=svetloba2;svetloba2=AIn10bNum(Ch0);label1->Text= "Svetlost= " + System::Convert::ToString(svetloba2);label3->Text= "Napetost= "+ System::Convert::ToString(AIn10bVol(Ch1))+" V";}void smer1(){
DOutNum(PortD, 5); Wait(0.1); DOutNum(PortD, 9); Wait(0.1); DOutNum(PortD, 10); Wait(0.1); DOutNum(PortD, 6); Wait(0.1); }
void smer2(){ DOutNum(PortD, 6); Wait(0.1); DOutNum(PortD, 10); Wait(0.1); DOutNum(PortD, 9); Wait(0.1); DOutNum(PortD, 5); Wait(0.1); }
//////////////////////konec globalnih funkcij///////////////////////////////////////////////// asovnik, jedro programa////////////////////////private: System::Void timer1_Tick(System::Object^ sender,System::EventArgs^ e) {
branje(); //bere analogne vhodeif (smer==1) smer1();//požene v desnoif (smer==2) smer2();//požene v levotest(); //preveri varnostno stikalobranje();if ((svetloba1>svetloba2)) {//primerjava zadnjih dveh meritev
svetlobeobrni();}
}private: System::Void button1_Click(System::Object^ sender,System::EventArgs^ e) {
smer=1;
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
48
timer1->Enabled = true; }
private: System::Void button2_Click(System::Object^ sender,System::EventArgs^ e) {
timer1->Enabled=false; }
private: System::Void Form1_Load(System::Object^ sender,System::EventArgs^ e) {
eProDasInit(1); }
private: System::Void Form1_FormClosing(System::Object^ sender,System::Windows::Forms::FormClosingEventArgs^ e) {
DOutNum(PortD, 0); eProDasClose();
}};}
Za pregled že napisane kode poženemo Iskalec svetlobe.sln v mapi primeri.
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
49
7 Sestava programov v konzoli
Vsak programski jezik ima dolo eno sintakso, pravila, kako pišemo program. Kaj
vsebuje vsaka programska koda jezika C++? Vsebuje »zaglavje« (ang. header),
ki vsebuje vrstice #include. Tu programska koda sporo i prevajalniku C++ naj
uporabi imena iz knjižnic, katerih ime (npr. <iostream> ali "eProDasCPPLib.h"
itd.) sledi programska koda (na primer Programska koda 7.1). Prazne vrstice
prevajalnik spregleda in nimajo posebnega pomena. Uporabne so v kolikor
izboljšajo preglednost in na pogled lo ijo »zaglavje« od ostalega dela kode.
Sledi bistvo programa, ki se za ne s funkcijo void main() ali int main().
Funkcijo main prevajalnik tudi prepozna kot za etek programa, ki smo ga napisali
ne glede na to, kje v programski kodi se nahaja.
Pomemben del so z zeleno barvo ozna eni //komentarji, ki jih dodamo
programski kodi, kadar želimo pove ati njeno preglednost in razumljivost, ozna iti
pomembna mesta in razložiti pomen napisanih vrstic. Komentarji se nahajajo za
dvema poševnicama “//” ali med “/*” in “*/”, z njimi pa postanejo kompleksnejši
programi razumljivejši tudi drugim.
V konzolnem na inu se danes programi zdijo neobi ajni, vendar nekateri v tem
vidijo tudi prednost, ker se tako laže vidi sintakso in se posve a le njej. Gumbi,
drsniki in podobni drugi objekti pa tu nimajo pomena, saj je vhodna enota
tipkovnica ali vmesnik
Programska koda 7.1: Primer kode za konzolo//datoteka je bila ustvarjena 25.7.2008#include "eProDasCPPLib.h" // knjižnica, ki upravlja z napravo eProDas#include <iostream> //standardna knjižnica, upravlja s podatki vkonzolivoid main() { eProDasInit(1); //zaženi eProDas napravo
DOutBit(PortB, 1, 1); //to je glavni del našega programa Wait(5); //po akamo 5 sekund eProDasClose();//odklopi eProDas napravo in po isti za seboj}
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
50
7.1 Naloge za izpis v konzoli
Naloge so zastavljene tako, da je najprej opisan namen naloge, kaj naj bi bil pri
konkretni nalogi cilj oziroma kon ni rezultat programiranja, nato sledi seznam
potrebnih elektri nih elementov (diod, uporov, stikal, fotouporov itd.). Navodilom
sledi primer celotne kode za program s komentarji in za kodo razlaga novih
ukazov. Podobno kot pri grafi nem na inu se lotimo gradnje tudi za konzolni
na in.
Nov projekt za nemo (Slika 7.1). Izberemo Win32 console application (Slika 7.2),
ga poimenujemo in kliknemo OK, nato next, izberemo Console application in
Empty project ter kliknemo Finish.
Slika 7.1: Izbira novega projekta v konzoli
Vsi primeri programov v konzoli se nahajo v mapi primeri/konzola/ (zaženete
datoteke .sln) in so poimenovani enako kot naslov naloge.
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
51
Slika 7.2: Izbira nastavitev projekta
Slika 7.3: Dodajanje nove CPP datoteke
V projekt dodamo še eProDasCPPLib.cpp datoteko (Slika 6.4).
Naloge so razdeljene v štiri sklope:
digitalni izhod, pri katerem se seznanimo s prižiganjem lu k
digitalni vhod, ki ga prožimo s stikalom
analogni vhod za branje napetosti na elementih
izpis meritev v tekstovno datoteko
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
52
7.2 Digitalni izhod
Na vmesniku vodnike in elektri ne elemente priklapljamo na brezvija ne sponke,
ozna ene s rko in številko (Slika 7.4).
Slika 7.4: Brezvija ne sponke (ang. Cage-clamp)
7.2.1 Prižiganje lu ke (Digitalni izhod)
Namen naloge:
Napisati program, s katerim vklopimo LED diodo.
Potrebujemo:
LED diodo in upornik med 300 in 1 k .
Najprej je potrebno na vmesnik eProDas priklju iti lu ke. V našem primeru so to
svetle e diode. Za svetle e diode je pomembno, kako jih vežemo. Daljšo nogico
na upor in krajšo na digitalni izhod na PortB (Slika 7.5) in (Slika 5.4).
Slika 7.5: Vezava svetle e diode
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
53
Pri predstavljanju sintakse se izogibamo podrobni razlagi vsake vrstice. Zaenkrat
so za nas pomembne samo vrstice, ki dajo na napravo eProDas viden rezultat.
Le-te so v nadaljevanju natisnjene krepko.
Prvo vajo bomo za eli neposredno na vmesniku eProDas. Prepišemo naslednje
vrstice v C++ program in poskušamo doumeti, kaj katera vrstica kode po ne. V
tej prvi nalogi je predstavljena klju na vrstica, ki prižge prvo LED diodo na
»PortB« (na vmesniku ozna eno z B0-B7) na prvem pinu, B0.
Programska koda 7.2: Prižiganje lu ke na digitalnem izhodu//Prižiganje lu ke (digtalni izhod)#include "eProDasCPPLib.h"void main() {
eProDasInit(1); //zaženi eProDas napravo
DOutBit(PortB, 0, 1);//Prižgemo prvo LED diodo na PortB, pin 0 eProDasClose();//odklopi eProDas napravo in po isti za seboj}
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
54
7.2.2 Prižiganje ve lu k
Namen naloge:
Napisati program, s katerim vklopimo ve LED diod.
Potrebujemo:
LED diode in upori med 300 in 1k .
Najprej na vmesnik eProDas priklopimo LED diode kot v prejšnji vaji (Slika 5.7),
ali pa priklopimo 8 LED diod na PortB, kot kaže slika (Slika 7.4).
Programska koda 7.3: Prižiganje ve lu k naenkrat//Prižiganje ve lu k naenkrat#include "eProDasCPPLib.h"void main(){ eProDasInit(1); DOutBit(PortB, 0, 1); DOutBit(PortB, 1, 1); DOutBit(PortB, 2, 1); eProDasClose();}
e želimo prižgati še ve lu k, potem samo dodamo vrstice, kar pa je zamudno,
e prižigamo vse lu ke na PortB, pa tudi prižgejo se isto asno, zato obstaja
na in, kako prižgati ve LED diod hkrati v eni vrstici.
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
55
7.2.3 Prižiganje ve lu k naenkrat
Namen naloge:
Napisati program, s katerim vklopimo ve LED diod hkrati v eni vrstici.
Potrebujemo:
LED diode in upornike med 300 in 1k . Vežemo jih tako kot pri prejšnjih vajah
(Slika 5.7).
Programska koda 7.4: Prižiganje ve lu k naenkrat for zanka//Prižiganje ve lu k naenkrat#include "eProDasCPPLib.h"void main(){
eProDasInit(1); //zaženi eProDas napravo DOutNum(PortB, 3);
eProDasClose(); //odklopi eProDas napravo }
Prižgali sta se dve LED diodi. Število 3 predstavlja številko, ki se na napravi
eProDas pokaže kot dvojiško. e vpišemo 1 se prižge prva LED dioda, e
vpišemo 15, prve štiri, e vpišemo 255, se prižgejo vse.
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
56
7.2.4 Utripanje lu k
Namen naloge:
Napisati program, s katerim vklapljamo in izklapljamo ve LED diod hkrati, tako
da le-te utripajo. Potrebujemo LED diode in upornike med 300 in 1k . Vežemo
jih tako kot pri prejšnjih vajah (Slika 5.7).
Programska koda 7.5: Utripanje lu k//Utripanje lu k#include "eProDasCPPLib.h"void main(){
eProDasInit(1); //zaženi eProDas napravo DOutNum(PortB, 7); DOutNum(PortB, 0); DOutNum(PortB, 7); DOutNum(PortB, 0); DOutNum(PortB, 7); DOutNum(PortB, 0); DOutNum(PortB, 7); DOutNum(PortB, 0); eProDasClose(); //odklopi eProDas napravo }
Utripanja lu k ni opaziti, ker le-te utripajo z zelo veliko frekvenco, zato se uporabi
funkcija Wait(), ki ustavi program za dolo eno število sekund. Med tem asom pa
lu ke na digitalnih izhodih svetijo. V našem primeru lu ke svetijo pol sekunde.
Programska koda 7.6: Utripanje lu k#include "eProDasCPPLib.h"//naloži knjižnicovoid main(){ eProDasInit(1); //zaženi eProDas napravo DOutNum(PortB, 7);Wait (0.5); //po akaj 0.5 sekunde DOutNum(PortB, 0);Wait (0.5); DOutNum(PortB, 7);Wait (0.5); DOutNum(PortB, 0);Wait (0.5); DOutNum(PortB, 7);Wait (0.5); DOutNum(PortB, 0);Wait (0.5); eProDasClose(); }
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
57
Lu ke spreminjajo stanje na 0,5 s.
e napišimo program, v katerem bodo lu ke utripnile desetkrat, stokrat ali
ve krat, bomo imeli kar precej dela. V primeru, da se isto stanje ponavlja, je bolj
smiselno, da uporabimo zanko.
V naslednjem primeru bo zanka opravila dvajset ponovitev vklopa in izklopa lu k.
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
58
7.2.5 Utripanje lu k (for zanka)
Namen naloge:
Napisati program, s katerim vklapljamo in izklapljamo ve LED diod hkrati tako,
da le-te utripnejo dvajsetkrat.
LED diode in upornike med 300 in 1k vežemo enako kot pri prejšnjih nekaj
vajah.
Programska koda 7.7: Utripanje lu k s for zanko//Utripanje lu k s for zanko#include "eProDasCPPLib.h"void main(){//naloži knjižnicoeProDasInit(1); //zaženi eProDas napravofor (int i=0; i<20; i++){
DOutNum(PortB, 7);Wait(0.5);DOutNum(PortB, 0);Wait(0.5);
}eProDasClose();}
For zanka (Programska koda 7.7, natisnjena krepko) deluje tako, da na za etku
postavi spremeljivko i na ni , potem preveri, e je spremeljivka i manjša od 20,
izvrši kodo med zavitima oklepajema, nato pa i pove a za ena. Ta postopek
ponavlja dokler je i manjši od 20. Ko i doseže število 20 se zanka prekine.
Zanko lahko za vajo spremenimo tudi tako, da bo ponovila svoj potek tridesetkrat.
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
59
7.3 Digitalni vhod
Pri teh nalogah je digitalni vhod v vseh primerih prožen z mikrostikalom. Proženje
dogodkov je možno na ve na inov:
dogodek proži napetost +5 voltov ali napetost 0 V na digitalnem vhodu (logi na 1
ali 0), pri tem stikalo vežemo na dva na ina, kot kaže slika (Slika 5.9) in shemi
(Slika 7.8).
dogodek proži prehod na digitalnem vhodu iz 0 na +5 V (Slika 7.6)
dogodek proži prehod na digitalnem vhodu iz +5 na 0 V (Slika 7.7)
7.3.1 Vklop LED diode s stikalom
Namen naloge:
Napisati program, s katerim vklapljamo LED diodo s pritiskom na stikalo.
Potrebujemo:
LED diodo, dva upornika med 300 in 1k ter stikalo vezano kot kaže shema
(Slika 7.6).
Slika 7.6: Vezava stikala in LED diode, vklop pri + 5 V
Vežemo lahko še na drug na in, tako, da se zgodi vklop pri 0 V (Slika 7.7).
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
60
Slika 7.7: Vezava stikala in LED diode, vklop pri 0 V
Pri tej nalogi se sre amo s pogojem, da se mora ob sklenjenem stikalu prižgati
LED dioda (Programska koda 7.8).
Programska koda 7.8: Vklop LED diode s stikalom//Vklop LED diode s stikalom#include "eProDasCPPLib.h"void main(){//naloži knjižnicoeProDasInit(1); //zaženi eProDas napravofor (;;){
if (DInBit(PortD, 0)==1)DOutBit(PortB, 0, 1);
else DOutBit(PortB, 0, 0);}}
Za for zanko nismo podali nobenega pogoja, zato se le-ta ponavlja v nedogled
(Programska koda 7.8).
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
61
7.3.2 Prekinitev utripanja lu k s stikalom
Namen naloge:
Napisati program, s katerim bodo lu ke neprestano utripale na 0,5 s. Utripanje pa
prekinemo s pritiskom na stikalo.
Potrebujemo:
dva upora od 300 do 1k , mikrostikalo, LED diodo.
Programska koda 7.9: prekinitev utripanja lu k s stikalom#include "eProDasCPPLib.h"void main(){ eProDasInit(1); //zaženi eProDas napravodo {
DOutNum(PortB, 255);Wait(0.5);DOutNum(PortB, 0);Wait(0.5);
}while (DInBit(PortD, 0)==1);//zanka se prekine, e je stikalovklopljenoeProDasClose();}
Program ek prekinemo s pritiskom na stikalo, ki je priklopljeno na D0 in + 5 V
(Slika 7.8 - levo). Stikalo nastavimo tako, da ob pritisku preide iz stanja + 5 V na
stanje 0 V. Kako izgleda vezje in programska koda, e se zanka prekine, ko je
stanje na D0 + 5 V?
Slika 7.8: Vezava stikala na vmesnik + 5 V in 0 V.
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
62
7.4 Analogni vhod
Vseh 12 analognih vhodov na napravi eProDas-SC1 je zapisanih v tabeli na
za etku (Tabela 5.1)
Z analognim vhodom lahko merimo napetosti od 0 do + 5 V. V ta namen
uporabimo ukaz AIn10bNum(Ch0), ki prebere in zapiše 10-bitno vrednost
(210=1024) ali ukaz AIn10bVol(Ch0), ki vrnjeno numeri no vrednost že prera una
v napetost po ena bi (Ena ba 5.1).
7.4.1 Branje numeri ne vrednosti in izpis na zaslon
Namen naloge:
Napisati program, ki bo pogledal na analogni vhod in ga izpisal na zaslon.
Prenehanje branja prekinemo s pritiskom na stikalo.
Potrebujemo:
fotoupor, dva 1k upora, stikalo.
Za naslednjo nalogo priklopite na vmesnik fotoupor. Za fotoupor je zna ilno, da
spremeni svoje lastnosti, kadar ga osvetlimo. Osvetljenemu se upornost zmanjša,
zatemnjenemu pa pove a. Fotoupor je lahko vezan na dva na ina, tako kot kaže
slika (Slika 6.6). Vezava na levi strani vrne število bolj proti 1023, ko je fotoupor
osvetljen. Ko ni osvetljen, vrne število, ki gre proti 0. Vezava na desni pa ravno
obratno. Ko je fotoupor osvetljen, vrne število, ki gre proti 0 in ko ni osvetljen,
proti 1023 (Programska koda 7.10).
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
63
Programska koda 7.10: Branje numeri ne vrednosti in izpis na zaslon#include "eProDasCPPLib.h"#include <iostream>//naloži knjižnico, ki upravlja z vhodi natipkovnici in izhodi na zaslonvoid main () {
eProDasInit(1); //zaženi eProDas napravoint mejni_vklop;
std::cout<<"Vpisi mejni vklop med 200 in 800:\n";std::cin>>mejni_vklop; //sprejem iz tipkovnice
do{double svetlost;svetlost = AIn10bNum(Ch1);
if (svetlost <= mejni_vklop){//pogojni stavekDOutNumHL (PortB, 255);
}else DOutNumHL (PortB, 0);
std::cout<<"Stevilo analognega vhoda je: "<<svetlost<<"\n";}while (DInBit(PortD, 0)==1);eProDasClose();
}
Izpis na zaslon poteka tako, da zapišemo std::cout, sledita dva operatorja <<,nato pa besedilo v dvojnih narekovajih. e želimo izpisati še kaj, samo dodamo
operatorja in besedilo v narekovajih. Namesto besedila v narekovajih lahko
uporabimo spremenljivko, katere vsebina se potem izpiše na zaslon. Stavek
kon amo s podpi jem »;«.
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
64
7.4.2 Branje analognega vhoda in izpis napetosti na zaslon
Namen naloge:
Napisati program, s katerim preberemo napetosti in jih izpišemo na zaslon
(Programska koda 7.11).
Potrebujemo potenciometer, ki ga priklopimo na A0 (Ch0), kot kaže slika (Slika
5.16). Program prekinemo s pritiskom na stikalo, vezano na D0.
Programska koda 7.11: Branje analognega vhoda in izpis napetosti na zaslon//merjenje napetosti na analognem vhodu#include "eProDasCPPLib.h"#include <iostream>using namespace std; //to vrstico napišemo, da nam ni potrebno pisatistd::coutvoid main () {
eProDasInit(1); //zaženi eProDas napravo
do{cout<<"Napetost na analognem vhodu je:";double num;num = AIn10bNum(Ch0);double napetost;napetost= AIn10bVol(Ch0);
cout<< napetost<<"\tV\n"; //\t je tabulator \n pa nova vrstica}while (DInBit(PortD, 0)==0); //stikalo za prekinitev izvajanja
programaeProDasClose();
}
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
65
7.4.3 Model uli ne razsvetljave v konzolskem na inu
V tem primeru bomo uporabili kombinacijo analognega vhoda in digitalnega
izhoda.
Vezje vežemo kot na sliki (Slika 7.9).
Slika 7.9: Vezava modela uli ne razsvetljave
Programska koda 7.12: Model uli ne razsvetljave//model uli ne razsvetljave//ta program vklopi lu i, ko postane pretemno#include "eProDasCPPLib.h"#include <iostream> //vkljucevanje knjiznice za vhod iz tipkovnice inizhod na zaslonvoid main () {
//naloži knjižnicoeProDasInit(1); //zaženi eProDas napravoint mejni_vklop;
std::cout<<"Vpisi mejni vklop med 200 in 800:\n";std::cin>>mejni_vklop; //sprejem iz tipkovnice
do{int svetlost;svetlost = AIn10bNum(Ch1);
if (svetlost <= mejni_vklop){//pogojni stavekDOutNumHL (PortB, 255);
}else DOutNumHL (PortB, 0);
std::cout<<"Stevilo analognega vhoda je: "<<svetlost<<"\n";}while (DInBit(PortD, 0)==0);eProDasClose();
}
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
66
7.5 Shranjevanje podatkov meritev
Pri merjenju karakteristike elektronskih elementov pogosto potrebujemo ve
zaporednih meritev v kratkem asu, podatke pa potem želimo obdelati kasneje v
kakšen drugem programu, kot je na primer Excell in izdelati graf poteka meritve.
V tem primeru potrebujemo program, ki nam bo podatke meritev shranil v
datoteko.
7.5.1 Shranjevanje vrstice v datoteko
Preden se lotimo zapisovanja meritev v datoteko, najprej poglejmo, kako
zapišemo podatke v datoteko (Programska koda 7.13). Za zapisovanje v
datoteko potrebujemo knjižnico fstream, ki jo vklju imo v projekt z ukazom
#include <fstream> v zaglavju (ang. header) programa.
Programska koda 7.13: Shranjevanje vrstice v datoteko//zapis v datoteko#include "eProDasCPPLib.h"#include "iostream"#include "fstream"//knjižnica za delo z datotekamiusing namespace std; //to vrstico napišemo, da nam ni potrebno pisatistd::coutvoid main () {
eProDasInit(1); //zaženi eProDas napravoofstream datoteka;datoteka.open ("meritve.txt");datoteka << "Tu bomo shranili podatke! \n";datoteka.close();//zapremo in shranimo datotekocout<<"\"Tu bomo shranili podatke\", je bilo zapisano v datoteko
meritve.txt";eProDasClose();
}
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
67
7.5.2 Shranjevanje meritve praznjenja kondenzatorja v datoteko
Naloga:
Sestaviti vezje in spisati program, ki bo ob vklopu stikala prebral napetost na
analognem vhodu in zapisal njegovo vrednost v datoteko kondenzator.txt
(Programska koda 7.14).
Potrebujemo:
kondenzator, dva 1 k upornika, dve stikali
Vezje vežemo kot na shemi (Slika 7.10):
Slika 7.10: Vezava vezja za merjenje praznjenja kondenzatorja
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
68
Programska koda 7.14: Zapis meritve praznjenja kondenzatorja v datoteko//zapis meritve praznjenja kondenzatorja v datoteko#include "eProDasCPPLib.h"#include "iostream"#include "fstream"//knjižnica za delo z datotekamiusing namespace std; //to vrstico napišemo, da nam ni potrebno pisatistd::coutfloat napetost();void main () {
eProDasInit(1); //zaženi eProDas napravo
ofstream datoteka;datoteka.open ("kondenzator.txt");//ustvari in odpre datoteko
kondenzator.txtdatoteka << "zaporedna vrstica\t napetost\n";//zapiše prvo
vrstico
while(DInBit(PortD, 0)==1){
}for(int i=0;DInBit(PortD, 0)==0; i++){
//for zanka kli e funkcijo napetost() dokler je stikalovklopljeno
datoteka << i <<"\t\t"<< napetost() <<"V\n";//izpis vdatoteko
}
datoteka.close();cout<<"Podatki zapisani v datoteko kondenzator.txt";//obvestilo o
zapisu v datotekoWait(2); //pred izhodom iz programa po akamo 2 sekundi, da lahko
preberemo obvestilo
eProDasClose();}float napetost(){
float temp=AIn10bNum(Ch0);float vol=temp*5/1024;return (vol);
}
V tej nalogi smo spoznali eno novost, in sicer inicializacijo funkcije, ki jo kli emo
iz glavne funkcije main(). To je funkcija napetost(), ki prebere numeri no
vrednost na analognem vhodu Ch0, jo pretvori v napetost in le-to vrne nazaj
funkciji main().
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
69
8 Zaklju ek
Kljub relativni zapletenosti C++ programskega jezika smo prišli do ukazov, ki niso
bistveno bolj zahtevni in zapleteni kot v drugih jezikih. C++ je na ta na in enako
uporaben za za etnike kot ostali programski jeziki, ki so že bili predstavljeni v
okviru projekta Comlab 2. Pou evanje u encev, ki se s programiranjem sre ajo
prvi , je s pomo jo uporabe vmesnika olajšano. Suhoparnost pou evanja je z
otipljivimi rezultati, v obliki utripajo ih lu k, vrte ih se motorjev, senzorjev,
omiljena, e ne kar odstranjena. Motiviranje u encev zaradi konkretne uporabe
programiranja ni ve problem, zanimanje za iskanje konkretnih rešitev in
reševanje konkretnih problemov pa naraste. Od tu naprej je potrebno pou evanje
programskega jezika nadaljevati s poglobljenim spoznavanjem sintakse kot tudi
specifike razvojnega okolja (uporaba kazalcev, polj, nizov itd.). Uporaba
vmesnika samega pa je še vedno lahko del kompleksnejšega programiranja v
C++ programskem jeziku.
Program pou evanja programiranja C++ preko vmesnika eProDas-SC1 ni bil
evalviran, za kar je v obsegu ene diplomske naloge premalo asa. Za
nadaljevanje bi bilo potrebno najti šole, ki vklju ujejo u enje programskega jezika
C++ (npr. srednje tehniške šole). Druga možnost pa je vklju evanje tega te aja v
osnovne šole, kjer bi bil to izbirni predmet ali interesna dejavnost (robotika,
programiranje itd.).
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
70
9 Viri:
[1] Mahni V., "Pou evanje programiranja na univerzitetnem študiju
ra unalništva in informatike: izkušnje predavatelja in študentov",
Organizacija, letnik 37, številka 8, oktober 2004, str.507
[2] Kölling, M., "The Problem of Teaching Object-Oriented Programming, Part
1: Languages," Journal of Object-Oriented Programming, 11(8): 8-15, 1999.
[3] http://en.wikipedia.org/wiki/Lego_Mindstorms zadnji obiskana 16.8.2008
[4] KOCIJAN , Slavko, RIHTARŠI , David. Using programming
environments for basic robotic examples. V: IN-ŠAIN, Marina
(ur.). Proceedings : conference : savjetovanje. Rijeka: MIPRO, cop.
2008, str. 253-257
[5] Irena Nan ovska Šerbec, Poskusna uvedba programiranja v paru pri
pou evanju programiranja. IKT - SIRIKT 2008, Kranjska Gora, 16.-19.april
2008, Ljubljana, Arnes, 2008. str. 134.
[6] Francis Glasbsborow, C++ od za etka: uvod za programerje, Pasadena,
Ljubljana 2007. Uvod, poglavje 0.
[7] http://www.cplusplus.com/info/history.html zadnji obiskana 16.8.2008
[8] http://baheyeldin.com/technology/teaching-kids-programming.html
25.8.2008
[9] Byron S. Gottfried, Schaum's Outline of Theory and Problems of
Programming with C, McGraw-Hill inc.,1990
[10] KOCIJAN , Slavko, KUŠAR, Tomaž. Introducing programming languages
through data acquisition examples. V: IN-ŠAIN, Marina
(ur.). Proceedings: conference: savjetovanje. Rijeka: MIPRO, cop. 2008, str.
258-261
[11] http://e-prolab.com/en/eqdaq/eprodas_plat/eprodasplat.html 25.8.2008
[12] http://e-prolab.com/en/index.html 22.8.2008
[13] http://www.e-prolab.com/en/progdas/chapter_4/digital_ports.html 25.8.2008
[14] http://e-prolab.com/en/conf/papers_pdf/jozef.pdf 15.9.2008
[15] http://www.e-prolab.com/en/downloads.html 22.8.2008
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
71
[16] http://e-prolab.com/en/progdas/chapter_1/install_drivers_dll.html 12.8.2008.
enje programskega jezika C++ na primerih s podro ja merjenja in krmiljenja P. Hladnik
72
10 Priloge na zgoš enki
diploma v pdf in word obliki: diplomaPrimozHladnik.pdf in
diplomaPrimozHladnik.doc
knjižnice eProDasCPPLib.h in eProDasCPPLib.cpp v mapi libraries
»solution« primeri za zagon v mapi primeri
video posnetki v mapi video