Forum: Mikrocontroller und Digitale Elektronik Zeitdifferenz berechnen


von Zo R. (hsch1978)


Lesenswert?

Hallo,

in einer Mikrocontroller Anwendung soll eine Zeitdifferenz berechnet 
werden.
Zunächst wird immer zyklisch ein Timer ausgeführt. In einer 
Callbackfunktion soll die Zeitdifferent von der vorhergehen Callback 
Ausführung berechnet werden.
Ich habe eine Funktion mit dieser kann ich die absolute Zeit in 
Millisekunden ermitteln. Irgendwie funktioniert die Berechnung nicht 
korrekt.
1
static void TimerCallback(void)
2
{
3
  uint32_t nextSendTime = 0;
4
5
  static uint32_t getAbsTime = 0;
6
  static uint32_t diffTime = 0;
7
8
  Timer_Start(UART, TimerCallback);
9
10
  getAbsTime = Timer_GetAbsMilliSec();
11
  diffTime = getAbsTime - diffTime;
12
13
  sprintf(uartTxData, "DiffTime: %06d\n", diffTime);
14
  UART_SendData(uartTxData, 17);
15
}

: Bearbeitet durch User
von Clemens S. (zoggl)


Lesenswert?

Dafür gibt es eine Lösung.

von Zo R. (hsch1978)


Lesenswert?

Folgende Werte erhalte ich über die UART:
1
Time: 13:20:00:108 CNT: 00 DiffTime: 000000
2
Time: 13:20:10:420 CNT: 01 DiffTime: 010312
3
Time: 13:20:20:727 CNT: 02 DiffTime: 010307
4
Time: 13:20:31:029 CNT: 03 DiffTime: 020614
5
Time: 13:20:41:326 CNT: 04 DiffTime: 020604
6
Time: 13:20:51:618 CNT: 05 DiffTime: 030906
7
Time: 13:21:01:906 CNT: 06 DiffTime: 030892
8
Time: 13:21:12:189 CNT: 07 DiffTime: 041189
9
Time: 13:21:22:467 CNT: 08 DiffTime: 041170
10
...

So sollte die Ausgabe ausschauen:
1
Time: 13:20:00:108 CNT: 00 DiffTime: 000000
2
Time: 13:20:10:420 CNT: 01 DiffTime: 010312
3
Time: 13:20:20:727 CNT: 02 DiffTime: 010307
4
Time: 13:20:31:029 CNT: 03 DiffTime: 010209
5
Time: 13:20:41:326 CNT: 04 DiffTime: 010292
6
Time: 13:20:51:618 CNT: 05 DiffTime: 010288
7
Time: 13:21:01:906 CNT: 06 DiffTime: 010283
8
Time: 13:21:12:189 CNT: 07 DiffTime: 010278
9
Time: 13:21:22:467 CNT: 08 DiffTime: 010273
10
...

von Bernd B. (behbeh)


Lesenswert?


von Zo R. (hsch1978)


Lesenswert?

Danke aber das ganze soll ohne die time.h laufen.
Eigentlich reicht doch das wenn ich den absoluten Wert auslese.
Ich stehe da echt auf dem Schlauch.

: Bearbeitet durch User
von Fabian H. (hdr)


Lesenswert?

1
static void TimerCallback(void)
2
{
3
  uint32_t nextSendTime = 0;
4
  static uint32_t getAbsTime = 0;
5
  static uint32_t lastAbsTime = 0;
6
7
  Timer_Start(UART, TimerCallback);
8
9
  getAbsTime = Timer_GetAbsMilliSec();
10
  sprintf(uartTxData, "DiffTime: %06d\n", getAbsTime - lastAbsTime );
11
  lastAbsTime = getAbsTime;
12
13
  UART_SendData(uartTxData, 17);
14
}

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

He S. schrieb:
> in einer Mikrocontroller Anwendung soll eine Zeitdifferenz berechnet
> werden.

Dann würde ich auch die Differenz zwischen zwei Zeiten nehmen:
1
    uint32_t now = Timer_GetAbsMilliSec();
2
    diffTime = now - getAbsTime;
3
    getAbsTime = now;

von Zo R. (hsch1978)


Lesenswert?

Ok Danke

von Michi S. (mista_s)


Lesenswert?

He S. schrieb:
> Eigentlich reicht doch das wenn ich den absoluten Wert
> auslese.

Dann hast Du erstmal aber nur den absoluten Wert. Um daraus einen Wert 
relativ zum vorigen Durchlauf zu machen, mußt Du den absoluten Wert vom 
letzen Durchlauf abziehen oder die aufgelaufene Summe aller bisherigen 
Differenzen.
Du ziehst aber vom aktuellen Absolutwert die Differenz vom vorigen 
Durchlauf ab, was eben nur genau zwei Mal klappt, beim nächsten 
Durchlauf hast Du einen abs. Wert von ~30.000 minus Deiner letzten 
Differenz von ~10.000 bringt Dir einen Wert um 20.000, dann gehts weiter 
mit einem abs.Wert von ~40.000 minus der vorigen Diff. von ~20.000 gibt 
wieder ~20.000 usw.

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.