void setup() routine funktioniert nicht?

Gast #5942531
Lesenswert?

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?
Gast #5949461
Lesenswert?

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.
Gast #5949822
Lesenswert?

@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.
Gast #5949827
Lesenswert?

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
}
Gast #5950140
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren