PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Display über I2C Portexpander ansteuern



MechMac
17.01.2011, 22:38
Hallo,

ich habe mich dazu entschieden ein Display über einen Portexpander anzusteuern. Das Problem ist: Das Display zeigt nichts an. Es könnte ein elektrisches Problem sein, genau so gut aber auch ein Programmiertechnisches.

Hier ein paar Infos:

Display: TC1602E-01 von Pollin (Google-suche nach D120420D.PDF)
Portexpander: PCF8574
Ich programmiere in C (AVR-Studio)
µC: ATmega 644
Quarz: 16 MHz

Was ich bereits geprüft habe, bzw. Hinweise:
Das Display hat im Vergleich zur "Norm" VCC und GND vertauscht.
Ich habe die A-version vom PCF8574. Also die Adresse 0x40.
SDA und SCL haben 10K Pullups.

A0,A1,A2 habe ich auf GND gezogen.
Den I2C Bus habe ich mit einem anderen I2C Modul (SD21 Servocontroller) getestet. Das funktionierte. Also daran liegts schonmal nicht.

Die Leitungen habe ich von den Beinchen des PCF8574 bis hin zum Display überprüft. Alle haben Kontakt und sind korrekt angeschlossen.

Das Programm habe ich hinzugefügt. Die Ansteuerungs-Scripte habe ich im Internet gefunden. U.a. wird auch die I2C-Software von Peter Fleury verwendet.

Ich habe in der i2clcd.h die Portpins angepasst.

Mir ist aufgefallen, das an VO eine Spannung von 5V anliegt. Sollte die aufgrund vom 10K Drehpoti nicht geringer sein? Vielleicht ist das Display dadurch einfach nur zu Hell? hatte aber auch schon einen normalen 10K Widerstand zwischen VO und VCC angeschlossen. Auch da 5V.

Wer kann mir da ein wenig helfen?
Gruß, Andreas

BMS
18.01.2011, 10:24
Hallo,
ohne deine Programme angeschaut zu haben:
Vo muss nahe 0Volt liegen. Laut Datenblatt:

Supply Voltage For LCD VDD-V0 4.7 V
Wobei Vdd ja 5V sind, Vo soll also 4,7V niedriger liegen, das wären 0,3V gegen GND gemessen.

Kann es sein, dass du das Poti irgendwie falsch verlötet hast? Falls du nur einen Widerstand verwendest, hänge ihn zwischen GND und Vo und schau nochmal.

Wenn das Display noch keine Daten entgegen genommen hat, müssen schwarze Blöcke in der oberen Zeile erscheinen!
=> I2C-Verbindung zum Atmega trennen und sehen, ob die Blöcke dargestellt werden.
Solange dann keine Blöcke erscheinen, ist der Kontrast noch falsch eingestellt.

Wünsche dir gutes Gelingen!
:wink:
Grüße,
Bernhard

MechMac
18.01.2011, 19:43
Hallo,

das die Balken nicht angezeigt wurden, lag an dem Spindeltrimmer. Ich wußte nicht das man da etwa 50 Umdrehungen braucht bis sich da was im Display tut. Nun sind da schöne schwarze Balken zu sehen.
Allerdings immer noch kein Text.

Das kann ja nur bedeuten, dass das Display keine Daten empfängt.

Ich habe nochmals in die Header geschaut ob ich nicht doch was vergessen haben könnte, aber ich wüßte nicht was.

Der muss doch nur die Pin-Konfiguration und die Device-Adresse wissen, oder?

Mal was anderes, der µc arbeitet automatisch im Master Betrieb? Könnte da vielleicht irgendetwas fehlen? Anderseits funktioniert der SD21 Servocontroller auch, also muss das ja irgendwie an dem Portexpander liegen.

Was kann man denn bei dem Teil so falsch machen?
Ich denke mal die Adresse 0x40 passt wenn ich A0,A1 und A2 auf GND gelegt habe. Ich muss doch nur einen davon auf VCC legen wenn ich mehrere Portexpander verwende, damit sie andere Adressen erhalten,
gell?
Ich habe gerade mal etwas ausprobiert. Da ich mir bezüglich der letzten Aussage unsicher war (A0,A1,A2 auf GND), habe ich mal die Adresse 0x4E verwendet. Das wäre die letzte Adresse. Damit hat sich das Programm aufgehangen, weil keiner geantwortet hat. Also muss die Adresse 0x40 korrekt sein.

Achja, den INT-Pin vom Portexpander habe ich nicht angeschlossen. Ich dachte mir das ich eh keine externen Interrupts dafür benötige.

Ich habe mich übrigens an diesem Projekt orientiert:
http://www.bralug.de/wiki/BLIT2008-Board-LCD

Da ist auch ein Testprogramm, dem ich diverse Zeilen entnommen habe.
Die Init und Ausgabe. Das Backlight habe ich weggelassen, da meines vorerst immer an ist.

Momentan bin ich ziemlich ratlos, weil ich irgendwie keinen Fehler entdecken kann.

Gruß, Andreas




###############################
Edit

Ich habe gerade folgendes ausprobiert:



// TWI initialisieren
i2c_init();

// LCD initialisieren
//lcd_init();

// LCD-Anzeige loeschen
//lcd_command(LCD_CLEAR);


// Text auf LCD ausgeben
//lcd_printlc(1,1,(unsigned char *)"TEST");
//lcd_printlc(2,1,(unsigned char *)"Hallo");

i2c_start_wait(LCD_I2C_DEVICE+I2C_WRITE);
i2c_write(0xF0);
i2c_stop();


Per Multimeter habe ich nun die Pinne durchgemessen. Das Ergebnis:
4x Low und 4x High.
Die Kommunikation zum Portexpander scheint also okay.
Merkwürdig ist, das es trotzdem nicht funktioniert. Außer schwarze Balken in Zeile 1 nix zu sehen.



###############################
Edit

Ist es möglich das es an der "Auflösung" der Matrix liegt?
Ich zähle 5X8 Punkte.

In der von mir beigefügten Datei i2clcd.c steht unter lcd_init(); jedoch 5x7.
Dummerweise kann man laut Header i2clcd.h nur zwischen 5x7 und 5x10 wählen. Wahrscheinlich wohl auch 5x8, aber welche HEX-Adresse wäre das denn dann?

Oder mal anders gefragt: Wenn diese "Auflösung" nicht stimmt, müsste dann nicht wenigstens der Befehl lcd_command(LCD_CLEAR); funktionieren? Also, müssten die schwarzen Blöcke nicht gelöscht werden?

Vielleicht kann mir ja jemand sagen, welche Adresse ich verwenden muss um die 5x8 zu verwenden.

MechMac
21.01.2011, 22:34
Habe den "Fehler" gefunden. Man darf nicht so dreist sein und eine andere Pinbelegung verwenden. Selbstverständlich habe ich diese in der Header-Datei entsprechend eingetragen, aber das ist wohl egal.
Man muss sich strikt an die ursprüngliche Liste halten:


PCF8574 <-> LCD
----------------------------------------------
P0 <-> DB4
P1 <-> DB5
P2 <-> DB6
P3 <-> DB7
P4 <-> RS
P5 <-> R/W
P6 <-> -
P7 <-> Enable