Master/Slave send/receive Funktion

Gast #2928163
Lesenswert?

Hallo Leute,
ich habe ein vorgefertigtes Source Code für die I2C Kommunikation 
verwendet, s.u. Nun weiss ich aber in dem Code nicht, wie die 
Reihenfolge beim senden oder empfangen der Daten aussieht. Wenn ich 
bspw. Daten nach einem Interrupt senden möchte, was passiert als erstes 
und was zuletzt??  oder halt umgekehrt? gelang ich dann erst in die ISR 
oder wird erst die Funktion aufgerufen?? Würde mich freuen, wenn mir da 
jemand weiterhelfen kann.

MFG

http://www.atmel.com/Images/doc2565.pdf
http://www.atmel.com/Images/AVR311.zip
Gast #2930213
Lesenswert?

Hallo hello,

bei den Beispielen, die auf der Atmel-Homepage zu finden sind, wird 
folgendermaßen vorgegangen:

1. Beim Senden

Zuerst müssen im Hauptprogramm die Daten in einem Array zusammengestellt 
werden.
Das Array (genaugenommen die Referenz auf das Array) wird mit dem Aufruf 
der Sende-Funktion an die TWI-Routinen übergeben.
Hier werden die zu sendenden Daten in ein lokales Array umkopiert.
Von nun an arbeitet die Sendefunktion interruptgesteuert, das 
Hauptprogramm kann seiner Lieblingsbeschäftigung nachgehen.

2. Beim Empfangen

Beim Eingang eines Bytes wird es in einem lokalen Array (der ISR) 
gespeichert.
Das Hauptprogramm prüft regelmäßig, ob Daten eingegangen sind.
Wenn ja, dann übergibt es einen Zeiger auf ein Array an die TWI-Routine, 
die wiederum kopiert die empfangenen Daten in dieses Array.
Nun kann das Hauptprogramm die empfangenen Daten auswerten, während die 
TWI-Routinen bereits wieder Daten entgegennehmen kann.

Das bedeutet, dass in beiden Fällen das Hauptprogramm durch das Senden 
und Empfangen nicht unterbrochen wird (abgesehen von den Interrupts 
natürlich).

mfg

Michael S.
#2951994
Lesenswert?

hello schrieb:
> Ja ob multi-slave oder standard spielt eigentlich keine Rolle, weil bei
> beiden der Aufbau 'gleich' ist. Wie könnte man diesen Buffer bezeichnen?

Soviel ich da sehen kann, ist das einfach nur ein Buffer, in den eine 
Message zwischengelagert wird, damit das Hauptprogramm weitermachen 
kann, während die ISR aus diesem Buffer die Ausgabe macht. Nix irgendwie 
spezielles. Einfach nur ein Sendebuffer.

Ein Ringbuffer ist zwar auch 'nur ein Buffer', allerdings mit einer 
Organisationsform, so dass der komplette zur Verfügung stehende 
Bufferspeicher komplett ausgenutzt werden kann.
Gast #2952854
Lesenswert?

hmm, ich denke ich habe mich etwas falsch ausgedrückt. In dem Code wird 
sowohl zum senden als auch zum empfangen derselbe name für den buffer 
verwendet. also sind es eigentlich 2 buffer die an unterschiedlichen 
zeiten verwendet werden, daher ist es dann wahrscheinlich nicht von 
belang diese umzubenennen oder?? Versteht mich bitte nicht falsch, ich 
versuche den code einfach nur zu verstehen und brauche eure Hilfe, mehr 
nicht!

Danke!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren