Arduino Mega und PCF8574AP [solved]

Hallo Forum,
ich habe vielleicht ein Probel mit meinem Schaltplan. Leider komme ich nicht darauf, wo ein Fehler liegen könnte:

Ich habe auf einer Platine eine RTC mit einem DS1307. Diese funktioniert Problemlos. Auf der gleichen Platine ist ein PCF8574AP, der ebenfalls am gleichen i2c-Bus hängt. Hiermit habe ich auch fast keine Probleme.

Die E/A-Pins habe ich mit einem 10K-Ohm Widerstand auf +5V gelegt. Wenn ich nun den Pin mit masse verbinde, macht P0 bis P6 genau das, was sie sollen, nämlich eine 0 zurückgeben. Bei P7 erhalte ich aber ein anderes Ergebnis.

Mit diesem Sketch teste ich den PCF8574AP

#include <Wire.h>

void setup()
{
  Wire.begin();         // join i2c bus (address optional for master)
  Serial.begin(9600);  // start serial for output
}

void loop()
{
  Wire.requestFrom(B0111000,1);    // request 6 bytes from slave device #2
//  Serial.println("start reading...");
  while(Wire.available())                 // slave may send less than requested
  {
    char c = Wire.read();                // receive a byte as character
    Serial.println(c, BIN);                // print the character
  }
//  Serial.println("end reading...");
  delay(2000);
}

Das ist lediglich ein etwas Modifiziertes “Wire.Read” Beispiel. Dabei bekomme ich folgende Ausgaben:

P0:11111111111111111111111111111110
P1:11111111111111111111111111111101
P2:11111111111111111111111111111011
P3:11111111111111111111111111110111
P4:11111111111111111111111111101111
P5:11111111111111111111111111011111
P6:11111111111111111111111110111111
P7:1111111

Ich habe dabei leider keine Ahnung, ob dies normal ist, oder ob irgenwo ein Hardwarefehler vorliegt. Den PCF8547AP habe ich bereits gegen einen neuen getauscht. Hierbei habe ich das selbe Problem. Kurzschlüsse konnte ich auf der Platine ebenfalls nicht finden. Diese ist so aufgebaut:

Kann mir jemand erklären, warum dies ausgerechnet beim MSB auftritt? Ist hier ein Pufferüberlauf schuld?

mfg
Thomas Pfaffinger

Hallo Thomas,

das Problem könne in dieser Zeile liegen: char c = Wire.read();

Probiere das mal mit: byte c = Wire.read();

Das 'Problem' ist, dass sich der Typ char wie ein 'signed byte' verhält und bei Werten > 128 negativ wird.

Gruß

Martin

Hallo Martin, leider nicht. Die Ausgabe hat sich dadurch geändert, aber das Problem bleibt.

P0:11111110 P1:11111101 P2:11111011 P3:11110111 P4:11101111 P5:11011111 P6:10111111 P7:1111111

Was interesant ist: Wenn ich P6+P7 auf Masse ziehe, sieht das Ergebnis so aus: 111111

Daran kann es leider nicht liegen. Ich habe bei meinen Nachforschungen auch jemanden gefunden, der eventuell das gleich eProblem hat. Leider in einem Polnischen Forum: Thread

Und dankt der Maschinellen Übersetzung kann ich davon ausgehen, dass er das gleiche Problem hat. Aber was genau, und ob es gelöst wurde.....

mfg Thomas Pfaffinger

Was interesant ist: Wenn ich P6+P7 auf Masse ziehe, sieht das Ergebnis so aus: 111111

Führende Nullen werden unterdrückt. B111111 entspricht B00111111 und somit P7 und P6 auf LOW.

Müßte dann nicht alles richtig sein?

Grüße Uwe

Hallo Uwe,
Danke, Problem gelöst. Gibts eine Möglichkeit, unterdrückte Nullen anzuzeigen?

mfg
Thomas Pfaffinger

So einfach weiß ich nichts. Das einzig was mir einfällt ist jedes Bit kontrollieren und eine 1 oder 0 ausgeben. Grüße Uwe