Forum: Mikrocontroller und Digitale Elektronik Zeitstempel an der richtigen Stelle in Datenstrom einfügen


von Alex (Gast)


Lesenswert?

Hallo,

folgendes Problem:

ich habe einen Datenstrom wie folgt:

xxx;xxx;xxx;xxx;xxx; ...
 dabei gehören immer eine dreistellige Zahl, gefolgt von von einem 
Semikolon zusammen. Ich sende sechzig dieser "Päckchen" pro Sekunde über 
UART (19200 Baud). Das Senden läuft über einen Ringpuffer. Aller 500ms 
sende ich zusätzlich interruptgesteuert einen Zeitstempel, etwa so 
[Zyy];
Nun mein Problem. Der Zeitstempel darf mir die Datenpäckchen nicht 
unterbrechen. Das passiert aber ab und an, wenn z.B zwei Zahlen 
geschrieben wurden und dann der Interrupt kommt. Dann erhalte ich etwa 
das:

xx[Zyy];x;

Hat jemand eine Idee, wie ich das umgehen kann? Zusätzliche Härte im 
Spiel ist, dass ich die Zeitstempel nicht ausfallen lassen oder 
verzögernn kann, weil sie zur synchromisation von zwei Datenströmen 
dienen. Der Ausfall eines Datenpäckchens wäre aber verschmerzbar.

Danke und Gruß,

Alex

von Sven P. (Gast)


Lesenswert?

Wenn du kontinuierlich sendest, setz im Interrupt ein Flag und bau beim 
nächsten Päckchen den Zeitstempel ein und setz gleichzeitig das Flag 
zurück.

von Matthias L. (Gast)


Lesenswert?

>Ich sende sechzig dieser "Päckchen" pro Sekunde

Ich stelle mir das so vor, dass du 60x pro Sekunde eine Funktion 
aufrufst, die Nutzdaten in den FIFO einträgt.

Eine zweite Routine (zB ISR von uart tx) sendet die Zeichen, oder besser 
die Pakete aus dem FIFO. Wenn du jetzt einfach mal besagte Funktion 
aufrufst, sollte der Zeitstempel als eigenes Paket im FIFO landen.

Wenn der Zeitstempel(so wie es aussieht) sehr eitkritisch ist, würde ich 
den direkt in die isr-uart-tx implementieren: Die kann zB nach jedem 
vollständig versendeten Paket prüfen, ob ein Zeitstempel gesendet werden 
muss. Wenn ja, wird dieser automaitsch generiert und einfach 
rausgeblasen. Danach ist wieder der FIFO dran...

Ich vermute, die Implemetation des FIFOs passt nicht.

von Ralph (Gast)


Lesenswert?

Vor dem Senden eines Paketes den Timer auslesen.
Das Paket nur dann senden wenn die verbleibenede Zeit bis zum IRQ 
ausreicht um das Paket zu senden

von Alex (Gast)


Lesenswert?

@ lippy: so ist es implementiert

ich habe noch mal gegrübelt und zwei Möglichkeiten überdacht.
1. gucken, ob das letzte Zeichen im Puffer ein ; ist, wenn nicht, das 
angefangene Päckchen löschen und den Zeitstempel in den Puffer 
schreiben.

2. während des Schreibens eines Päckchens den Timerinterrupt 
deaktivieren und dann erst den Zeitstempel in den Puffer schreiben. Die 
paar Takte zum schreiben von vier Byte in den Puffer sind als 
Zeitversatz verschmerzbar, denke ich.

Was denk ihr?

Gruß, Alex

von Klaus2 (Gast)


Lesenswert?

...hätte es wie Ralph gemacht. Scheint am einfachsten zu sein.

Klaus.

von Alex (Gast)


Lesenswert?

Hi,

wenn ich es so realisieren möchte, wie von Ralph vorgeschlagen, hätte 
ich noch eine Frage:

der Timer läuft im Asynchronmode (ATMEL644, Timer2 mit externer RTC). 
Nun gibts ja beim Schreiben des Timer-Registers im Asynchronmode ein 
paar Sachen zu beachten (Flag abwarten usw.), weil das über ein 
Zwischenregister geschieht. Nun meine Frage:

Wie sieht das beim Lesen aus, geht das direkt, so wie bei anderen 
Registern auch, oder muss ich da auch was beachten? Hab im Datenblatt 
explizit nichts gefunden.

Gruß, Alex

von Alex (Gast)


Lesenswert?

Hab's so implementiert - läuft, danke!

Alex

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.