Moin liebe Forumsgemeinde, ich hoffe ihr könnt mich bei meinen ersten TWI Versuchen unterstützen. Ich baue derzeit in einen Modellbahnbahnhof Anzeigetafeln ein, welche jeweils einen eigenen Mikrocontroller besitzen, diese kommunizieren bereits erfolgreich über SPI mit den LCDs und OLEDs. Zu beginn möchte ich nun zu erst zwischen 2 Mega2560 Boards (Standard Arduinoboards) per TWI kommunizieren und hoffe das ich bei euch Unterstützung finde. Datenblatt des ATmega 2560 ist natürlich mein Freund, trotzdem überließt mensch bei neuen Inhalten immer wieder Dinge oder interpretiert diese anders als es gemeint ist. Momentan möchte ich als erstes den Master generieren, hierzu ist ein Mega2560 an Betriebsspannung angeschlossen und die SCL und SDA Leitung jeweils mit 2,2k Ohm gegen 5V geschaltet, der Controller läuft mit 16MHz. Den Takt am SCL Pin kann ich bereits auf dem Oszilloskop verfolgen, dieser ist während des Delays in der while auf High und ansonsten schwingt dieser auf und ab (ich habe derzeit leider nur ein kleines China Oszi, daher sind Frequenzmessungen in dem Zeitbereich unmöglich). Auf dem SDA Pin passiert hingegen garnichts, dieser ist Dauer High, liegt dies an meinem Code (gerne Verbesserungsvorschläge mit Begründung posten) oder an dem Fakt das noch kein Empfänger angeschlossen ist der einen ACK senden kann. Viele Grüße Hannes
Manchmal ist mensch blind, die void TWIkonfig wurde nicht aufgerufen. Nun passiert auch auf dem SDA Pin etwas. Ist das sonstige Vorgehen klug? Das senden soll natürlich später um mehrere Bytes zum senden erweitert werden. Da ich nur einen Master habe und auch nur schreiben möchte, habe ich hier keine Fehlerabfangung eingebaut dass ein anderer Master schreiben möchte bzw. ich Daten von einem Slave/Master lesen kann.
Warum das Rad neu erfinden? https://www.mikrocontroller.net/articles/I%C2%B2C http://homepage.hispeed.ch/peterfleury/avr-software.html
Hannes schrieb: > Ist das sonstige Vorgehen klug? >> double rechenwert; Der Datentyp wird zu float gemacht, double gibt es nicht auf den 8-Bit AVRs. Nimm uint32_t, das genügt vollkommen.
Gelang Weilter schrieb: > Warum das Rad neu erfinden? > > https://www.mikrocontroller.net/articles/I%C2%B2C > > http://homepage.hispeed.ch/peterfleury/avr-software.html Weil es doch deutlich mehr zum verstehen von Prozessen beiträgt als Dinge zu kopieren ohne sie zu kapieren. Gerade im Hobbybereich liegt der Reiz doch am selber machen. Ansonsten könnte ich ja ins Arduinoforum gehen :D Gelang Weilter schrieb: > Nimm uint32_t, das genügt vollkommen. Stimmt, ist geändert. Int, Double sind aus der Uni irgendwie so drin. Danke für den Hinweis Ich habe jetzt mal den Slave begonnen, hier tu ich mich schon wesentlich schwerer mit einer geeigneten Struktur. An PD2 hängt das Oszi zum checken. Mein Gedanke war, dass bei passender Adresse die Flag TWINT gesetzt wird und ich dann in eine Interrupt Routine gehe und dort die Daten aus dem Datenregister überschreibe. Nun wird die Flag natürlich schon gesetzt wenn die Adresse stimmt und dadurch sind die Daten zwar auch mal die übertragenen 170 (aus dem Master von oben) aber halt auch andere Dinge. Hier wäre ein Tipp cool wie eine sinnvolle Routine ablaufen könnte, mag aber auch gerade an der Uhrzeit liegen dass der Kopf streikt. Hoffentlich komme ich dann morgen mit eurer Hilfe voran. Viele Grüße Hannes
Hannes schrieb: > Weil es doch deutlich mehr zum verstehen von Prozessen beiträgt als > Dinge zu kopieren ohne sie zu kapieren. Niemand zwingt dich, fremden Code einfach nur stumpfblöd zu kopieren. Du darfst da gerne auch reinschauen, um zu verstehen, wie er funktioniert. Sowas ist sogar eine ziemlich übliche Vorgehensweise, um Fehler im eigenen Konzept aufzuspüren...
Guten Abend, mein Slave empfängt nun seine Daten allerdings nur wenn ich sie 2 mal sende. Liegt dies am Code? (Bei 10KHz) bei 100KHz funktioniert es nur mit 7-8 mal senden, dies könnte aber auch am fliegenden Aufbau liegen (siehe Bild) Mein Versuchs aufbau hat nun am Master eine LED hängen welche mit 1Hz blinkt (per Delay) wenn sie eingeschaltet wird sende ich danach eine 169 an Adresse 100 (Slave schaltet seine LED ein) wenn sie ausgeschaltet wird eine 170 an Adresse 100 (Slave schaltet seine LED aus). Was ich noch nicht ganz verstanden habe, im Datenblatt auf Seite 256 in der Grafik ist im oberen rechten eine Unterscheidung von 0x80 und 0x88. Wozu dient diese? Ich hoffe ihr könnt mir beim Code helfen damit dieser auch bei der ersten Übermittlung alles mitbekommt, so ist es kacke. Viele Grüße Hannes
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.