Zeitdifferenz berechnen

OP #7376816
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
}
OP #7376823
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
...
#7376830
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
}
#7377226
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren