Ausgänge PCF8574 einzeln unabhängig schalten

Gast #5032379
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
Gast #5032385
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
Gast #5032509
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
Gast #5032840
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?

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