Forum: Mikrocontroller und Digitale Elektronik void setup() routine funktioniert nicht?


von Nils (Gast)


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?

von Timmo H. (masterfx)


Lesenswert?

Mehr Code bitte. Pinmode gesetzt und begin gemacht? Welche lib 
verwendest du?

: Bearbeitet durch User
von Nils (Gast)


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.

von Jim M. (turboj)


Lesenswert?

>  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.

von Wolfgang (Gast)


Lesenswert?

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".

von Timmo H. (masterfx)


Lesenswert?

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
von Nils (Gast)


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.

von Einer K. (Gast)


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
}

von Einer K. (Gast)


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.

von Johann J. (johannjohanson)


Lesenswert?

Arduino Fanboy D. schrieb:
> Nöö, das tut es nicht.

Du hast es schwer. Bist Du eigentlich auch in "reinen" Arduino-Foren 
unterwegs?

von Einer K. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.