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?
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.