Hallo Leute, ich habe folgendes Anliegen: Ich habe ein geschlossenens System (eine Automatensteuerung). In diesem System bedindet sich ein I2C-Datenbus, mit einem Master und mehren Slaves. Jetzt möchte ich mit einem externen Mikrocontroller auf den Bus gehen und diesen abhören. Wenn zum Beispiel der Master vom Slave ein Byte anfordert, soll der externe Mikrocontroller auch dieses Byte lesen und nun eine Folgefunktion einleiten....! Es reicht wenn der externe Mikrocontroller NUR LESEN KANN!!! Wie wird sowas realisiert? Ich steht Gedanklich im Wald!!!! danke für eure IDEEN!!! Andy
Hallo Andy, ist eigentlich kein Problem, um Dir etwas Mut zu machen. Ich hoffe die SCL-Frequenz dieses Systems ist nicht zu hoch? Was benötigst Du? - Einen µC mit ext. Interrupt, um die Start-STOP-Prozedur besser zu erkennen - Ist die SCL-Frequenz bekannt? Wenn nicht ==> mit Oszi messen Lösungsvariante: Der µC muss die Startprozedur bzw. Repead-START erkennen und bei jedem SCL-Takt die SDA -Leitung abfragen. Anschließend kannst Du die Adresse,R/W, und das/die Datenbyte auswerten. Die Stopp-Prozedur sollte auch vom µC erkannt werden. Anmerkung: Der Aufbau dieses Datenprotololls findest Du z.B. gut beschrieben in den Datenblättern der µC (z.B. ATmega8) Bernhard
Hier ein kleiner Programm für einen tiny2313. Ich nutze die USI im TWI Modus um die Daten zu empfangen. Die empfangenen Daten werden per UART gesendet. Folgende Ereignisse werden gemeldet: Start, Stop, Byte übertragen, ACK/NAK Bei mir funktionierte das ganze wunderbar, aber ich habe keine Ahnung wie schnell der I2C Bus maximal sein darf. Bei 100kHz und keinem lang anhaltenden Dauertransfer hatte ich bisher keine Probleme.
Hallo Bernhard, Mut machen ist gut:-) Habe eine Frequenz von 200kHz. Sollte nicht das Problem sein! Habe ich das richtig verstanden, das ich jede positive Flanke(über INT) auf SCL erkenne , und dann im Interrupt prüfe ob SDA HIGH oder LOW ist. Die ersten 7 Besuche im INT-Interrupt geben die Adresse an. Der 8 Besuch R/W....... 9 Besuch ACK . Besuch 10- bis 17 das Datenbit??????? Das soll funktionieren=???? Oder kann ich mit dieser methode irgendwelche Probleme bekommen oder geht es auch leichter?
Hallo, wenn Du z.B. einen AVR mit I2C Schnitstelle nimmst, kannst Du diesen als Slave konfigurieren. Ich glaube, da gibt es irgenwie eine "Mithörfunktion". Schau mal ins Datenblatt z.B. ATMEGA8 mfg Jogibär
Hallo Andy, >Habe eine Frequenz von 200kHz. Sollte nicht das Problem sein! da blieben bei 16MHz µC-Takt, 80 Takte zur Auswertung, das müsste reichen >Habe ich das richtig verstanden, das ich jede positive Flanke(über >INT)auf SCL erkenne , und dann im Interrupt prüfe ob SDA HIGH oder >LOW ist. SCL und SDA muss auf Flankenwechsel geprüft werden. Bsp START : SDA wird LOW, aber SCL noch HIGH Bsp Übertragung: SCL wird HIGH, SDA LOW oder HIGH BSP STOP : SCL ist HIGH, SDA Pegelwechsel >Die ersten 7 Besuche im INT-Interrupt geben die Adresse an. Der 8 >Besuch R/W....... 9 Besuch ACK . Besuch 10- bis 17 das >Datenbit??????? korrekt >Das soll funktionieren=???? Ja, ABER!!! Es kann sein, dass sich der Programmierer nicht an dieses Standard Protokoll halten wollte und in Deinem konkreten Fall davon abgewichen ist. Das wirst Du aber sicherlich beim programmieren sehr bald feststellen. Hierzu gab es hier mal vor einiger Zeit ein sehr interessanten Beitrag über ein Autoradio (9-Datenbytes). Hallo Jogibär, >Ich glaube, da gibt es irgenwie eine "Mithörfunktion". >Schau mal ins Datenblatt z.B. ATMEGA8 Wo soll denn das stehen, habe es noch nicht rauslesen können? Bernhard
Danke Bernhard! Bin gerade dabei mir eine solche Routine zu schreiben! Hast du schon erfahrung mit dieser Problematik? Programmiere in C. Habe jetzt schon mehrfach im Datenblättern versch. ATMEL Controller nach einer solchen Mithörfunktion gesucht....aber OHNE ERFOLG!! Gruss Andy
Hallo Andy, >Bin gerade dabei mir eine solche Routine zu schreiben! >Hast du schon erfahrung mit dieser Problematik? Ich würde einen µC mit 16 MHz takten und die externen Interrupts nutzen (Atmega8 ==> 2Stk) Hat den Vorteil, dass Du jedes I2C-Protokoll (8 oder 9-Bit -Pakete) mitlesen könntest) >Programmiere in C. Hoffentlich ist C dazu in der Lage (200kHz), da Du nur wenige Takte zur Verfügung hast. Benedikt hat sich schon mit diesem Thema tiefgründiger beschäftigt, vielleicht hielft Dir sein Beispiel weiter? Wäre Assembler für diesen konkreten Anwendungsfall nicht treffsicherer? >Habe jetzt schon mehrfach im Datenblättern versch. ATMEL Controller >nach einer solchen Mithörfunktion gesucht....aber OHNE ERFOLG!! Eigentlich benötigst Du nur den konkreten Protokollaufbau (s. Datenblatt ATmega8), der Rest ist dann Fleißarbeit nach der Methode "Versuch und Irrtum" ;) Vielleicht hilft Dir dieses kleine Werkzeug zum experimentieren etwas: http://www.mikrocontroller.net/forum/read-4-291891.html Bernhard
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.