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?
Mehr Code bitte. Pinmode gesetzt und begin gemacht? Welche lib verwendest du?
:
Bearbeitet durch User
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
:
Bearbeitet durch User
@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.
1 | void setup() |
2 | {
|
3 | Wire.begin(); // hier leider überflüssig |
4 | |
5 | pcf8574.begin(0x20); // Expensionboard initalisieren |
6 | |
7 | wire.begin(0x10); // wenn es zusätzlich als Slave laufen soll |
8 | |
9 | |
10 | pcf8574.pinMode(P0, OUTPUT); // Pin des Expensionboards als Output |
11 | pcf8574.pinMode(P1, OUTPUT); // Pin des Expensionboards als Output |
12 | pcf8574.pinMode(P2, OUTPUT); // Pin des Expensionboards als Output |
13 | pcf8574.pinMode(P3, OUTPUT); // Pin des Expensionboards als Output |
14 | pcf8574.pinMode(P4, OUTPUT); // Pin des Expensionboards als Output |
15 | pcf8574.pinMode(P5, OUTPUT); // Pin des Expensionboards als Output |
16 | pcf8574.pinMode(P6, OUTPUT); // Pin des Expensionboards als Output |
17 | pcf8574.pinMode(P7, OUTPUT); // Pin des Expensionboards als Output |
18 | |
19 | pcf8574.digitalWrite(P0, HIGH); // Pin des Expensionboards "HIGH" |
20 | pcf8574.digitalWrite(P1, HIGH); // Pin des Expensionboards "HIGH" |
21 | pcf8574.digitalWrite(P2, HIGH); // Pin des Expensionboards "HIGH" |
22 | pcf8574.digitalWrite(P3, HIGH); // Pin des Expensionboards "HIGH" |
23 | pcf8574.digitalWrite(P4, HIGH); // Pin des Expensionboards "HIGH" |
24 | pcf8574.digitalWrite(P5, HIGH); // Pin des Expensionboards "HIGH" |
25 | pcf8574.digitalWrite(P6, HIGH); // Pin des Expensionboards "HIGH" |
26 | pcf8574.digitalWrite(P7, HIGH); // Pin des Expensionboards "HIGH" |
27 | |
28 | |
29 | }
|
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.
Arduino Fanboy D. schrieb: > Nöö, das tut es nicht. Du hast es schwer. Bist Du eigentlich auch in "reinen" Arduino-Foren unterwegs?
Johann J. schrieb: > Du hast es schwer. Da hast du allerdings voll Wahr! Meinen Dank, für dein Mitgefühl! Ja, "hier" ist es schon mal schwer. ;-)
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.