mikrocontroller.net

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


Autor: Alex (Gast)
Datum:

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

Autor: Sven P. (haku) Benutzerseite
Datum:

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

Autor: Matthias Lipinsky (lippy)
Datum:

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

Autor: Ralph (Gast)
Datum:

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

Autor: Alex (Gast)
Datum:

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

Autor: Klaus2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...hätte es wie Ralph gemacht. Scheint am einfachsten zu sein.

Klaus.

Autor: Alex (Gast)
Datum:

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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab's so implementiert - läuft, danke!

Alex

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.