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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.