Forum: Mikrocontroller und Digitale Elektronik EA DOGXL160 an Atmega328 über I2C / twi Bus ansteuern!?


von Thomas I. (thomasi)


Angehängte Dateien:

Lesenswert?

Hallo an Alle,


Ich heiße Thomas, studiere Microelektronik und bin Neu hier im Forum. 
Erst mal möchte ich ein größes Lob an alle Mitglieder dieses 
einzigartigen Portals aussprechen, diese umfangreiche Informationsquelle 
ist einfach unbezahlbar!

Nun zu meinem Problem:

Ich möchte mit einem Atmega328 über den I2C - Bus ein Electronic 
Assembly Display DOGXL160 ansteuern. Das Display hat einen UC1610 
Controller verbaut. Das ganze System wird mit einem 3,3V 
Festspannungsregler gespeist. Die Bus Leitung ist ca. 10cm lang, der 
Bustakt beträgt 100khz.
Datenblätter: http://www.lcd-module.de/produkte/dog.html

Das Display habe ich laut Datenblatt angeschlossen, die Pull-Up 
Widerstände haben 1kOhm. Pin A2 liegt auf Masse, also ist die Adresse 
für das Controlregister 0x78. Am Oszibild seht ihr, das Start dann 0x78 
gesendet wird, aber das Display zieht das Ack - Bit nicht nach unten. 
Man sieht auch das das Display die SDA Leitung nicht unter 2V bringt!?

An was kann das liegen? Bin schön langsam am Verzweifeln!
Hab schon alles mögliche versucht, größere Pull-Ups bringen auch nichts!


Mit besten Grüßen
Thomas

von spess53 (Gast)


Lesenswert?

Hi

>die Pull-Up Widerstände haben 1kOhm.

Das ist zu klein.

Datenblatt:

Beachten Sie bei der Auswahl der Pull-up Widerstände, dass die 
Anschlusspins
SDA+SCK einen Innenwiderstand von ca. 600..1000 Ohm, evtl. auch mehr 
haben
(betrifft LO-Pegel beim Lesen von Daten bzw. dem ACK-Bit).

MfG Spess

von Thomas I. (thomasi)


Angehängte Dateien:

Lesenswert?

Danke Spess, für die schnelle Antwort!


Laut I2C - Bus Spezification ist der Bus für 3mA ausgelegt. Daher müssen 
die Pull-Up Widerstände größer gleich 3,3V/0,003A = 1,1k Ohm haben. Nur 
ändern andere Pullup's leider nichts an diesem Problem, habe ich schon 
versucht!
Nur was bedeutet "SDA+SCK haben einen Innenwiderstand von ca. 
600..100Ohm"? Damit kann ich nicht wirklich was anfangen! Bedeutet das, 
das ich größere oder kleinere Widerstände brauche? Ist da ein 
Serienwiderstand gemeint oder in Bezug auf Masse oder 3,3V, ich habe 
keine Ahnung.

Den Bus habe ich übrigens mit einem 24C64 eeProm getestet und das 
funktioniert einwandfrei, sogar bis ca. 850khz Bustakt!

Zum testen ob mein Display nicht doch irgendeinen Defekt aufweist, habe 
ich extra ein zweites gekauft, doch siehe da, gleiches Problem!

Irgendwie kommt es mir vor, als ob das Display gar nicht zum 
initialisieren vom Bus kommt, but why? Laut UC1610 Datenblatt braucht 
das Display nach einschalten von VCC ca. 5-10ms bis es Daten am Bus 
empfangen kann. In dieser Zeit versucht es glaub ich die Spannung 
irgendwie zu stabilisieren. Siehe Seite 38 unter "RESET & POWER 
MANAGEMENT" im Datenblatt des UC1610.

Wenn man das Oszibild vom ersten Beitrag mit diesem Bild (SDA hängt in 
der Luft) vergleicht, sieht man das das Display doch irgendwie die SDA 
Leitung nach unten zieht, aber eben nur bis ca. 2V. Und das ist für 
einen Low - Pegel von 0,3 * 3,3V = 0,99V einfach zuviel!

Vom Kundendienst von EA habe ich bis jetzt noch keine brauchbare Antwort 
bekommen!

Hat irgendwer schon ein DOGXL160 am I2C - Bus zum laufen gebracht?

Please help!


Mit besten Grüßen
Thomas

von spess53 (Gast)


Lesenswert?

Hi

>ur was bedeutet "SDA+SCK haben einen Innenwiderstand von ca.
>600..100Ohm"? Damit kann ich nicht wirklich was anfangen!

Für mich heißt das, das der L-Pegel durch einem Spannungsteiler aus 
Pull-Up-Widerstand und 600...1000R bestimmt wird. Praktisch bedeutet 
das, das der Pull-Up-Widerstand >2,34K sein muss.

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

Nachtrag:

Im Datenblatt des UC1610 ist ein Pull-Up von 2..10k angegeben.

MfG Spess

von Thomas I. (thomasi)


Lesenswert?

So...

Jetzt hab ich die ganze E12 Reihe von 1k bis 47k durchgetestet! Bis 33k 
funktioniert die Übertragung noch und der L-Pegel liegt dann immer noch 
bei 1,5V.
Also bringt gar nichts.


Auf jeden Fall schon mal DANKE für die Tipps!

Was kann da sonst noch sein????


Mit besten Grüßen
Thomas

von Gastino G. (gastino)


Lesenswert?

Hast Du die Pull-ups an den ATmega-Pins abgeschaltet?

von Thomas I. (thomasi)


Lesenswert?

Hi,

>Hast Du die Pull-ups an den ATmega-Pins abgeschaltet?

Die Atmega internen Pull-Ups sind natürlich deaktiviert!

MFG
Thomas

von Thomas I. (thomasi)


Angehängte Dateien:

Lesenswert?

Hallo,


Da ich das Display mit dem I2C - Bus nicht zum laufen bekomme, dachte 
ich mir, probier's halt mit dem SPI Mode.

Also hab ich die Verdrahtung laut Datenblatt geändert, das Programm für 
die Verwendung des Atmega internem SPI umgescchrieben. Dann habe ich das 
Timing und den gesendeten Inhalt der drei Leitungen CD, SDA(MOSI) und 
SCK am Oszi überprüft. Das gesendete Signal sieht hervorragend aus, also 
gleich mal am Display getestet.

Doch siehe da, das Display zeigt wieder nichts an! Die nach 
erfolgreichem Initialisieren am Pin VLCD erzeugte Spannung von 
4,5....15V ist auch NULL! Daher kann das Display nicht funktionieren. 
Aber warum?

Denn Code habe ich jetzt mal angehängt, vieleicht entdeckt jemand einen 
Fehler.

Da mein zweites Display das gleiche Verhalten zeigt, kann man einen 
Defekt vermutlich ausschließen.

Tja, was nun? Hat noch jemand eine Idee?


Mit besten Grüßen
Thomas

von Thomas I. (thomasi)


Lesenswert?

... eins ist mir noch eingefallen.

Welche Kondensatoren würdet ihr für VBx und VLCD verwenden?
Ich habe Tantalkondensatoren eingesetzt, müsste passen oder?

Weil im Datenblatt des UC1610 auf Seite 8 steht:

"When CL is used, keep the trace resistance under 300 Ohm"

MFG
Thomas

von Thomas I. (thomasi)


Angehängte Dateien:

Lesenswert?

Hallo,


Hier noch den Schaltplan und die Oszibilder von der Displayansteuerung 
über SPI.

Hat keiner mehr eine Idee, oder ein ähnliches Problem gehabt?


MFG
Thomas

von Thomas B. (escamoteur)


Lesenswert?

Hi,

ich verwende auch SPI, I2C hab ich nicht probiert. Ich verwende Folie 1µ 
Kondensatoren, daher kann ich Dir nicht sagen, ob Du Deine Tantal 
richtig gepolt hast.

AUF JEDEN FALL muss D6 auf GND sonst denkt er Du willst immer noch i2C 
machen.

Gruß
Tom

von Thomas I. (thomasi)


Lesenswert?

Hallo,


Danke für deine Mithilfe!

Ok, dann werde ich die Tantalkondensatoren gegen Folienkondensatoren 
tauschen, mal sehen was passiert.

Laut Datenblätter ist beim 3 WIRE 8-BIT SPI-MODE 'D6' auf 3,3V!
Verwendest du also den 4 WIRE 8-BIT SPI-MODE, soll ich den mal 
probieren?


MFG
Thomas

von Thomas B. (escamoteur)


Lesenswert?

Ah, sorry hab ich übersehen. Ich verwende den 4 wire SPI, sollte aber 
dennoch gehen.

Kuck Dir mal das Timing-Diagram im anderen Thread ganz oben an, dass ist 
auf jeden Fall korrekt.

Gruß
Tom

von Thomas I. (thomasi)


Lesenswert?

So jetzt habe ich die Kondensatoren getauscht und das Übertragungsmuster 
/ Timing-Diagramm überprüft. Das Signal passt, doch es wird keine VLCD 
Spannung generiert!

Schön langsam glaub ich das beide Displays defekt sind! So ein Sch...!

MFG
Thomas

von Thomas B. (escamoteur)


Lesenswert?

Ich hatte eines meiner Displays wirklich kaputtgemacht, daher gings 
nicht. Ich denke zwei kaputte Displays ist unwahrscheinlich.

Schickst Du auch diese Initsequenz? Du weißt, dass Du erst eine VLCD 
Spannung bekommst wenn Du die komplette Initialisierung durch hast.

1
#define Set_Com_End_H                 0xF1
2
#define Set_Com_End_L                 0x67
3
#define Set_LCD_Mapping_Control       0xC0
4
#define Set_Scroll_Line_LSB           0x40
5
#define Set_Scroll_Line_MSB           0x50
6
#define Set_Panel_Loading             0x2B
7
#define Set_LCD_Bias_Ratio            0xEB
8
#define Set_Vbias_Potentiometer_H     0x81
9
#define Set_Vbias_Potentiometer_L     0x5f
10
#define Set_RAM_Address_Control       0x89
11
#define Set_Display_Enable            0xAF
12
#define Set_All_Pixels_On             0xA5
13
#define System_Reset                  0xE2
14
#define Page_Address                  0x60
15
#define Column_LSB0                   0x00
16
#define Column_MSB0                   0x10
17
#define InvertDisplay          0xA7
18
19
#define DisplayinitSequenceLength 11
20
21
uint8_t DisplayInitSequence[] = { 
22
                              Set_Com_End_H,                 
23
                              Set_Com_End_L,                 
24
                              Set_LCD_Mapping_Control,       
25
                              Set_Scroll_Line_LSB,           
26
                              Set_Scroll_Line_MSB,           
27
                              Set_Panel_Loading,             
28
                              Set_LCD_Bias_Ratio,            
29
                              Set_Vbias_Potentiometer_H,     
30
                              Set_Vbias_Potentiometer_L,
31
                              Set_RAM_Address_Control,
32
                              Set_Display_Enable,
33
                              };
Bei mir hatte ich noch das Problem, dass ich zuerst den CS und CD zu 
früh zurückgenommen hatte, bevor die SPI-Übertragung ganz fertig war. 
Nachdem ich jetzt warte bis die Übertragung fertig ist, ist es kein 
Problem mehr.

Hier ist mein Code, allerdings für den STM32, aber vielleicht hilft es:
1
void DOGXL::WriteCommand(BYTE command)
2
{
3
    GPIO_ResetBits(SPI1_DISPLAY_CONTROL_PORT,PIN_DISPLAY_CS);
4
    GPIO_ResetBits(SPI1_DISPLAY_CONTROL_PORT,PIN_DISPLAY_COMMAND_DATA);
5
6
    
7
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
8
    /* Send SPI1 data */
9
    SPI_I2S_SendData(SPI1, command);
10
11
    //Warten bis übertragung fertig ist
12
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
13
14
15
   GPIO_SetBits(SPI1_DISPLAY_CONTROL_PORT,PIN_DISPLAY_COMMAND_DATA);
16
   GPIO_SetBits(SPI1_DISPLAY_CONTROL_PORT,PIN_DISPLAY_CS);
17
 
18
}
19
20
void DOGXL::WriteData(BYTE* data, int count)
21
{
22
    GPIO_ResetBits(SPI1_DISPLAY_CONTROL_PORT,PIN_DISPLAY_CS);
23
24
    BYTE* p = data;
25
    for(int i = 0; i< count; i++)
26
    {
27
        //Warten bis Sendebuffer leer ist ist
28
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
29
30
        SPI_I2S_SendData(SPI1, *p);
31
                               
32
33
        p++;
34
    }
35
    //Warten bis übertragung fertig ist
36
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
37
38
    GPIO_SetBits(SPI1_DISPLAY_CONTROL_PORT,PIN_DISPLAY_CS);
39
}

Gruß
Tom

von Thomas I. (thomasi)


Lesenswert?

Hallo,


Meine Initsequenz ist identisch mit deiner.
Der Pegel auf CD ist auch bis nach dem letzten Bit auf Low.

Aber wenn ich deinen Code Richtig verstehe, dann brauche ich nicht nach 
jedem gesendeten Byte einen Flankenwechsel auf der CD-Leitung 
durchführen bzw. den internen Bitzähler zurücksetzen.

Da im Datenblatt steht "Jede Änderung des Pegels am Pin CD setzt den 
internen Bit-Zähler zurück. Danach werden die 8-Bit in das Display 
getaktet (MSB zuerst)." dachte ich, ich muss nach 8-Bit wieder eine 
Pegeländerung machen. Das heist ich übertrage 8Bit dann CD auf High, 
10us delay und dann CD wieder auf Low und die nächsten 8-Bit werden 
gesendet usw..

Muss ich jetzt einen Flankenwechsel auf der CD Leitung machen oder 
nicht?

Hat zufällig jemand dieses USB Testboard von Electronic Assembly mit der 
Nummer EA 9780-2USB zuhause und möchte es verkaufen?


MFG
Thomas

von Thomas B. (escamoteur)


Lesenswert?

Hi Thomas,

ich hab das Testboard genaus aus demselben Grund gekauft. Ich kanns Dir 
schicken.

Nein, Du hast den Code nich ganz verstanden. WriteData verwende ich 
wirklich nur für Daten, nicht für Commands.

WriteCommand zieht erst CS und dann CD auf LOW sobald das Commando BYTE 
übertragen wurde geht erst CD, dann CS high.

D.h. bei den Commandos mache ich sowohl für CS als auch für CD einen 
Flankenwechsel.

Gruß
Tom

von Thomas I. (thomasi)


Lesenswert?

Hallo,


OK, also passt das mit den Flankenwechsel schon so wie ich mir das 
gedacht habe.

Ich hab mir das Timing nochmal am Oszi angeschaut:
Wenn die steigende Flanke auf SCK beim letzten Bit kommt, liegt CD noch 
für 550ns auf Low. Laut Datenblatt mindestens 20ns, passt also locker!

Ich probiers jetzt mal mit dem Testboard, um einen Defekt definitiv 
ausschließen zu können!


MFG
Thomas

von Thomas I. (thomasi)


Lesenswert?

@ Thomas Burkhart

Hab dir ne Nachricht geschickt! Wegen dem Testboard!

MFG
Thomas

von Thomas I. (thomasi)


Lesenswert?

Hallo,


Heute habe ich die Displays mit dem EA Testboard getestet, siehe da 
beide funktionieren!

Ich versteh die Welt nicht mehr...

Was mache ich falsch bei meiner Initialisierung?

Jetzt werde ich mal versuchen die Schaltung auf dem Testboard zu 
verifizieren und mal mit dem Oszi die Signale tschecken...

Hat noch jemand einen Tipp für mich?


Mit besten Grüßen
Thomas

von Stephan (Gast)


Lesenswert?

Hi,

ist dein Schaltplan noch aktuell??
Wenn Ja schau dir nochmal den Anschluss Vlcd an!!!!
Der geht eigentlich gegen GND und nicht VCC.

mfg Stephan

von Thomas I. (thomasi)


Lesenswert?

Hallo,


@Stephan
Danke für die Info!
Den Kondensator an VLCD hab ich wohl verkehrt eingezeichnet...


Aber auch etwas Positives gibt es zu berichten:

Beide Displays funktionieren jetzt! Mein Fehler war, dass ich die 
Anschlussbelegung laut der Tabelle auf Seite 2 vom Datenblatt 
wahrgenommen habe. Doch wenn man auf die letzte Seite vom Datenblatt 
schaut, stehen neben den Pins auf der Zeichnung kleine Nummern dabei und 
die sind genau in umgekehrter Reihenfolge! Toll!!!

...ist mir fast ein bisschen peinlich ;-)


MFG
Thomas

von Thomas B. (escamoteur)


Lesenswert?

uups, von welchem Datenblatt sprichst Du? ich hab einfach die tabelle 
aus dem von Electronic Assembly genommen und das hat gepasst.
Tom

von Thomas I. (thomasi)


Angehängte Dateien:

Lesenswert?

Wenn man diese beiden Bilder betrachtet sieht man das die Pinreihe 17 
bis 32 genau um 180° verdreht ist. Ich hab mich natürlich auf die 
Tabelle verlassen und hab erst gar nicht bei den Zeichnungen darauf 
geachtet, leider!

MFG
Thomas

von Thomas B. (escamoteur)


Lesenswert?

:-) Tja, so liegt der Teufel im Detail, aber immerhin läufts jetzt.

Tom

von werner1 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo
Ich möchte ein EADOGXL 160-7 anschließen. Ist der Anschluss wie im 
Anhang richtig? Wie groß muss der Pull-up Widerstand sein? Er ist direkt 
an einen Atemega 32 über I²C angeschlossen.

Vielen Dank

von werner1 (Gast)


Lesenswert?

Kann ich für die Kondensatoren ELKOS einsetzen oder müssen es 
Tantalkondensatoren am UC1610 sein?

von Thomas I. (thomasi)


Lesenswert?

Hallo,

Ja, dein Schaltplan ist so Richtig. Falls du dir den Pin für den Display 
Reset sparen willst, kannst du den Reset einfach auf 3,3V legen. Für die 
Wahl der Pullups sind die Leitungslänge/Kapazität und die Busfrequenz 
entscheidend. Meistens verwende ich 4,7k oder 3,3k...

Es müsste auch mit normalen Elkos funktionieren, ich verwende jedoch 
immer Tantalelkos.

mfg
Thomas

von spess53 (Gast)


Lesenswert?

Hi

>Es müsste auch mit normalen Elkos funktionieren, ich verwende jedoch
>immer Tantalelkos.

Von EA werden Keramik-Cs empfohlen. Benutze ich bei allen Dog-Displays.

MfG Spess

von werner1 (Gast)


Lesenswert?

statt den 3x 1µF könnte ich dort auch 3x 2,2µF einsetzen oder würde sich 
hier ein defekt nach sich ziehen ?

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.