Forum: Mikrocontroller und Digitale Elektronik PCF8574N Daten lesen


von Andreas M. (burns)


Angehängte Dateien:

Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

>test=pcf8574_get_inputs (2);

Ein PCF8574N hat die Grundadresse 0x20.

MfG Spess

von isnah (Gast)


Lesenswert?

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"

von isnah (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Andreas M. (burns)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Andreas M. (burns)


Lesenswert?

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;
}

von Andreas M. (burns)


Lesenswert?

Hat noch jemand eine Idee?

von Klaus (Gast)


Lesenswert?

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

von burns1111@gmx.de (Gast)


Lesenswert?

ja habe ich, so verschalten


Kann die Taktrate von ca. 1,6 kHz ein Problem sein?

von Falk B. (falk)


Lesenswert?

Nein, I2C arbeitet beliebig langsam, wie SPI, weil es synchron (mit 
Taktleitung) ist.

von isnah (Gast)


Lesenswert?

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?

von Andreas M. (burns)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

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
Noch kein Account? Hier anmelden.