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
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.
>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.
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
@ 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
...hätte es wie Ralph gemacht. Scheint am einfachsten zu sein. Klaus.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.