Avtor: mag. Vladimir Mitrović
E-pošta: vmitrovic12@gmail.com
2018_266_42
V tem nadaljevanju bomo predstavili knjižnico LED_clock$SE.sub, namenjeno modulom za digitalne ure s štirimi 7-segmetnimi displeji in s čipom TM1637 (7-segment LED Clock Tube Display). Spoznajmo se najprej s samim modulom.
Moduli za digitalne ure s čipom TM1637 (7-segment LED Clock Tube Display)
Slika 42 prikazuje fotografijo in shemo tipičnega modula za digitalne ure s čipom TM1637. Na tržišču obstaja več modelov, z več ali manj displeji v različnih barvah (poglejte fotografijo na sliki 36 v predhodnem nadaljevanju), vendar je shema vseh, do katerih sem uspel priti, precej podobna tej s slike 42. Modul vsebuje štiri 7-segmentne displeje s skupno anodo, TM1637 čip in vezje za odpravljanje motenj (pull-up upor z upornostjo 10 kΩ in kondenzator kapacitete 100 pF spojen proti masi; o učinkovitosti vezja sem pisal v predhodnem nadaljevanju).
Ta vsebina je samo za naročnike
Knjižnica LED_clock$SE.sub
Knjižnica LED_clock$SE.sub vsebuje ukaze, ki olajšujejo uporabo modula za digitalne ure. Podprte so mreže od enega do maksimalno 6 modulov z neodvisnim prikazom (slika 39). Če se na več modulih prikazuje ista vsebina, se moduli lahko spojijo tudi paralelno (slika 40), in takrat se vsi tako spojeni moduli štejejo kot en modul. Moduli so oštevilčeni od 1 do 6, številčenje mora biti po vrsti (če uporabljamo 3 module, morajo njihove številke biti 1, 2 in 3). Da bi podprogrami iz knjižnice znali korektno komunicirati z modulom, moramo v glavnem programu definirati, koliko modulov uporabljamo in kateri priključki mikrokontrolerja krmilijo vodilo.
LED_clock knjižnica dimenzionira in uporablja naslednje globalne spremenljivke:
Dim Led_clock$7segm(4) As Byte
Niz vsebuje podatke, ki jih je treba prikazati na 7-segmentnih displejih trenutno aktivnega modula, pri čemer prvi bajt v nizu ustreza prvem (levemu) 7-segmentnemu displeju.
Dim Led_clock$$backup(led_ clock_number_4) As Byte
V pomožnem nizu se hranijo kopije podatkov 7-segmentnih displejev, ki trenutno niso aktivni. Velikost niza je odvisna od konstant Led_clock_number_4, ki jih Bascom-AVR prevajalnik izračunava med prevajanjem programa proti konfiguriranemu številu modulov. Priporoča se, da ne menjamo vsebine niza direktno iz uporabniškega programa; enako velja tudi za ostale pomožne spremenljivke s prefiksom Led_clock$$.
Ukazi iz LED_clock$SE.sub knjižnice uporabljajo ukaze in spremenljivke iz TM1637$SE.sub knjižnice, pri čemer so posameznim spremenljivkam dodeljena alternativna imena. Poudarili bomo samo:
Led_clock$current Alias Tm1637$current
ki vsebuje redno številko trenutno aktivnega modula (1-6). V knjižnici obstajajo ukazi, s katerimi se menja število trenutno aktivnih modulov, zato se vsebina te spremenljivke uporablja samo kot indikacijo trenutno aktivnega modula – ne smemo ga direktno menjati.
Sledi opis ukazov iz knjižnice, glej sliko program 1 in 2.
S tem je zaključen opis knjižnice LED_clock$SE.sub. Uporabo njenih ukazov bomo ilustrirali na programskem primeru LED_clock_test.bas.
Program LED_clock_test.bas
Program je napisan za testno vezje treh modulov, povezanih po shemi na sliki 39 iz preteklega nadaljevanja. Razdeljen je na 4 celote, od katerih se prva izvršuje med inicializacijo (po resetu mikrokontrolerja), ostale pa s pritiski na tipke TP1-TP3.
Inicializacijska rutina vključuje vse segmente na vseh štirih 7-segmentnih displejih (Led_clock$7seg_set, Led_clock$refresh), nato štirikrat izmenično vključuje in izključuje dvopičje po drugi številki (Led_clock$dp_on, Led_clock$dp_off). Sledi sprememba intenzitete svetilnosti (Led_clock$on) in izmenično vklapljanje in izklapljanje prikaza na displeju (Led_clock$on, Led_clock$off). Na koncu inicializacijska rutina briše vse številke (Led_clock$7seg_clear).
TP1: Dokler je tipka TP1 pritisnjena se na displeju izmenično izpisuje “1234”, “5678”, “89 ” (Led_clock$7seg_num) in ” ” (prazen displej, Led_clock$7seg_clear). Ko spustimo tipko, na displeju ostane “zamrznjen” zadnji izpisan prikaz.
TP2: Dokler je tipka TP2 pritisnjena, se na displeju izmenično vklaplja in izklaplja dvopičje za drugo številko (Led_clock$dp_on, Led_clock$dp_off). Ko spustimo tipko, na displeju ostane “zamrznjen” zadnji izpisan prikaz.
TP3: Ilustracija uporabe ukazov Led_clock$select, Led_clock$copy in Led_clock$spread. Če tipko TP3 držimo pritisnjeno dalj kot 2,5 s, se vsebina trenutno izbranega displeja izpisuje na vseh konfiguriranih modulih (Led_clock$spread); število izbranega modula se pri tem ne menja. Če se TP3 drži pritisnjena 1-2,5 s, izbere naslednji modul v nizu (1->2->3->1…) in v njega kopira vsebino predhodno izbranega modula. Če se tipka drži pritisnjena manj od ene sekunde, se izbere naslednji modul (1->2->3->1…). V vseh primerih je število trenutno izbranega modula prikazano na LEDicah LED0 in LED1 (slika 39).
Na začetku programa moramo definirati s koliko moduli bomo delali
Const Led_key_number = 3
in nato definiramo tudi krmilne priključke vodila. Vedno moramo definirati CLOCK in DIO priključke prvega modula:
Led_clock_clk Alias Portd.6 Led_clock_do Alias Portd.5 Led_clock_di Alias Pind.5
Predvideli smo, da bodo na vodilo spojeni 3 moduli, zato sledi definicija DIO priključkov, ki krmilijo drugi (DI1/DO1) in tretji modul (DI2/DO2):
Led_clock_do1 Alias Portd.4 Led_clock_di1 Alias Pind.4 Led_clock_do2 Alias Portd.3 Led_clock_di2 Alias Pind.3
Opazili boste, kako mora biti vsak krmilni pin za DIO linijo konfiguriran dvakrat, kot vhodni in kot izhodni! Sedaj lahko vključimo LED_clock$SE knjižnico:
$include "LED_clock$SE.sub"
S tem nam bodo postale dostopne vse spremenljivke, konstante, definicije in ukazi iz LED_clock$SE.sub knjižnice, vendar bodo sestavni del programa postati samo tisti ukazi, ki jih bomo uporabljali. V program se bo avtomatsko vključil samo inicializacijski podprogram, ki bo konfiguriral predhodno definirane CLK in DO priključke kot izhodne, postavil jih bo v ustrezno začetno stanje (STOP) in izbral prvi modul.
Opomba: Knjižnica uporablja novi način definiranja podprogramov (Config Submode = New), zato je to potrebno upoštevati, če se v programu uporabljajo podprogrami iz nekaterih drugih knjižnic ali lastni podprogrami.
Večina ukazov iz LED_clock$SE.sub knjižnice uporablja ukaze in podprograme iz TM1637$SE.sub knjižnice, zato bodo uporabniku postali dostopni tudi ukazi iz te knjižnice. Včasih se isti učinek lahko doseže z uporabo podobnih ukazov iz ene ali iz druge knjižnice. Poudarimo takoj razliko na enem primeru! Če želite pobrisati prikaz na 7-segmentnih displejih, lahko to naredite z vpisom binarnih ničel v displej spomin:
For I = 0 To 3 Tm1637$write_byte I , &B00000000 Next
ali pač z uporabo ukaza Led_clock$7seg_clear:
For I = 1 To 4 Led_clock$7seg_clear I Next
Prvi primer bo imel trenutni učinek, ker ukazi iz TM1637$SE.sub knjižnice komunicirajo direktno s TM1637 čipom: vsi segmenti se bodo takoj ugasnili. V drugem primeru se bo pobrisala “slika” 7-segmentnih displejev v polju Led_clock$7segm() LED_clock$SE.sub knjižnice. Da bi ta sprememba postala vidna, jo je potrebno prenesti v modul oziroma osvežiti njegov prikaz:
Led_clock$refresh
To velja tudi za vse ostale Led_clock$ ukaze, ki postavljajo ali menjajo vsebino 7-segmentnih displejev: da bi sprememba postala vidna, je potrebno osvežiti prikaz. Odvisno od tega, kaj želimo doseči, se to lahko dela po vsaki spremembi, kot v tem primeru:
For I = 1 To 4 Led_clock$7seg_clear I Led_clock$refresh Waitms 250 Next
ali samo enkrat potem, ko so narejene vse želene spremembe:
For I = 1 To 4 Led_clock$7seg_clear I Next Led_clock$refresh
Prvi postopek uporabljamo, če želimo doseči učinek animacije (displeji se bodo brisali eden za drugim), in drugi, če želimo da vse spremembe postanejo vidne naenkrat.
Z izmeničnim ugašanjem in vklapljanjem displejev dosežemo učinek “utripanja”:
For I = 1 To 4 Led_clock$off Waitms 100 Led_clock$on 2 Waitms 100 Next
Vendar ukaz Led_clock$on zmore tudi več od tega; poleg tega, da vključuje prikaz na displeju hkrati tudi postavlja želeno intenzivnost. Tako bo zanka
For I = 1 To 7 Led_clock$on I Waitms 100 Next
postopno povečevala intenzivnost svetilnosti od minimalne do maksimalne, zanka
For I = 7 To 0 Step -1 Led_clock$on I Waitms 100 Next
jo bo postopno zmanjševala do minimuma. Opomba: Ukazi Led_clock$on in Led_clock$off imajo trenutni učinek, zato prikaza na displeju ni potrebno osveževati z ukazom Led_clock$refresh.
Z ukazom Led_clock$7seg_set lahko vključimo katero koli kombinacijo segmentov na 7-segmentnem displeju. Npr.,
Led_clock$7seg_set 1, &B00111111
bo na prvem displeju vključil segmente “a”, “b”, “c”, “d”, “e” in “f” in tako izpisal številko “0”. Da bi olajšal izpis desetiških številk 0-9, sem v knjižnico vključil ukaz Led_clock$7seg_num. Sestavni del ukaza je tabela z definicijo desetiških številk.
Zanka
For I = 1 To 4 J = I - 1 Led_clock$7seg_num I , J Next Led_clock$refresh
bo izpisala številke “0” – “3”, zanka
For I = 1 To 4 J = I + 3 Led_clock$7seg_num I , J Next Led_clock$refresh
pa številke “4” – “7”.
Tukaj smo se morali malo poigrati z indeksiranjem: prva številka na displeju ima indeks 1, medtem, ko ima definicija prve številke, “0”, ima v tabeli indeks 0. Poleg desetiških številk, lahko ukaz Led_clock$7seg_num izpiše tudi prazen prostor (blank), če se ji ukaže izpis “številke” večje od 9. Tako bosta ukaza
Led_clock$7seg_num 3 , 10 Led_clock$7seg_num 4 , 11
na tretji in četrti poziciji izpisala prazne prostore (vsi segmenti so ugasnjeni).
Štirištevilčni displeji za izpis časa imajo dvopičje po drugi številki. Knjižnica ima ukaze Led_clock$dp_on in Led_clock$dp_on s katerima lahko vklopimo in izklopimo dvopičje in pri tem ne menjamo vsebine na ostalih displejih. Kot tudi pri vseh drugih ukazih, ki vplivajo na spremembo prikaza na displeju, bo potrebno vsebino displeja osvežiti, da bi sprememba postala vidna. Tako vključeno dvopičje
Led_clock$dp_on
ne bo vidno, dokler ne osvežimo prikaza na displeju: Led_clock$refresh
Kadar delate z več LED clock moduli, lahko posamezni modul izberete z ukazom Led_clock$select. Predpostavimo, da je trenutno aktiven modul 1, od sedaj naprej pa želimo komunicirati z modulom 3. Ukaz
Led_clock$select 3
bodo deaktivirali modul 1 in aktivirali modul 3, in zato bodo vsi naslednji ukazi in podatki usmerjeni proti njemu. Poleg tega bo knjižnica shranila trenutno “sliko” displej spomina modula 1 in potegnila iz spomina predhodno shranjeno “sliko” displej spomina modula 3, da bi na njej lahko nadaljevali z delom. V tem trenutku se ne bo spremenil prikaz niti na enem modulu, ker TM1637 čipi, ki upravljajo s prikazi na displejih, to delajo na osnovi slike, ki jo imajo v svojem lastnem spominu.
Spremembo modula lahko naredimo tudi s pomočjo ukaza Led_clock$copy, ki se obnaša malo drugače od ukaza Led_clock$select. Predpostavimo, da je trenutno aktiven modul 1, od sedaj naprej želimo komunicirati z modulom 3. Ukaz
Led_clock$copy 3
bo deaktiviral modul 1 in aktiviral modul 3, zato bodo vsi naslednji ukazi in podatki usmerjeni proti njemu. Poleg tega bo knjižnica shranila trenutno “sliko” displej spomina modula 1, vendar jo bo zadrževala tudi kot sliko displej spomina modula 3. Z drugimi besedami, vsebina displej spomina 1. modula je prekopirana v displej spomin 3. modula. Da bi ta vsebina postala vidna na displeju tretjega modula, je potrebno osvežiti prikaz z ukazom Led_clock$refresh. Poleg ukaza Led_clock$refresh knjižnica nudi še en ukaz, s katerim lahko spremenimo izpis na displejih vseh modulov sočasno: Led_clock$spread. Uporabimo jo takrat, kadar želimo osvežiti prikaz na displejih vseh modulov z isto vsebino. Ukaz ne menja števila trenutno izbranega modula niti vsebine delovnih področij ostalih modulov. Z drugimi besedami, če uporabljate ukaz Led_clock$spread namesto ukaza Led_clock$refresh, bodo vsi moduli v mreži prikazovali isto vsebino, kot da so paralelno vezani kot na shemi na sliki 40.
Tukaj je važno poudariti naslednje: če uporabite vezavo po shemi na sliki 40, so moduli povezani paralelno in možen je samo skupni (sočasen) pristop displejem vseh modulov; zaradi tega bodo vsi displeji nujno prikazovali isto vsebino. Če uporabljate vezavo po shemi na sliki 39, lahko v programu kombinirate uporabo ukazov Led_clock$refresh in Led_clock$spread in tako, po potrebi, imeti individualni ali skupinski pristop displejem modula za prikaz časa.
Fotografija na sliki 43 prikazuje testno vezje med preverjanjem ukazov iz knjižnice TM_1637$SE.sub in LED_clock$SE.sub.
Opomba: knjižnico LED_clock$SE.sub in testni program LED_clock_test.bas lahko brezplačno dobite v uredništvu revije Svet elektronike.
Barduino (12)