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
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
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.
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
Eingang offen ist wirklich ein Anfängerfehler. Danke Aber grundsätzlich müßte mein Ansatz schon funktionieren? lg. gerhard
>Aber grundsätzlich müßte mein Ansatz schon funktionieren?
ja.
Welche Rennbahn ist das denn?
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
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)... ;-)
Es es notwendig den Interrupt teilweise zu disablen. Ich glaube durch den permaenten Datenstrom überholt der Einleseindex permanent den Ausleseindex? lg. gerhard
>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.
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).
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
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.