Hallo, ich setze einen PCF8574N ein und will Daten von diesem lesen. Leider bekomme ich keine Eingänge zurückgeliferet wenn ich meine Abfrage über den I²C starte. Am P4 hängt ein Schalter und zu Testzwecken wollte ich am PORT B ein Paar LED's leuchetn lassen. Mein Programm habe ich gleich mal mit angehangen. Wenn ich das auf meinen Atmega 16 lade stelle ich fest das meine LED nix tun am PORT B. scheinbar bleit das Programm im Befehl "test=pcf8574_get_inputs (2);" hängen und arbeitet den Rest der schleife nicht ab. Kann mir hier jemand einen Tip geben? Im Anhnag ist auch mal die Bibliothek für den PCF Baustein. In vorherigen Test hat ein schreiben auf die Ports funktioniert nur leider das lesen nicht. Danke
Hast du am PCF8374 A0 und A3 auf GNG und A2 auf VCC gelegt? dann heisst der Functionaufruf zum Lesen: test=pcf8574_get_inputs (42); ALso "Grundadresse | deine Adresse"
Korrektur: Selbstverständlich muss A1 und A2 auf GND und A0 auf VCC gelegt werden damit die Adresse 0x42 stimmt. Das LSB ist das R/W-Befehlsbit
Hi >Selbstverständlich muss A1 und A2 auf GND und A0 auf VCC gelegt werden >damit die Adresse 0x42 stimmt. Wie kommst du aus 42? 0x20 ist dezimal 32. Und das wird in pcf8574_send_add_rw um ein Bit nach links geschoben und mit dem RW-Bit versehen. MfG Spess
Das mit der Grund adresse ist mir schon klar. Ich übergebe der Funktion aber nicht die Grundadresse sondern die "normale "I²C Slaveadresse. Weil in der Unterfuntion "pcf8574_send_add_rw" wird aus meiner normalen Adresse doch die richtige I²C Adresse generiert. Oder habe ich hier ein Verständnisproblem?? Wenn ich mir das ganze im Simulator anschaue bekomme ich die Adresse für den i2C von 0b01000101 oder 45hex generiert. Das müßte meiner Meinung nach passen wenn ich A0 und A2 auf GND und A1 auf +5V verschalten habe.
Hi >Ich übergebe der Funktion >aber nicht die Grundadresse sondern die "normale "I²C Slaveadresse. >Weil in der Unterfuntion "pcf8574_send_add_rw" wird aus meiner normalen >Adresse doch die richtige I²C Adresse generiert. Oder habe ich hier ein >Verständnisproblem?? Nein. Aber erkläre doch mal, was du hiermit test=pcf8574_get_inputs (2); adressierst? MfG Spess
mit test=pcf8574_get_inputs (2); rufe ich die Funktion "pcf8574_get_inputs (2);" auf undübergebe die Slaveadresse 2. Die Funktion beinhaltet den Funktionaufruf "pcf8574_send_add_rw (address, 1);" In der Funktion passiert doch folgendens: -->ich bekomme übergeben eine 2 für Variable address unsigned char pcf8574_send_add_rw (unsigned char address, unsigned char rw) { ... addr_byte = address << 1; // hier schiebe ich meine Adresse 2 um 1 es entsteht aus 0b00000010 ein 0b00000100 addr_byte |= rw; // hier wird das R/W gesetzt Ergebniss 0b00000101 addr_byte |= 0b01000000; //setzen der Grundardess Ergebniss 0b01000101 TWDR = addr_byte; // hier wird díe fertige I²C Adresse übergeben TWCR = (1<<TWINT) | (1<<TWEN); while (!(TWCR & (1<<TWINT))); return TWSR; }
Andreas Meissner schrieb: > //setzen der Grundardess Ergebniss 0b01000101 Also du sendest die Adresse 45h zum auslesen. Hast du den PCF8574N auch Hardwaremäßig auch so angeschlossen?? Also ich meine: A0 = GND A1 = VCC A2 = GND
ja habe ich, so verschalten Kann die Taktrate von ca. 1,6 kHz ein Problem sein?
Nein, I2C arbeitet beliebig langsam, wie SPI, weil es synchron (mit Taktleitung) ist.
Hast du die Pullup-Widerstände bei SCL und SDA gesetzt DDRC &= ~((1<<SCL) | (1<<SDA)); PORTC |= (1<<SCL) | (1<<SDA); oder externe Widerstände eingelötet?
Ich habe externe Widerstände gesetzt. Nur ist es so in meinem Aufbau das die nicht am ende der Leitung sind sondern am Anfang, aber bei einer Kabellange von 50cm denke ich nicht das es ein Problem ist oder habt Ihr andere Erfahrungen damit?
Der Ort der Pull-Up Widerstände ist unkritisch. Betreibe eine systematische Fehlersuche. Zuerst muss der IC auf die Adresse mit ACK antworten. Tut er das nicht, ist die Adresse falsch oder es gibt eine Störung bei der Übertragung. Das kann man messen und danach entsprechnend handeln.
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.