Forum: Mikrocontroller und Digitale Elektronik Master/Slave send/receive Funktion


von hello (Gast)


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

von hello (Gast)


Lesenswert?

Wird etwa die funktion solange ausgeführt bis in der ISR die Daten 
komplett empfangen/gesendet wurden??

von Michael S. (Gast)


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.

von hello (Gast)


Lesenswert?

Danke Michael S. hatte ja schon die Hoffnung aufgegeben, dass mir noch 
jmd schreibt, cool, dann hab ichs ja im Nachhinein richtig verstanden :)

VG

von hello (Gast)


Lesenswert?

Hi Leute,
ich habe noch eine Frage,kann man den Buffer der in dem Code verwendet 
wird als Ringbuffer bezeichnen??

von Karl H. (kbuchegg)


Lesenswert?

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.

von hello (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von hello (Gast)


Lesenswert?

aso ok, Danke.

von hello (Gast)


Lesenswert?

inwiefern macht es sinn, hier von einen Buffer zwei zu machen?? einmal 
zum senden und einmal zum empfangen??

von Karl H. (kbuchegg)


Lesenswert?

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.

von hello (Gast)


Lesenswert?

NEIN!! ich sollte zwar einen zweiten Buffer hinzufügen, aber für mich 
macht das irgendwie keinen Sinn, daher die Frage. :-/

von hello (Gast)


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!

von bootcamp (Gast)


Lesenswert?

Hallo Michael,

meinst du mit dem lokalen Array das TWDR, oder?

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.