Chcia?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
| | |
Ca?o?? zamontowana na matrycy:
 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).
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:
- wszystkie funkcje rysunkowe wraz z demonstracj? trybów OR, XOR i NAND
- bitmapy
- tekst normalny i negatywowy na czarnym prostok?cie, ro?ne czcionki
- bitmapy normalnie i w negatywie
- to co wy?ej + kó?ka w XOR + prostok?ty w XOR
 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 |