HILFE - New LiquidCrystal bekomme LCD via I2C nicht zum laufen

Hallo Forum,

bin total verzweifelt und weiß nicht mehr was ich machen soll.
Ich verwende Arduino 1.0 und habe mir die New LiquidCrystal hier https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home#!hw-configuration-and-schematics runtergeladen.

Ich muss via I2C ein 16x2 Display ansteuern. Auf der og. Seite verwenden die Leute einen PCF8574.
Diese habe ich mir nun gekauft und auf einem Breadboard mal aufgebaut. (Am PCF steht bei mir PCF8574AP)

Also Hardware ist genau nach dem Schaltplan von hier aufgebaut worden.https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!i2c-connection https://bytebucket.org/fmalpartida/new-liquidcrystal/wiki/i2c_lcd_schematic.jpg

So nun habe ich den ersten Sketch mal raufgespielt um zu sehen was das Diplay tut, jedoch passiert gar nix. Ich kann max den Contrast verändern, sonst sieht man nix am Display ausser dass die erste Zeile komplett ausgepixelt ist, d.h jeder Pixel ist aktiv und ein leichtes flackern ist bemerkbar. (siehe Foto)

http://img442.imageshack.us/img442/3763/imag0054x.jpg

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x38);  // Set the LCD I2C address

#define BACKLIGHT_PIN     13

void setup()
{
  // Switch on the backlight
  pinMode ( BACKLIGHT_PIN, OUTPUT );
  digitalWrite ( BACKLIGHT_PIN, HIGH );
  
  lcd.begin(16,2);               // initialize the lcd 

  lcd.home ();                   // go home
  lcd.print("Hello, ARDUINO ");  
  lcd.setCursor ( 0, 1 );        // go to the next line
  lcd.print (" WORLD!  ");      
}

void loop()
{

}

Der PCF8574 muss am I2C Bus funktionieren, denn ich habe am Arduino eine I2C Port Scanner laufen gehabt, welcher mir den richtigen Adresscode genannt hat. siehe Auszug ( jedoch in 56 Dezimal und eingeben tue ich in meinen Sketch den Hexadezimalen Wert 0x38 )

I2CScanner ready!
starting scanning of I2C bus from 1 to 100...
addr: 1       	addr: 2       	addr: 3       	addr: 4       
addr: 5       	addr: 6       	addr: 7       	addr: 8       
addr: 9       	addr: 10       	addr: 11       	addr: 12       
addr: 13       	addr: 14       	addr: 15       	addr: 16       
addr: 17       	addr: 18       	addr: 19       	addr: 20       
addr: 21       	addr: 22       	addr: 23       	addr: 24       
addr: 25       	addr: 26       	addr: 27       	addr: 28       
addr: 29       	addr: 30       	addr: 31       	addr: 32       
addr: 33       	addr: 34       	addr: 35       	addr: 36       
addr: 37       	addr: 38       	addr: 39       	addr: 40       
addr: 41       	addr: 42       	addr: 43       	addr: 44       
addr: 45       	addr: 46       	addr: 47       	addr: 48       
addr: 49       	addr: 50       	addr: 51       	addr: 52       
addr: 53       	addr: 54       	addr: 55       	addr: 56 found!
addr: 57       	addr: 58       	addr: 59       	addr: 60       
addr: 61       	addr: 62       	addr: 63       	addr: 64       
addr: 65       	addr: 66       	addr: 67       	addr: 68       
addr: 69       	addr: 70       	addr: 71       	addr: 72       
addr: 73       	addr: 74       	addr: 75       	addr: 76       
addr: 77       	addr: 78       	addr: 79       	addr: 80       
addr: 81       	addr: 82       	addr: 83       	addr: 84       
addr: 85       	addr: 86       	addr: 87       	addr: 88       
addr: 89       	addr: 90       	addr: 91       	addr: 92       
addr: 93       	addr: 94       	addr: 95       	addr: 96       
addr: 97       	addr: 98       	addr: 99       	addr: 100       

done

Ich habe schon Stunden verbracht und den Fehler hoffnungslos nicht gefunden.
Die Verdrahtung passt auch lt dem Plan.

Als Display verwende ich ein Sparkfun Display kompatibel zu Hitachi HD44780
Hättet ihr einen nützlichen Rat an mich …

danke schon mal im Voraus

lg
Dieter

Kann es sein, dass du dich auf Pin 35 auf dem Breadboard (das orangene Kabel) versteckt hast - sieht aus, als ob das auf Pin 36 zeigt... Würde auch zur Symptomatik passen: Es liegt kein passendes Datensignal an - die schwarzen Kästchen sagen aus, dass der Controller richtig initiallisiert wird.

hmm sieht irgendwie so aus als hätte ich mich da versteckt. kann es aber im moment nicht prüfen erst wieder am Abend, Ich hoffe dass es die Ursache war

Hallo

leider handelt es sich nicht um einen Steckfehler. :-(

lg

Versuchs mal mit der i2c Adresse 0xE0. Wenn alle Adresseingänge auf LOW sind, müsste das lt Datenblatt http://www.nxp.com/documents/data_sheet/pcf8574.pdf die richtige Adressierung sein.

Er hat geschrieben, er hat die A-Version. Da stimmt 0x38 schon, wenn alle Adresseingänge auf LOW sind. Die nicht A-Version des PCF8574 startet bei 0x20.

sorry , ich habe falsch herum gelesen. Es müsste 0x70 sein.

Mir ist es auf Breadboards schon häufiger passiert, dass der IC nicht alle Kontakte richtig berührte. Vielleicht steckst Du den IC einfach mal ein paar Positionen weiter und versuchst es da noch einmal.

Check mal mit dem Portscanner hier http://www.gammon.com.au/forum/?id=10896. Der hat meine I2C Adresse am PCF8574 (ohne "A") richtig erkannt.

Ich hab das ganze mal nachgebaut, da ich eh ein paar I²C-Sachen an meinem Raspberry Pi machen wollte.
Ich habe nach dem Schaltplan gebaut und mit der entsprechenden library und Deinem Sketch getestet. Hier das Ergebnis:

http://img513.imageshack.us/img513/7356/lcdi2c.jpg

Ich würde nochmals die Verkabelung und den festen Sitz des ICs kontrollieren.

EDIT: wie man sieht es geht auch manchmal ohne Pull-ups :wink:

Was genau tut der kleine Folienkondensator rechts neben dem Display?

markbee: Ich hab das ganze mal nachgebaut, da ich eh ein paar I²C-Sachen an meinem Raspberry Pi machen wollte. Ich habe nach dem Schaltplan gebaut und mit der entsprechenden library und Deinem Sketch getestet. Hier das Ergebnis:

http://img513.imageshack.us/img513/7356/lcdi2c.jpg

Ich würde nochmals die Verkabelung und den festen Sitz des ICs kontrollieren.

EDIT: wie man sieht es geht auch manchmal ohne Pull-ups ;)

vielen Dank dass du dir die Mühe gemacht hast und die Schaltung bei dir dahei nachgebaut hast. Ich musste gestern eine Alternative zum I2c Display als BackUp implementieren und werde nun die Schaltung am Breadboard prüfen. Was ich aber gemacht habe ist, die PCF mittels Portscanner zu finden und dieser findet ihn bei 56 (0x38) Verändere ich die logische Beschaltung bei A1,A2,A3 ( d.h von einstmal alle auf GND => teilweise Pins auf Vcc hängen ) so ändert sich auch richtig die Adresse.

Dann habe ich die Schaltung noch in einer jungfräulichen 1.0 Arduino getestet um sicher zu gehen, dass keine Verändeurngen in den Standard Libs einfluss darauf haben. Wieder mit dem selben Ergebnis.

Ich muss nun wirklich die Verbindungen vom PCF zum Display testen, denn wenn der I2C Scanner den PCF findet so passen ja mal alle Anschlüsse wie Versorgungsspannung, Adressdefinierung über die A1-A3 bzw die I2C Anschlüsse von SDA und SCL. Liege ich da mit meiner Fehlerausschlussdefinierung richtig? So kann der Fehler ja nur zwischen Display und der Steckverbindungen zum PCF liegen ????

lg Dieter

Check doch mal mit diesem kleinen Programm, ob die Ausgänge am PCF8574A an den Ausgängen im Sekundenrhythmus wechseln.
Dann die Adresse mal auf 0x70 ändern.

#include <Wire.h> 
#define expander 0x38

void setup() {
  Wire.begin();
}

void loop() {
  unsigned long starttime = millis();
  expanderWrite(B00000000);
  while(millis()-starttime < 1000){}
  expanderWrite(B11111111);
  while(millis()-starttime < 2000){}
}

void expanderWrite(byte _data ) {
  Wire.beginTransmission(expander);
  Wire.write(_data);
  Wire.endTransmission();
}

Ich hab das mit der Adressierung nochmal in verschiedenen Quellen gecheckt (hat mir doch keine Ruhe gelassen). Das von mir verlinkte Datenblatt ist tatsächlich an dieser Stelle falsch. Die korrekte Adresse für den PCF8574A mit A0, A1, A2=0 ist 0x38. (wie z.B. hier gezeigt http://www.ti.com/general/docs/lit/getliterature.tsp?baseLiteratureNumber=scyb031

… im übrigen kann er mit Deinem Sketch-Vorschlag auch nicht viel anfangen, weil ein LCD dranhängt. Dein Code würde nur mit LEDs o.ä. funktionieren.

... einfach den Pin mit einem Voltmeter messen oder falls nicht verfügbar eine LED mit Vorwiderstand an den Pin halten. Dem Display wird es nicht schaden, wenn's parallel dran hängt.

Hallo zusammen,

leider bin ich unterwegs und habe zur Zeit nicht die Hardware zum testen zur Hand. Ich werde in den nächsten 2 Tagen mal alle Verbindungen checken und hoffentlich rennt das Ding dann.

Bzgl der Adressierung: Wenn diese nicht 0x38 sein soll wieso erkennt der I2C Portscanner immer die 0x38? Kann sich dieser irren? PS bis dato habe ich nur diesen Portscanner ausprobiert: http://todbot.com/blog/2009/11/29/i2cscanner-pde-arduino-as-i2c-bus-scanner/ Den anderen muss ich erste testen....

Die Portscanner arbeiten nach dem Prinzip: ich frage alle möglichen I2C-Adressen (7 bit also max. 128 Adressen abzüglich einiger reservierter Adressen plus 8. bit (read/ write-bit)) ab und wer mir antwortet (in diesem Fall ein “ACK” vom Slave bekommt) den zeige ich als erreichbares I2C-Device. Von daher ist auch gesichert, dass die Verbindung über I2C (SDA/ SCL) bei Dir mit dem PCF8574A mit der in dem Sketch festgelegten Adresse 0x38 funktioniert. Die anderen hier erwähnten Adressen sind übrigens nicht typisch für den PCF8574 (Basisadresse 0x20) und PCF8574A (Basisadresse 0x38).
Ob es Sinn macht Bitmuster zu schicken, um die Funktion des Bausteins an sich zu testen, wenn die I2C-Verbindung steht, muss jeder für sich selber entscheiden. Ein defekter I/O-Expander, der aber auf die Adressanfrage korrekt antwortet ist wohl eher selten…
Übrigens sollte man beim Anschluss von LEDs vorsichtig sein, da der PCF8574 kaum Strom treiben kann (wenige 100µA). Wenn, dann sollte man ihn als Stromsenke benutzen (~25mA).