mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Ringpuffer mit C515C


Autor: Tommy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Yagan Z. Dongobar (Gast)
Datum:
Angehängte Dateien:
  • FIFO.A (3,51 KB, 152 Downloads)

Bewertung
0 lesenswert
nicht 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

Autor: Tommy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Yagan Z. Dongobar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.