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
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
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
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
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
Hast Du die Pull-ups an den ATmega-Pins abgeschaltet?
Hi,
>Hast Du die Pull-ups an den ATmega-Pins abgeschaltet?
Die Atmega internen Pull-Ups sind natürlich deaktiviert!
MFG
Thomas
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
... 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
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
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
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
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
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
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
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
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
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
@ Thomas Burkhart Hab dir ne Nachricht geschickt! Wegen dem Testboard! MFG Thomas
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
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
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
uups, von welchem Datenblatt sprichst Du? ich hab einfach die tabelle aus dem von Electronic Assembly genommen und das hat gepasst. Tom
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
:-) Tja, so liegt der Teufel im Detail, aber immerhin läufts jetzt. Tom
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.