Avtor: mag. Vladimir Mitrović
E-pošta: vmitrovic12@gmail.com
2018_262_48
Med IO moduli na osnovi integriranih vezij PCF8574/8574A, ki smo ju preučevali v preteklem nadaljevanju, lahko izpostavimo enega za posebne namene – I2C serial interface for LCD. Modul je po obliki in razporedu priključkov prilagojen alfanumeričnim displejem z osvetlitvijo ozadja Zato ga lahko direktno zaspajkamo na zadnjo stran displeja (slika 23 levo). Z eno omejitvijo: modul je namenjen displejem, pri katerih je priključek 15 anoda in priključek 16 katoda osvetlitve ozadja. Če ima vaš displej obrnjen razpored, si boste morali omisliti ustrezno prilagoditev.
I2C LCD modul
Navedeni modul omogoča krmiljenje z alfanumeričnim displejem preko I2C vodila. S tem je število krmilnih priključkov mikrokontrolerja od 7 (8, če krmilimo tudi osvetlitev ozadja) zmanjšano na samo 2. Ta mesec predstavljamo knjižnico, ki omogoča enostavno uporabo takšnega modula. Namesto modula je v vašem vezju možno uporabiti tudi samo integrirano vezje PCF8574/8574A. V tem primeru je potrebno upoštevati način povezovanja, ki je prikazan na sliki 23 desno: P7-P4 = D7-D4, P3 = osvetlitev ozadja, P2 = ENA, P1 = R/W, P0 = RS. Drugačen način povezovanja zahteva modifikacijo rutin iz knjižnice!
Ta vsebina je samo za naročnike
Knjižnica PCF8574_LCD$SE.sub
Bascom-AVR nudi možnost alternativnega krmiljenja LCDja s pomočjo uporabniških rutin. In ravno to možnost uporablja knjižnica PCF8574_LCD$SE.sub. Ko jo vključite v svoj program, rutine iz knjižnice sprejmejo standardne Bascomove LCD ukaze in jih pretvarjajo v obliko, ki je primerna za prenos na I2C vodilu, PCF8574/8574A čip v modulu jih spet pretvarja v 8-bitno paralelno obliko primerno za krmiljenje LCDja. Ta del je programerju popolnoma neviden: ukazi za delo z LCDjem se pišejo na isti način kot da gre za “klasični” načinu povezovanja, vse potrebno naredijo rutine iz knjižnice. Te “skrite” rutine in spremenljivke, ki jih uporabljajo, imajo prefiks Lcd$$ in priporoča se, da se jih ne uporablja direktno iz uporabniškega programa.
Knjižnica podpira delo z večjim številom LCDjev pod predpostavko, da so moduli/čipi, ki upravljajo z njihovim delom, postavljeni na različne naslove. Naslov modula/čipa je odvisen od stanja naslovnih priključkov A0-A2 in od uporabljenega čipa. Zato lahko na isto I2C vodilo priključimo 8 modulov s PCF8574 in 8 modulov s PCF8574A čipom – skupaj 16 LCDjev! Vsakega od LCDja moramo inicijalizirati pred prvo uporabo. Inicijalizacija hkrati tudi izbere LCD zato ga lahko pričnemo takoj uporabljati, če imamo samo en LCD na I2C vodilu. Če imamo dva ali več LCDjev, je v vsakem trenutku lahko aktiven samo eden od njiju; z izbiro LCDja določimo, kateremu od njiju bodo poslani naslednji Bascom LCD ukazi.
Identifikacija izbranega LCDja v obliki binarne številke v razponu 0-15 je nameščena v globalni spremenljivki Lcd$current:
Dim Lcd$current As Byte
Vsebino spremenljivke lahko uporabljate iz uporabniškega programa, vendar ga ne menjajte. Sledi opis ukazov iz knjižnice:
Ukaz Lcd$init
Lcd$init par1
Parametri: | par1 | konstanta ali ime byte spremenljivke ki vsebuje identifikacijsko oznako modula oziroma PCF8574/8574A čipa (0-15);
par1 = 0-7: modul uporablja čip PCF8574, naslov čipa A2-A0 ustreza vrednosti parametra par1 par1 = 8-15: modul uporablja čip PCF8574A, naslov čipa A2-A0 ustreza vrednosti parametra par1 zmanjšanega za 8 |
Namen: | Inicijalizira, postavlja v 4-bitni način dela in izbere navedeni modul, nato postane dostopen vsem LCD ukazom. |
Ukaz Lcd$select
Lcd$select par1
Parametri: | par1 | konstanta ali ime byte spremenljivke ki vsebuje identifikacijsko oznako modula, odnosno PCF8574/8574A čipa (0-15);
par1 = 0-7: modul uporablja čip PCF8574, naslov čipa A2-A0 ustreza vrednosti parametra par1 par1 = 8-15: modul uporablja čip PCF8574A, naslov čipa A2-A0 ustreza vrednosti parametra par1 zmanjšanega za 8 |
Namen: | Izbere navedeni modul, po tem postane dostopen vsem LCD ukazom. | |
Opomba: | Sočasno je lahko izbran samo en modul. Ukaz je nujen samo v primerih kadar sta na isto I2C vodilo povezana dva ali več LCDjev. |
Ukaz Lcd$write_command
Lcd$write_command par1
Parametri: | par1 | konstanta ali ime byte spremenljivke ki vsebuje LCD ukaz |
Namen: | Z uporabo I2C protokola posreduje ukaz izbranemu LCDju v 4-bitnem načinu. | |
Opomba: | Na ta način je možno poslati tudi ukaze, ki niso zajeti s standardnim setom Bascom-AVR LCD ukazi. |
Ukaz Lcd$write_data
Lcd$write_data par1
Parametri: | par1 | konstanta ali ime byte spremenljivke ki vsebuje podatek ki ga je treba prikazati na LCDju |
Namen: | Z uporabo I2C protokola posreduje podatek izbranemu LCDju v 4-bitnem načinu. |
Ukaz Lcd$bl_on
Lcd$bl_on
Parametri: | nima |
Namen: | Vključuje osvetlitev ozadja izbranega LCDja. |
Ukaz Lcd$bl_off
Lcd$bl_off
Parametri: | nima |
Namen: | Izključuje osvetlitev ozadja izbranega LCDja. |
Ko smo spoznali koncept in ukaze iz knjižnice PCF8574_LCD $ SE.sub, bo njihova uporaba ponazorjena z nekaj primeri.
Program I2C_LCD_1.bas
Namen prvega primera je preverjanje vseh ukazov iz knjižnice, kot tudi preverjanje kako osnovni LCD ukazi Bascom-AVRja delujejo v povezavi s knjižnico. Primer je napisan za vezje na sliki 24 s samo enim 16×2 LCDjem na I2C vodilu. Naslov modula je 7 (A2-A0 = 111), krmilno vezje z mikrokontrolerjem ATtiny4313 se nahaja v razvojnem sistemu MiniPin. Enako dobro bo služila tudi MegaPin ali neko drugo razvojno orodje s podobnimi možnostmi. Tukaj bomo analizirali samo dele programa ki se nanašajo na ukaze iz knjižnice; za popolno razumevanje dela je potrebno pogledati celoten program.
Na začetku programa moramo definirati katero vrsto LCDja uporabljamo in takoj zatem vključimo PCF8574_LCD$SE.sub knjižnico:
Config Lcd = 16 * 2 $include "PCF8574_LCD$SE.sub"
Z vključitvijo knjižnice se menja način na katerega Bascom-AVR prevajalnik obdeluje LCD ukaze, zato običajni Config Lcdbus i Config Lcdpin ukaz ni potreben. Sestavni del programa bo postal samo tisti del ukazov iz knjižnice, ki jih boste uporabljali. 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 lastnih podprogramov.
Moramo še definirati priključke za I2C komunikacijo,
Config Sda = Portd.4 Config Scl = Portd.5 Config I2cdelay = 5 I2cinit Waitms 10
in nato inicializirati LCD:
Lcd$init 15
Parameter 15, binarno “1111” pomeni, da se v modulu uporablja PCF8574A čip (bit 3 = “1”) in da so naslovni priključki postavljeni v stanje A2-A0 = “111”. Če bi imeli modul s PCF8574 čipom, bi inicializacijski parameter moral biti 7 namesto 15. Ukaz za inicializacijo izvršuje softverski reset LCDja in ga hkrati tudi izbere, zato ga lahko takoj pričnemo uporabljati. Najprej bomo vključili osvetlitev ozadja
Lcd$bl_on
in nato nadaljevali pisati “običajne” Bascom LCD ukaze:
Home U Lcd "*PCF8574A test*" Home L Lcd "* *"
Ukaza Lcd$write_command in Lcd$write_data omogočata pošiljanje ukazov in podatkov LCDju mimo “klasičnih” Bascomovih ukazov. Za nekaj takega je potrebno poznati nabor ukazov, ki jih neki LCD podpira pa tudi organizacijo internega spomina LCDja. Pregled ukazov tipičnega LCDja prikazuje slika 25. Organizacija spomina je odvisna od dimenzij LCD displeja in tako npr., se prva vrstica LCDja tipa 16×2 prične od naslova &H00, druga pa od &H40. Na internetu boste lahko našli podatke o naslavljanju drugih vrst displeja.
Poglejmo primera kako nekaj napisati na LCD z uporabo njegovih izvornih ukazov. Najprej se bomo postavili na zgornjo levo pozicijo displeja. Po tabeli s slike 25 temu služi ukaz Set DDRAM address, &B1aaaaaaa. “aaaaaaa” je naslov na katerega se želimo postaviti; v tem primeru je naslov 0, zato LCDju pošljemo ukaz:
Lcd$write_command &B10000000
Nato bomo izpolnili displej z znaki iz ACSII tabele:
For I = &H20 To &H7F Lcd$write_data I Waitms 100 Next
Teh 116 znakov bo končalo v RAMu LCDja; pri LCDju tipa 16×2 bodo vidni samo tisti, ki se nahajajo na naslovih &H00-&H0F (prva vrsta) in &H40-&H4F (druga vrsta).
Isti program je napisan tudi v verziji za mikrokontroler ATmega328P (I2C_LCD_1mega.bas); programa sta zelo podobna, razlika je samo v konfiguraciji I2C komunikacije (ATmega328P uporablja hardverski TWI) in priključkih mikrokontrolerja ki se uporabljajo za posamezen namen.
Program I2C_LCD_2.bas
Ta primer je napisan za konfiguracijo dveh LCDjev povezanih tajko, kot vidimo na sliki 26. Kadar uporabljamo več LCDjev je zaželeno, da so vsi istega tipa. V našem primeru ni temu tako. Prvi LCD je 16×2, drugi 20×4. To načeloma predstavlja problem, ker lahko v Bascom-AVR programu uporabljamo samo en Config Lcd ukaz. Parametre tega ukaza Bascom-AVR prevajalnik uporablja pri preračunavanju Home in Locate ukazov v naslove spominskih lokacij LCDja in bi pri napačnem izboru prihajalo do napak v pozicioniranju. Z analizo razpoložljive dokumentacije in preverjanjem na realnem vezju sem ugotovil, da bo LCD tipa 16×2 deloval pravilno tudi, če ga konfiguriramo kot 20×4, zato v programu uporabljamo naslednji ukaz:
Config Lcd = 20 * 4
Oba modula uporabljata čip PCF8574A; prvi je postavljen na naslov “111”, drugi pa na “110”. Inicijalizirali bomo prvi LCD in na njemu izpisati pozdravno sporočilo:
Lcd$init 15 Lcd$bl_on Home U Lcd "* I2C LCD 16*2 *" Home L Lcd "Svet elektronike"
Nato bomo isto napravili na drugem LCDju:
Lcd$init 14 Lcd$bl_on Home U Lcd "*** I2C LCD ***" Home L Lcd "*** 20*4 ***" Home T Lcd "* Svet elektronike *" Home F Lcd "********************"
Sledi nekaj animacije s prižiganjem in ugašanjem osvetlitve ozadja. V teh primerih je pomembno ugotoviti to, da je vsakega od LCDjev nujno izbrati, da bi mu mogli poslati nek ukaz ali podatek. Npr.,
Lcd$select 15 Lcd$bl_off Lcd$select 14 Lcd$bl_on
bo ugasnil osvetlitev ozadja na prvem in ga vklopil na drugem LCDju. V nadaljevanju na LCDjih izpisujemo enostavno sporočilo zato, da lahko spremljamo efekte Shiftlcd ukaza na enem in na drugem tipu LCDja. Prva vrsta je popolnjena z vsebino “10…19”
Locate 1 , 1 Lcd "10111213141516171819"
druga pa z vsebino “20…29”:
Locate 2 , 1 Lcd "20212223242526272829"
Opazili boste, da na LCDju tipa 16×2 del teh sporočil konča v nevidnem delu spomina. Vloga tipk TP1-TP4 je naslednja:
- S pritiskom na TP1 izberemo prvi (15), drugi (14) ali neobstoječi (7) LCD; ta zadnji je izbran zato, da bi se prepričali da je sporočilo poslano temu LCDju in da ne bo sprejeta niti na enem od dveh obstoječih LCDjev. Kateri LCD je izbran lahko spremljamo na LEDicah vezanih na priključke mikrokontrolerja PB3-PB0. V podprogramu uporabljamo vrednost globalne spremenljivke Lcd$current iz knjižnice, ki vsebuje naslov zadnjega izbranega LCDja.
- S pritiskom na TP2 izmenično vklapljamo in izklapljamo osvetlitev ozadja izbranega LCDja.
- S pritiskom na TP3 izvršimo ukaz Shiftlcd Right na izbranem LCDju.
- S pritiskom na TP3 izvršimo ukaz Shiftlcd Left na izbranem LCDju.