Forum: Mikrocontroller und Digitale Elektronik Ringbuffer Problem


von Gerhard H. (computerkora)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe folgende Aufgabe zu lösen:

Meine digitale Rennbahn, liefer mit 38400 Baud kontinuierlich einen 41 
Byte langen Datenstream, welcher alle möglichen Informationen enthält. 
Jeder Datenstream beginnt mit &HA2 gefolgt von &H01. Bei speziellen 
Ereignissen ist der Datenstream nur 6 Byte lang.

Um dies zu lösen, möchte ich einen Ringbuffer programmieren, der auf der 
einen Seite mittels ISR gefüllt wird und im Hauptprogramm dann 
ausgelesen und bewertet wird.

Leider habe ich irgendwo schon einen grundsätzlichen Fehler, den in 
meinen Testprogramm, das nur zum Austesten des Ringbuffers gedacht ist, 
wird der Index des Ringbuffers in der ISR hochgezählt, auch dann wenn 
ich an RX gar nichts angeschlossen habe - was mache ich da falsch?

Compiler: Bascom
Microcontroler: Mega8
Entwicklungsboard:STK500

lg.
gerhard

von Peter D. (peda)


Lesenswert?

Gerhard Hagenauer wrote:

> wird der Index des Ringbuffers in der ISR hochgezählt, auch dann wenn
> ich an RX gar nichts angeschlossen habe - was mache ich da falsch?


Ja, das kommt hier öfters.

Garnichts angeschlossen ist großer Bockmist.

Du mußt Dich schon für einen Pegel entscheiden, VCC oder GND. Kann auch 
über nen Widerstand erfolgen (Pullup).


Peter

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

Wenn man auf
RX_index_in <> RX_index_out
testet kann man sich den "BufferOverrun" (und die damit verbundenen 
Abfragen) sparen.

>Bei speziellen Ereignissen ist der Datenstream nur 6 Byte lang.

Woran erkennt man das?
Ist die Datenrahmenlänge sonst gleich?

Wie Peter schon schrieb:
Eingänge sollte man nie offen lassen.

von Gerhard H. (computerkora)


Lesenswert?

Nach den 2 Startbytes ist im 4 Byte die Info über den 
Spielbetriebsmodus. Wenn diese Byte &H05 (Start) oder &H09 (Reset) dann 
werden 6 Bytes geliefert.

Ansonsten schauts so aus:

Die 2 Startbytes (&HA2,&H01), danach kommt die Info über Spannung an den 
Schienen, Byte 4 gibt Auskunft über Rennbetrieb und Byte 5 wieviele 
Regler angeschlossen sind - danach kommen für jedes Auto 6 Bytes, wobei 
im ersten die Info über Fehlstart ist, dann 4 Bytes die Zeitinfo in 
Tausenstelsekunden seit Startbeginn und zum Abschluß infos zur 
Reglerposition.
Es ist ein konituierlicher Datenstrom, wenn ein Auto die Zielline quert, 
werden die entsprechenden Infos eingeplegt - somit kann man die Runden 
auch mit Zählen, bzw. den Abstand zwischen den Autos errechnen.

lg.
gerhard

von Gerhard H. (computerkora)


Lesenswert?

Eingang offen ist wirklich ein Anfängerfehler.

Danke

Aber grundsätzlich müßte mein Ansatz schon funktionieren?

lg.
gerhard

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

Gibt es zu dem Protokoll irgendwo eine Dokumentation?

von Gerhard H. (computerkora)


Angehängte Dateien:

Lesenswert?

Ja,

im Anhang

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

>Aber grundsätzlich müßte mein Ansatz schon funktionieren?
ja.

Welche Rennbahn ist das denn?

von Gerhard H. (computerkora)


Lesenswert?

Es ist die Scalextric Sport Digital. Die Bahn hat eine Aux Port an dem 
eben die oben beschriebenen Daten geliefert werden.

Ich bin nun dabei, eben verschiedene Teile (Rundenanzeiger, Ampeln, LCD 
Displays - so like Großbildleinwand) dazuzubauen die man in die Deko gut 
integrieren kann, aber auf der anderen Seite habe ich ein gutes Projekt 
um meine Programmier und Hardwarekenntnisse wieder aufzubessern. Darum 
versuche ich auch verschiedene Bussystem in das Projekt zu integrieren 
(RS232, I2C, CAN und vielleicht auch TCP/IP). Am Ende sollten die ganzen 
HW Teile vom PC aus konfigurierbar sein - mal sehen welche Probleme noch 
so entstehen.

lg.
gerhard

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

Ich hab es auch gerade gefunden. Das System erinnert etwas an die 
Carrera-Servo.

Schade, dass ich keine Kinder habe (und mich auch nicht wirklich für 
"Motorsport" interessiere)... ;-)

von Gerhard H. (computerkora)


Lesenswert?

Es es notwendig den Interrupt teilweise zu disablen.

Ich glaube durch den permaenten Datenstrom überholt der Einleseindex 
permanent den Ausleseindex?

lg.
gerhard

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

>Ich glaube durch den permaenten Datenstrom überholt der Einleseindex
>permanent den Ausleseindex?

Sollte eigentlich nicht passieren, solange du den Puffer schneller 
bearbeitest als neue Zeichen eintreffen.

Wenn du ihn sperrst, verlierst du ja Zeichen.

Wenn du allerdings mehr Daten mit einer geringeren Datenrate ausgibst, 
als du einliest, provozierst du natürlich einen Pufferüberlauf.

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

Vielleicht solltest du den Controller gegen einen ATMega162 tauschen. 
Der hat zwei Hardware-USARTs. (der Mega8 ist mit der Aufgabe u.U. schon 
etwas überfordert).

von Gerhard H. (computerkora)


Lesenswert?

Ich lasse mir für die Tests ans Terminalprogamm Kontrollinfos mit 57600 
ausgeben.

Kann es sein das dieser SW Uart mir mehr Probleme bringt als es als 
Debuginfo liefert?

lg.
gerhard

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

>Kann es sein das dieser SW Uart mir mehr Probleme bringt als es als
>Debuginfo liefert?

Möglicherweise... das sind BASCOM-Interna.
Ein Hardware-UART finde ich auf jeden Fall besser. Da weiß man, wie sehr 
die den Controller noch belastet: fast gar nicht...
SoftUART ist schon ziemlich anstrengend für den Controller.

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.