Forum: Mikrocontroller und Digitale Elektronik Probleme mit Display DogXL von EA


von Daniel (Gast)


Lesenswert?

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

von Jörg S. (joerg-s)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von inse (Gast)


Lesenswert?

...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.

von spess53 (Gast)


Lesenswert?

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

von Daniel (Gast)


Lesenswert?

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?

von spess53 (Gast)


Lesenswert?

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

von Daniel (Gast)


Lesenswert?

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)

von Daniel (Gast)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

Hi

Stellst du sicher, das deine Umschaltung Daten/Kommando auch erst 
erfolgt, wenn die Übertragung komplett ist?

MfG Spess

von Daniel (Gast)


Lesenswert?

>Stellst du sicher, das deine Umschaltung Daten/Kommando auch erst
>erfolgt, wenn die Übertragung komplett ist?

Genau DAS war mein Fehler!

Es funktioniert!

DANKE!!!!

von spess53 (Gast)


Lesenswert?

Hi

>Genau DAS war mein Fehler!
>Es funktioniert!
>DANKE!!!!

Mach dir nichts draus. In die Falle bin ich auch schon getappt.

MfG Spess

von Ludwig (Gast)


Lesenswert?

@ 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

von Jean P. (fubu1000)


Lesenswert?

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ß

von Ludwig (Gast)


Lesenswert?

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.

von Jean P. (fubu1000)


Lesenswert?

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ß

von Ludwig (Gast)


Lesenswert?

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


}

von Jean P. (fubu1000)


Lesenswert?

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
}

von Ludwig (Gast)


Lesenswert?

Habe den Fehler gefunden !!! freu
Und zwar: Man muss vor jedes Umschaltkomando zwischen Data - und 
Commandmode ein I2C_Start schreiben :D

von spess53 (Gast)


Lesenswert?

Hi

Warum nimmst du überhaupt I2C? Ein Soft-SPI ist wesentlich einfacher und 
lässt sich an beliebigen PINs und AVRs benutzen.

MfG Spess

von Ludwig (Gast)


Lesenswert?

spess53 schrieb:
> Warum nimmst du überhaupt I2C?

Weil an meinem C CONTROL keine anderen Pins frei waren :D

von spess53 (Gast)


Lesenswert?

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

von Ludwig (Gast)


Lesenswert?

spess53 schrieb:
> Und eigentlich fehlt auch das Senden der Stop-Condition.

Das hab ich auch drin, man bräuchte es aber nicht :D

von Ludwig (Gast)


Angehängte Dateien:

Lesenswert?

Tolle Bilder :D

von Kim (Gast)


Angehängte Dateien:

Lesenswert?

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

von Kim (Gast)


Lesenswert?

... 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) ...

von Kim (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.