Fórum témák

» Több friss téma
Cikkek » Karakteres LCD kijelző driver AVR és PIC mikrovezérlőkhöz
Karakteres LCD kijelző driver AVR és PIC mikrovezérlőkhöz
Szerző: benjami, idő: Jan 17, 2013, Olvasva: 27699, Oldal olvasási idő: kb. 7 perc
Lapozás: OK   1 / 5
Hogy ne kelljen az LCD programját minden alkalommal félig újraírni...

Bővült egy kicsit az LCD driver program (v0.4 -> 0.5), ezért a leírás is módosult. A módosítások listája a charlcd.c elején van felsorolva.

Mikrovezérlős alkalmazások gyakori kiegészítő hardver eszköze a karakteres LCD kijelző. Ezek kaphatóak 1, 2, 4 soros, soronként 8, 16, 20, 24, 40 karakteres változatban, háttérvilágítással és anélkül is. Közös jellemzőjük, hogy Hitachi HD44780 vagy azzal kompatíbilis vezérlőchipet tartalmaznak (én legalább is még csak ilyennel találkoztam). Ezekhez a kijelzőkhöz készült egy univerzálisan felhasználható program, amelynek felhasználásával mentesülhetünk a kijelző programjának elkészítésével járó vesződséggel. Hogy miért készült? Régebben gyakran előfordult, hogy a kijelző programját az előző munkámból átemelve az nem akart egyből működni. Ilyenkor mindig sok idő ment el azzal amíg megkerestem mi nincs jól beállítva, hol maradtak benne olyan függések amik a régi programhoz kapcsolódtak és már nem aktuálisak. Megunva az ezzel járó gyakori vesződséget megírtam olyanra, amit minden programba könnyedén be tudok illeszteni, és a lehető legkisebb a csatlakozási felület az aktuálisan készülő programunkkal. Mivel egy helyre van összegyűjtve az összes beállítási lehetőség, így nem kell a programban szanaszét található paramétereket és lábhozzárendeléseket keresgélni. A beállításokat is nagyon gyorsan és egyszerűen (majdnem mint egy ikszelős kérdőívet kitöltve) el lehet végezni. A kiírandó szöveg átadása is nagyon egyszerű, mindössze az LcdText tömbbe kell berakni azt a szöveget amit a kijelzőn szeretnénk látni. Innen majd a "driver" program (LcdChar) fogja azt a kijelzőre áttölteni. Van olyan üzemmódja a driver-nek, ami az inicializálást leszámítva sehol nem tartalmaz úgynevezett blokkoló típusú függvényt, ezért időkritikus (USB, ethernet stb.) alkalmazásokhoz is használható. Ne ijedjünk meg attól, hogy a forrás igen nagy lett, a kész programba ennek csak a töredéke fog belekerülni (csak a konfigurációs beállítások alapján felhasznált funkciókhoz tartozó kód) a fordító feltételes fordítási lehetőségeit felhasználva. Ezt le is tudjuk ellenőrizni, ha fordítás után megnézzük a disassambly listát pl. az MPLAB-ban. Ha pl. nem használjuk a kurzort (kikommentezzük az LCDCURSOR definíciót), akkor a kurzor megjelenítéséhez készült kód egyszerűen bele sem kerül a programmemóriába, továbbá az ahhoz tartozó változók sem fognak létezni, ezáltal nem foglalnak helyet RAM-ban.


A program képességei a következők:

  • A kód néhány 8bites AVR, PIC16Fxxx, PIC18Fxxx, PIC24xxx, DSPICxxx mikrovezérlőkhöz készült. A következő
    fordítókkal lett tesztelve:
    AVR: AVR studio 4.xx/WinAVR
    PIC16Fxxx: Hi-tech PICC
    PIC18Fxxx: Microchip C18, Hi-tech PICC18
    PIC24xxx/DSPICxxx: Microchip C30
  • 1, 2, 4 soros kijelző használata.
  • legfeljebb 40 karakter széles kijelző használata.
  • 2db kijelző használata (LCDSTEREO).
  • Dupla vezérlős, pl. 4x40 karakteres, E1, E2 lábat is tartalmazó kijelző működtetése.
  • 4 vagy 8 bites vezérlési mód.
  • A kijelző vezérlő lábait a mikrovezérlő bármely kimenetként működtethető lábára köthetjük. Nincs semmi megkötés, a lábak összerendelése nagyon egyszerű.
  • 5 féle üzemmód.
  • Megszakításos, folyamatos frissítési üzemmódban (LCDMODECONTIRQ) a frissítési frekvencia (FPS) megadható (LCDFRAMEPERSEC).
  • Megszakításos üzemmódban a felhasznált időzítő kiválasztásának lehetősége (olyat adjunk meg, ami létezik a chipben és nem használunk más célra).
  • Megszakításos módban lehetőség van saját menedzselésű időzítő használatára is (LCDUSERTIMER). Ez akkor javasolt, ha nem akarunk az LCD-re egy időzítőt kizárólagosan elpazarolni. Ilyenkor az időzítőt más feladatra is felhasználhatjuk (pl. óra).
  • Ha nem BUSY flag figyeléses üzemmódot használunk, az LCD RW lábát GND-re kötve egy I/O láb megspórolható.
  • 8 saját tervezésű karakter, inicializáláskor történő feltöltése az LCD-re (ezeket a #0...#7, #8..#15 karakterkódokkal jeleníthetjük meg).
  • Futás közben a saját tervezésű karakterek cseréjének a lehetősége.
  • Kurzor használata (csak az egyszeri frissítéses üzemmódokban).
  • Beállíthatjuk, hogy a #0 kódú karaktereket szóközre cserélje.
  • Villogó karakterek használata.
  • Megszakításos, folyamatos frissítési üzemmódban (LCDMODECONTIRQ) automatikus villogás is használható, ilyenkor a villogási sebesség is megadható (LCDBLINKSPEED).


Inicializálás:

Az LcdInit() függvény inicializálja és bekapcsolja az LCD kijelzőt. Ha saját karaktereket is használunk, az inicializáló függvény azt is feltölti a kijelzőbe. A függvény futási ideje kb. 130msec ideig tart. Célszerű a program elejére tenni. Ennek természetesen csak egyetlen alkalommal kell lefutnia. Kötelező használni, e nélkül nem fog működni a kijelző. Hibás vagy rosszul bekötött kijelző esetén is le fog futni az inicializálás, nem olvas semmit a kijelzőről vissza, ezért nem tudja a driver sikeres volt-e az inicializálás.


Üzemmódok:

A kijelző drivert 5 különböző üzemmódon működtethetjük. Az üzemmód kiválasztása a feladattól függ, mindegyik üzemmódnak vannak lehetőségei és korlátai is, ezek alapján döntsük el melyiket választjuk.

  • LCDMODEONCEBUSY: Megszakítás nélküli egyszeri frissítési üzemmód BUSY flag figyeléssel. Ilyenkor nem fut állandóan a háttérben a kijelző driver, hanem az LcdText tömb feltöltése után szólni kell a drivernek, hogy frissítse a kijelző tartalmát. Ezt az LcdRefreshAll() függvényhívással tehetjük meg. A frissítő függvény akkor tér csak vissza, ha a frissítés befejeződött (blokkoló függvény!). Az írási műveletet az LCD BUSY olvasása alapján ütemezi. Figyelem! Ha a kijelző, vagy a bekötése meghibásodna, esetleg rossz az I/O lábak beállítása, a program végtelen ciklusba kerülhet. Ezt az üzemmódot akkor célszerű választani, ha a programunk nem egy végtelen programhurokban kering, hanem sok kis különálló hurok található benne. A kijelző írási sebessége a legmagasabb lesz, amit a kijelző és a mikrovezérlő sebessége biztosítani tud. Lassabb kijelzőt csatlakoztatva sem maradhatnak ki karakterek, hiszen csak akkor ír a kijelzőre, amikor az képes azt fogadni.
    Lehetőségek: kurzor használata, saját karakterek feltöltése és cseréje, villogtatás (csak felhasználó által megoldott ütemezéssel), két kijelző vagy dupla vezérlős kijelző használata.
    Korlátozások: R/W láb kötelező használata, automatikus villogtatás nem lehetséges, LcdRefreshAll blokkoló típusú függvény.

  • LCDMODEONCEDELAY: Megszakítás nélküli egyszeri frissítési üzemmód időzítéses írással. Ilyenkor sem fut állandóan a háttérben a kijelző driver, hanem az LcdText tömb feltöltése után szólni kell a drivernek, hogy frissítse a kijelző tartalmát. Ezt az LcdRefreshAll() függvényhívással tehetjük meg. A frissítő függvény akkor tér csak vissza, ha a frissítés befejeződött (blokkoló függvény!). Ezt az üzemmódot akkor célszerű választani, ha a programunk nem egy végtelen programhurokban kering, hanem sok kis különálló hurok található benne. Az írási műveletet az LCDEXECUTIONTIME –ban beállított idő szerinti paramétere szerint ütemezi, a függvény futási ideje hozzávetőleg a karakterek száma * LCDEXECUTIONTIME mikroszekundum ideig tart. Arra ügyeljünk, hogy ne adjunk meg rövidebb időt, mint amit a kijelző tud, mert akkor hiányosan jelenhet meg a szöveg. Erre főleg akkor figyeljünk, ha a fejlesztési környezetben találhatótól eltérő típusú kijelzőkkel is üzembiztos működést szeretnénk biztosítani.
    Lehetőségek: kurzor használata, saját karakterek feltöltése és cseréje, villogtatás (csak felhasználó által megoldott ütemezéssel), két kijelző vagy dupla vezérlős kijelző használata, R/W láb GND-re kötésével egy I/O láb megspórolása.
    Korlátozások: automatikus villogtatás nem lehetséges, LcdRefreshAll blokkoló típusú függvény.

  • LCDMODEONCEIRQ: Megszakításos egyszeri frissítési üzemmód: Ilyenkor sem fut állandóan a háttérben a kijelző driver, hanem az LcdText tömb feltöltése után szólni kell a drivernek, hogy frissítse a kijelző tartalmát. Ezt az LcdRefreshAll() függvényhívással tehetjük meg. A függvény csak elindítja a frissítést és azonnal visszatér (nem blokkoló függvény!). A karakterek átvitele időzítő megszakításból fog majd megtörténni. A teljes tartalom átvitele kb. 1/LCDFRAMEPERSEC másodperc idő alatt fog megtörténni. Ha ez megtörtént, leállítja az időzítőt (LCDUSERTIMER esetén természetesen nem állítja le, csak a frissítési függvény nem fog lefutni). Ezt az üzemmódot akkor célszerű választani, ha a programunk nem egy végtelen programhurokban kering, hanem sok kis különálló hurok található benne, továbbá nem szeretnénk a programunkat megakasztani a kijelzőre történő szöveg kiírásának idejére. Ha nem fejeződött be a kijelző teljes tartalmának kiírása, és ismét meghívjuk LcdRefreshAll() függvényt, elölről fog kezdődni az átvitel. Ez önmagában még nem okoz gondot, de ha folyamatosan félbeszakítjuk előfordulhat, hogy csak az első néhány karakter kerül át a kijelzőre. Ilyenkor el kell gondolkoznunk azon, hogy más üzemmódot válasszunk.
    Lehetőségek:
    kurzor használata, saját karakterek feltöltése és cseréje, villogtatás (csak felhasználó által megoldott ütemezéssel), két kijelző vagy dupla vezérlős kijelző használata, R/W láb GND-re kötésével egy I/O láb megspórolása.
    Korlátozások:
    automatikus villogtatás nem lehetséges.

  • LCDMODECONTBUSY: Megszakítás nélküli folyamatos frissítési üzemmód. Olyan programban célszerű használni, ahol a program folyamatosan egy (vagy néhány) végtelen hurokban kering. A hur(k)okba be kell iktatni egy LcdUpdateChar() függvényhívást. Ez egy karaktert visz át a kijelzőbe, de csak akkor, ha a kijelző BUSY_FLAG kiolvasása alapján ez lehetséges, foglaltság esetén azonnal visszalép a függvényből. A karakter kiírása után lépteti az LcdText tömb indexét, így a következő futáskor a következő karaktert írja majd ki. R/W lábat is kötelezően be kell kötni, hiszen a BUSY FLAG olvasása csak így lehetséges.
    Lehetőségek: saját karakterek feltöltése és cseréje, villogtatás (csak felhasználó által megoldott ütemezéssel), két kijelző vagy dupla vezérlős kijelző használata.
    Korlátozások: kurzor nem használható, R/W láb kötelező használata, automatikus villogtatás nem lehetséges.

  • LCDMODECONTIRQ: Megszakításos folyamatos frissítési üzemmód. A kijelző frissítése időzítő megszakításból folyamatosan történik, semmi más dolgunk nincs, csak az LcdText-be a megfelelő szöveg elhelyezése. Időzítéskritikus feladat végrehajtásakor lehetőség van a frissítést átmenetileg szüneteltetni -LcdRefreshStop(), majd folytatni - LcdRefreshStart() . Szüneteltetés alatt a villogás is szünetelni fog. Ezt az üzemmódot bármilyen felépítésű programnál használhatjuk, hiszen a kijelző működtetése teljesen függetlenül a programunktól, megszakításból történik. Automatikus villogtatást is csak ebben az üzemmódban van lehetőségünk használni. Hátránya, hogy néhány százalék processzoridőt igényel a folyamatos frissítés, bár ha nem változik a megjelenítendő szöveg, a fentebb leírt módon tudjuk szüneteltetni a kijelző folyamatos frissítését. A szüneteltetés alatt természetesen semmi processzoridőt nem használ a driver.
    Lehetőségek: saját karakterek feltöltése és cseréje, automatikus villogtatás (beállítható sebességgel), két kijelző vagy dupla vezérlős kijelző használata.
    Korlátozások: kurzor nem használható.

A cikk még nem ért véget, lapozz!
Következő: »»   1 / 5
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem