Erstmal danke für Eure Mühe, Geduld, Hilfe und Erklärungen.

Zitat Zitat von Klebwax Beitrag anzeigen
... Du mußt den Returnwert von "i2c_start (Sadd + I2C_WRITE)" auswerten
... Da wird überall blind in den Bus hineingerufen ... auch noch als Beispielcode ...
Nochmal zum Auswerten der Busanfrage. Derzeit, im Aufbau- und Teststadium habe ich nur zwei baugleiche Sensoren auf 0xE0 und 0xE2 angeschlossen. Wenn ich I²C fahre, dann prüfe ich standardmässig immer auf aktuell angeschlossene/vorhandene Devices in der Startphase des Controllers/Programms. Manchmal über den ganzen, meist aber nur über einen begrenzten Adressbereich. Ausgabe aufs Terminal.
Code:
  SRF02_look ( );               // Suche angeschlossene Sensoren 0xE0..0xFE    SRF
Code:
  while ( 1 )                   //
//for ( u16 such=0xE0; such <= 0xFC; such = such + 2 )
  {                             // Teste nur I2C-Adressbereich der US-Sensoren
    if(!(i2c_start(such)))      // Slave bereit zum schreiben?
    {                           // 
      i2c_stop();               // Zugriff beenden
// - - - - - - - - - - - - - - - -
      uputs0 ("\r\tUSdev addr\t");        // Melde zugriffbereiten Slave
      uputs0u (such); uputs0hex (such);         // ..mit dezimaler und Hex-Adresse
      jaflag = 55;              //
    }                           //
    else                        // Melde jetzt: Kein Byte geschrieben
    {                           //   und Fehlermelde-Strich
      if ( jaflag == 55 )       // Flag "Slave erkannt" ??
      {                         //
        uputs0 ("\r\t");        // .. dann neue Zeile für Nein-Strich(e)
      }                 // Ende if ( jaflag = 55; )
                                
      jaflag    =  0;           // Flag zurücksetzen
      uputs0 ("-");             // Nein-Strich
//    uputs0 ("\r-   ");        //
//    uputs0hex (such);         // ..mit dezimaler und Hex-Adresse
      i2c_stop();               // Zugriff im Fehlerfall beenden, sonst SDA low
    }                   // Ende if(!(i2c_start(such)))
                                //
    if ( such == 0xFE ) break;
    if ( such <= 0xFC ) such    =  such + 2;

  }             // Ende while ( 1 ), war for ( uint8_t such=0xE0; such <= 0xFE;
Das kommt dann so aufs Terminal (dazu die Meldung zum Start-Kalibrieren - das eigentlich unnötig ist) :
Code:
    C506x21-32(319) CiCo babyo328/20MHz 30 Sep 2014 19:42
    CIR: irLED=PB1, CIR PC0ff ...
    UART0 115 kBd    RxTx-buff 64/64.

    Init I²C ok

    I²C-Dev 0xE0-0xFE    NoDev =: '-'
    USdev addr    224=0xE0
    USdev addr    226=0xE2
    --------------        End    254=0xFE

    Kal SRF02 224=0xE0    End
    Kal SRF02 226=0xE2    End
In der Entwicklungsphase neige ich dazu (mehr als sonst) leichtfertig zu programmieren, sprich: Busverfügbarkeit weglassen. Damit kann man manchmal schon frühzeitig Fehler provozieren. Dass die Leichtfertigkeit sich auch in den fertigen Code reinschmuggelt - kommt bei mir vor :-/

ABER : aktuell sind nur die beiden Sensoren am Bus, es ist ein Master-Slave-Betrieb und aktuell nur der Timerinterrupt vom Boardtimer mit Heartbeat-LED. Da sollte der Bus sauber sein, es sei denn, ich habe irgendwo ein i2c_stop vergessen oder so was Ähnliches.

Beispielcodes. Stimmt, das ist ein eigenes Thema. Ich hatte ne ganze Weile Mühe mit dem Code für den Master aus dem R N - Wissen zu TWI Slave mit avr-gcc. Der wird als getestet signiert - lief aber bei mir nicht (stand ja auch nix von "erfolgreich getestet"). Aber meist sind die Beispielcodes schon recht hilfreich und ohne die hätte ich viel mehr Mühe gehabt in C einzusteigen. Und in die ganze Controllertechnik.