Forum: Mikrocontroller und Digitale Elektronik STM32F2 Zeitstempel mit ext. Takt erzeugen


von Martin K. (martinko)


Lesenswert?

Hallo zusammen,

Ich stehe gerade einmal auf dem Schlauch, vielleicht kann mich jemand in 
die richtige Richtung schubsen:

Ich möchte mit einem STM32F2 einen Zeitstempel in µS generieren, der von 
einem externen Takt kommt. Diesen Wert benötige ich nur unregelmäßig 
(z.B. beim Eintreffen eines Datensatzes auf einer Schnittstelle, 
vielleicht ein paar hundert mal in der Sekunde), die Zeit soll aber 
synchron zum externen 1MHz Signal sein.

Bisherige Idee: Das Signal wird als externer Takt auf einen Zeitgeber 
gegeben, der bis 1.000.000 zählt und dann einen Interrupt auslöst. In 
diesem Interrupt wird eine Variable hoch gezählt, die die Sekunden 
enthält. Das sollte doch machbar sein.
Wenn ich nun diesen Zeitstempel benötige lese ich den aktuellen 
Timerstand aus - bekomme also die µS - und nehme den Sekundenzähler 
dazu.

So, da kommt nun mein Problem ins Spiel: Ich kann die beiden Werte ja 
nicht atomar in einer Operation auslesen. Das bedeutet: Wenn ich erst 
den Timer auslese und danach den Sekundenzähler, dann kann zwischendurch 
ein Timer Interrupt aufgetreten sein und die beiden passen nicht mehr 
zusammen. Andersherum ebenso.
Da war doch mal was mit einen Wert zwei mal auslesen und den anderen 
dann Korrigieren. So ähnlich wie: Timer auslesen, merken, Sekundenzähler 
auslesen, merken, Timer wieder auslesen, ist der nun kleiner als beim 
erstem mal Sekunde eins rauf. Aber was wenn zwischen den ersten beiden 
Schritten der Interrupt kam, dann ist der Sekundenzähler schon um eins 
hoch gegangen.
Da stehe ich nun uns brauche den Schubs. Wie macht man das noch mal 
richtig?

Danke und Gruß
Martin

von holger (Gast)


Lesenswert?

>So, da kommt nun mein Problem ins Spiel: Ich kann die beiden Werte ja
>nicht atomar in einer Operation auslesen.

Gib deinem Interrupt die höchste Priorität. Dann ist das kein Problem.

von Martin K. (martinko)


Lesenswert?

holger schrieb:
>>So, da kommt nun mein Problem ins Spiel: Ich kann die beiden Werte ja
>>nicht atomar in einer Operation auslesen.
>
> Gib deinem Interrupt die höchste Priorität. Dann ist das kein Problem.

Der Interrupt ist nicht das Problem, sondern der Zeitpunkt an dem ich 
den "zeitstempel" brauche.

Gruß Martin

von holger (Gast)


Lesenswert?

>Der Interrupt ist nicht das Problem, sondern der Zeitpunkt an dem ich
>den "zeitstempel" brauche.

Dann disable alle Interrupts. Wo ist dein Problem?
Das wird seit hunderten von Jahren schon so gemacht.

von Martin K. (martinko)


Lesenswert?

holger schrieb:
>>Der Interrupt ist nicht das Problem, sondern der Zeitpunkt an dem ich
>>den "zeitstempel" brauche.
>
> Dann disable alle Interrupts. Wo ist dein Problem?
> Das wird seit hunderten von Jahren schon so gemacht.

Das mir dann vielleicht Takte verloren gehen.

Gruß Martin

von holger (Gast)


Lesenswert?

>> Dann disable alle Interrupts. Wo ist dein Problem?
>> Das wird seit hunderten von Jahren schon so gemacht.
>
>Das mir dann vielleicht Takte verloren gehen.

Hä?

disable interrupts
lese us Timer
lese s Timer
enable interrupts

Dein Kram dauert bei einem STM32 gerade mal
4 Maschinenzyklen.

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.