Forum: Mikrocontroller und Digitale Elektronik Ausgänge PCF8574 einzeln unabhängig schalten


von Klars (Gast)


Lesenswert?

Hallo
mit diesem Programm schalte ich jeweils 1 Ausgang des PCF.
1
void led_blinken1()
2
  {
3
  lauf1++;
4
  if(lauf1==1000)
5
    {
6
      PORTA &= ~(1<<PA0);      // Schaltet Pin
7
      i2c_start(adr2_w);      // Schreibbefehl für Device 1
8
      i2c_write(0xfe);      // Alle 
9
      i2c_stop();
10
    }
11
  else
12
    {
13
    if(lauf1==2099)
14
      {
15
      PORTA |= (1<<PA0);    // Schaltet Pin
16
      
17
      i2c_start(adr2_w);    // Schreibbefehl für Device 1
18
      i2c_write(0xff);    // Alle 
19
      i2c_stop();
20
      lauf1=0;
21
      }
22
    }
23
  }
mit 0xfe schalte ich z.B. Ausgang 1 ein. Mit 0xff schalte ich alles aus.
Mit dem gesamten Programm schalte ich unabhängig von einander bis zu 8 
Ausgänge. Alle zu unterschiedlichen Zeiten.
Wie kann ich den Ausgang ausschalten ohne die anderen zu beeinflussen, 
da sie zeitversetzt schalten?
LG Klars

: Verschoben durch Moderator
von Christian M. (Gast)


Lesenswert?

In Deinem Programm beeinflusst Du die Anderen ja gar nicht!
Normal mit einer Variablen, in der Du die (Bit-)Manipulationen machst, 
und dann den Inhalt in den PCF sendest.
Was meinst Du mit "zeitversetzt"?

Gruss Chregu

von knollo (Gast)


Lesenswert?

Hallo !

Ich mache das so:
1
// Bits auf 1 setzen, auf 1 stehende Bits werden gesetzt
2
void outSet(uint8_t set, uint8_t adress) {
3
  uint8_t maske;
4
5
  Wire.requestFrom(adress, 1);
6
  if (Wire.available())   // slave may send less than requested
7
  {
8
    maske = Wire.read();    // receive a byte
9
  }
10
11
  maske = maske ^ B11111111; // Bits negieren, da Ein = Low
12
  maske = maske | set;
13
  maske = maske ^ B11111111;
14
15
  Wire.beginTransmission(adress);
16
  Wire.write(maske); // Ausgänge setzen
17
  Wire.endTransmission(adress);
18
}
19
20
// Ausgänge abschalten, auf 0 stehende Bits werden zurückgesetzt
21
void outunSet(uint8_t set, uint8_t adress) {
22
  uint8_t maske;
23
24
  Wire.requestFrom(adress, 1);
25
  if (Wire.available()) {
26
    maske = Wire.read();   // slave may send less than requested
27
  }
28
29
  maske = maske ^ B11111111; // Bits negieren, da Ein = Low
30
  maske = maske & set;
31
  maske = maske ^ B11111111;
32
33
  Wire.beginTransmission(adress);
34
  Wire.write(maske); // Ausgänge setzen
35
  Wire.endTransmission(adress);
36
}
Gut, ist für Arduino und geht bestimmt auch besser, aber vielleicht 
hilft's ja.
MfG

von Klars (Gast)


Lesenswert?

Das mit "zeitversetzt" meine ich mit, nehme 8 verschiedene Ausgänge an 
dem PCF. Jeder Ausgang soll unabhängig vom anderen schalten. Dadurch 
erscheint eine Art "Zufallsmuster". Das mache ich mit 8 Zählern (wie 
oben), jeder Zähler schaltet einen Pin vom PCF ein und aus. Das 
einschalten klapp ganz gut. Nehme z.B. Ausgang 8 0xfb und für Ausgang 1 
0xfe. Wie kann ich aber danach nur den Ausgang 1 abschalten?

von Christian M. (Gast)


Lesenswert?

Klars schrieb:
> Wie kann ich aber danach nur den Ausgang 1 abschalten?

Mit dem & Operator auf Dein Shadow-Register! Oder mit bitClear()!

Gruss Chregu

von Falk B. (falk)


Lesenswert?

Bitte den Beitrag verschieben.

von Klars (Gast)


Lesenswert?

Hallo

Christian M. schrieb:
> Mit dem & Operator auf Dein Shadow-Register! Oder mit bitClear()!

Könntest du mir das an einem Beispiel zeigen?

von Christian M. (Gast)


Lesenswert?

Das meinst Du jetzt aber nicht im Ernst!?
Ich meine, kein C++ zu können, aber mit den Beispielen auf der 
Arduino-Seite kann das jeder hinkriegen!

Gruss Chregu

von Bastian W. (jackfrost)


Lesenswert?

Du hast eine uint8 Variable bei der du die Bits der Ausgänge änderst die 
geändert werden sollen. Und nach jeder Änderung schickst du das Byte an 
den PCF.

Gruß JackFrost

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.