Forum: Mikrocontroller und Digitale Elektronik Portexpander PCF8574


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Rainer (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich habe ein seltsames Verhalten bei dem Portexpander PCF8574 (I2C 
Bus)festgestellt. Auch nach mehrtägiger Untersuchung des Problems habe 
ich keine schlüssige Erklärung.

Ich betreibe den PCF8574 an der TWI Schnittstelle (PORTC) eines XMEGA32

Mit folgendem Code lese ich den PCF8574 ein.

// Read byte
uint8_t PCF8574_IO_Read(uint8_t address)
{
  // prepare PCF8574 for read
  Write_byte(address, 0xff);
  // Wait for transmission complete
  while(!(Port_TWI.MASTER.STATUS & TWI_MASTER_WIF_bm));

  // Send address
  Send_Address_PCF8574(address, 1);
  // Wait for transmission complete
  while(!(Port_TWI.MASTER.STATUS & TWI_MASTER_RIF_bm));

  // send TWIF Stop
  Port_TWI.MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc;

  // Get Data
  return Port_TWI.MASTER.DATA;
}

Funktioniert einwandfrei, solange man nicht den P7-Eingang auf "0" legt.
Siehe Anhang FF.jpg (eish...sollte 7F heißen)

Ist Bit 7 "1" funktioniert es (siehe Anhang BF.jpg)

Auf dem Logikanalyser sieht man, dass SDA nicht wieder auf "1" geht, 
wenn P7 bei der Einlesung auf "0" lag.
Was ich nicht verstehe, wieso hat der Status eines Portpins überhaupt 
Einfluss auf die Bussignale. Wie gesagt, nur das Bit 7.

Hab es mit mehreren ICs ausprobiert, SMD, SIL. Identisches Verhalten.

Für jeden Tip bin ich dankbar, da mich das Teil in den Wahnsinn treibt 
:-)

LG
Rainer

von Gerd E. (robberknight)


Bewertung
0 lesenswert
nicht lesenswert
Rainer schrieb:
> Funktioniert einwandfrei, solange man nicht den P7-Eingang auf "0" legt.

wie legst Du den genau auf "0"? Direkt an GND oder über einen 
Widerstand?

Hast Du mal die tatsächliche Spannung am Pin 7 mit Multimeter/Oszi 
gemessen?

Der PCF8574 hat keine Umschaltmöglichkeit zwischen Ein- und Ausgängen, 
er verwendet stärkere Pullups. Wenn Du jetzt einen Pin über nen 
Widerstand auf 0 legen willst, aber durch den Pullup irgendwo in der 
Mitte landest, bist Du im undefinierten Bereich und das kann der IC Dir 
übel nehmen.

Der MCP23008 hat echte GPIOs mit Richtungsumschaltung und ist daher 
weniger zickig.

von Rainer F. (cnccontroller)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

der Pin7 liegt direkt auf GND.

Bei allen anderen PINs funktioniert es einwandfrei. Nur wenn Pin7 bei 
der Einlesung auf GND liegt nicht.

D.h. bei allen Einlesungen an den Portpins > 0x80 funktioniert es nicht, 
unter 0x80 funktioniert es einwandfrei.


R.

von Klaus R. (klara)


Bewertung
0 lesenswert
nicht lesenswert
Rainer schrieb:
> Funktioniert einwandfrei, solange man nicht den P7-Eingang auf "0" legt.
> Siehe Anhang FF.jpg (eish...sollte 7F heißen)

Ich setze den PCF8574 seit über 10 Jahren ein. Mit diesem IC hatte ich 
noch nie Probleme gehabt. Es ist zudem sehr einfach und auch robust. Wie 
sieht denn Deine Schaltung und Dein Aufbau aus. Könnte Port 7 (12) und 
SDA (15) vielleicht einen Kurzschluß haben? Das wäre meine Vermutung.
mfg klaus

von Rainer F. (cnccontroller)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

HW ueberprüft, alles soweit ok. Die hatte ich auch im Verdacht.

Hab heute den ganzen Tag die Foren im Netz durchsucht. Hab auch jemanden 
gefunden, der auch das P7-Problem mit dem PCF8574 hatte.
Liegt an der SW.

Macht man es so (s. u.), funktioniert es. Warum die ursprüngliche 
Version aber genau mit dem Bit P7 ein Problem hat und alle anderen 
funktionieren, ist nicht herauszufinden.

Egal, nun funktioniert es.

Vielen Dank für die Hilfe

// Read byte
uint8_t PCF8574_IO_Read(uint8_t address)
{
  // prepare PCF8574 for read
  Write_byte(address, 0xff);
  // Wait for transmission complete
  while(!(Port_TWI.MASTER.STATUS & TWI_MASTER_WIF_bm));

  // send STOP command
  Port_TWI.MASTER.CTRLC =  TWI_MASTER_CMD_STOP_gc;

  // read Port
  Port_TWI.MASTER.ADDR = address + 1;
  while(!(Port_TWI.MASTER.STATUS & TWI_MASTER_RIF_bm));

  // send ACKACT and STOP command
  Port_TWI.MASTER.CTRLC = TWI_MASTER_ACKACT_bm |TWI_MASTER_CMD_STOP_gc;
}


Rainer

von Bernd K. (prof7bit)


Bewertung
0 lesenswert
nicht lesenswert
Beide Oszillogramme sehen seltsam aus. Was sind das für zwei langsame 
Takte am Ende auf SCL? Machst Du selbstgestricktes Software-I2C?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.