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

Zitat von
Klebwax
... 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.
Lesezeichen