Skocz do zawartości

[C] [Atmega16] LCD graficzny od Nokii 6100/6610


mopsiok

Pomocna odpowiedź

Dzień dobry wszystkim 🙂.

Kilka tygodni temu postanowiłem spróbować odpalić tenże wyświetlacz. Nic z tego nie wyszło, ale cierpliwie czekałem na oryginalny (wyciągnięty prosto z Nokii) wyświetlacz, a nie jakieś dziadostwo z Allegro za 15 złotych. Niedawno doczekałem się i otrzymałem go. Powstała odpowiednia płytka, ale po załadowaniu mojego programu do Atmegi, wyświetlacz niestety nie chciał działać. Postanowiłem użyć gotowego kodu stąd: http://thomaspfeifer.net/nokia_6100_display_en.htm

Program ściągnięty, przejrzany, płytka z LCD podłączona do procka tak jak powinna. Wgrywam kod (oczywiście ze zmienioną częstotliwością taktowania) i dalej nic. Atmega wysyła do komputera "OK", więc program wykonuje się prawidłowo.

Od dłuższego czasu bezskutecznie próbuję sprawić by to diabelstwo w końcu zaświeciło się jak należy. Wymieniłem gniazdo, sprawdziłem wszystkie połączenia (włącznie z tymi do gniazda), nawet zmieniłem domyślną "konwersję" napięć logicznych ze zwykłego dzielnika napięcia na przełączanie tranzystorami. Jedyny powód jaki przychodzi mi do głowy to inny sterownik wyświetlacza niż ten, na którego był pisany program z podanej strony... W komentarzach jest napisane że kod nie będzie działać z wyświetlaczami na zielonej płytce, bo mają inny sterownik, ale czytałem gdzieś że niektóre Philipsy też są na zielonej.

Czy ktoś wie co może być przyczyną? Poniżej kod źródłowy programu oraz schemat podłączenia i zdjęcia wyświetlacza.

/*

 Nokia 6100 Display Test
 Copyright 2005 Thomas Pfeifer (http://thomaspfeifer.net)


 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2 of the License, or
 (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA


 Target: AVR-ATMega8
 Compiler: AVRGcc

 Note: This will only work with Philips-Controller-Displays (brown flexible
 PCB). The ones with Epson-Controller (green PCB) will NOT work.

*/

//#### CONFIG ####

#define F_CPU 16000000UL  // 8 MHz

#define SPIPORT PORTB
#define SPIDDR DDRB
#define CS 2
#define CLK 5
#define SDA 3
#define RESET 4

#define USR UCSRA
#define UCR UCSRB
#define UBRR UBRRL
#define BAUD_RATE 38400
//#define MODE565

//#################



#include <avr/io.h>
#include <avr/delay.h>

#define cbi(reg, bit) (reg&=~(1<<bit))
#define sbi(reg, bit) (reg|= (1<<bit))

#define CS0 cbi(SPIPORT,CS);
#define CS1 sbi(SPIPORT,CS);
#define CLK0 cbi(SPIPORT,CLK);
#define CLK1 sbi(SPIPORT,CLK);
#define SDA0 cbi(SPIPORT,SDA);
#define SDA1 sbi(SPIPORT,SDA);
#define RESET0 cbi(SPIPORT,RESET);
#define RESET1 sbi(SPIPORT,RESET);

#define byte unsigned char
byte n=0;
byte s1,s2;
byte r,g,b;

void sendCMD(byte cmd);
void sendData(byte cmd);
void shiftBits(byte b);
void setPixel(byte r,byte g,byte b);

void waitms(int ms) {
 int i;
 for (i=0;i<ms;i++) _delay_ms(1);
}

int main (void) {

 SPIDDR=(1<<SDA)|(1<<CLK)|(1<<CS)|(1<<RESET); //Port-Direction Setup


 //Init Uart and send OK
 UCR = (1<<RXEN)|(1<<TXEN);
 UBRR=(F_CPU / (BAUD_RATE * 16L) - 1);
 loop_until_bit_is_set(USR, UDRE);
 UDR = 'O';
 loop_until_bit_is_set(USR, UDRE);
 UDR = 'K';


 CS0
 SDA0
 CLK1

 RESET1
 RESET0
 RESET1

 CLK1
 SDA1
 CLK1

 waitms(10);

 //Software Reset
 sendCMD(0x01);

 //Sleep Out
 sendCMD(0x11);

 //Booster ON
 sendCMD(0x03);

 waitms(10);

 //Display On
 sendCMD(0x29);

 //Normal display mode
 sendCMD(0x13);

 //Display inversion on
 sendCMD(0x21);

 //Data order
 sendCMD(0xBA);

 //Memory data access control
 sendCMD(0x36);

//sendData(8|64);   //rgb + MirrorX
 sendData(8|128);   //rgb + MirrorY

#ifdef MODE565
 sendCMD(0x3A);
 sendData(5);   //16-Bit per Pixel
#else
 //sendCMD(0x3A);
 //sendData(3);   //12-Bit per Pixel (default)
#endif


 //Set Constrast
 //sendCMD(0x25);
 //sendData(63);


 //Column Adress Set
 sendCMD(0x2A);
 sendData(0);
 sendData(131);

 //Page Adress Set
 sendCMD(0x2B);
 sendData(0);
 sendData(131);

 //Memory Write
 sendCMD(0x2C);

int i;
 //Test-Picture

 //red bar
 for (i=0;i<132*33;i++) {
   setPixel(255,0,0);
 }

 //green bar
 for (i=0;i<132*33;i++) {
   setPixel(0,255,0);
 }

 //blue bar
 for (i=0;i<132*33;i++) {
   setPixel(0,0,255);
 }

 //white bar
 for (i=0;i<132*33;i++) {
   setPixel(255,255,255);
 }


 //wait for RGB-Data on serial line and display on lcd

 while(1==1) {

   loop_until_bit_is_set(UCSRA, RXC);
   r = UDR;
   loop_until_bit_is_set(UCSRA, RXC);
   g = UDR;
   loop_until_bit_is_set(UCSRA, RXC);
   b = UDR;
   setPixel(r,g,b);

 }

}



void shiftBits(byte b) {

 CLK0
 if ((b&128)!=0) SDA1 else SDA0
 CLK1

 CLK0
 if ((b&64)!=0) SDA1 else SDA0
 CLK1

 CLK0
 if ((b&32)!=0) SDA1 else SDA0
 CLK1

 CLK0
 if ((b&16)!=0) SDA1 else SDA0
 CLK1

 CLK0
 if ((b&8)!=0) SDA1 else SDA0
 CLK1

 CLK0
 if ((b&4)!=0) SDA1 else SDA0
 CLK1

 CLK0
 if ((b&2)!=0) SDA1 else SDA0
 CLK1

 CLK0
 if ((b&1)!=0) SDA1 else SDA0
 CLK1

}




//send data
void sendData(byte data) {

 CLK0
 SDA1                                                 //1 for param
 CLK1

 shiftBits(data);
}

//send cmd
void sendCMD(byte data) {

 CLK0
 SDA0                                                 //1 for cmd
 CLK1

 shiftBits(data);
}

//converts a 3*8Bit-RGB-Pixel to the 2-Byte-RGBRGB Format of the Display
void setPixel(byte r,byte g,byte b) {
#ifdef MODE565
  sendData((r&248)|g>>5);
  sendData((g&7)<<5|b>>3);
#else
 if (n==0) {
   s1=(r & 240) | (g>>4);
   s2=(b & 240);
   n=1;
 } else {
   n=0;
   sendData(s1);
   sendData(s2|(r>>4));
   sendData((g&240) | (b>>4));
 }
#endif
}

Schemat:

Wyświetlacz:

Zbliżenie na gniazdo: (sprawdzane omomierzem, nie ma żadnych zwarć i wszystko przewodzi jak należy)

Podłączenie całości:

Link do komentarza
Share on other sites

Zanim zaczniesz zastanawiać się nad programem, rozwiąż problem natury hardware'owej.

Wyświetlacz zasilasz za małym napięciem. Na diabła te wszystkie tranzystory?

Jeśli ci to coś pomoże, wklejam schemat zegara na tym wyświetlaczu.

Link do komentarza
Share on other sites

Też ostatnio dostałem tego lcdka, tyle, ze mój jest na pomarańczowej taśmie. Sam go jeszcze nie włączyłem, miałem problemy z jego podłączeniem, czytając trochę doszedłem do tego, że po odklejeniu tej białej taśmy ze spodu wyświetlacza ukazują się ładne złocone styki... Po co się męczyć z tym mikro złączem.

Link do komentarza
Share on other sites

mopsiok:

Koledzy mają rację, zacznij od sprzętu. Zmierz napięcie wychodzące ze stabilizatora 1117, przy R15=47 nie ma szans mieć 3.3V. Po co jest R14? I pomyśl co zapodaje stan niski na wejścia LCD. Bo wysoki dają tranzystory - to jasne. Acha, i po co dałeś zapętlenie MISO-MOSI, że niby coś ma wracać do procesora po linii MISO? Skąd?

rezolut:

Podoba mi się zasilanie podświetlania 🙂

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Też ostatnio dostałem tego lcdka, tyle, ze mój jest na pomarańczowej taśmie. Sam go jeszcze nie włączyłem, miałem problemy z jego podłączeniem, czytając trochę doszedłem do tego, że po odklejeniu tej białej taśmy ze spodu wyświetlacza ukazują się ładne złocone styki... Po co się męczyć z tym mikro złączem.

Mógłbyś podesłać jakiś artykuł w którym to wyczytałeś? Albo powiedz chociaż gdzie dokładnie te pola lutownicze miały być. Bo rozebrałem calutki wyświetlacz na części pierwsze i żadnych złoconych styków nie widzę. Jest ich trochę na dole, ale i tak nie wiem czy to te i który któremu odpowiada 🙂

Link do komentarza
Share on other sites

Dzięki za zainteresowanie. Już odpowiadam...

Wyświetlacz zasilasz za małym napięciem. Na diabła te wszystkie tranzystory?

Wyczytałem, że należy go zasilić 3.3V. Na wyjściu stabilizatora mam 3.15V przy niepodłączonym wyświetlaczu, i tyle samo przy podłączonym. Tranzystorów użyłem do konwersji poziomów logicznych (5V -> 3.3V), bo nie posiadam konwertera w scalaku. Stwierdziłem że użycie dzielnika napięcia może być niedokładne...

po odklejeniu tej białej taśmy ze spodu wyświetlacza ukazują się ładne złocone styki... Po co się męczyć z tym mikro złączem.

Ja niestety nie posiadam tychże styków, dlatego chcąc nie chcąc musiałem użyć złącza. Nie jestem z tego faktu zadowolony, ale znalazłem ostatnio w internecie taśmę, która ma potrzebne gniazdo. Wystarczy w szukajce znanego portalu aukcyjnego wpisać "AE4 LCD NOKIA 1200" i wyskoczy kilka wyników. Może komuś się przyda 🙂.

Zmierz napięcie wychodzące ze stabilizatora 1117, przy R15=47 nie ma szans mieć 3.3V. Po co jest R14? I pomyśl co zapodaje stan niski na wejścia LCD. Bo wysoki dają tranzystory - to jasne.

Tak jak pisałem, napięcie wynosi 3.15V. R15 nijak na to nie wpływa, bo według noty katalogowej przy nóżce ADJ/GND jest źródło prądowe i daje ono stały prąd bodajże 50uA. A z kolei do nóżki wyjściowej podłączony jest przez rezystor 2.2k, co eliminuje problem dużego prądu już na wstępie. R14 dodałem w sumie sam nie wiem dlaczego, zastosowałem się do noty katalogowej. Jeden rezystor to niewiele miejsca 😉. Sprawa ze stanem niskim... no i tutaj szczere podziękowania za tę informację. Kompletnie o tym zapomniałem ;/. Zaraz podepnę "pull-down" do każdego wejścia i pokombinuję nieco, zobaczymy co z tego wyjdzie.

Dziękuję wszystkim za chęci pomocy, dam znać jak tylko coś się ruszy 🙂.

Link do komentarza
Share on other sites

Artykułu (a właściwie wypowiedzi na jakimś forum) nie znalazłem, ale za to wrzucam zdjęcie mojego wyświetlacza z odklejoną taśmą:

@edit

Dodam, że wyświetlacz nie pochodzi z noki 6100 a 3100, ale wyświetlacze są tam identyczne. 😉

  • Lubię! 1
Link do komentarza
Share on other sites

"napięcie wynosi 3.15V. R15 nijak na to nie wpływa"

To znaczy, że nie użyłeś układu 1117 jak napisałeś na schemacie tylko jego wersji 1117-3.3 z dzielnikiem napięcia już wstawionym do środka. W tej sytuacji cały dzielnik R13-R15 jest zbędny. R14 także. W normalnej konfiguracji 1117 stara się stabilizować napięcie 1.25V na górnym rezystorze tego dzielnika i oczywiście zarówno R13 jak i R15 mają wpływ na napięcie wyjściowe wg prostego wzoru:

Vout = 1.25V*(1+(R15/R13))

Dlatego uznałem, że przy takich wartościach jak na schemacie nie ma możlwioścsći by napięcie wyjsciowe 1117 chociaż z daleka widziało 3V. W każdym razie jesteś 3 oporniki do przodu 🙂

"Zaraz podepnę "pull-down" do każdego wejścia i pokombinuję nieco, zobaczymy co z tego wyjdzie."

Nie opisałeś rezystorów przy tranzystorach ale takie układy zrobione z tranzystorów głęboko wchodzących w nasycenie są dość wolne. Jeśli procesor generuje np. impulsy zegara o długości w okolicach mikrosekund, mogą one przez taki konwerter napięć nie przejść. Minimum to test ze statycznymi sygnałami 0-1 i woltomierzem. Jeśli całość będzie działała np. przy taktowaniu procesora z 1MHz a przy 8MHz już nie, sprawa będzie jasna.

Link do komentarza
Share on other sites

http://www.electricstuff.co.uk/noklcd.html

http://www.module.ro/nokia_3510.html

w tym pierwszym linku jest wszystko bardzo fajnie opisane

A co do podświetlania bardzo prosto da się przerobic je na 3v

Procesor masz z końcówką A czy bez a może L ?

Jeśli chcesz mogę ci podesłać gotowy kod do obsługi takiego wyświetlacza tyle że w bascomie

Link do komentarza
Share on other sites

Marek1707:

To jest układ AS1117-2.85. Bez dzielnika dawał 2.85V, ale z nieznanych mi powodów dało się go regulować 🤣. W każdym razie - o ile dobrze zrozumiałem Twoją wypowiedź, wina może stać również po stronie tranzystorów? W takim razie może faktycznie lepiej nie kombinować i zrobić konwersję za pomocą dzielnika napięcia?

Robomaniak:

Dzięki za linki, z pierwszego wynika że mój LCD jest oparty na Epsonie, ale kto ich tam wie...

Słyszałem że diody podświetlające ten wyświetlacz są połączone szeregowo po dwie (kompletny debilizm moim zdaniem...), także jeśliby się do nich dostać, to faktycznie dałoby radę przerobić połączenie na równoległe i zasilać z 3V 🙂. Pomyślę nad tym, bo z 5V diody jeszcze nie świecą.

Mam Atmega16, bez A ani L. Rozumiem że zmierzasz do obniżenia napięcia zasilania do 3.3V. Odpadnie mi wtedy konwersja stanów logicznych. Mam gdzieś kilka Atmeg16L, więc jest to do zrobienia.

Co do kodu bascomowego - byłbym bardzo wdzięczny 😃. Tylko jak kiedyś próbowałem skompilować kod do obsługi Epsona to mi wywalało że jest jakiś błąd w bibliotece...

Tak więc na chwilę obecną sprawa wygląda tak, że spróbuję zadziałać na Atmega16L na 3.3V, i zamienić połączenie diod żeby można je było zasilić z 3.3V. Dam znać jak tylko coś się ruszy 🙂.

Link do komentarza
Share on other sites

Artykułu (a właściwie wypowiedzi na jakimś forum) nie znalazłem, ale za to wrzucam zdjęcie mojego wyświetlacza z odklejoną taśmą:

Obrazek

@edit

Dodam, że wyświetlacz nie pochodzi z noki 6100 a 3100, ale wyświetlacze są tam identyczne. 😉

Dokładnie tydzień temu rozebrałem swoją starą Nokię 3100. Myk z tymi wyświetlaczami jest taki, że część jest na sterowniku Philipsa PCF8833, a część na Epsonie (nie pamiętam dokładnego symbolu). W telefonie to nie robi różnicy, który sterownik jest, dopiero przy zabawie z AVR są różnice w komendach. Jeśli dobrze pamiętam te z Philipsem mają pomarańczową taśmę na której są właśnie takie pola lutownicze. Niestety ja trafiłem na Epsona z zieloną taśmą i będę się musiał pobawić z tym gniazdem malutkim, raster 0.5mm >.<

Link do komentarza
Share on other sites

Luuke, wbrew pozorom te gniazda są proste w montażu. Wyżej podałem frazę do wpisania w szukajkę portalu aukcyjnego, znajdzie Ci piękną listwę z której wystarczy gniazdo wymontować, a potem wlutować do siebie. Pół milimetra to nie tak znowu mało, nawet mnie udało się wytrawić płytkę tak żeby nie było zlane/podtrawione 🙂. Jak już przyłożysz gniazdo do płytki i przylutujesz dwa przeciwległe wyjścia to po prostu robisz jeden wielki lut który obejmie wszystkie pięć wyjść z jednej strony gniazda, a następnie przykładasz plecionkę rozlutowującą (uprzednio namoczoną w spirytusowym roztworze kalafonii, tylko takim dość nasyconym) i podgrzewasz lutownicą - nadmiar cyny pięknie wsiąknie w plecionkę i zostanie tylko niewielka ilość na łączeniu padów ze ścieżkami.

Powodzenia 😃.

Link do komentarza
Share on other sites

Ok, to teraz wszystko jasne. Trzeba było tak od razu. Taki układ też daje możliwość regulacji, czego dowodzi Twój przykład. Dodajesz wtedy jakby trzeci opornik w łańcuszku - dwa są już w środku. Nie można tą metodą obniżyć napięcia ale podwyższyć jak najbardziej. Tak mi nie pasowało to malutkie 47 omów ale od 2.85 do 3V niedaleko więc pewnie wystarczył.

Z tymi tranzystorami to jakby nie ich wina. W tak prostych układach tranzystory wchodzą w głębokie nasycenia i powrót do stanu blokowania zajmuje czasem wiele mikrosekund. Jeżeli zrobisz np. zegar wyświetlacza z impulsów 1us powtarzanych co 1us (czyli w sumie dla AVRa żaden wyczyn, nawet programowo bez wsparcia SPI) to to nie przejdzie prawie na pewno.

Dzielniki z kolei mają duże impedancje wyjściowe i kiepsko "napędzają" wszelkiego rodzaju dłuższe scieżki, taśmy i co bardziej odległe rzeczy. W sumie pewnie wyjdzie na to samo co z tranzystorem.

Zrównanie napięć zasilających usuwa wszelkie problemy.

Możesz też użyć układów, które taką konwersję napięć zjadają na śniadanie, np. rodziny 74LVC, 74LVX lub podobnych. Takie coś nie ma diod zabezpieczających na wejściach, więc możesz go zasilać np. z 3V jak LCD a na wejscie zapodać mu przebieg 5V. Na wyjściach będzie oczywiście max tyle co jego zasilanie, czyli 3V. Jeśli użyjesz bramek nieodwracających, np. 74LVC08, to masz w małym układzie 4-bitowy, piekielnie szybki, pracujący np. do 20MHz konwerter. Wtedy wyświetlacz przestaje być zmorą (i tak obciążającą procesor) tylko w miarę nadążającym zasobem.

Link do komentarza
Share on other sites

Orientuje się ktoś czy wyświetlacz z 6100 jest taki sam jak z 6020? Bo mam 2 takie 🙂

6020 ma taki sam sterownik jak 6100, ale 12 wyprowadzeń. Dodano 2 piny GND. I u mnie nie było tych pól lutowniczych po odklejeniu taśmy. Zobacz załączniki w moim artykule https://www.forbot.pl/forum/topics20/dla-poczatkujacych-pozyskiwanie-czesci-z-niepotrzebnego-sprzetu-domowego-vt6976.htm#62167 tam masz wszystkie schematy ideowe dla tego telefonu

  • Lubię! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.