Gast
#2517276
Wenn der Zähler aufwärts läuft und die Werte "Früher" und "Später" bekannt sind - was ist der geschickteste Weg, die Differenz zu ermitteln (C)?
|
Anzeige
|
C - Zeit zwischen zwei Timerwerten berechnen?
Gast
#2517276
Wenn der Zähler aufwärts läuft und die Werte "Früher" und "Später" bekannt sind - was ist der geschickteste Weg, die Differenz zu ermitteln (C)?
Gast
#2517281
Ganz einfach: Wenn später früher als früher ist, dann ziehst Du später von früher ab ansonsten früher von später. Es kann auch ratsam sein, mitzuzählen wie oft der Zähler überläuft.
Gast
#2517295
Wenn du unsigned Arithmetik benutzt kannst du eigentlich immer b - a
rechnen, wobei b der "neuere" Wert ist. Überläufe sind dann kein
Problem:
Z.B.
volatile uint32_t Ticks;
// Ticks wird inkrementiert
void delay_ms(uint32_t delayMs)
{
uint32_t startTick = Ticks;
// Ueberlauf sicher durch unsigned wrap
while ((Ticks - startTick) < delayMs);
}
// SysTick->VAL wird dekrementiert
void delay_us(uint32_t delayUs)
{
uint32_t delayTicks = delayUs * 168;
uint32_t startTick = SysTick->VAL;
// Ueberlauf sicher durch unsigned wrap
while ((SysTick->VAL - startTick) > delayTicks);
}
Gast
#2517312
Sehe gerade das zweite Beispiel ist falsch.
Gast
#2517360
i++ schrieb: > Wenn du unsigned Arithmetik benutzt kannst du eigentlich immer b - a > rechnen, wobei b der "neuere" Wert ist. Überläufe sind dann kein > Problem: Danke!
Gast
#2517368
Kurz zusammengefaßt: Um die Differenz zwischen zwei Timerwerten zu ermitteln, berechnet man die Differenz zwischen neuerem und älterem Wert. Korrekt?
Gast
#2517522
Ja die unsigned Differenz funktioniert aber nur mit unsigned und nur
wenn der Counter nicht nachgeladen wird. Also wenn der Timer den
gesamten Wertebereich des Datentypes ausnutzt und dann wieder auf 0
wrappt.
Z.B. 0 - 0xFF
0 - 0xFF
...
bei 8 Bit.
Hier ist das nochmal etwas besser erklärt.
http://www.thetaeng.com/TimerWrap.htm
Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|