Hallo ich habe ein Problem, was mir unerklärlich ist. Bis eben hat
tatsächlich noch alles funktioniert, bis ohne Änderung von mir auf
einmal ein seltsamer Fehler auftrat.
An meinem Arduino hängt ein Relay mit dem PCF8574.
Wenn ich in der setup() routine nun:
pcf8574.digitalWrite(P3, HIGH);
Aufrufe um einen der Pins aus zu stellen reagiert das PCF nicht.
wenn ich in der loop() dieselbe Zeile aufrufe klappt es aber.
Ich verstehe nicht woran das liegen kann, die adresse für den pcf8574
wird bereits vor der setuproutine festgelegt.
Habt ihr eine Idee?
Gerne. In der Void-Setup rufe ich folgendes auf:
pcf8574.pinMode(P0, OUTPUT); // Pin des Expensionboards als Output
pcf8574.pinMode(P1, OUTPUT); // Pin des Expensionboards als Output
pcf8574.pinMode(P2, OUTPUT); // Pin des Expensionboards als Output
pcf8574.pinMode(P3, OUTPUT); // Pin des Expensionboards als Output
pcf8574.pinMode(P4, OUTPUT); // Pin des Expensionboards als Output
pcf8574.pinMode(P5, OUTPUT); // Pin des Expensionboards als Output
pcf8574.pinMode(P6, OUTPUT); // Pin des Expensionboards als Output
pcf8574.pinMode(P7, OUTPUT); // Pin des Expensionboards als Output
pcf8574.digitalWrite(P0, HIGH); // Pin des Expensionboards "HIGH"
pcf8574.digitalWrite(P1, HIGH); // Pin des Expensionboards "HIGH"
pcf8574.digitalWrite(P2, HIGH); // Pin des Expensionboards "HIGH"
pcf8574.digitalWrite(P3, HIGH); // Pin des Expensionboards "HIGH"
pcf8574.digitalWrite(P4, HIGH); // Pin des Expensionboards "HIGH"
pcf8574.digitalWrite(P5, HIGH); // Pin des Expensionboards "HIGH"
pcf8574.digitalWrite(P6, HIGH); // Pin des Expensionboards "HIGH"
pcf8574.digitalWrite(P7, HIGH); // Pin des Expensionboards "HIGH"
pcf8574.begin(); // Expensionboard initalisieren
Wire.begin(0x10);
Als Library benutze ich die PCF8674.h von Renzo (MIT Lizenz).
Derselbe Code führt in einer Loop sofort dazu das das Relais getriggert
wird. Ich kann mir nicht genau erklären woran das liegt, vllt irgendwas
mit dem Strom? Mir fallen einfach keine Gründe ein die dieses Verhalten
bewirken können.
> pcf8574.begin(); // Expensionboard initalisieren
Schau mal nach was das so alles mit den Pins anstellt. Das machst Du
doch bestimmt in der Loop() nicht nochmal.
Nils schrieb:> In der Void-Setup rufe ich folgendes auf: ...
Und in welcher Reihenfolge?
Vielleicht zeigst du doch mal den wesentlichen Teil des Programms. Acht
mal die Pininitialisierung und acht mal das Setzen eines Pins, nur mit
geänderter Pin-Nummer, zähle ich nicht zu "wesentlich".
Nils schrieb:> Wire.begin(0x10);
Willst du Slave oder Master sein? So bist du Slave
Das PCF8574.begin() initialisiert das Wire schon als Master. Das machst
du durch deinen Wire.begin dann gleich wieder rückgängig
@Wolfgang
Ich verstehe nicht genau was du meinst, genau das ist was ich in der
void setup() aufrufe. Ich will lediglich, dass die PINS des
Expensionboards auf HIGH gesetzt werden, damit die Heizelemente dahinter
aus sind.
Wenn ich die PINS genau mit demselben Code wie dort aus der void setup()
in die void loop() kopiere, funktioniert alles.
Timmo H. schrieb:> Nils schrieb:>> Wire.begin(0x10);> Willst du Slave oder Master sein? So bist du Slave> Das PCF8574.begin() initialisiert das Wire schon als Master. Das machst> du durch deinen Wire.begin dann gleich wieder rückgängig
Ich verstehe nicht genau was du meinst, vielleicht liegt es daran?
Das Wire.begin(0x10) stelllt die I2C Verbindung zu einem zweiten Arduino
her
wo ein Wire.OnRequest() Event implementiert ist, dass einige Sensoren
ausliest.
Ich verstehe jetzt nicht ganz wo das Problem hier liegt.
Timmo H. schrieb:> Das machst> du durch deinen Wire.begin dann gleich wieder rückgängig
Nein!
Timmo H. schrieb:> Das PCF8574.begin() initialisiert das Wire schon als Master.
Ja. Aber nur als Master.
Nils schrieb:> Wire.begin(0x10);
Danach spielt Wire im Master und Slave Mode.
Also nix rückgängig.
Nils schrieb:> Ich verstehe nicht genau was du meinst, vielleicht liegt es daran?> Das Wire.begin(0x10) stelllt die I2C Verbindung zu einem zweiten Arduino> her
Nöö, das tut es nicht.
Es stellt keine Verbindung zu einem zweiten Arduino her.
Sondern, es macht den Arduino, auf dem es ausgeführt wird zum Slave mit
der Adresse 0x10.
Weiterhin kann und darf dieser auch danach noch die Master Rolle
spielen.