Verjetno je kar nekaj bralcev naše revije, ki se dobro spomnijo televizijske nadaljevanje, ki se je v originalu imenovala Knight Rider. V tej nadaljevanki je bil eden od glavnih junakov tudi Hi-tech avto z imenom K.I.T.T., ki je imel vgrajene cel kup elektronike. Eden izmed zaščitnih znakov tega avtomobila, so bile premikajoče se LED diode na sprednjem delu avtomobila…
Torej vsi, ki ste videli vsaj eno od omenjenih nadaljevanj, veste o kakšnih premikajočih LED diodah govorim. Vsi ostali pa jih boste še spoznali. Nedavno smo v krožku, kjer učencem sedmih in osmih razredov OŠ Domžale predstavljam programiranje v Bascom-u, imeli vajo, kjer smo prižigali LED diode direktno, kot kaže primer:
P1 = 10000000
Wait 1
P1 = 01000000
Wait 1
P1 = 00100000
itd...
Najprej sem učencem pokazal, kako deluje vse skupaj na simulatorju, potem pa sem jih prosil, naj naredijo premikajočo se LED diodo in to tako, da se po ena LED dioda prižiga od zunaj navznoter. Če to naredimo na dveh portih, bomo v našem simulatorju videli sliko a in v naslednjem ciklu sliko b itd…
Torej smo dobili bežečo luč, ki se premika od zunaj navznoter in obratno. Seveda, je pisanje direktne kode za 8 položajev prižgane LED diode zamudno. Če pa še to moramo podvojiti, ker mora LED-ica potovati nazaj, je dvakrat bolj zamudno. In za povrh vsega pa je potrebno podobno proceduro ponoviti še za sosednji port … No, seveda je takšna – recimo ji, direktna rešitev potratna, tako časovno kot tudi iz programerskega stališča.
Moram sicer takoj povedati, da je večina dijakov iz krožka nalogo uspešno napisala kar z »direktno« metodo in LED-ice so se prav lepo prižigale. Mislim pa, da je prav, da se spoznamo tudi z malce bolj programersko rešitvijo, ki nam bo morda kdaj kasneje prišla prav pri bolj zahtevnih nalogah, kot je ravno prižiganje LED diod. Poglejmo si, kakšne so binarne kombinacije za izvedbo premikajoče se LED diode. Binarne in desetiške vrednosti vidimo v tabeli 1.
Ideja programa je bila, da zastavimo FOR-NEXT zanko, kjer povečujemo kontrolno število, recimo »I« od 0 do 7, spremenljivka Ab.I pa se skladno z I-jem tudi spreminja. Ab.I pomeni, da je spremenljivka Ab tipa Byte, njen I-ti bit je označen kot Ab.i – podobno, kot npr P3.0. Ko je I=0, potem je Ab.I = Ab.0 = 1, naslednji bi bil Ab.1 = 1, Ab.2 = 1 itd. Skladno s tabelo 1 bi se spreminjale vrednosti spremenljivke Ab. Vendar v realnem mikrokontrolerju ni vse tako, kot izgleda. Ko pogledamo Tabelo 1 v kolono Dejansko Ab vidimo, kaj se v resnici dogaja. Vsakič, ko povečamo števec I, se sicer poveča Ab.I, ampak ostali nižji biti pa se ne »ugasnejo« na 0, pač pa so se vedno na 1. Torej bi morali samo nekako »ugašati« zadnje bite, najvišji – Ab.I, pa bi moral biti 1. V tem primeru bi dobili vrednosti iz Tabele 1, ki smo jih označili z Želeno Ab.
Kako to narediti pravzaprav vidimo iz Tabele 1. Namreč, za prikaz števila 1, ni potrebno nič spreminjati – tukaj se Želeno in Dejansko Ab ujemata, pri izpisu 2, pa že vidimo, da smo prikazali 1 bit preveč. Enostavno to rešimo tako, da od vrednosti recimo 3 odštejemo njeno prejšnjo, ki je 1 in dobimo rezultat iz kolone Želeno Ab. Naredite izračun za vrednosti 255 in 127 in kaj ste dobili? Odgovor je 128 – točno to, kar smo želeli. Poglejmo si kratek programski odsek, kjer smo to realizirali:
For I = 0 To 7 'te lucke gredo od leve proti desni
J = 7 - I 'te pa ravno obratno
Ab.i = 1 'zacetni pogoj
Cd.j = 1 'zacetni pogoj
Cd = Cd - M 'ugasamo zadnje lucke zato, da gori samo ena
Ab = Ab - N 'ugasamo zadnje lucke zato, da gori samo ena
P1 = Not Ab
P3 = Not Cd
Ab = N
Cd = M
Waitms 100
Next
Kot rečeno, imamo kontrolno spremenljivko I, ki se v FOR-NEXT zanki spreminja od 0 do 7, druga kontrolna spremenljivka J pa se spreminja od 7 do 0. Spreminja se tudi vrednost spremenljivk Ab in Cd, katerima spreminjamo vrednosti posameznih bitov tako, kot smo opisali zgoraj. Spremenljivki N in M sta od začetka programa nič, nato pa v njiju prepišemo predhodno vrednost Ab oziroma Cd in ju uporabimo pri odštevanju od Ab oziroma Cd. Preprosto, kajne, upam, da tudi dovolj razumljivo.
Opazili boste, da smo v programu napisali P1 = Not Ab in P3 = Not Cd. To smo napisali zato, ker smo za lažjo demonstracijo in razlago primera ves čas operirali z logičnimi enicami. Vsi, ki se pa ukvarjamo s programiranjem pa vemo, da LED diodo vklopimo z logično nič – zato vrednosti, ki smo jih izračunali invertiramo. In naša realna LED dioda v vezju nam bo zasvetila.
No, zdaj nam LED diode že kar lepo bežijo v eno smer, kaj pa v drugo? Postopek je podoben, le da moramo štetje obrniti, kar je razvidno iz dela programa:
For I = 7 Downto 0 'te lucke gredo od desne proti levi
J = 7 - I 'te pa ravno obratno
Ab.i = 1 'zacetni pogoj
Cd.j = 1 'zacetni pogoj
Cd = Cd - M 'ugasamo zadnje lucke zato, da gori samo ena
Ab = Ab - N 'ugasamo zadnje lucke zato, da gori samo ena
P1 = Not Ab
P3 = Not Cd
Ab = N
Cd = M
Waitms 100
Next
Tukaj je uporabljen ukaz For I = 7 Downto 0, kjer vrednost I-ja spreminjamo od 7 do 0, vse ostalo je isto.
Izvedba
Praktična izvedba KITT LED-ic se malce razlikuje od idejne zasnove. Na shemi na sliki 1. Na shemi vidite, da sem uporabil AT89C2051 mikrokontroler, ki pa ima samo 15 vrat! Torej smo že na začetku omejeni s število vrat in ne bomo mogli narediti prikaza z 2×8 LED-icami. Zato sem se odločil, da uporabim 2×7 LED diod, na ena prosta vrata pa vežem tipko, s katero bi lahko menjali različne programe zapisane v mikrokontrolerju. Ker pa Port3 nima P3.6 priključka, sem zadevo še malce zakompliciral in namesto P3.6 uporabil P1.7, kot se vidi iz sheme. Temu primerno je seveda bilo potrebno spremeniti program.
Spremenjenega programa ne bom posebej opisoval. Program je na voljo na Download sekciji naše spletne strani in si ga lahko snamete. Naj opozorim, da je trenutna verzija programa takšna, da omogoča osnovno kombinacijo prižiganja LED-ic, podobno kot KITT avto. Če boste želeli drugačno prižiganje LED-ic, boste ta del programa morali dopisati sami, kar pa verjamem, da ne bo prehudo.
Tiskano vezje je enostransko in ni prav nič komplicirano. Na sliki 2 vidimo predlog tiskanega vezja. Sestavljanje vezja je enostavno in ne bi smelo predstavljati posebej hudega problema. Ne pozabite vstaviti podnožje za mikrokontroler, saj mu boste med uporabo verjetno še spreminjali program. V vezju sem predvidel 5mm LED diode. Na sliki 4 vidite, da se en upor nahaja pod podnožjem mikrokontrolerja, vsi ostali elementi pa niso kritični. Namesto diskretnih uporov lahko uporabite uporovno verigo v obliki integriranega vezja.
Zaključek
Takole, še en primer enostavne uporabe Bascom programskega jezika smo obdelali. To pot smo prižigali LED diode v stilu K.I.T.T. avtomobila, kdaj drugič pa bomo napravili še kakšno zanimivo aplikacijo.
K.I.T.T. bežeča luč
Avtor: Jure Mikeln
2003_SE101_58