Strona główna Projekty 'Interface' - kontroler do matryc LCD
'Interface' - kontroler do matryc LCD
Ocena użytkowników: / 47
SłabyŚwietny 
Wpisany przez Freddie Chopin   
Poniedziałek, 16 Marzec 2009 12:27

LCD controllerChciałbym dziś przedstawić konstrukcję, która jest autonomiczną częścią mojej pracy magisterskiej. Jest to kontroler do matryc LCD oparty o uC wraz ze specjalizowanym układem drivera matrycy.

OVERVIEW:

Główna ideą projektu było stworzenie całkowicie autonomicznego urządzenia, które pełniłoby rolę układu pośredniczącego między pewnym hostem a matrycą. Host wysyła tylko krótkie komendy, natomiast urządzenie zajmuje się ich interpretacją i wykonywaniem. Stąd nazwa 'Interface' [; Urządzenie wykonuje kilka podstawowych rozkazów graficznych, przesyłanych przez UART lub SPI.

HARDWARE:

Sterowaniem całego układu, odbieraniem transmisji, wykonywaniem komend i większością fajnych rzeczy zajmuje się procesor PIC24HJ256GP210. Jest to jeden z najnowszych układów mało popularnej w PL firmy Microchip o bardzo dużych możliwościach. Jest to 16-bitowa jednostka wyposażona w całkiem niezły zestaw funkcji matematycznych. Procesor ten jest ogólnie w 99% zgodny z procesorami dsPIC33 (tutaj konkretnie odpowiednikiem byłby dsPIC33FJ256GP710), tyle że pozbawione są około 10 instrukcji specjalizowanych do przetwarzania sygnałów. Procesor pracuje z taktowaniem 80MHz, co zapewnia mu 40MIPSow mocy obliczeniowej. Procesor posiada 256kB pamięci FLASH o organizacji 24b i 16kB pamięci RAM o organizacji 16b. Obudowa - TQFP-100 (ścieżki 0.25mm, raster 0.25mm).

Sterowaniem matrycy zajmuje się scalony driver EPSON S1D13705 (znany kiedyś pod nazwa SED1375). Układ ten wyposażony jest w 80kB pamięci dual-port-video-RAM. Zajmuje się on odświeżaniem matrycy i niczego więcej ponad to nie robi [; . Układ pozwala na obsługę matryc pasywnych, podwójnych-pasywnych, TFT (ale z jakimiś ograniczeniami, nie wgłębiałem się w szczegóły, bo moja matryca jest pasywna), czarnobiałych i kolorowych (bodajże 256 kolorów max). Układ po poprawnej konfiguracji poprzez kilka rejestrów (coś pod 16) zajmuje się ciągłym przerzucaniem danych ze swojej pamięci na linie sterujące matrycy, w miedzy czasie pozwalając na zapis i odczyt swojej pamięci. Zwalnia nas on tym samym od potrzeby ciągłej generacji sygnałów na liniach sterujących matrycą. Układ taktowany jest zegarem 25MHz, co pozwala na osiągnięcie przy zastosowanej przeze mnie matrycy (640x480, mono, podwójna-pasywna) odświeżania rzędu 77Hz. Układ jest w obudowie TQFP-80 (ścieżki i raster jak wyżej).

Matryca jest 10-cio letnim panelem monochromatycznym z laptopa o rozdzielczości 640x480. Producentem układu jest SHARP. Matryca ma zintegrowany generator ujemnego napięcia dla kontrastu i inverter dla katody. Podłączana jest przez przeokropne złącze ZIFF-30.

Na płytce znajduje się jeszcze parę innych bajerów typu układ MAX3232 (do komunikacji przez RS-232 z komputerem PC), negator (jako bufor zegara, aby całość układu pracowała z jednym kwarcem), bufory (konwersja logiki 3.3V -> 5V dla matrycy) i garść elementów dyskretnych.

Skonstruowany układ pozwala na podłączenie dowolnej matrycy (obsługiwanej przez układ S1D13705) poprzez dodanie stosownego headera do podłączenia samej matrycy - na płytce wyprowadzony jest jedynie rząd goldpinow z sygnałami sterującymi i zasilaniem. Możliwe jest wiec podłączenie innego panela.

Płytka wykonana była metoda termotransferu, jest dwustronna i jest w niej chyba ze 100 przelotek (jak nie więcej [; ). wyszła dopiero za 4-tym razem, ponieważ poprzednie 3 razy użyłem złego papieru. Układy lutowane na pastę z cyną za pomocą hot-aira. płytka projektowana w Protelu DXP.

Układ do zasilania wymaga napięcia ok 6.5V, które stabilizowane jest na 5V (matryca) i 3.3V (układy scalone). Całość pobiera następujące ilości prądu:

  • 50mA - układy scalone (pracujące)
  • 200mA - układy + matryca (bez podświetlenia)
  • 500mA - całość (przy maksymalnej jasności podświetlenia)

Parę f0t45Q\/ płytki i układów:

Interface - pcb
Interface - pcb
Interface - pcb
Interface - pcb
Interface - pcb
Interface - pcb
Interface - pcb
Interface - pcb
  

Całość zamontowana na matrycy:

Interface - lcd
Interface - lcd
Interface - lcd
Interface - lcd
Interface - lcd
Interface - lcd
Interface - lcd
Interface - lcd
  

SOFTWARE:

procesor główny oprogramowany został w języku C z dosyć znacznymi wstawkami w assemblerze. całość została podzielona na pewne warstwy:

  • warstwa komunikacji z układem S1D13705:

układy połączone są poprzez 16b szynę danych, 16b szynę adresowa i kilka linii sterujących i sygnalizacyjnych. Ta cześć oprogramowania zapewnia następujące funkcje: odczyt słowa, odczyt bloku, zapis słowa, zapis bloku tablicą, zapis bloku tą samą wartością, modyfikacje słowa (R-M-S). Modyfikacja jest możliwa w 3 trybach - OR (dodawane czarne pixele), NAND (dodawane białe pixele), XOR (odwracanie pixeli).

  • warstwa funkcji graficznych:

zaimplementowane zostały następujące funkcje: pixel, linia (selektor podfunkcji), linia pozioma (autonomiczne), linia pionowa (autonomiczne), linia skośna (autonomiczne), kolo (poprzez pixele lub linie poziome), prostokąt (linie), bitmapa (prekompilowane bitmapy zapisane w pamięci FLASH), znak z alfabetu (czcionki prekompilowane we FLASHu, realizowane poprzez bitmapy z dodatkowymi algorytmami wyboru właściwego fragmentu bitmapy), string (poprzez znaki). Dodatkowo parę dodatków jak: lineto (przyjmuje współrzędne końca, realizowane poprzez funkcje line), setxy (ustawienie początku dla serii poleceń lineto), zmiana czcionek, zmiana trybu pracy. Możliwe są następujące tryby graficzne: OR/XOR/NAND (wpływają na wszystko poza funkcjami tekstowymi i bitmapami) + OUTLINE/SOLID (wpływają na kola i prostokąty) + BMP_NORMAL/BMP_INVERT (wpływają na bitmapy i text).

  • warstwa komunikacyjna:

urządzenie przyjmuje komendy od hosta w postaci słowo komendy + (po potwierdzeniu) strumień danych. komunikacja jest jedynie 16b. układ pracuje jednocześnie z UARTem i SPI. zaimplementowane komendy to: funkcje graficzne, włączenie/wyłączenie trybu oszczędzania energii, wymazanie ekranu (na biało/czarno), zmiana trybu, zmiana czcionki, strumień komend, zmiana jasności podświetlenia matrycy. ciekawa opcja IMHO jest strumień komend, który pozwala na przyjecie następujących po sobie innych komend. każda z funkcji wymaga podania jej rozmiaru w słowie komendy, ponieważ dane przyjmowane są przez DMA.

coby już dłużej nie przynudzać kilka f0t45Q\/ pokazujących możliwości układu, a na nich po kolei:

  1. wszystkie funkcje rysunkowe wraz z demonstracją trybów OR, XOR i NAND
  2. bitmapy
  3. tekst normalny i negatywowy na czarnym prostokącie, rożne czcionki
  4. bitmapy normalnie i w negatywie
  5. to co wyżej + kółka w XOR + prostokąty w XOR
Interface - gfx
Interface - gfx
Interface - gfx
Interface - gfx
Interface - gfx
Interface - gfx
Interface - gfx
Interface - gfx
Interface - gfx
Interface - gfx
 

jako ciekawostkę podam komendy jakie należy wysłać do układu przez terminal, aby otrzymać niektóre obrazy:

[używany przeze mnie terminal obsługuje liczby hexadecymalne jako $xx, a liczby dziesiętne jako #xxx, komentarze są ode mnie, terminal ich nie przyjmuje]

zestaw czcionek:

$00$01 // erase
$04$04 // tryb OR + SOLID
$01$89$00$00$EF$00$7F$02$DF$01 // prostokąt na dolne pół ekranu
$02$05#024$8C$9A$00$3A$00Czcionki normalne:$00$00 // stringi <:
$00$05#048$8C$00$00$5A$00- Courier 12pt, normal ~!@##$$%^&*?:"+ \m/$00$00 
$01$05#048$8C$00$00$6A$00- Courier 14pt, normal ~!@##$$%^&*?:"+ \m/$00$00 
$02$05#048$8C$00$00$7A$00- Courier 24pt, normal ~!@##$$%^&*?:"+ \m/$00$00 
$03$05#046$8C$00$00$A0$00- Courier 36pt, bold ~!@##$$%^&*?:"+ \m/$00$00 
$08$04$02$05#022$8C$9A$00$FF$00Tryb negatywowy:$00$00 
$00$05#048$8C$00$00$1F$01- Courier 12pt, normal ~!@##$$%^&*?:"+ \m/$00$00 
$01$05#048$8C$00$00$2F$01- Courier 14pt, normal ~!@##$$%^&*?:"+ \m/$00$00 
$02$05#048$8C$00$00$3F$01- Courier 24pt, normal ~!@##$$%^&*?:"+ \m/$00$00 
$03$05#046$8C$00$00$6F$01- Courier 36pt, bold ~!@##$$%^&*?:"+ \m/$00$00

 

bitmapy plus koła + prostokąty:

$00$01 // erase
$00$04$01$80$01$00$00$00$0B$00 // bitmapa w trybie normalnym
$08$04$01$80$01$00$40$01$0B$00 // bitmapa w trybie negatywowym
$34$8D$06$04$08$81$A0$00$B0$00$30$00$B0$00$B0$00$40$00 
$C0$00$B0$00$50$00$D0$00$B0$00$60$00$E0$00$B0$00$70$00 
$F0$00$B0$00$80$00$00$01$B0$00$90$00$10$01$B0$00$A0$00 
$02$89$32$00$64$00$40$01$F0$00$41$01$F0$00$4D$02$7B$01 // strumień komend: tryb (XOR+SOLID), 8 kół

wygląda kosmicznie, ale tak nie jest. głownie dlatego tak straszy, ze dane przyjmowane są w formacie 16b, a przez uarta idą dane 8b, dlatego należy wysłać najpierw młodszy bajt, a potem starszy (little endian).

sam kod stworzony przeze mnie zajmuje ok 4.35kB, cały program bez prekompilowanych czcionek i bitmap - 5.35k (wektory przerwań, inicjalizatory, stale). czcionki zajmują od 3.5-17kB, bitmapy 17kB, bitmapa pełno ekranowa 38kB. wszystko razem (4 czcionki + 3 bitmapy) zajmuje 115kB. kod ogólnie jest na tyle szybki, ze możliwe byłoby odtwarzanie animacji w tempie kilku klatek na sekundę (całość obrazu z większością funkcji graficznych w różnych trybach [zdjęcie powyżej] generowana jest w 0.2s), jednak użyta matryca ma zbyt duże opóźnienia do tego celu.

stworzyłem również aplikację w Visual C++, która konwertuje bitmapy na postać strawną dla moich algorytmów.

FUTURE:

jako ze jest to wersja beta, wkradło się na płytkę parę błędów, przydałoby się wiec i parę poprawek - może w przyszłości, kto wie [; . możliwe są dalsze zmiany protokołu, tak aby był wygodniejszy i prostszy. pomysłów mam wiele, czasu mało <: chciałem tez stworzyć aplikacje na PC, która umożliwiałaby sterowanie tym układem.

całość układu wyniosła mnie:

  • procesor - próbki
  • driver - 40zl
  • matryca - 50zl
  • elementy pozostałe - próbki + ~15zl
  • inne takie - 10zl

______________

w sumie: około 110zl

czas całkowitej realizacji to około 3 miesiące, w tym ciężka sesja + święta + ferie [; , wiec trochę mniej, ciężko określić. pyzatym jestem trochę leniwy, wiec bywało i tak, ze przez tydzień nic nie zrobiłem [;

hmm... co by tu jeszcze... chwilowo nie mam pomysłu co więcej napisać, wiec jak są jakieś pytania to odpowiem.

możliwe jest, że w bliżej niezdefiniowanej przyszłości udostępnię zarówno projekt płytki (schemat + pcb) jak i kod...

Temat na forum elektrody

Zmieniony: Poniedziałek, 30 Wrzesień 2013 22:54