Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[PIC24H][C+ASM] Kontroler do LCD mono 640x480 (S1D13705)

Freddie Chopin 04 Sep 2009 18:33 16045 83
Altium Designer Computer Controls
  • Altium Designer Computer Controls
  • #62
    Mat_91
    Level 25  
    No i lepszego chwilowo nie będzie:) Jak pożyczę aparat od kumpla to wstawię lepsze fotki.

    Co do układu to dsPIC żyje:)

    Ale z programem już na sam początek mam problem:/ Chodzi o te adresy. Gubię się przy adresacji z bitem A0 na stałe ustawionym na 0.

    EDIT:

    Pomóżcie mi to zrozumieć :| Mając rejest o indexie 0xAC, standardowo żeby go zaadresować muszę dokonać przesunięcia o 1 czyli z 10101100 dostaje 1010110. Jednak u mnie bit A0 jest już ustawiony na 0 czyli w rezultacie jako adres ustawiam 101011 = 0x2B??
  • #64
    Mat_91
    Level 25  
    Ehh racja, nie wyspany dziś jestem i nie myślę trochę;]
    A co jeżeli będę miał rejestr w którym A0 wypada jako 1? Wtedy ustawiam adres normalnie A1:A16, i zmieniam górny bajt słowa?
  • Altium Designer Computer Controls
  • #65
    Freddie Chopin
    MCUs specialist
    Zwykle w takiej sytuacji musisz odczytać 16bitów, zmienić tylko jedną połówkę i zapisać z powrotem. Zresztą w sytuacji gdy zmieniasz dolną "połowę" słowa to też tak musisz zrobić. To jest cena za używanie mniejszej ilości linii sterujących.

    4\/3!!
  • #66
    Mat_91
    Level 25  
    Tak wiem, tak właśnie robie... Jednak coś chyba mam nie tak bo nie mogę zmienić stanu wyjść GPIO w SSD1906:| Kod wydaje się ok bo jest praktycznie identyczny jak przykład od microchip'a, będę musiał wieczorem zbadać czy nie ma jakiś zwarć/zimnych lutów w układzie.

    EDIT: Układ jednak jest ok, miałem błąd w programie, ICD2 pomógł :]
    Mogę już sterować z poziomu kodu podświetleniem <radocha>.
    Teraz pozostało mi dobrać rezystor i kondensator w filtrze RC od PWM kontrastu, napisać funkcje ssd1906_init() i może uda mi się coś wyświetlić... :)
    Trzymajcie kciuki.
  • #68
    Mat_91
    Level 25  
    Pare fotek:
    [PIC24H][C+ASM] Kontroler do LCD mono 640x480 (S1D13705)[PIC24H][C+ASM] Kontroler do LCD mono 640x480 (S1D13705)[PIC24H][C+ASM] Kontroler do LCD mono 640x480 (S1D13705)

    EDIT:
    Ostatnio nie miałem zbytnio czasu żeby pobawić się tą matrycą, dziś znów się za to zabrałem i powiedzmy ze mam postępy. Ale jest problem...

    Freddie pisałeś kiedyś tam na początku twojej pracy że masz problemy z przetwornicą od kontrastu, możesz powiedzieć jak to rozwiązałeś?
    U mnie problem wygląda tak że nie ważne jaką częstotliwość PWM wybiorę to przetwornica przeokropnie piszczy ( nawet jak PWM działa z f=41kHz, sprawę źle dobranego flitru RC na razie pomijam, muszę kupić kondensator i innej pojemności), i do tego niezależnie jakie napięcie ustawie, na pinie od kontrastu on sie nie zmienia a ekran jest caly czarny. Najgorsze jest to że na pracę tej przetwornicy wpływa manipulowanie przy pinie 14 złącza ZIFF, jak sie go dotknie miernikiem to piszczy ciszej, kontrast troszkę się zmienia, czasem przetwornica przestanie piszczeć a czasem się całkiem wyłączy. Nie mam zielonego pojęcia co z tym fantem zrobić- a skutecznie uniemożliwia mi dalsze prace:/

    Napięcia oraz parametry filtru RC podam jutro albo we wtorek jak go poprawie.
  • #69
    Freddie Chopin
    MCUs specialist
    Sprawy nie rozwiązałem, ale u mnie to była inna kwestia. Ja miałem zintegrowaną przetwornicę na wyświetlaczu, jedynie jej sterowanie było przy pomocy napięcia 0-5V na pinach w gnieździe. Problemem było to, że czasem przetwornica ta się wyłączała, ale inaczej niż u ciebie - u mnie wszystkie pola stawały się przezroczyste. Po pewnym czasie przetwornica się sama naprawiła i ten efekt w zasadzie przestał występować.

    4\/3!!
  • #70
    Mat_91
    Level 25  
    No ja też mam zintegrowaną (to w końcu ta sama matryca) i tak samo się steruje kontrastem. U mnie właśnie jak się przetwornica wyłączy całkowicie to przestaje piszczeć i ekran robi się przeźroczysty, ale taki stan jest bardzo żadko. Teraz ciągle piszczy i jest czarna. Nie wiem, może coś się poprawi jak zmienię ten filtr i dopracuje sterowanie. Napisze o efektach na dniach.
  • #71
    Freddie Chopin
    MCUs specialist
    Sprawdź (jak możesz) samą przetwornicę, sterując nią przez potencjometr jakiś. Warto to sprawdzić (chyba że już to robiłeś), bo to w końcu sprzęt sprzed miliona lat, więc może być padnięty...

    No i zmierz napięcie jakie tam masz - może to wejście jest jakieś dziwne i na przykład ciągnie bardzo dużo prądu, dlatego ci przysiada napięcie...

    Niemniej jednak piszczenia nie miałem... Tak w ogóle to piszczy twój filtr na płytce, czy sama przetwornica na matrycy, bo się już pogubiłem <:

    4\/3!!
  • #72
    Mat_91
    Level 25  
    Piszczy sama przetwornica :] Filtr nie wydaje dźwięków aczkolwiek jest do poprawy;]
    W takim razie muszę zrobić osobny zasilacz i sprawdzić ją jutro... Dziś już nie mam weny twórczej żeby wyciągać sprzęt i zabrać się za lutowanie.
    I mam nadzieje że jednak matryca działa.

    EDIT: Zrobiłem jak mówiłeś, czyli zasiliłem samą matryce (bez jakiegokolwiek sterowanie cyfrowego) i sterowałem kontrastem za pomocą potencjometru, efekt jest taki że napięcie Vee ładnie się zmienia w zakresie od około -8 do ponad -25V czyli przetwornica działa (i nie piszczy), sama matryca niestety nie staje się ciemniejsza podczas tych zmian- tak powinno być i było by to widoczne podczas wysłania do niej jakiś danych?

    Problem wraca jak chce sterować z PWM, Poprawiłem filtr i napięcie jest takie jakie chce i samo napięcie na przetwornicy też sie zmienia w takim samym zakresie jak przy sterowaniu z potencjometru. Jednak... tu matryca jest cała czarna (cały czas) i piszczy:/
  • #73
    Freddie Chopin
    MCUs specialist
    Eeee.... no to pełne szaleństwo chyba... Przydałby się oscyloskop, aby pooglądać co się na tym pinie dzieje, bo może coś dziwnego jednak - np napięcie jest niezbyt wystabilizowane... ? Nie wiem co może być tutaj przyczyną...

    4\/3!!
  • #74
    Mat_91
    Level 25  
    Freddie ja tym bardziej nie wiem. Z oscyloskopem może być problem, jedyne do czego chwilowo mam dostęp to miernik cyfrowy z funkcja oscyloskopu 10MHz. Napięcie jest wystabilizowane za pomocą LM2576, może trochę za mało odfiltrowane? w sumie to przed LMem jest 1 kondensator 100uF i 100nF, 2 razy tyle jest za nim.
    Teraz robie takie "testy dla zabawy" i zauważyłem że przetwornica przestaje piszczeć dopiero jak ssd1906 ustawie w tryb "power saving mode". Przykładowo wyłączenie samego PWM (i ustawie go w stan niski lub wysoki) nie zaprzestaje piszczenia (dobra- raz przestało ale wtedy sie cała przetwornica wyłączyła).

    Normalnie aż mnie kusi żeby zrobić 2 rzeczy- pierwsza to zmienić rezonator na wolniejszy, druga to kupić nową matrycę :/
  • #76
    Mat_91
    Level 25  
    Schemat w załączniku.
    L1 na schemacie z wartością 100uH to w rzeczywistości 220uH. Wszystkie kondensatory elektrolityczne w zasilaczu 100uF.

    W wersji z potencjometrem był tylko stabilizator 7805 + 2 x 100uF + 100nF + potencjometr. Nic więcej.

    Ps.: Proszę nie używać wzorów płytek przestawionych w pliku, posiadają dość znaczne błędy (3 jeżeli chodzi o szczegóły).
  • #77
    Freddie Chopin
    MCUs specialist
    A jaką wartość mają R18 i C23 w filtrze RC?

    Wartości rezystorów w pętli sprzężenia LM2576 powinny być chyba trochę większe - z tego co pamiętam producent zaleca aby ten rezystor do masy był rzędu 5k

    Może problemem jest to, że do kontrastu przeznaczone jest wejście LCV, a LPWM powinno być właśnie do jasności podświetlenia?

    4\/3!!
  • #78
    Mat_91
    Level 25  
    Szczerze to R18 i C23 są dobierane eksperymentalnie i wynoszą odpowiednio R18=10k, C23=33nF. Próbowałem na prawde różne wartości (od dużych R i małych C począwszy) i to dało najlepszy efekt...

    Szczerze to teraz Freddie dałeś mi dużo do myślenia jednak to będę mógł sprawdzić dopiero jutro bo to wymaga przelutowania płytki i dorobieniu jakoś filtru RC przy wyjściu LCVout :|
    Ale z drugiej strony PWM to PWM więc to chyba różnicy nie powinno robić?
  • #79
    Freddie Chopin
    MCUs specialist
    LCV i LPWM pracują z różną częstotliwością - LPWM jest dzielone przez 256, a LCV przez 2, więc jest 128x szybszy. Wydaje się więc, że to pierwsze lepsze jest do podświetlenia, bo tu nie trzeba dużej częstotliwości, a to drugie do generowania napięcia kontrastu, bo im większa częstotliwość tym lepsza stabilność itp.

    Z drugiej zaś strony Ty zastanawiasz się nad zmniejszeniem częstotliwości... Swoją drogą to jaką policzyłeś częstotliwość dla tego wyjścia?

    Wiesz czego mógłbyś jeszcze spróbować - przetestuj układ z potencjometrem, ale dodaj między matrycę a potencjometr twój filtr RC - może tak naprawdę on jest problemem...

    Wartość R jest wciąż dosyć spora - próbowałeś dla jakichś naprawdę małych? 10 - 100R i duża pojemnośc (elektrolit?)? Może wbrew logice wydajność prądowa tego napięcia ma znaczenie...

    4\/3!!
  • #80
    Mat_91
    Level 25  
    No to że pracują z różna częstotliwością to wiem, sprawdzę to jutro- będę musiał ciąć ścieżkę, ale trudno :)

    EDIT!:

    Pół nocy nad tym siedziałem, zrobiłem wiele testów i zmiany wartości elementów w filtrze nie przynosiły żadnych zmian. Teraz mam 10ohm i 33uF.

    Ale... Powiedzmy że rozwiązałem problem. Ustawiłem rejestry odpowiedzialne ze sygnały LLINE, LFRAME, oraz rozdzielczość itp i problem z piszczeniem po prostu... zniknął! Również matryca teraz nie jest ciemna i regulacja kontrastu daje efekty- widać naocznie jego zmianę (z PWM oczywiście).

    Idąc dalej, próbuje teraz ustawić jakoś konkretnie całość żeby to po ludzku zaczęło działać, bo na razie to na LCD pojawiają się dosłownie przypadkowe dane (dosłownie śmieci) oraz sam LCD lekko migota. Moje aktualne ustawienia to:
    Code:

    void init(void){

       ssd1906_set_reg(0xB1,0x0F);   //PWM and CV puls clock divide
       ssd1906_set_reg(0xB3,128);   //PWM duty cycle
       ssd1906_set_reg(0xB0,0x18);   //PWM puls enable, CV signal set to HIGH
       ssd1906_set_reg(0xA8,0xFF);   //all GPIO set as output
       ssd1906_set_reg(0xAC,0x00);   //all GPIO set to LOW

       ssd1906_set_reg(0x10,0x10);   //set Panel Data Width Bits

       ssd1906_set_reg(0x12,0x51);   //horizontal total
       ssd1906_set_reg(0x14,0x4F);   //horizontal total display period
       ssd1906_set_reg(0x16,0x0C);   //horizontal display period start
       ssd1906_set_reg(0x20,0x8B);   //Horizontal syncronization pulse width

       ssd1906_set_reg(0x18,0xE2);   //vertical total
       ssd1906_set_reg(0x19,0x01);   
       ssd1906_set_reg(0x1C,0xDF);   //Vertical display period
       ssd1906_set_reg(0x1D,0x01);
       ssd1906_set_reg(0x1E,0x02);   //Vertical display period start
       ssd1906_set_reg(0x24,0x01);   //Vertical syncronization pulse width
       
       ssd1906_set_reg(0x01,0x09);   //display bufer size
       ssd1906_set_reg(0x24,0x80); //LFRAME puls polarity
       ssd1906_set_reg(0xA0,0x00);   //Power saving mode OFF
    }   
  • #81
    Freddie Chopin
    MCUs specialist
    Faktycznie brak poprawnych sygnałów mógł być problemem - przypomniało mi się, ze gdy kiedyś podpiąłem do matrycy sygnały źle (w sensie wszystkie odwrotnie [; ) to też wydawała przeraźliwe dźwięki i chyba byłą cała czarna... Jak widać już wszystko zapomniałem [;

    Co do śmieci na wyświetlaczu - po włączeniu zasilania pamięć układu zawiera przypadkowe wartości, więc jeśli nie czyścisz pamięci i jeśli śmieci są "statyczne" to myślę, że jest dobrze.

    Jeśli przez migotanie masz na myśli słabe odświeżanie, to po prostu musisz pokombinować z zegarami.

    Tryb power saving lepiej wyłącz od razu, albo sprawdź w datasheecie co w tym trybie nie działa - może ustawienia które wpisujesz nie mają efektu, bo - na przykład - w tym trybie wyłączona jest pamięć rejestrów...

    4\/3!!
  • #82
    Mat_91
    Level 25  
    Z odświeżaniem sobie poradzę, na razie problem jest taki że mimo iż w pętli zapisuję dane do kontrolera na lcd nic się nie zmienia.

    To co dostaję po zakończeniu tej funkcji którą podałem wyżej przestawia obrazek:
    [PIC24H][C+ASM] Kontroler do LCD mono 640x480 (S1D13705)

    Szczerze się przyznam że nie mam pojęcia jaki rejestr muszę jeszcze koniecznie ustawić aby móc coś wyświetlić zapisując dane od adresu 0 w górę :|

    Co do power saving mode to nie widzę różnicy czy wyłączam ją przed ustawianiem rejestrów czy po, w przykładach od microchipa ten tryb jest wyłączany po ustawieniu wszystkich rejestrów więc to chyba nie ma znaczenia.
    Microchip w swoim kodzie oprócz rejestrów które ja ustawiam, ustawia jeszcze "main window register start adres", tyle że jeżeli rotacja ekranu wynosi 0 stopni to tam jest wpisywane 0, czyli tyle samo ile wynosi po resecie, więc tego chyba nie muszę ruszać...
  • #83
    Freddie Chopin
    MCUs specialist
    Myślę że z rejestrami jest dużo zabawy, bo ich ustawienie wcale nie jest takie banalne. Ten wyświetlacz o którym mówimy jest typu "dual", czyli tak naprawdę wysyłając 1 bajt, połówka ląduje w górnej połowie ekranu, a druga połówka w dolnej. Z tego względu dla takiego kontrolera (który nie obsługuje tego trybu "sprzętowo" wyświetlacz nie ma wcale rozdzielczości 640x480 tylko 1280x240, a dane są mocno poprzeplatane. To może następować u ciebie, bo widać, że na połowie wyświetlacza (tej dalszej) masz śmieci totalne, a na połowie (tej bliższej) coś co może być czystą pamięcią

    Wartościom po resecie nie wierz dopóki nie sprawdzisz - odczytaj co tam jest pod tym adresem, to będziesz pewny, bo czasem po resecie wcale zera nie ma [;

    A dla testu może puść program który by zapisywał stale w całej pamięci 0, a potem same jedynki (w pętli) - jeśli cokolwiek się wyświetla, to w końcu zauważysz zmianę na wyświetlaczu.

    4\/3!!
  • #84
    Krzysiu19
    Level 11  
    Hej. Również projektuję sobie PCB na którym bedzie SSD1906 proc i TFT. Mam jedno dręczące pytanie co do podlączenia TFT do sterownika.

    LCD jest 24 bitowy wiec ma po 8 bitów na piksel. Ja bede korzystac na 100% z trybu 16bpp a więc bedę omijać tablicę LUT, co oznacza, 16 bitów ( 5(R) + 6(G) + 5(B) ) będą iść od razu na wyjście sterownika wiec na piny LDATAxx.

    W datasheet w rozdziale LCD Pin Mapping pokazane jest podłączenie do 12 bitowego TFT oraz do 18 bitowego TFT. I tak dla 12 bitowego pin chociazby LDATA0 idzie na R3 na wyświetlaczu. Dla 18 bitowego LDATA0 idzie na R5 na LCD.

    Widząc analogię rozumiem, że dla trybu 16bpp omijajac LUT LDATA0 pojdzie na R4 do wyswietlacza?? (tak naprawde to nie fizyczne R4 tylko R7 bo tft ma 8 bitow na kolor ale cztery najmlodsze zwieram i lacze z najmlodszym bitem sterownika tak wiec fizycznie mam (R0,R0,R0,R0,R1,R2,R3,R4) (G...) (B...) ).