I2C Bus und Stop Befehl

Gast #5102396
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
Gast #5103070
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

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