
Chcialbym dzis przedstawic konstrukcje, ktora bedzie czescia mojej pracy magisterskiej. Jest to kontroler do matryc LCD oparty o uC wraz ze specjalizowanym ukladem driver'a matrycy.
OVERVIEW:
Glowna idea projektu jest stworzenie calkowicie autonomicznego urzadzenia, ktore pelniloby role ukladu posredniczacego miedzy pewnym hostem, a matryca. Host wysylalby tylko krotkie komendy, natomiast urzadzenie zajmowaloby sie ich interpretacja i wykonywaniem. Stad nazwa 'Interface' [; Urzadzenie mialo zapewniac kilka podstawowych funkcji graficznych i mozliwosc komunikacji poprzez UART i SPI.
HARDWARE:
Sterowaniem calego ukladu, odbieraniem transmisji, wykonywaniem komend i wiekszoscia fajnych rzeczy zajmuje sie procesor PIC24HJ256GP210. Jest to jeden z najnowszych ukladow malo popularnej w PL firmy Microchip o bardzo duzych mozliwosciach. Jest to 16-bitowa jednostka wyposazona w calkiem niezly zestaw funkcji matematycznych. Procesor ten jest ogolnie w 99% procentach zgodny z procesorami dsPIC33 (tutaj konkretnie odpowiednikie bylby dsPIC33FJ256GP710), tyle ze pozbawione sa okolo 10 instrukcji specjalizowanych do przetwarzania sygnalow. Procesor pracuje z taktowaniem 80MHz, co zapewnia mu 40MIPSow mocy obliczeniowej. Procesor posiada 256kB pamieci FLASH o organizacji 24b i 16kB pamieci RAM o organizacji 16b. Obudowa - TQFP-100 (sciezki 0.25mm, raster 0.25mm)
Sterowaniem matrycy zajmuje sie scalony driver EPSON S1D13705 (znany kiedys pod nazwa SED1375). Uklad ten wyposazony jest w 80kB pamieci dual-port-video-RAM. Zajmuje sie on odswiezaniem matrycy i nic wiecej ponad to nie robi [; . Uklad pozwala na obsluge matryc pasywnych, podwojnych-pasywnych, TFT (ale z jakimis ograniczeniami, nie wglebialem sie w szczegoly, bo moja matryca jest pasywna), czarnobialych i kolorowych (bodajze 256kolorow max). Uklad po poprawnej konfiguracji poprzez kilka rejestrow (cos pod 16) zajmuje sie ciaglym przerzucaniem danych ze swojej pamieci na linie sterujace matrycy, w miedzy czasie pozwalajac na zapis i odczyt swojej pamieci. Zwalnia nas on tym samym od potrzeby ciaglej generacji sygnalow na liniach sterujacych matryca. Uklad taktowany jest zegarem 25MHz, co pozwala na osiagniecie przy zastosowanej przezemnie matrycy (640x480, mono, podwojna-pasywna) odswiezania rzedu 77Hz. Uklad jest w obudowie TQFP-80 (sciezki i raster jak wyzej).
Matryca jest 10-cio letnim panelem monochromatycznym z laptopa o rozdzielczosci 640x480. Producentem ukladu jest SHARP. Matryca ma zintegrowany generator ujemnego napiecia dla kontrastu i inverter dla katody. Podlaczana jest przez przeokropne zlacze ZIFF-30.
Na plytce znajduje sie jeszcze pare innych bajerow typu uklad MAX3232 (do komunikacji przez RS-232 z komputerem PC), negator (jako bufor zegara, aby calosc ukladu pracowala z jednym kwarcem), bufory (konwersja logiki 3.3V -> 5V dla matrycy) i garsc elementow dyskretnych
Skonstruowany uklad pozwala na podlaczenie dowolnej matrycy (obslugiwanej przez uklad S1D13705) poprzez dodanie stosownego header'a do podlaczenia samej matrycy - na plytce wyprowadzony jest jedynie rzad goldpinow z sygnalami sterujacymi i zasilaniem. Mozliwe jest wiec podlaczenie innego panelu.
Plytka wykonana byla metoda termotransferu, jest dwustronna i jest w niej chyba ze 100 przelotek (jak nie wiecej [; ). wyszla dopiero za 4tym razem, poniewaz poprzednie 3 razy uzylem zlego papieru. uklady lutowane na paste z cyna za pomoca hot-aira. plytka projektowana w Protelu DXP.
Uklad do zasilania wymaga napiecia ok 6.5V, ktore stabilizowane jest na 5V (matryca) i 3.3V (uklady scalone). Calosc pobiera nastepujace ilosci pradu:
- 50mA - uklady scalone (pracujace)
- 200mA - uklady + matryca (bez podswietlenia)
- 500mA - calosc
Pare f0t45Q\/ plytki i ukladow:





Calosc zamontowana na matrycy:




SOFTWARE:
procesor glowny oprogramowany zostal w jezyku C z dosyc znacznymi wstawkami w assemblerze. calosc zostala podzielona na pewne warstwy:
- warstwa komunikacji z ukladem S1D13705:
uklady polaczone sa poprzez 16b szyne danych, 16b szyne adresowa i kilka linii sterujacych i sygnalizacyjnych. Ta czesc oprogramowania zapewnia nastepujace funkcje: odczyt slowa, odczyt bloku, zapis slowa, zapis bloku tablica, zapis bloku ta sama wartoscia, modyfikacje slowa (R-M-S). Modyfikacja jest mozliwa w 3 trybach - OR (dodawane czarne pixele), NAND (dodawane biale pixele), XOR (odwracanie pixeli).
- warstwa funkcji graficznych:
zaimplementowane zostaly nastepujace funkcje: pixel, linia (selektor podfunkcji), linia pozioma (autonomiczne), linia pionowa (autonomiczne), linia skosna (autonomiczne), kolo (poprzez pixele lub linie poziome), prostokat (linie), bitmapa (prekompilowane bitmapy zapisane w pamieci FLASH), znak z alfabetu (czcionki prekompilowane w FLASHu, realizowane poprzez bitmapy z dodatkowymi algorytmami wyboru wlasciwego fragmentu bitmapy), string (poprzez znaki). Dodatkowo pare dodatkow jak: lineto (przyjmuje wspolrzedne konca, realizowane poprzez funkcje line), setxy (ustawienie poczatku dla serii polecen lineto), zmiana czcionek, zmiana trybu pracy. Mozliwe sa nastepujace tryby graficzne: OR/XOR/NAND (wplywaja na wszystko poza funkcjami tekstowymi i bitmapami) + OUTLINE/SOLID (wplywaja na kola i prostokaty) + BMP_NORMAL/BMP_INVERT (wplywaja na bitmapy i text).
- warstwa komunikacyjna:
urzadzenie przyjmuje komendy od hosta w postaci slowo komendy + (po potwierdzeniu) strumien danych. komunikacja jest jedynie 16b. uklad pracuje jednoczesnie z UARTem i SPI. zaimplementowane komendy to: funkcje graficzne, wlaczenie/wylaczenie trybu oszczedzania energii, wymazanie ekranu (na bialo/czarno), zmiana trybu, zmiana czcionki, strumien komend. ciekawa opcja IMHO jest strumien komend, ktory pozwala na przyjecie nastepujacych po sobie innych komend. kazda z funkcj wymaga podania jej rozmiaru w slowie komendy, poniewaz dane przyjmowane sa przez DMA.
coby juz dluzej nie przynudzac kilka f0t45Q\/ pokazujacych mozliwosci ukladu:
wszystkie funkcje rysunkowe wraz z demonstracja trybow OR,XOR i NAND:

bitmapy:

tekst normalny i negatywowy na czarnym prostakacie, rozne czcionki:

bitmapy normalnie i w negatywie:

to co wyzej + kolka w XOR + prostakaty w XOR:

jako ciekawostka podam komendy jakie nalezy wyslac do ukladu przez terminal, aby otrzymac niektore obrazy:
[uzywany przezemnie terminal obsluguje liczby hexadecymalne jako : $xx, a liczby dziesietne jako #xxx, komentarze sa odemnie, terminal ich nie przyjmuje]
zestaw czcionek:
$00$01 // erase
$04$04 // tryb OR + SOLID
$01$89$00$00$EF$00$7F$02$DF$01 // prostokat na dolne pol 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 kola + prostakaty:
$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 // strumien komend: tryb (XOR+SOLID), 8 kol
wyglada kosmicznie, ale tak nie jest. glownie dlatego tak straszy, ze dane przyjmowane sa w formacie 16b, a przez uarta ida dane 8b, dlatego nalezy wyslac najpierw mlodszy bajt, a potem starszy (little endian).
sam kod stworzony przezemnie zajmuje ok 4.35kB, caly program bez prekompilowanych czcionek i bitmap - 5.35k (wektory przerwan, inicjalizatory, stale). czcionki zajmuja od 3.5-17kB, bitmapy 17kB, bitmapa pelno ekranowa 38kB. wszystko razem (4 czcionki + 3 bitmapy) zajmuje 115kB. kod ogolnie jest na tyle szybki, ze mozliwe byloby odtwarzanie animacji w tempie kilku klatek na sekunde (calosc obrazu z wiekszoscia funkcji graficznych w roznych trybach [zdjecie powyzej] generowana jest w 0.2s), jednak uzyta matryca ma zbyt duze opoznienia do tego celu.
stworzylem rowniez aplikacje w Visual C++, ktora konwertuje bitmapy na postac strawna dla moich algorytmow.
FUTURE:
jako ze jest to wersja beta, wkradlo sie na plytke pare bledow, przyda sie wiec i pare poprawek. planuje dodac 2 cyfrowe potencjometry, ktore sterowalyby jasnoscia podswietlenia i kontrastem (zarowno poprzez protokol jak i przyciski). dodam tez mozliwosc programowego wylaczenia podswietlenia. mozliwe sa dalsze zmiany protokolu, tak aby byl wygodniejszy i prostszy. pomyslow mam wiele, czasu malo <: chcialem tez stworzyc aplikacje na PC, ktora umozliwialaby sterowanie tym ukladem.
calosc ukladu wyniosla mnie:
- procesor - probki
- driver - 40zl
- matryca - 50zl
- elementy pozostale - probki + ~15zl
- inne takie - 10zl
______________
w sumie: okolo 110zl
czas calkowitej realizacji to okolo 3 miesiace, w tym ciezka sesja + swieta + ferie [; , wiec troche mniej, ciezko okreslic. pozatym jestem troche leniwy, wiec bywalo i tak, ze przez tydzien nic nie zrobilem [;
hmm... co by tu jeszcze... chwilowo nie mam pomyslu co wiecej napisac, wiec jak sa jakies pytania to odpowiem.
na chwile obecna nie planuje udostepniac kodu ani schematow.
0x41 0x56 0x45!!
Cool? Ranking DIY