Avtor: mag. Vladimir Mitrović
vmitrovic12@gmail.com
2018_236_42
Spletne trgovine nudijo širok izbor modulov, ki združujejo 7-segmentne displeje, nize LEDic in manjše ali večje število tipk (slika 28). Popularno se imenujejo “LED&KEY” in vsi so, kot tudi drugi moduli, ki jih preučujemo v tej seriji člankov, prvenstveno namenjeni uporabnikom Arduino ali Raspberry Pi platform. Pokazali bomo, kako jih povezati z našima MiniPin ali MegaPin razvojnima orodjema in seveda, kako z njima komunicirati iz programskega jezika BascomAVR.
LED&KEY modula (TM1638)
Skupna nit vseh teh LED&KEY modulov je integrirano vezje TM1638. Isti LED drive control čip uporabljajo tudi nekateri moduli, ki na sebi nimajo tipk, kot te prikazani na sliki 28 desno v sredini in spodaj. Ostali moduli se, na prvi pogled, največ razlikujejo po številu vgrajenih tipk. Vendar to ni edina razlika: nekateri moduli uporabljajo 7-segmentne displeje s skupno katodo, drugi s skupno anodo, nekateri moduli imajo niz dvobarvnih LEDic, drugi uporabljajo enobarvne, tretji jih sploh nimajo… No, največja razlika je vendar v tem, ker “iste” komponente na vseh modulih z integriranim vezjem niso povezane na enak način.
Ta vsebina je samo za naročnike
Ko sem razmišljal kako narediti knjižnico, ki bi “pokrila” čim večje število modulov zasnovanih na integriranem vezju TM1638 sem zaključil, da bi bilo najbolje napisati dve: eno, ki bi pokrila osnovne funkcije samega integriranega vezja in drugo, ki bi olajšala uporabo najpogostejših modulov vrste LED&KEY. Tako sta nastali knjižnici TM1638$SE.sub in LED&KEY$SE.sub, ki jih bomo spoznali v nadaljevanju.
Osnovno o integriranem vezju TM1638
Vse, kar morate vedeti o integriranem vezju TM1638, je prikazano na sliki 29. Čip podpira dve matrici: vhodno 8×3 (na sliki modro) in izhodno, 8×10 (na sliki rumeno). Na presečiščih K1-K3 in KS1-KS8 vhodne matrice se vežejo tipke ali stikala, katerih stanja bere TM1638 v multipleksiranem načinu dela. Na presečišča linij SEG1-10 in GRID1-8 izhodne matrice povežemo LEDice. To so lahko posamične enobarvne ali večbarvne LEDice, diodne matrice ali pač 7-segmentni displeji s skupno anodo ali katodo. V vsakem primeru, se morajo anode LEDic povezati na SEG, katode pa na GRID linije.
Takšen način povezovanja LEDic tudi vsebuje multipleksirani način dela, o čemer “skrbi” sam TM1638. Če želite vključiti eno od LEDic, je dovolj postaviti ustrezen bit v 16-bajtnem displej registru integriranega vezja. Povezava med položaji LEDice v matrici in naslova bita v displej registru je prikazana v “rumeni” tabeli v gornjem desnem delu slike 29. Naslovne lokacije so napisane znotraj oklepajev v heksadecimalnem zapisu, in se gibljejo v razponu od (00h) do (0Fh). Če bi želeli npr. vključiti LEDico povezano na presečišču linij SEG5 in GRID2, je potrebno postaviti bit B4 na naslovni lokaciji (02h). V vsakem trenutku je lahko postavljeno poljubno število bitov v kateri koli kombinaciji.
Poleg vključevanja in izključevanja LEDic lahko TM1638 upravlja tudi z intenzivnostjo njihove svetilnosti. Eden od 8 razpoložljivih nivojev intenzivnosti se postavlja s pomočjo Display Control ukazov in se nanaša na vse LEDice sočasno (ni možno postavljati intenzivnost svetilnosti vsake posamezne LEDice). Z Display Control ukazi je tudi možno ugasniti in ponovno vklopiti celotno diodno matrico.
Sklenjenemu stikalu ustreza postavljeni bit v enem od štirih bajtov vhodnega registra. Povezava med položajem stikala v matrici in ustreznega bita v vhodnem registru je prikazana v “modri” tabeli na sliki 29 spodaj desno. Če sklenemo npr. stikalo med linijama KS1 in K1, bo integrirano vezje postavilo bit 2 prvega bajta vhodnega registra (B1.2). Če sklenemo stikalo na presečišču linij KS7 in K3, se bo postavil ničti bit četrtega bajta vhodnega registra (B4.0). Tukaj boste opazili, da so v skladu z dokumentacijo integriranega vezja bajti vhodnega registra oštevilčeni od 1-4, njihovi biti pa od 0-7. Za razliko od naslovnega prostora registra displeja, v katerem je možno direktno naslavljati in nato spremeniti vsaki bajt, je bajte iz naslovnega prostora vhodnega registra možno brati samo zaporedno enega za drugim.
TM1638 podpira serijsko komunikacijo preko svojih DIO in CLK priključkov. S komunikacijo v celoti upravlja mikrokontroler, ki generira takt impulze (CLK) in preko DIO voda vodila pošilja ali sprejema podatke. Če v mreži obstaja več od enega TM1638 čipov, se njihovi DIO in CLK priključki paralelno povežejo na istoimenske priključke vodila. Komunikacijski protokol ne pozna naslavljanja ampak mikrokontroler izbere TM1638 čip s katerim želi komunicirati tako, da postavi njegov selekcijski priključek STB v stanje logične ničle. Čipi katerih STB priključki so v stanju “1” ignorirajo promet na vodilu. Če je na vodilo povezan samo eden TM1638 čip, je njegov STB vhod možno trajno postaviti v stanje “0”; v nasprotnem primeru mora mikrokontroler zagotoviti, da je v vsakem trenutku aktiven samo en čip.
Knjižnica TM1638$SE.sub
Knjižnica TM1638$SE.sub podpira mreže od enega do maksimalno 6 TM1638 čipov. Čipi so oštevilčeni od 1 do 6, vendar pa mora številčenje biti po vrsti (če uporabljamo 3 čipe, morajo njihove številke biti 1, 2 in 3). Da bi podprogrami iz knjižnice znali korektno komunicirati s TM1638 čipi, moramo v glavnem programu definirati priključke mikrokontrolerjev, ki so povezani na vodilo, število čipov na vodilu in priključke mikrokontrolerjev, ki krmilijo STB priključke posameznih TM1638 čipov.
Knjižnica dimenzionira in uporablja naslednje globalne spremenljivke:
Dim Tm1638$current As Byte
Spremenljivka Tm1638$current vsebuje redno število trenutno izbranega (aktivnega) TM1638 čipa (1-6). Njegova vsebina se postavlja iz glavnega programa, preverjajo ga vsi komunikacijski ukazi in podprogrami iz knjižnice, zato da bi lahko aktivirali pravi čip še pred pošiljanjem ali prejemanjem podatkov.
Dim Tm1638$keys(4) As Byte
Niz Tm1638$keys(4) vsebuje kopijo vhodnih registrov TM1638 čipa v trenutku, ko je zadnjič izvršen ukaz za branje, Tm1638$read_keys.
Poleg navedenih, knjižnica definira še nekaj spremenljivk s prefiksom Tm1638$$; te spremenljivke uporabljajo podprogrami iz knjižnice in ni jih priporočljivo uporabljati iz glavnega programa.
Sledi opis ukazov iz knjižnice
Ukaz Tm1638$write_command
Tm1638$write_command par1
Parametri: | par1 | konstanta ali ime byte spremenljivke ki vsebuje veljaven data ukaz |
Namen: | Pošilja ukaz Data Command tipa TM1638 čipu. | |
Opomba: | Dopustne vrednosti parametra par1 so &B0000-&B1111, ukaz ignorira bite par1.7-par1.4. |
Ukaz Tm1638$write_control
Tm1638$write_control par1
Parametri: | par1 | konstanta ali ime byte spremenljivke ki vsebuje veljaven kontrolni ukaz |
Namen: | Pošilja ukaz Display Control tipa TM1638 čipu. | |
Opomba: | Dopustne vrednosti parametra par1 so &B0000-&B1111, ukaz ignorira bite par1.7-par1.4. |
Ukaz Tm1638$write_byte
Tm1638$write_byte par1, par2
Parametri: | par1 | konstanta ali ime byte spremenljivke ki vsebuje veljaven naslov displej registra (0-15) |
par2 | konstanta ali ime byte spremenljivke ki vsebuje podatek (0-255) ki ga je treba vpisati na naslov za dani parameter par1 | |
Namen: | Vpisuje byte podatek par2 v displej register, na naslov določeno vrednost parametra par1. | |
Opombe: | Dopustne vrednosti parametra par1 so &B0000-&B1111, ukaz ignorira bite par1.7-par1.4.
Ukaz postavlja Data Command parametre normal mode, fixed address, write data. |
Ukaz Tm1638$write_block
Tm1638$write_block par1
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje veljaven naslov displej registra |
Namen: | Začetni ukaz zaporednega vpisa; pošilja naslov bajta iz displej registra TM1638 čipu. | |
Opombe: | Dopustne vrednosti parametra par1 so &B0000-&B1111, ukaz ignorira bite par1.7-par1.4.
Ukaz postavlja Data Command parametre normal mode, auto increment, write data. |
Ukaz Tm1638$write_data
Tm1638$write_data par1
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje podatek za vpis (0-255) |
Namen: | Vpisuje podatek v predhodno naslovljeni bajt displej registra TM1638 čipu. | |
Opomba: | Ukaz se uporablja med zaporednim vpisom podatkov. |
Ukaz Tm1638$write_block_end
Tm1638$write_block_end
Parametri: | nima |
Namen: | Zaključni ukaz zaporednega vpisa. |
Ukaz Tm1638$read_keys
Tm1638$read_keys
Parametri: | nima |
Namen: | Bere 4 bajte iz vhodnega registra TM1638 čipa in njihovo vsebino shrani v niz Tm1638$keys(). |
Opomba: | Ukaz postavlja Data Command parameter read key scanning data. |
Poleg navedenih ukazov, knjižnica vsebuje še nekaj deset podprogramov, ki kličejo ukaze iz knjižnice. Ti podprogrami imajo prefiks Tm1638$$ in priporoča se, da jih ne uporabljate direktno iz uporabniškega programa.
Ko smo spoznali koncept in ukaze iz knjižnice TM1638$SE.sub, bomo način njihove uporabe ilustrirali s pomočjo primera. Poudarimo še enkrat, da so ukazi iz knjižnice orientirani na TM1638 čip in ne na modul, v katerem je vgrajen. Zato bo za rešitev neke konkretne naloge potrebno poznati shemo samega modula, torej način kako so LEDice, 7-segmentni displeji, stikala in tipke povezani s čipom. Primer, ki ga bomo analizirali, nam lahko pri tem pomaga.
Primer je napisan za testno vezje v kateremu se nahajajo trije moduli s TM1638 čipom, povezani z mikrokontrolerjem ATtiny4313 po shemi na sliki 30. Krmilno vezje z mikrokontrolerjem se nahaja v razvojnem okolju MiniPin, MegaPin, ali nekem drugem podobnih možnosti. Tukaj bomo analizirali samo dele programa ki se nanašajo na ukaze iz knjižnice; za popolno razumevanje dela je potrebno pogledati celoten program.
Program TM1638.bas
Namen tega programa je preverjanje vseh ukazov iz knjižnice TM1638$SE.sub. Program je razdeljen na 5 delov, od katerih se prvi izvršuje med inicializacijo (po resetu mikrokontrolerja), ostali pa s pritiskom na tipke TP1-TP4:
- Inicializacijska rutina zapolnjuje spomin displeja TM1638 čipa z binarnimi enicami (&Hff) od najnižje lokacije do najvišje, nato pa z binarnimi ničlami (&H00) v nasprotni smeri (preverjanje ukaza Tm1638$write_byte). Postopek se ponavlja za vse tri module, nato ostane izbran prvi modul.
- TP1: Zapolnjuje spomin displeja z binarnimi enicami (preverjanja ukaze Tm1638$write_block), vse LEDice morajo zasvetiti. Izmenično vklaplja in izklaplja LEDice, nato menja intenzivnost svetilnosti LEDic od najmanjše do največje in nazaj (preverjanja ukaze Tm1638$write_control). Zapolnjuje spomin displeja z binarnimi ničlami (&H00), vse LEDice se morajo ugasniti.
- TP2: Zapolnjuje parne lokacije spomina displeja z vsebino &B00000001 do &B10000000, nato z vsebino &B00000001 do &B11111111. Cilj je ugotoviti povezanost med spominskimi lokacijami in posameznimi LEDicami. Posamezni prikaz se lahko zadrži, če se med izpisi pritisne in drži TP2.
- TP3: Zapolnjuje neparne lokacije spomina displeja z vsebino &B00000001 do &B10000000, nato z vsebino &B00000001 do &B11111111. Cilj je ugotoviti povezanost med spominskimi lokacijam in posameznimi LEDicami. Posamezni prikaz se lahko zadrži, če se med izpisi pritisne in drži TP3.
- TP4: Menja izbrani modul (1->2->3->1…). Številka trenutno izbranega modula je prikazana na LEDicah LED0 in LED1 (slika 30).
Poglejmo kako je to realizirano v programu! Na začetku programa definiramo koliko TM1638 čipov bomo uporabljali:
Const Tm1638_number = 3
in takoj za tem definiramo komunikacijske pine DIO, CLK in STB:
Tm1638_do Alias Portd.6 Tm1638_di Alias Pind.6 Tm1638_clk Alias Portd.5 Tm1638_stb Alias Portd.4
Opazili boste, da je DIO priključek potrebno definirati dvakrat, kot izhodni in kot vhodni. Tm1638_STB pin izbere (vključuje) prvi TM1638 čip; ker je program napisan za tri TM1638 čipe, moramo še definirati selekcijske priključke za preostala dva čipa:
Tm1638_stb1 Alias Portb.2 Tm1638_stb2 Alias Portb.3
Te definicije je nujno napisati pred klicem TM1638$SE knjižnice, zato jo v svoj program vključujemo šele zdaj:
$include "TM1638$SE.sub"
Z vklopom knjižnice bodo v programu postale dostopne vse njene globalne spremenljivke, konstante in ukazi, vendar pa bodo sestavni del programa postati samo tisti ukazi, ki jih boste uporabljali. V program se bo avtomatsko vključil samo inicializacijski podprogram, ki bo konfigurira predhodno definirane CLK in STB priključke kot izhodne, postavil jih bo v ustrezno začetno stanje in izbral bo prvi TM1638 čip. Opomba: Knjižnica uporablja novi način definiranja podprograma (Config Submode = New) zato je o to potrebno upoštevati, če se v programu uporabljajo podprogrami iz nekaterih drugih knjižnic ali lastni podprogrami.
Najprej bomo z ukazom Display Control definirali želeni nivo osvetlitve, npr. 4/16:
Tm1638$write_control &B1010
Če želimo vključiti vse LEDice, to najlažje naredimo v blok-načinu, ki ga pričnemo z Write_block ukazom:
Tm1638$write_block &B0000
Tukaj smo definirali kako displej registre TM1638 čipa dopolnjujemo od začetnega naslova 0. Vseh 16 bajtov displej registra bomo dopolnili z vrednostjo &B11111111 s pomočjo ukaza Write_data:
For I = 0 To 15 Tm1638$write_data &B11111111 Waitms 100 Next
Waitms 100 znotraj zanke upočasnjuje vklop LEDic zato, da bi lahko spremljali vrstni red, po katerem se prižigajo in tako določili, kateremu naslovu displej registra ustreza skupina LEDic.
Blok-mod vpisa moramo zaključiti z ukazom Write_block_end :
Tm1638$write_block_end
Isti efekt bi lahko dosegli z uporabo Write_byte ukaza:
For I = 0 To 15 Tm1638$write_byte I , &B11111111 Waitms 50 Next
Write_byte ukaz ima direkten dostop do vsake naslovne lokacije displej registra, zato jo uporabljamo kadar želimo vpisati specifično vsebino na nek določen naslov:
Tm1638$write_byte 2 , &B01010101
če želimo dopolnjevati displej register s spremenljivo vsebino in pri tem preskakovati nekatere naslovne lokacije:
J = &B00000001 For I = 0 To 14 Step 2 Tm1638$write_byte I , J Waitms 100 Shift J , Left Next
ali pač če želimo pobrisati vsebino vseh lokacija nazaj:
For I = 15 To 0 Step -1 Tm1638$write_byte I , &B00000000 Waitms 50 Next
Z uporabo Write_control ukaza vpisujemo vrednosti v Display control register in tako vplivamo na jakost osvetlitve LEDic. Npr., zanka
For I = 1 To 4 Tm1638$write_control &B1010 Waitms 500 Tm1638$write_control &B0000 Waitms 500 Next
bo 4-krat vklopila (&B1010) in ugasnila (&B0000) vse LEDice (seveda se to nanaša samo na diode, ki smo jih predhodno vključili; ukaz ne menja vsebine displej registra), dokler bo zanka
For I = &B1000 To &B1111 Tm1638$write_control I Waitms 200 Next
menjala intenzivnost svetilnosti vključenih LEDic od najmanjše (&B1000) do največje (&B1111).
Če želimo prebrati vsebino vhodnega registra, bomo uporabili Read_keys ukaz:
Tm1638$read_keys
Ta ukaz bo prebral vsebino štiribajtnega vhodnega registra TM1638 čipa in jo prenesel v TM1638keys() niz ki je, kot smo že rekli, globalna spremenljivka znotraj same knjižnice. Če poznamo shemo uporabljenega modula, bomo s pomočjo data sheeta TM1638 čipa lahko ugotovili katera sklenjena tipka sli stikalo povzroča postavljanje katerega bita v vhodnem registru, oziroma v Tm1638keys() nizu v našem programu. To lahko potrdimo s prikazom vsebineTm1638keys() niza na LEDicah:
For I = 1 To 4 J = I - 1 : J = J * 2 Tm1638$write_byte J , Tm1638$keys(in) Next
Opomba: vsebina vhodnega registra TM1638 čipa ustreza trenutnemu stanju tipke/stikala; če želimo spremljati spremembe, moramo register pogosto brati in analizirati njegovo vsebino. Zato je v testnem programu ta procedura vklopljena znotraj glavne Do-Loop zanke.
Vsi primeri, ki smo jih do sedaj navedli so se nanašali na prvi TM1638 modul, ker je izbran v začetku v trenutku, ko smo smo vključili TM1638$SE knjižnico. Če želimo komunicirati z nekim drugim modulom, je dovolj spremeniti vrednost globalne spremenljivke Tm1638$current:
Tm1638$current = 3
Knjižnica bo zdaj izbrala tretji TM638 modul, in zato bodo vsi ukazi in podatki po tem poslani k njemu.
Če poizkušate s pomočjo programa TM1638.bas analizirati, kako funkcionira neki TM1638 modul, se boste morali kar precej potruditi, da boste “polovili niti” kako so komponente na modulu spojene z integriranim vezjem oziroma katera LEDica, kateri segment katerega 7-segmentnega modula in katero stikalo ustrezajo kateremu bitu iz njegovih registrov. Knjižnica TM1638$SE.sub omogoča pristop vsakem na TM1638 čipu baziranem modulu, ampak ne nudi končne rešitve. Če želite elegantno uporabljati tak modul, so potrebni podprogrami “višjega nivoja”, ki imajo v sebi že vgrajene posebnosti posameznega modula. Eno takšno nadgradnjo bomo predstavili v naslednjem nadaljevanju. Gre o knjižnici LED&KEY$SE.sub, ki je prilagojena trem najpogosteje uporabljenim modulom: LED&KEY, JY-MCU (JY-LKM1638) in QYF-TM1638. Z uporabo ukazov iz te knjižnice delo z navedenimi moduli ne bo zahtevnejše od uporabe navadnega LCD modula!