Digitális technika (VIMIAA01)
Gyakorlat 10. hét
Karakteres LCD kijelző használata MiniRISC processzoron F1. A MiniRISC processzor rendelkezik általános célú adat be-/kimeneti (GPIO) interfészekkel. Ezek az interfészek rugalmasan használhatók szinte tetszőleges külső egységek illesztési feladatainak megoldására, nem túl nagy sebességi igények és nem túl precíz időzítési előírások mellett. A sebességi és időzítési korlátok oka az, hogy a jeleket programból, szoftveresen kezeljük, ami értelemszerűen jelentős megkötéseket jelent az időbeli felbontás és beállíthatóság területén. Ugyanakkor nagyon sok alkalmazásban a követelmények nem túl szigorúak, és a programozottan állítható jelekkel nagyon egyszerűen, extra hardver költségek nélkül szinte tetszőleges interfész protokollokat realizálhatunk. Az LCD modul áramköri illesztése A gyakorlat során egy 2 soros 8 karakteres alfanumerikus LCD kijelző illeszthetőségét vizsgáljuk meg, a MiniRISC processzor bővítő csatlakozóin hozzáférhető GPIO portok, jelek segítségével. Az LCD kijelző önmagában egy bonyolult egység, a működését egy belső vezérlőegység biztosítja. Az LCD vezérlő a kijelző használatához egy 8 bites párhuzamos kommunikációs interfészt biztosít, az adatlapján megadott időzítési adatokkal. Az interfész adat és vezérlőjelei: DB[7:0]
Nyolcbites, kétirányú adatbusz
RS
Parancs/adat regiszter kiválasztó vezérlőjel
R/W
Írás/olvasás irány vezérlőjel
E
Engedélyező és ütemező vezérlőjel
F1.a. Az interfész követelmények áttekintésével ismerjük meg az LCD modul áramköri illesztését a MiniRISC processzor által biztosított GPIO interfész portokhoz. Elemezzük a jelvezetékek szükséges számát, azok kívánt funkcionalitását, az áramköri szintek illeszthetőségének követelményét a különböző típusú (bemenet, kimenet, be-/kimenet) jelek esetén. Tekintsük át az interfészjelek és vezérlőjelek, továbbá az elérhető GPIO bitek egymáshoz rendelését, használati módjuk beállítási lehetőségeit. Ha külső egységet szeretnénk GPIO periférián keresztül vezérelni, akkor az első lépés a szükséges áramköri kapcsolatok realizálhatóságának ellenőrzése. Jelen esetben szükségünk van egy 8 bites kétirányú adatbuszra, továbbá 3 db vezérlőjelre, amik állandóan kimeneti irányt igényelnek. Ennek egy lehetséges megoldása a következő választás: DB[7:0] 8 bites kétirányú adatbusz
GPIO_A[7:0] 8 bites port-on keresztül
RS, R/W, E
GPIO_C[4:0] 5 bites port 3 bitje lehet állandó kimeneti jel.
3 db vezérlőjel
Az LCD 5V-os tápfeszültséget igényel, TTL jelszintek mellett. Az FPGA 3,3V-os I/O tápfeszültséget használ, CMOS kimeneti jelszintek mellett. Ez azt jelenti, hogy a CMOS kimeneti jelek jelszintjei kompatibilisek a TTL bemeneti jelek előírásával. (CMOS H kimenet ~3,3V, L kimenet ~0V, TTL H bemenet >2V, TTL L bemenet <0,8V, tehát a működési feltételek teljesülnek). Az adatvonalak illesztése már problémásabb, hiszen itt lehetne olyan helyzet, amikor az 5V tápfeszültségű LCD modul vezérelné az FPGA 3,3V bemenetét, ami nem megengedhető. Ezért ide egy kétirányú 5V ↔ 3,3V szintillesztő áramkörre van szükség. Ezt a célt szolgálja a LOGSYS LCD modul
Digitális technika (VIMIAA01)
Gyakorlat 10. hét
SN74LVC4245 kétirányú buszmeghajtó áramkörének használata. A fenti szempontok alapján megtervezett modul kapcsolási rajzának részlete látható az alábbi ábrán.
. Az LCD modul adatátviteli protokoll programozása Az LCD kijelzőben található vezérlő áramkör két darab 8 bites regisztert tartalmaz, utasítás regisztert (IR) és adatregisztert (DR). A két regiszter között az interfész RS regiszterkiválasztó jele választ. Az üzemmód vezérlő vagy beállítási parancsokat az IR utasításregiszterbe írjuk, ugyanitt olvashatjuk a végrehajtás állapotát jelző státusz bitet, a kijelzendő karaktereket pedig az adatregiszterbe írhatjuk. (Az adatregiszter is olvasható, de ez nem gyakori művelet). A használat táblázatos összefoglalása (a DDRAM és a CGRAM a vezérlő memóriaterületei, a DDRAM a kijelzendő karakterek kódját, a CGRAM a karakterkészlet bitképeit tárolja:
A kommunikációs interfész átviteli időzítéseit a következő ábra és táblázat szemlélteti, jobb oldalon az írás művelet (R/W = 0) , a bal oldalon az olvasás művelet (R/W = 1) idődiagramja látható.:
Digitális technika (VIMIAA01)
Gyakorlat 10. hét
F1.b A vezérlőjelek és GPIO bitek egymáshoz rendelésének ismeretében tekintsük át a szükséges GPIO műveleteket az adatok kiadásához, beolvasásához, a vezérlő jelek kiadásához. Készítsünk időbeli ütemezési tervet a szükséges elemi műveletekhez, hogy azok az adatátviteli protokoll előírásainak teljesítésével az LCD kijelző elvárásai szerinti jelváltásokat valósítsák meg. Fordítsuk le MiniRISC processzor utasításokra a megtervezett elemi adatmozgatási, jelváltási feladatokat.
Az LCD modullal 4 fajta átvitel végezhető. 1. 2. 3. 4.
Parancskiadás Státusz lekérdezés Adatkiírás Adatbeolvasás.
Ezekből az utolsó nem szükséges a normál használathoz, tehát nem készítjük el. A státusz lekérdezés is elhagyható lenne, de ekkor a másik két művelet után mindig az adatlapban megadott maximális értékű, maximális végrehajtási időket mindig meg kellene várnunk, ami biztosan rosszabb az egyes egyedi példányokkal elérhető sebességnél. Ezért a maradék három esetet realizáljuk. A státusz bit olvasása mindkét kiviteli művelet (parancs vagy adat) szinkronizálásához felhasználható, mégpedig akkor járunk el helyesen, ha a kiviteli műveletek elején vizsgáljuk az LCD modul KÉSZ állapotát.
Digitális technika (VIMIAA01)
Gyakorlat 10. hét
Az LCD vezérléséhez használt GPIO_A és GPIO_C portok regiszterei és perifériacímeik a következők:
Az adatkimeneti és irányregiszterek tartalma visszaolvasható (maszkolás/tesztelés, XOR invertálás).
A GPI_A 8 bites adatbusz alapállapota legyen mindig a bemeneti irány, tehát kikapcsolt kimenet. Ez egy biztonsági beállítás, elkerülendő a kimenetek véletlen szembehajtását. Ezt minden átviteli művelet után biztosítjuk, kikapcsolva a meghajtást. A többi regiszter alapértéke a következő:
Státusz olvasása: Ez a szubrutin tehát induláskor már helyes adatbusz irányítással indulhat. A processzor beállítja az RS=0, R/W=1, E=0 értékeket. Ezután RS és R/W értékének fenntartása mellett E értékét 1-re állítja. Ez legalább 2 utasítás, tehát teljesül a tAS = 80 ns. Az E=1 érték beállítása után tDDR=100ns múlva érvényes az adat az adatbuszon, tehát a következő utasításban (ami 187,5ns időt igényel, már mintavételezhető a státuszinformáció. Ha a beolvasott adatbuszon a státuszbájt 7. bitjének (Busy Flag) értéke 1, akkor az LCD még nem végzett. Újabb olvasással várakozunk.
Digitális technika (VIMIAA01)
Gyakorlat 10. hét
MEGFIGYELÉS: Az E jel magas értékének időtartamára nincs semmilyen korlátozás. Tehát lehet egyetlen „kitartott” olvasás műveletben folyamatosan figyelni a BF állapotának változását. Ez nem nagy győzelem, de egyszerűsíti a programot. Tehát egy rövid ciklusban várunk, amíg a beolvasott adatbusz 7. bitje 0 lesz. Amint ez teljesül az RS és az R/W bitek stabil állapotban tartása mellett (mert a tAH = 10ns) E=0-t állítunk be, és vége a státusz olvasásnak. A státuszflag beolvasásának időbeli lefolyása a következő idődiagramon látható (egy utasítás végrehajtásának ideje 3 órajel ciklus, azaz 187,5 ns).
Egy t=187,5ns egyenletes osztású időskálán inkrementálisan rajzoltuk fel a folyamatot, jelölve a várakozó ciklust, majd a befejezést.
Digitális technika (VIMIAA01)
Gyakorlat 10. hét
Hasonló módon készíthető el a parancs és adatkiviteli szubrutin is. Az eltérés az, hogy a vezérlőjelek kiadása után következik a parancs/adat kiadása, ami igényli az adatvonalak kimeneti engedélyezését is. Tehát először, pl. a parancskiadásnál RS=0, R/W=0 E=0 beállítása. Ezután következik a munkaregiszterbe írt parancskód kiírása a GPIO_A adatregiszterébe. Ezután a GPIO_A DIR irányregiszterét (ADR) minden biten 1-re, azaz kimenetre állítjuk. Ezzel minden feltétel adott az E=1 végrehajtás engedélyezés kiadásához. Ha kiadtuk E=1 értékét, azonnal előkészíthetjük a visszavételét is, mert legalább 2 utasításidő lesz az E=0 kivitele (385ns > tWEH), az RS és R/W jelek értékének tartása mellett. Ezután a GPIO_A port kimeneti adatbusz meghajtókat is ki kell kapcsolnunk, tehát az ADR (GPIO_A vonalak iránya) regiszterbe csupa 0 értéket írunk. Ezután biztonsággal visszatérhetünk a szubrutinból.
MEGJEGYZÉS: A rajzolt idődiagramhoz képest az adatbusz bekapcsolása az E jel kiadása előtt történt. Ez az előírásoknak nem mond ellent, így is lehetséges a szabályok betartása. Persze lehetne először az E = 1 beállítása, majd ezután az adatbusz aktiválása és az adat kiadása.
Egy t=187,5ns léptékű lineáris idődiagramon az átviteli eseményeket bejelölve rajzoltuk le a valódi jelváltozásokat.
Digitális technika (VIMIAA01)
Gyakorlat 10. hét
F1.c Tekintsük át az LCD modul működését ismertető legfontosabb műszaki paramétereket, különös tekintettel az LCD modul belső vezérlő áramkörének parancs/adatátvitel végrehajtatási időzítésére. Az LCD vezérlő 270kHz-es órajelfrekvenciája miatt a végrehajtás nagyon lassú, minden átvitel után jelentős várakozási időt kell beiktatnunk. Az LCD kijelző rendelkezésre állását a foglaltság jelző bit (Busy Flag) lekérdezéses ellenőrzésével tudjuk tesztelni. Készítsük el a várakozó rutin programkódját. Mikor érdemes a foglaltságjelző bitet tesztelni? Erre kérdésre már válaszoltunk az F1.a. pontban.
F1.d Tekintsük át az LCD modul bekapcsolási inicializálásának folyamatát, a szükséges beállítások szerepét, értelmezését. Röviden értelmezzük az inicializálási szubrutin programkódot és működését!
Digitális technika (VIMIAA01)
Gyakorlat 10. hét
Mivel az alapértelmezett adatbusz szélesség 8 bit és a LOGSYS bővítő csatlakozón az adatbusz összes bitje rendelkezésre áll, ezért a foglaltság jelzés (BF) kezdettől fogva lekérdezhető. A kétsoros üzemmód inicializálásához a következő műveleteket kell végrehajtani a bekapcsolás után: • Várakozzunk az LCD kijelző saját belső inicializálásának befejeződéséig, ezalatt BF=1 kb. 15 ms ideig. • Adjuk ki a Function Set parancsot: DL=1, N=1, F=0 (BF=1 kb. 4,1 ms ideig) • Adjuk ki a Display Off parancsot (BF=1 kb. 39 μs ideig) • Adjuk ki a Clear Display parancsot (BF=1 kb. 1,53 ms ideig) • Adjuk ki az Entry Mode Set parancsot: I/D=1, SH=0 (BF=1 kb. 39 μs ideig) • Adjuk ki a Display On parancsot (BF=1 kb. 39 μs ideig) Az LCD inicializációs szubrutin magába foglalja a két GPIO port felkonfigurálását is. Ennek megfelelően GPIO_A kezdetben 8 bites bemenet, GPIO_C alsó 3 bitje állandó kimenet, és az alapértékük nulla. A parancs kódok a beállításuk után egyenként kiadhatók, mindegyik saját magát időzíti, várakozik a BF flagre.