Skocz do zawartości

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


mopsiok

Pomocna odpowiedź

Witam ponownie. Zrobiłem tak jak pisałem - to jest zasiliłem Atmegę z 3.3V (zmieniłem też kwarc na 7.3728 MHz, bo przy 3.3V już by nie uciągnęła 16MHz) i podawałem dane bezpośrednio z niej do wyświetlacza. Poszperałem w Internecie i znalazłem komendy do Epsona (o ile mi dobrze wiadomo to kod napisał autor tego tekstu: http://www.sparkfun.com/tutorial/Nokia%206100%20LCD%20Display%20Driver.pdf ). Tak to wygląda po przepleceniu z poprzednim kodem:

#define F_CPU 7372800

#define SPIPORT PORTA
#define SPIDDR DDRA
#define CS 3
#define CLK 2
#define SDA 1
#define RESET 0

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

//komendy
#define DISON     0xAF      // Display on
#define DISOFF    0xAE      // Display off
#define DISNOR    0xA6      // Normal display
#define DISINV    0xA7      // Inverse display
#define COMSCN    0xBB      // Common scan direction
#define DISCTL    0xCA      // Display control
#define SLPIN     0x95      // Sleep in
#define SLPOUT    0x94      // Sleep out
#define PASET     0x75      // Page address set
#define CASET     0x15      // Column address set
#define DATCTL    0xBC      // Data scan direction, etc.
#define RGBSET8   0xCE      // 256-color position set
#define RAMWR     0x5C      // Writing to memory
#define RAMRD     0x5D      // Reading from memory
#define PTLIN     0xA8      // Partial display in
#define PTLOUT    0xA9      // Partial display out
#define RMWIN     0xE0      // Read and modify write
#define RMWOUT    0xEE      // End
#define ASCSET    0xAA      // Area scroll set
#define SCSTART   0xAB      // Scroll start set
#define OSCON     0xD1      // Internal oscillation on
#define OSCOFF    0xD2      // Internal oscillation off
#define PWRCTR    0x20      // Power control
#define VOLCTR    0x81      // Electronic volume control
#define VOLUP     0xD6      // Increment electronic control by 1
#define VOLDOWN   0xD7      // Decrement electronic control by 1
#define TMPGRD    0x82      // Temperature gradient set
#define EPCTIN    0xCD      // Control EEPROM
#define EPCOUT    0xCC      // Cancel EEPROM control
#define EPMWR     0xFC      // Write into EEPROM
#define EPMRD     0xFD      // Read from EEPROM
#define EPSRRD1   0x7C      // Read register 1
#define EPSRRD2   0x7D      // Read register 2
#define NOP       0x25      // NOP instruction
//-----------------------------------------------------------------------


//kolory
#define WHITE		0xFFF
#define BLACK		0x000
#define RED			0xF00
#define GREEN		0x0F0
#define BLUE		0x00F
#define CYAN		0x0FF
#define MAGENTA		0xF0F
#define YELLOW		0xFF0
#define BROWN		0xB22
#define ORANGE		0xFA0
#define	PINK		0xF6A	
//-----------------------------


#include <avr/io.h>
#include <util/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 clearScreen(void);

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

 RESET0
 _delay_ms(2);
 RESET1
 _delay_ms(2);

 //display control
 sendCMD(DISCTL);
 sendData(0x00);
 sendData(0x20);
 sendData(0x00);

 //COM scan
 sendCMD(COMSCN);
 sendData(1);

 sendCMD(OSCON); //Internal oscilator ON
 sendCMD(SLPOUT); //sleep out

 //power control
 sendCMD(PWRCTR);
 sendData(0x0f);

 sendCMD(DISINV); //inverse display

 //data control
 sendCMD(DATCTL);
 sendData(0x01);
 sendData(0x00);
 sendData(0x02);

 //voltage control (contrast setting)
 sendCMD(VOLCTR);
 sendData(32);
 sendData(3);

 _delay_ms(20); //allow power supply to stabilize  
 sendCMD(DISON); //turn on the display

 clearScreen();

 for(;;);
 return 0;
}



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);
}


void clearScreen(void) {
long i;

//row address set
sendCMD(PASET);
sendData(0);
sendData(131);

//column address set
sendCMD(CASET);
sendData(0);
sendData(131);

//set the display memory to RED
sendCMD(RAMWR);
for (i = 0; i < ((131*131)/2); i++) {
		sendData((RED >> 4) & 0xFF);
		sendData(((RED & 0xF) << 4) | ((RED >> 8) & 0xF));
		sendData(RED & 0xFF);
}
}

Atmega i LCD są zasilane z wyżej wspomnianego już AS1117 (tym razem na wyjściu 3.13V, ale słyszałem że działałyby nawet przy 2.85V), natomiast diody podświetlające ze stabilizatora 9V (+ rezystor 220 omów). Oba stabilizatory podłączone do zasilacza 12V. Po połączeniu mas zasilacza i konwertera FTDI, terminal pięknie wykrywa "OK" przy 38400 baud, więc mam pewność że nie ma większych zakłóceń. Niestety wyświetlacz nie wyświetla czerwonego tła, tylko jakieś dziwne cosie, sam zbytnio nie wiem co to jest. Tak to wygląda (poprawiłem lekko kontrast i kolory żeby wyglądało tak jak w realu):

Taki widok jest za każdym razem gdy włączę wyświetlacz, nawet zanim zmieniłem kod programu. Nie są to wartości losowe, bo przy każdym uruchomieniu wszystko wygląda identycznie. Wygląda na to, że... kod nie działa 🤣.

Czy widzicie gdzieś jakieś błędy? Już powoli mnie to zaczyna nudzić, że ciągle próbuję i próbuję, i nic poza zmarnowanym laminatem z tego nie wynika...

Tak czysto hipotetycznie, równie dobrze wina może być po stronie mechanicznej - kto wie, może wtyczka nie łączy z gniazdem? Gniazdo ze ścieżkami na pewno jest dobrze połączone, sprawdzałem omomierzem (nie ma też żadnych zwarć).

Link do komentarza
Share on other sites

Też walczyłem z tym wyświetlaczem, jednak ostatecznie się poddałem. Miałem wrażenie, że kontroler nie chciał współpracować. Najpierw przetestowałem różne gotowce z internetu w C żaden nie odpalił, ruszył tylko jeden w Bascomie, ale praktycznie też nie można tego nazwać działaniem...

Sprawdziłeś wszystkie kody jakie są tutaj w tutorialach na dole? http://www.sparkfun.com/products/569

Niedługo będę się zabierał za ten wyświetlacz jeszcze raz...

Link do komentarza
Share on other sites

Czy widzicie gdzieś jakieś błędy? Już powoli mnie to zaczyna nudzić, że ciągle próbuję i próbuję, i nic poza zmarnowanym laminatem z tego nie wynika...

A nie prościej sprawdzić hardware na pewno działającymi bibliotekami Bascom? Są dwie.

Jeśli Ci to ruszy pod Bascom'em dopiero zacznij się dłubać w C.

Link do komentarza
Share on other sites

Jeśli usunąłeś wszelkie konwertery napięć, inwertery itp między procesorem a wyświetaczem, to moim zdaniem cały sygnał zegara jest odwrócony. Przepisz wszystkie funkcje komunikacyjne tak, by w stanie spoczynku zegar był w stanie niskim. Jeśli chcesz wysłać bit, to najpierw wystawiasz jego stan na linię danych a za chwilę "cykasz" zegarem, np:

 SPI_DATA_LOW;		// MSB=0 dla komend
 SPI_CLK_HIGH;
 SPI_CLK_LOW;

lub cytując Twój kod:

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

a sam RESET przerób tak:

 CS1 
 SDA0 
 CLK0 

 RESET0 
 _delay_ms(2); 
 RESET1 
 _delay_ms(2); 

 CS0 

i od tej pory już nie ruszasz CS a zegar i dane tylko w funkcjach wysyłania po te nieszczęsne 9 bitów.

A niewygodniej by Ci było pracować w trybie 256 kolorów? Wtedy 1 wysłany bajt to jeden piksel. Żadnego mielenia czwórkami bitów i dziwnych kombinacji jak w Twojej clearScreen(). Jak już to zrobisz, wyślę kod inicjujący wyświetlacz (w sensie sekwencji wysyłanych komend) choć nie analizowałem Twojego. Może też jest OK.

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

Okej, to po kolei.

Kiedyś już próbowałem zrealizować to w bascomie, tylko że z jakichś niewiadomych przyczyn kod nie chciał mi się skompilować. Teraz o dziwo tego problemu nie ma i wszystko normalnie się wgrało na procka. Ale i tak nie działa. Kod jest następujący:

$lib "lcd-pcf8833.lbx"                                      'special color display support
'$lib "lcd-epson.lbx"

$regfile = "m16def.dat"                                     
$crystal = 7372800                                         

'First we define that we use a graphic LCD
Config Graphlcd = Color , Controlport = Porta , Cs = 3 , Rs = 0 , Scl = 2 , Sda = 1

'here we define the colors
Const Blue = &B00000011   'predefined contants are making programming easier
Const Red = &B11100000

'clear the display
Cls

Line(0 , 0) -(130 , 130) , Blue
Line(130 , 0) -(0 , 130) , Red
Circle(30 , 30) , 10 , Blue
Box(10 , 30) -(60 , 100) , Red

Próbowałem z bibliotekami dla obu sterowników, efekt ten sam.

Sprawdziłem to o czym pisał Marek1707 - zmieniłem wszystkie tiki zegarka w taki sposób jak napisałeś, ale oczywiście dalej nic nie działa... zaczynam się powoli zastanawiać czy to rzeczywiście nie jest wina połączenia. Coś mi się obiło o uszy o odwróceniu funkcji pinów w niektórych wyświetlaczach. W sensie że na przykład zamiast reset na pinie pierwszym, to na dziesiątym. To tylko plotki, czy faktycznie coś takiego występuje?

Marek - jeśli chodzi o kolory to mnie też strasznie drażni takie cudowanie z nimi. Ale póki co nie chcę z niczym kombinować, bo ja to zazwyczaj najwięcej błędów popełniam przy takich mykach, bez których na pierwszy test można się obejść.

Link do komentarza
Share on other sites

Ojj zapomniałem całkiem o tym temacie. Jak tylko będę na kompie to wrzucę ten kod.

Co do kolegi up czy czasem od tego czasu nie zmieniła Ci się wersja bascoma?

EDIT

$lib "lcd-pcf8833.lbx"                                      'biblioteka zależna od tego jaki mamy sterownik lcd
'$lib "LCD-EPSON.LBX"
$regfile = "m16def.dat"
$crystal = 8000000

Config Graphlcd = Color , Controlport = Porta , Cs = 1 , Rs = 0 , Scl = 3 , Sda = 2


'Kolory
Const Blue = &B00000011
Const Yellow = &B11111100
Const Red = &B11100000
Const Green = &B00011100
Const Black = &B00000000
Const White = &B11111111
Const Brightgreen = &B00111110
Const Darkgreen = &B00010100
Const Darkred = &B10100000
Const Darkblue = &B00000010
Const Brightblue = &B00011111
Const Orange = &B11111000


Glcdcmd &H21                                                'Jeśli będą odwrócone kolory usunąć


Cls                                                         ' Bug bo czyszczenie nie działa

Box(0 , 0) -(97 , 67) , White                               'ale eysowanie białego kwadratu już tak


Pset 0 , 0 , Black
Pset 1 , 1 , Red




Line(10 , 10) -(96 , 65) , Blue
Line(96 , 0) -(0 , 65) , Red

Waitms 1000


Showpic 40 , 32 , Flower

Waitms 1000

'Setfont Color16x16
Setfont Color8x8



Lcdat 8 , 32 , "N6100" , Blue , Yellow
Lcdat 0 , 8 , "PCF8833/Epson Lcd" , Black , Orange

Waitms 1000
Circle(15 , 30) , 10 , Blue

Waitms 1000


Box(5 , 50) -(15 , 65) , Green


Pset 46 , 25 , Black
Pset 48 , 25 , Red
Pset 50 , 25 , Black


End

$include "color8x8.font"

Flower:
$bgf "kwiatek.BGC"

w załączniku dodaję wszystkie pliki potrzebne do skompilowania fonty itp biblioteki są już w BASCOMie przynajmniej w wersji 1.11.9.5

Nokia_6610.rar

Link do komentarza
Share on other sites

Dzięki za wstawkę. Jak już zwykło się dziać w moim przypadku - nie działa 🤣. Ale doszedłem do wniosku że mogę jakoś wykorzystać starą Nokię 6610. Całkiem możliwe że mi się pomieszały piny (albo wyświetlaczowi 😅 ), więc gdyby tak podpiąć dwa piny z wyjścia w komórce (np. domniemany zegar i szynę danych) do wejścia na mikrofon w kompie [rzecz jasna przez dzielnik napięcia] i odpalić komputerowy oscyloskop? Tylko nie wiem czy dane nie będą wysyłane zbyt szybko jak na taką prowizorkę... no nic, zobaczymy. Mam nadzieję że przynajmniej uda mi się ustalić czy faktyczne wyprowadzenia pokrywają się z tymi ze schematu.

Link do komentarza
Share on other sites

Przecież to musi w końcu zadziałać.

Tyle razy to sobie powtarzałem, że sam zaczynam w to wątpić 🤣. Przed nami święta, będzie więcej wolnego czasu. Postaram się wszystko dokładnie posprawdzać...

Bez względu na wynik, jeszcze tutaj wrócę 😃.

Link do komentarza
Share on other sites

Okej, podpiąłem komórkę do komputera. To co zobaczyłem na wykresie nieco mnie zszokowało... Zresztą sami zobaczcie. Kanał czerwony jest podpięty do pinu podpisanego jako CS, a zielony - CLK.

Teraz rodzi się pytanie - czy w wała robi mnie cały Internet, czy może oscylator? 😋

Nie wiem co o tym myśleć... czysto teoretycznie może być też taka możliwość, że sygnał CLK zmienia się zbyt szybko i oscylator za nim nie nadąża, dlatego pokazuje go jako niezmienny. Tylko w takim wypadku co oznacza ten nagły impuls raz na 5 sekund? Jest też druga możliwość. Mój wyświetlacz ma pozamieniane piny, i CS to wcale nie CS, a CLK to wcale nie CLK. Ale jak nie one, to co innego? Kanał opisany jako CS zmienia się tak okresowo, że aż można podejrzewać że jest to sygnał zegarowy. O ile oczywiście odrzucimy możliwość że oscylator jest za wolny i kanał CLK faktycznie zmienia się tylko raz na kilka sekund. Wtedy czym może być tenże kanał? Jedyne co przychodzi mi do głowy to pin resetu. Bo ani CS, ani tym bardziej DATA czy CLK nie działałyby tak wolno. Tylko po co resetować co 5 sekund?

Ja już nie wiem co o tym myśleć...

//Edit

Robomaniak, oczywiście tak zrobiłem - zawsze testuję obie biblioteki, bo dalej nie wiem jaki mam sterownik...

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.