Hallo zusammen, ich arbeite an einem Projekt mit den Displays von Electronic Assembly (DogXL 160x104). Angesteuert wird das Display via SPI von einem ARM CORTEX M3. Folgendes Problem tut sich auf: - Display wird zum 1. mal auf mein eigens entwickeltest Evaluationsboard (für das Display) aufgesteckt. - Controller wird geflashed (mit Initialisierungssequenz für Display) - Initialisierungssequenz: Set_Com_End_H, Set_Com_End_L, Set_LCD_Mapping_Control, Set_Scroll_Line_LSB, Set_Scroll_Line_MSB, Set_Panel_Loading, Set_LCD_Bias_Ratio, Set_Vbias_Potentiometer_H, Set_Vbias_Potentiometer_L, Set_RAM_Address_Control, Set_Display_Enable, Set_All_Pixels_On /* um zu schauen, ob sich was am Display tut */ - Display springt an, alle Pixeln werden eingeschaltet Bis hierhin alles okay. Möcht ich nun Daten auf das Display schreiben, also mit WriteData (Wert 0xFF), sollten laut Datenblatt 4 Pixeln aktiviert werden. Set Page und Set Column sind auf 0 und 0 gesetzt, also Start ist links oben. Leider kommt nach diesem Befehl nur Pixelsalat auf den Display. Und nun das andere Problem: Sobald ich die Spannung weg nehme und nach kurzer Zeit wieder hinzufüge, gibt das Display kein Lebenszeichen mehr von sich. Dadurch hab ich schon 2 Displays ins Nirvana geschickt. Softwareseitig sollte das alles passen, da ich die Initialisierungsbeispiele von der EA-Seite heruntergeladen und in das Projekt eingefügt habe. SPI Signal hab ich mir auf dem Oszi angeschaut, passt auch alles. VCC hat auch die richtige Spannung mit 3.3V. Verdrahtungsfehler schließ ich aus, hab ich alles mehrmals nachgeprüft. Beschaltet hab ich genau nach Datenblatt von EA. Kann das Problem vielleicht an den Kondensatoren liegen? Ich verwende Keramikkondensatoren. Ansonsten hab ich echt keine Ahnung woran es liegen könnte... Ich würde mich über jeden Tipp oder Hinweis freuen. Daniel
Daniel schrieb: > Leider kommt nach diesem Befehl nur Pixelsalat auf den Display. Immer der gleiche Salat, oder zufälliges Muster? > Verdrahtungsfehler schließ ich aus, hab ich alles mehrmals nachgeprüft. Anders lässt sich ein gestorbenes Display wohl aber nicht erklären. > Kann das Problem > vielleicht an den Kondensatoren liegen? Ich verwende > Keramikkondensatoren. Nö, die gehen schon.
Hi >Möcht ich nun Daten auf das Display schreiben, also mit WriteData (Wert >0xFF), sollten laut Datenblatt 4 Pixeln aktiviert werden. Set Page und >Set Column sind auf 0 und 0 gesetzt, also Start ist links oben. Leider >kommt nach diesem Befehl nur Pixelsalat auf den Display. Hast du das Display auch vorher gelöscht. Also den Displayram mit komplett $00 beschrieben. 'All Pixels On/OFF' verändert den DDRAM-Inhalt nicht. >Und nun das andere Problem: Sobald ich die Spannung weg nehme und nach >kurzer Zeit wieder hinzufüge, gibt das Display kein Lebenszeichen mehr >von sich. Machst du einen Hardware Reset vor der Initialisierung? >Dadurch hab ich schon 2 Displays ins Nirvana geschickt. Sicher. Die Teile sind eigentlich recht robust. MfG Spess
Hi Sicher. -> Sicher? >Und nun das andere Problem: Sobald ich die Spannung weg nehme und nach >kurzer Zeit wieder hinzufüge, gibt das Display kein Lebenszeichen mehr >von sich. >Dadurch hab ich schon 2 Displays ins Nirvana geschickt. Noch eine Frage: Hälst du die geforderten 5..10ms Wartezeit vor der Initialisierung ein? MfG Spess
...ohne daß ich mich mit speziell diesem Display genau auskenne: ist es überhaupt möglich das Display durch fehlerhafte Initialisierung über den Jordan zu schicken? Ich würde erstmal die elektrischen Verhältnisse prüfen. Ist die Versorgungsspannung beim Ein- und Ausschalten innerhalb der Spec? (Überschwingen, Hochlauf- Abfallzeit...) Gibt es Überschneidungen zwischen Hochlauf Versorgungsspannung und Pegel an den Datenleitungen? Das kann zu Latchup und Zerstörung führen. Besonders der Satz "Sobald ich die Spannung weg nehme und nach kurzer Zeit wieder hinzufüge, gibt das Display kein Lebenszeichen mehr von sich." lässt mich so etwas vermuten.
Hi >Besonders der Satz "Sobald ich die Spannung weg nehme und nach >kurzer Zeit wieder hinzufüge, gibt das Display kein Lebenszeichen mehr >von sich." lässt mich so etwas vermuten. Er benutzt einen ARM CORTEX M3. Das Display braucht aber nach dem Power-On-Reset ein paar ms um sich zu sammeln. Darauf wird aber seine Initialisierung keine Rücksicht nehmen. D.h. die Initialisierung erfolgt zu einem Zeitpunkt, an dem das Display noch keine Befehle verarbeiten kann. MfG Spess
Hi, das ist echt merkwürdig... Ich hab mich an die "kaputten" Displays nach einem Tag, und auch nur durch Zufall, wieder versucht. Und auf einmal tun beide wieder... ich versteh das nicht. Das mit dem RAM löschen hab ich nun beachtet. Jetzt ist auch der Pixelsalat endlich weg. Das war der passende Tipp! Vielen Dank! Bevor ich das Display initialisiere, hab ich natürlich die Pause von 10ms eingehalten. Ich hab mal ein paar Pixel aktiviert und somit ein, zwei Buchstaben auf den Display ausgeben können. Alles passt bis hier soweit. Danke für die Antworten! Nun bin ich aber an einem weiteren Problem: Set_Com_End_H, Set_Com_End_L, Set_LCD_Mapping_Control, Set_Scroll_Line_LSB, Set_Scroll_Line_MSB, Set_Panel_Loading, Set_LCD_Bias_Ratio, Set_Vbias_Potentiometer_H, Set_Vbias_Potentiometer_L, Set_RAM_Address_Control, <-------- Set_Display_Enable, Und zwar macht mir das Kommando Set_RAM_Address_Control etwas Kopfweh. Ich versteh zwar, dass nach jedem SendData(Byte) Columns bzw. Pages inkrementiert werden. Kann man aber gezielt einstellen, dass man jetzt an der Stelle Page X und Column Y ein Pixel (bzw. 4 Pixel) aktivieren kann??? Das sollte man ja eigentlich mit den Kommandos "Page_Address", "Column_LSB0" und "Column_MSB0" erzielen können (zumindest laut Datenblatt)... doch leider komm ich da nicht an die gewünschte Stelle. Wo liegt da der Fehler?
Hi >das ist echt merkwürdig... Ich hab mich an die "kaputten" Displays nach >einem Tag, und auch nur durch Zufall, wieder versucht. Und auf einmal >tun beide wieder... ich versteh das nicht. Wundert mich eigentlich nicht. Es deutet alles darauf hin, das du die Displays mit der Initialisierung überfahren hast, bevor sie nach dem Power-On-Reset richtig munter waren. >Das sollte man ja eigentlich mit den Kommandos "Page_Address", >"Column_LSB0" und "Column_MSB0" erzielen können (zumindest laut >Datenblatt)... Ja. Mit 'Set Page' und 'Set Column' wählst du eine bestimmte Stelle (4 Pixel) an. >doch leider komm ich da nicht an die gewünschte Stelle. Wie äußert sich das? MfG Spess
1 | |
2 | |
3 | // davor Hardwarereset ...
|
4 | |
5 | //Offset
|
6 | page_offset = 5; |
7 | |
8 | //Delay 10ms
|
9 | Delay(10); |
10 | |
11 | /* Initalisierungssequenz */
|
12 | HalLcd_Init(); |
13 | |
14 | LcdData[0] = 0xFF; |
15 | HalLcd_SendData(LcdData, 1); |
16 | HalLcd_SendData(LcdData, 1); |
17 | HalLcd_SendData(LcdData, 1); |
18 | |
19 | /* Gehe nun an die Stelle Column 0 und Page 5 */
|
20 | LcdData[0] = Column_LSB0 + column_offset; //0x00 |
21 | LcdData[1] = Column_MSB0; // 0x10 |
22 | LcdData[2] = Page_Address + page_offset; //0x60 + Offset |
23 | HalLcd_SendCmd(LcdData, 3); |
24 | |
25 | /* Und schreibe ab dort weiter */
|
26 | LcdData[0] = 0xFF; |
27 | HalLcd_SendData(LcdData, 1); |
28 | HalLcd_SendData(LcdData, 1); |
29 | HalLcd_SendData(LcdData, 1); |
30 | |
31 | Reset_Display(); |
32 | |
33 | Delay(10); |
34 | |
35 | //ENDE
|
Also die ersten 3 Daten werden an die richtige Stelle geschickt. An Column 0, 1 und 2, jeweils an der Stelle Page 0, werden 4 Pixel aktiviert. Nachdem aber die Kommandos Set Column_LSB bzw. MSB, sowohl Page_Adress übertragen werden, wird leider nicht an der entsprechenden Stelle weitergeschrieben, sondern schreibt dann quasi irgendwo und zwar irgendwas undefiniertes (z.b. werden 4 Pixel irgendwo anderst aktiviert, mit geringerem Kontrast)
zwischen HalLcd_SendData(LcdData, 1) und Reset_Display() hab ich natürlich noch fie Funktion Display_Enable() und ein Delay von 15Sek um zu sehen, was sich auf dem Display tut... Hab ich jetzt nur vergessen hier einzufügen.
Hi Stellst du sicher, das deine Umschaltung Daten/Kommando auch erst erfolgt, wenn die Übertragung komplett ist? MfG Spess
>Stellst du sicher, das deine Umschaltung Daten/Kommando auch erst >erfolgt, wenn die Übertragung komplett ist? Genau DAS war mein Fehler! Es funktioniert! DANKE!!!!
Hi >Genau DAS war mein Fehler! >Es funktioniert! >DANKE!!!! Mach dir nichts draus. In die Falle bin ich auch schon getappt. MfG Spess
@ Daniel: Am 11.5.2011 hast du geschrieben: "Das mit dem RAM löschen hab ich nun beachtet. Jetzt ist auch der Pixelsalat endlich weg. Das war der passende Tipp! Vielen Dank! Bevor ich das Display initialisiere, hab ich natürlich die Pause von 10ms eingehalten. Ich hab mal ein paar Pixel aktiviert und somit ein, zwei Buchstaben auf den Display ausgeben können." .... wie hast du den RAM gelöscht ? Könntest du mir bitte das Programm oder den Sourcecode schicken ? MFG, Ludwig
Ludwig schrieb: > .... wie hast du den RAM gelöscht ? > > Könntest du mir bitte das Programm oder den Sourcecode schicken ? > > MFG, Ludwig Man beschreibt einfach das gesamte Lcd mit 0x00 ! Gruß
Das haben wir schon versucht...... hat nicht funktioniert !!! Könntest du bitte deinen Sourcecode mit den Buchstaben als Anhang oder E-Mail schreiben ??? Bin am verzweifeln :D MFG, Ludwig.
Ludwig schrieb: > Könntest du bitte deinen Sourcecode mit den Buchstaben als Anhang oder > E-Mail schreiben ??? > Bin am verzweifeln :D Ich helfe gerne , wenn du deinen Code postest. Meiner liegt bei der Arbeit, komme erst Montag wieder hin. Gruß
Hier mein Code fürs C Control: /*********************************** ***** Wetterstation Alpha 1.1 ***** ************************************ ********* © Ludi and Alex ******** ***********************************/ void main(void) { unsigned char Page; int Col; I2C_Init(I2C_100kHz ); I2C_Start(); AbsDelay(10); //Inizialisierung I2C_Write(0x78); I2C_Write(0xF1); I2C_Write(0x67); I2C_Write(0xC0); I2C_Write(0x40); I2C_Write(0x50); I2C_Write(0x2B); I2C_Write(0xEB); I2C_Write(0x81); I2C_Write(0x5F); I2C_Write(0x89); I2C_Write(0xAF); /* I2C_Write(0xF9); I2C_Write(0xF4); I2C_Write(0); I2C_Write(0xF5); I2C_Write(0); I2C_Write(0xF6); I2C_Write(159); I2C_Write(0xF7); I2C_Write(25); I2C_Write(0xF9); */ /* for(Page=0;Page<=25;Page++) { for(Col=0;Col<=159;Col++) { //AbsDelay(10); I2C_Write(0x78); I2C_Write((0x60 | Page)); I2C_Write((Col & 0x0F)); //LSB I2C_Write(((Col >> 4) | 0x10)); //MSB //AbsDelay(10); I2C_Write(0x7A); I2C_Write(0xCC); } */ I2C_Write(0x7A); for(Col=0;Col<=4160;Col++) { //AbsDelay(10); I2C_Write(0x00); } AbsDelay(10); //Alle Pixel an //I2C_Write(0x7A); //I2C_Write(0xC3); AbsDelay(3000); //Ausschalten !!! I2C_Write(0x78); I2C_Write(0xAE); I2C_Stop(); AbsDelay(5); }
Ludwig schrieb: > I2C_Write(0x7A); > for(Col=0;Col<=4160;Col++) > { > //AbsDelay(10); > > I2C_Write(0x00); > } Also vorne weg, ich benutze SPI, aber ich denke der Code sollte wie bei mir unten funzen. Du musst die Pages und Coloumns setzen:
1 | for(uint8_t j = 0; j < 26; j++) |
2 | {
|
3 | I2C_Write(0x78); //command |
4 | I2C_Write(0x30 | j); //set page |
5 | I2C_Write(0x00); //set coloumn lsb |
6 | I2C_Write(0x00); //set coloumn msb |
7 | I2C_write(0x7A); //data command |
8 | for(uint8_t i = 0; i < 160; i++) |
9 | {
|
10 | I2C_Write(0x00); |
11 | }
|
12 | }
|
Habe den Fehler gefunden !!! freu Und zwar: Man muss vor jedes Umschaltkomando zwischen Data - und Commandmode ein I2C_Start schreiben :D
Hi Warum nimmst du überhaupt I2C? Ein Soft-SPI ist wesentlich einfacher und lässt sich an beliebigen PINs und AVRs benutzen. MfG Spess
spess53 schrieb: > Warum nimmst du überhaupt I2C? Weil an meinem C CONTROL keine anderen Pins frei waren :D
Hi >Weil an meinem C CONTROL keine anderen Pins frei waren :D Ich dachte du hättest einen richtigen Controller. >Und zwar: Man muss vor jedes Umschaltkomando zwischen Data - und >Commandmode ein I2C_Start schreiben :D Und eigentlich fehlt auch das Senden der Stop-Condition. Belese dich mal über die I2C-Schnittstelle im Datenblatt vom UC1610. MfG Spess
spess53 schrieb: > Und eigentlich fehlt auch das Senden der Stop-Condition. Das hab ich auch drin, man bräuchte es aber nicht :D
Hallo, ich habe hier auch ein Problem mit dem DOGXL, vielleicht kann mir jemand auf die Sprünge helfen. Ich betreibe das Display an einem ATMega32 und spreche es über das TWI an. Ich nutze die entsprechende TWI-Lib. von Peter Fleury. Die Versorgungspannung beträgt 3 V. Verschaltet habe ich es wie im Datenblatt, auch mit den entsprechende C-Werten (siehe Anhang). Die beiden C's an VB0/VB1 sind ELKOS, ist das OK? So sieht mein Code aus:
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | #include <stdlib.h> |
4 | #include <util/delay.h> |
5 | #include <util/twi.h> |
6 | #include "init.h" |
7 | #include "i2cmaster.h" |
8 | |
9 | |
10 | // addresses of the LCD
|
11 | #define Write_Command 0x78
|
12 | #define Read_Status 0x79
|
13 | #define Write_Data 0x7A
|
14 | #define Read_Data 0x7B
|
15 | /*
|
16 | #define Write_Command 0x7C
|
17 | #define Read_Status 0x7D
|
18 | #define Write_Data 0x7E
|
19 | #define Read_Data 0x7F
|
20 | */
|
21 | |
22 | int main (void) { |
23 | |
24 | |
25 | init(); |
26 | |
27 | // initialize I2C library
|
28 | i2c_init(); |
29 | |
30 | |
31 | //Watchdog enabled
|
32 | //wdt_enable (WDTO_250MS);
|
33 | |
34 | |
35 | |
36 | |
37 | i2c_start_wait(Write_Command); // set device address and write mode |
38 | i2c_write(0xF1); // Set last COM electrode to 103 (number of COM electrodes - 1) |
39 | i2c_write(0x67); // |
40 | i2c_write(0xC0); // SEG (column) and COM (row) normal |
41 | i2c_write(0x40); // Set Display Startline to 0 |
42 | i2c_write(0x50); // |
43 | i2c_write(0x2B); // Set Panelloading to 28..38nF |
44 | i2c_write(0xEB); // Set Bias to 1/12 |
45 | i2c_write(0x81); // Set Contrast |
46 | i2c_write(0x5F); // |
47 | i2c_write(0x89); // Set Auto-Increment |
48 | i2c_write(0xAF); // Display on |
49 | i2c_stop(); // set stop conditon = release bus |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | do{ |
57 | |
58 | //wdt_reset(); //Watchdog reset
|
59 | |
60 | //i2c_start_wait(Write_Data); // set device address and write mode
|
61 | //i2c_write(0xFF); // Set last COM electrode to 103 (number of COM electrodes - 1)
|
62 | //i2c_stop(); // set stop conditon = release bus
|
63 | asm volatile ("nop"); |
64 | |
65 | } while (1); |
66 | |
67 | return 0; |
68 | }
|
Sollte nach der Initialisierung schon etwas auf dem Display zu sehen sein? Es ist auf jeden Fall so, das die Spannung Vlcd nur auf ca. 3 V (entspricht Versorgungsspannung?!) steigt. Eigentlich sollten es doch um die 12 V sein?! Zumindest schein aber die Kommunikation zu klappen, da die Spannung an Vlcd vor den Init-Befehlen 0 V ist. Jemand 'ne Idee warum Vled so niedrig ist? Grüße
... und an VB0+/VB1- liegen konst. 1 V an. Das ist doch auch nicht normal. Ich habe hier auch ein Testboard für das LCD (welches dort überigens funktionier) und da messe ich auf VB0+/VB1- ein hochfrequentes Rechtecksignal (0v - 10V) ...
Ups ... an Vled komme ja 10M und nicht 10k. Leider habe ich keine 10M, habe den R also ganz weggelassen (ist das schlau?). Jetzt scheint es zumindest zu funktionieren (schönes Pixel-Chaos auf dem LCD).
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.