Forum: Mikrocontroller und Digitale Elektronik Ringpuffer mit C515C


von Tommy (Gast)


Lesenswert?

Also, ich habe folgende Aufgabe:

Der Analogwert eines Poti's soll per A/D Wandler in ein
8-Bit-Datenwort gewandelt werden. Dieses soll per integrierter
CAN-Schnittstelle an einen weiteren C515C übertragen werden.
Dazu müssen die 8-Bit-Wörter in einem Ringpuffer zwischengespeichert
werden.

Leider komm ich da nicht weiter. Erstmal die Frage, was ist denn
überhaupt schneller? Die Wandlung oder die Übertragung?
Weil die sollten ja etwa gleich schnell sein, sonst kann das ja nie
funktionieren?!
Oder soll die Wandlung nicht automatisch gestartet werden, sondern erst
wenn die Übertragung eines Bytes beendet ist?

Mein erstes Problem ist also dieser Puffer, ich weiss einfach nicht wie
ich sowas mit dem verfügbaren Befehlssatz realisieren kann.
Hab hier im Forum gesucht und auch ein Beispiel gefunden, allerdings
fehlt mir da der Zusammenhang irgendwie..

Kann mir jemand nen Tipp geben, oder sagen wie die grobe Struktur
aussieht?

von Yagan Z. Dongobar (Gast)


Angehängte Dateien:

Lesenswert?

Tommy,

die Übertragung der Werte muss auf die Dauer schneller sein, als die
Wandlungsrate. Der Ringpuffer kompensiert nur kurzfristig. Also sollte
der ADC so eingestellt werden, dass die CAN-Schnittstelle mitkommt.

Code-Beispiel für einen einfachen Ringpuffer siehe Dateianhang.

Ciao, Yagan

von Tommy (Gast)


Lesenswert?

Erstmal vielen dank!

Der Code ist für einen Anfänger wie mich ein hartes Stück schluck
Gibt's da keine einfachere Variante?

Wusste garnicht dass es den if-Befehl hier gibt

von Yagan Z. Dongobar (Gast)


Lesenswert?

Tommy,

es tut mir leid, dass ich keinen besser kommentierten Code hatte.
Für einen Anfänger sicher nicht leicht zu verstehen.

Die if-Befehle sind Anweisungen für den Assembler, eine bestimmte
Code-Variante zu erzeugen. Der Prozessor bekommt die nicht zu sehen.

Zum Konzept des Ringpuffers:

Man benutzt einen Speicherbereich fester Länge, einen Schreib- und
einen Lesezeiger.
Wenn man das interne RAM benutzt, kann man die Register R0 oder R1 zum
Adressieren verwenden, was den Code einfacher macht.

Am Anfang zeigen Schreib- und Lesezeiger auf die Startadresse des
Ringpuffers.

Wenn man ein Byte in den Puffer schreibt erhöht man anschliessend den
Schreibzeiger um eins. Zeigt er auf das Ende des Puffers, setzt man ihn
wieder auf den Anfang. Einen Pufferüberlauf kann man dadurch erkennen,
dass der Schreibzeiger nach Weiterrücken == Lesezeiger wäre.

Vor dem Lesen eines Bytes wird geprüft, ob Lesezeiger == Schreibzeiger.
Wenn ja, ist der Puffer (noch) leer.

Nach dem Lesen wird der Lesezeiger um eins erhöht, bzw. wenn er am Ende
des Puffer steht wieder auf den Anfang gesetzt.

Das ist so das Grundkonzept, einfacher geht es eigentlich nicht.

Eine komforablere Variante arbeitet mit einem Byte-Zähler, der beim
Schreiben um 1 erhöht, beim Lesen um 1 erniedrigt wird. Da weiss man
immer, wieviele Bytes sich aktuell im Puffer befinden. Die Leer- oder
Überlaufprüfung macht man dann über den Zähler.

Falls das Schreiben oder Lesen im Interrupt stattfinden soll, muss man
unter Umständen Semaforen einführen, die gleichzeitiges Schreiben und
Lesen verhindern.

Ciao, Yagan

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.