Das Beispiel von Oberallgeier kann man noch erweitern ..
Die aktuelle Abfragen des I²C-Busses beim Start von archie - > 1 m lang - erzeugen die folgenden Ausgaben auf UART/Terminal und LCD (bessere Auflösungen im Bild verlinkt ) . Angezeigt werden also drei (von mehreren Slaves), hier MotorController, KopfController und ArmRechtsCOntroller. Üblicherweise wird aber auch der ALCo (ArmLinksController) angezeigt :
......Bild hier
......Bild hier
In der kompletten UART-Aufzeichnung (im Bild verlinkt) trennt der rote Strich zwei Zustände. Wenn die I²C-Leitung mit einem nicht-stromführenden Slave verbunden ist (Beispiel unterhalb rot - korrig.28.1.´18x) dann hängt das Programm beim ersten I²C-Aufruf. Ist "nur" die I2C-Leitung vom Bus abgeklemmt worden, dann kommen die kompletten Suchergebnisse, siehe oben.
Der dazugehörige Code steht unten. Dem fehlt offenbar ne Abfrageschleife, die im main von archie den Fehler abfängt (existiert derzeit nicht) :
Code:
// ============================================================================= =
// ============================================================================= =
void i2clook (void) // Welche I²C-Devices existieren? Liste ?
{ // Aufruf main =>
// Teste I²C-Schreibadressen von 0x70hex bis 0xAC, 112 - 254 (früher bis 0xFC)
// ##>> Testbereich einschränken auf 112 - 159 bzw x70 - x9F
// Erfolgsmeldung(en) ausgeben mit Adresse dez und hex, Fehlsuche mit "-"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// B E A C H T E bei S T O E R U N G
// https://www.roboternetz.de/community/threads/71534-Uhrschalt
// plan-%C3%BCberpr%C3%BCfen-MOSFET-und-MAG3110?p=642024&view
// full=1#post642024
//// Dazu lässt man SDA aus Sicht des Masters offen und erzeugt 9 mal einen
//// Takt auf SCL. Danach erzeugt man ein Stop. Das sollte die
//// Statemachine im Slave zurück setzen
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uint8_t jaflag = 0; // Ja-Flag
// - - - - - - - - - - - - - - -
uputs0 ("\r\tSuche I²C-Devices im Bereich 0x70/112dez - 0xFE/254dez");
uputs0 ("\r\tJedes '-' bedeutet: Slave/s nicht vorhanden oder defekt\r\t");
// war 0x70 - 0xAC
// bzw 0x70/112dez - 0x9F/159dez bzw 0x70 - 0xAC
Line2(); // LCD vorbereiten für Anzeige
lcd_string(" "); // Zeile 2 löschen
for ( u8 such=0x70; such <= 0xF0; such = such + 2 ) // Adressenbereich
{ // Teste den I2C-Adressbereich gemäß for-Schleife
if(!(i2c_start(such))) // Slave bereit zum schreiben?
{ //
i2c_stop(); // Zugriff beenden
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//##25Jun14,14h01 uputs0 ("\r\t\tSlave addr\t"); // Melde zugriffbereiten Slave
// =: SetCursor (2, 10) heisst SetCursor (x,y), x=zeile {1,2}, y=Pos {0, 15}
uputs0 ("\r\t\tSlave addr\t"); // Melde zugriffbereiten Slave
uputs0i (such); uputs0hex (such); // .. mit dezimaler und Hex-Adresse
// Hilfsschema zur Anordnung von Text am LCD 0123456789012345
// MoC KoC ARC ALC
if (such==130) //
{ uputs0("\tMoCo"); SetCursor (2, 8); lcd_string("MoC "); }
if (such==132) //
{ uputs0("\tKoCo"); SetCursor (2, 4); lcd_string("KoC "); }
if (such==134) //
{ uputs0("\tARCo"); SetCursor (2, 0); lcd_string("ARC "); }
if (such==136) //
{ uputs0("\tALCo"); SetCursor (2, 12); lcd_string("ALC "); }
jaflag = 55; //
} // ist if(!(i2c_start(such)))
else // Melde: Kein Byte geschrieben
{ // und Fehlermelde-Strich
i2c_stop(); // Zugriff bei Fehlerfall beenden, sonst SDA low
if ( jaflag == 55 ) // Flag "Slave erkannt" ??
{ //
uputs0 ("\r\t"); //
} // Ende if ( jaflag = 55; )
jaflag = 0; // Flag zurücksetzen
uputs0 ("-"); //
} // Ende if(!(i2c_start(such)))
} // Ende for (uint8_t such=0x70..; Alle Slaveadressen sind getestet
} // Ende Ende void i2csuch (void)
// === Ende Routine i2clook
// ============================================================================= =
Lesezeichen