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.pdfhttp://www.atmel.com/Images/AVR311.zip
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.
hello schrieb:> Hi Leute,> ich habe noch eine Frage,kann man den Buffer der in dem Code verwendet> wird als Ringbuffer bezeichnen??
Du meinst im 'multi_slave' Beispielcode?
Nö. Das ist kein Ringbuffer.
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.
hello schrieb:> inwiefern macht es sinn, hier von einen Buffer zwei zu machen?? einmal> zum senden und einmal zum empfangen??
Was wird das?
Prüfungsvorbereitung ohne Ahnung von der Sache?
Wie funktioniert TWI?
Daraus ergibt sich die Antwort auf deine Frage.
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!