Forum: Mikrocontroller und Digitale Elektronik Das erste Mal TWI nutzen


von Hannes (Gast)


Angehängte Dateien:

Lesenswert?

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

von Hannes (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Gelang Weilter (Gast)


Lesenswert?


von Gelang Weilter (Gast)


Lesenswert?

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.

von Hannes (Gast)


Angehängte Dateien:

Lesenswert?

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

von c-hater (Gast)


Lesenswert?

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...

von Hannes (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.