Probleme mit Display DogXL von EA

Gast #2174679
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
#2174705
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.
Gast #2174815
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
Gast #2175885
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
Gast #2177031
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.
Gast #2177094
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
Gast #2178549
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?
Gast #2178582
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
Gast #2179151
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)
Gast #2179172
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.
Gast #2202302
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
Gast #2202717
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);


}
#2202783
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
}
Gast #2203869
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
Gast #2236993
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
Angehängte Dateien:
Gast #2237012
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) ...
Gast #2237039
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).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren