Logo

Autorius: Šarūnas („circuit“)
Aut. teisės: Šarūnas
Įdėta: 2004-10-21
View automatic English translation

Grafinis skystųjų kristalų displėjus

Šį skystųjų kristalų displėjų (LCD — iš anglų kalbos Liquid Crystal Display) išėmiau iš 1992 metų japonų gamybos elektroninės užrašų knygutės „CITIZEN”.

Rodyti didesnį

Kad LCD kažką rodytų, nepakanka to vien tik panorėti. Jam reikia siųsti skaitmeninius signalus. Tai galima daryti personaliniu kompiuteriu arba mikrovaldikliu. Mano atveju puikiai tinka mikrovaldiklis. Kad galima būtų prijungti mikrovaldiklį prie LCD, reikia žinoti ką jungti ir prie ko. Su mikrovaldikliu viskas aišku — jo gamintojas pateikia pilną aprašymą (datasheet) ir tuomet viskas priklauso nuo programuotojo parašytos programos. Tik va iškilo bėda su LCD draiveriais. Jų (T7778A ir T7900) aprašymų internete ir net prašydamas gamintojo negavau. Išrinkta CITIZEN užrašų knygutė buvo veikianti, taigi, teko suktis kitaip — pasinaudojant oscilografu. Toks darbelis nėra labai paprastas, nes su oscilografu gana sunku sugaudyti neperiodinius signalus. Na, bet pasistengęs išsiaiškinau kur koks signalas, kokiu principu jis paverčiamas vaizdu ir t.t.

Signalai
Oscilografu ištirti 8 į LCD nuolat siunčiami signalai

Kai jau žinojau kaip valdyti LCD, reikėjo išsirinkti tam tinkamą mikrovaldiklį. Pradžioje buvau suplanavęs naudoti PIC16F870 (jį turėjau), bet paaiškėjo, kad reikėtų bent dvigubai greitesnio, kad jis sugebėtų nuolat siųsti informaciją į LCD, keisti vaizdus, komunikuoti su aplinka ir sutalpinti visą paveiksliuką savo laikinoje atmintyje (RAM).

Kadangi pilno dydžio paveiksliuko dydis yra 160x64 taškų, taigi paveiksliuką sudaro 10240 taškų.

Paveiksliuko spalvų gylis yra 1 bitas (0 atitinka baltą spalvą, o 1 — juodą).

Dydis bitais = taškų skaičius * spalvų gylis = 10240 * 1 = 10240 bitų.

Kadangi 1 baitas = 8 bitai (mikrovaldiklio atmintyje), taigi paveiksliuko dydis baitais = 10240 / 8 = 1280B.

Kadangi 1 kilo baitas yra 1024 baitai, taigi paveiksliuko dydis kilobaitais = 1280 / 1024 = 1.25kB.

Šis PIC serijos mikrovaldiklis turi 1kB (8 kilo bitus) vidinės laikinos atminties, o paveiksliukas užima 1.25kB (10 kilo bitų). Akivaizdu, kad paveiksliukas yra didesnis nei telpa PIC16F870 mikrovaldiklio atmintyje. Taip pat jam pritrūko greičio informacijos apdorojimui:

  • LCD atsinaujinimo dažnis — 80Hz (12.5ms);
  • Sąsaja su mikrovaldikliu — 4 bitai;
  • Horizontalių eilučių kiekis — 64;
  • Horizontalios eilutės taškų kiekis — 159 (160).

Jau palyginti senai atsirado vadinamieji „Smart LCD” turintys integruotą mikrovaldiklį. Tai leidžia tik vieną kartą nusiųsti informaciją ir grožėtis LCD rodomu vaizdu. Kad vaizdas pasikeistų vėl reikia nusiųst kito vaizdo informaciją. Deja, mano naudojamas LCD neturi integruoto mikrovaldiklio ir tą informaciją reikia siųsti nuolat.
Dažniausiai LCD ekraniukai gali dirbti atsinaujinimo dažnio intervale nuo ~40Hz iki 120Hz, Bet aš nusprendžiau jo nekeisti ir palikti tokį koks buvo padarytas užrašų knygutėje.

Norint išlaikyti tokį atsinaujinimo dažnį reikia nuolat suspėti į LCD draiverius siųsti paveiksliuko informaciją.
Kadangi visos 64 eilutės turi būti nusiunčiamos per 12.5ms, tai viena eilutė turi būti nusiunčiama per 195.3125µs (12.5 / 64).
Kadangi visi 160 vienos eilutė taškai turi būti nusiunčiami per 195.3125µs, tai keturi (jie visi nusiunčiami vienu metu, nes naudojama 4 bitų sąsaja su mikrovaldikliu) taškai nusiunčiami per 4.8828125µs (195.3125 * 160 / 4).

Per tokį laiko tarpą (~5µs) mikrovaldiklis turi tik nuskaityti paveiksliuko duomenis iš jo atmintyje esančios programos ir išsiųsti 4 taškų informaciją. Mikrovaldiklis PIC16F870 dirba maksimaliu 4MHz taktiniu dažniu. Vieną komandą jis atjieka per 4 taktus, t.y. 1MHz dažniu, o tai yra 1µs.
Taip gaunasi, kad kontroleris 4 bitus turi nusiųsti atlikdamas ne daugiau kaip 5 komandas (5 / 1). To tiesiog nepakanka. O dar jei pridėt kitus jam skirtus nuveikti darbus...

Taigi, teko mikrovaldiklio PIC16F870 atsisakyti, ir užsakyt galingesnį ATmega32 (jo kaina — ~24Lt). Jis turi 2kB laikinos atminties (RAM), o jo maksimalus taktinis dažnis yra 20MHz. Visa laimė, kad šis mikrovaldiklis vieną komandą atlieka per 1-4 taktus priklausomai nuo komandos (vidutiniškai — ~1.5), nes kitaip ir jo greičio būtų buvę maža. Dabar LCD valdymas išnaudoja ~20% viso jo greičio. Taigi mikrovaldiklis dar laisvai suspėja atlikti kitus darbus, tokius kaip žingsninio variklio (sukinėjančio garso rankenėlę) valdymą, sąsają su kompiuteriu ir vartotoju ir kita.

Žinoma, mikrovaldiklis be programos yra visai kaip ir kompiuteris — metalo laužas. Taigi reikėjo parašyt programą, kuri mikrovaldiklyje atlieka tokį vaidmenį, kaip ir operacinė sistema kompiuteryje.
Ją parašiau ATMEL siūloma programa — AVRstudio, assembler'io programavimo kalba. Išsaugojus darbą gaunamas *.asm failas.

Ir pagaliau prasideda linksmoji dalis: Ir kur tą *.asm failą dabar dėti..? Ogi išversti jį į mikrovaldikliui suprantamą kalbą — šešioliktainę sistemą (sukompiliuoti). Tai gali atlikti ta pati AVRstudio programa. Gautas failas yra *.hex formato. Kai jau turime mikrovaldikliui suprantamą programą, galime ją įrašyti į mikrovaldiklio pastovią FLASH atmintį. Kad galėtume tai atlikti reikalinga sąsaja tarp kompiuterio ir mikrovaldiklio. Taigi, teikia pasigaminti tam skirtą programatorių, kurių schemų internete apstu. Aš pasirinkau šį programatorių, nes su juo galima programuoti kontrolerį neišimant jo iš prietaiso (tokio tipo programatoriai vadinami ISP — In System Programming). T.y. mikrovaldiklis gali laisvai dirbti savo darbą, tuo metu prisijungiame programatorių, mikrovaldiklis toliau pilnai funkcionuoja, ir tuomet pradėti įrašinėjimą. Prasidėjus įrašymui mikrovaldiklis pereina į būseną, kurioje nebevykdo darbo ir laisvai programuojasi. Po ~20 sekundžių trūkusio programavimo mikrovaldiklis vėl pereina į normalų darbo režimą ir jau vykdo naują programą. Į programatorių informacija iš *.hex failo siunčiama per programą PonyProg.

Galite atsisiųsti mano demonstracinę programą (programa taip pat valdo skaitmeninį 6 kanalų potenciometrą garsui reguliuoti ir dar valdo žingsninį variklį, kuris sukioja potenciometrą (šiuo metu nenaudojama)) *.asm formate, kuri šiuo metu rodo vieną paveiksliuką, be abejo vėliau, kai atrasiu laisvo laiko, programą papildysiu (bet tik sau :-).

Šį projektą sujungiau su projektu „BLASTER A03“, taigi tesinį rasite jame.

Šia tema galite diskutuoti forume.

LCD schema

Nuotraukos

Visas LCD maitinimas LCD Draiveriai CITIZEN'o CPU CITIZEN'o klaviatūra

© 2004-2024 circuit.lt | Be sutikimo kopijuoti draudžiama