Forum: Mikrocontroller und Digitale Elektronik I2C Bus und Stop Befehl


von Klaus (Gast)


Lesenswert?

Hallo
Zum schalten einer LED über den I2C Bus verwende ich diesen Code:
1
int main(void)
2
{                    // Hauptprogramm
3
  i2c_init ();
4
  i2c_start(adr1_w);          // Schreibbefehl adr 1
5
  // 1.Zahl LED 5-8, 2.Zahl LED 1-4
6
  i2c_write(0xff);          // Alle Pins des PCF auf 0 0xff
7
  //i2c_stop();
8
  
9
  while(1)
10
  {                  // Hauptschleife
11
    i2c_write(0xff);        // Alle Pins des PCF auf 0
12
    i2c_start(adr1_r);        // Starte Lesezugriff
13
    d=i2c_readNak();        // Schreib Leseergebnis in d
14
    //i2c_stop();
15
16
    if (~d & 0x04)          // Abfrage T3   0x04
17
    {                // Wenn T3 gedrückt ist...
18
      i2c_start(adr1_w);      // Schreibbefehl
19
      e = 0xaf;          // Angabe LED Ausgänge 1.Zahl
20
      i2c_write(e);        // Schreibe e
21
      //i2c_stop();
22
      _delay_ms(100);        // 100ms warten
23
    }
24
    else
25
    {
26
      e = 0xff;          // alle LED aus
27
      i2c_start(adr1_w);      // Schreibbefehl
28
      i2c_write(e);        // Schreibe e
29
      //i2c_stop();
30
    }
31
  }
32
  _delay_ms(100);
33
  //i2c_stop();
34
}
Die Befehle i2C_stop() habe ich auskommentiert. Wenn ich diese wieder 
freigebe läuft der Code nicht mehr. Dachte bisher. das nach jedem Aufruf 
des Slave ein Stop folgen muss.
Denkfehler?
LG KL

: Verschoben durch User
von Rene K. (xdraconix)


Lesenswert?

WAS für einen Slave hast du denn?!

von Baldrian (Gast)


Lesenswert?

> Dachte bisher, dass nach jedem Aufruf des Slave ein Stop folgen muss.

Was sagt denn das Datenblatt dazu?

von Klaus (Gast)


Lesenswert?

Verwende einen PCF8574. Habe damit 4xLED und 4xTaster ausgelesen bzw. 
angesteuert.

von TK (Gast)


Lesenswert?

Hallo Klaus,

mal ein kleiner Tipp:
Zeichne Dir mal ein Diagramm (falls kein Oszi vorhanden ist) von der 
Übertragung (SCL und SDA). Dann wirst Du relativ schnell erkennen, wo 
der Fehler liegt, und wieso ein Stopp in Deinem Code diese Auswirkung 
hat.

Noch ein Tipp:
Mit Deiner "main" alleine kann man nur dann was anfangen, wenn die 
Unterroutinen auch allen Unwissenden zugänglich gemacht werden.

Gruß
TK

von DraconiX (Gast)


Lesenswert?

Zumindest fehlt in der Abfrage von d die ACK Abfrage. Auch verstehe ich 
nicht warum... Wenn er ein N-ACK bekommt, wieder drauf geschrieben wird? 
Das würde doch eine Abbruch implizieren und einen erneuten Start der 
gesamten Routine.

Deswegen schließe ich mich meinem Vorredner an: Mal dir ein 
Ablaufdiagramm auf.

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.