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)?
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.
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);
}
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!
Kurz zusammengefaßt: Um die Differenz zwischen zwei Timerwerten zu ermitteln, berechnet man die Differenz zwischen neuerem und älterem Wert. Korrekt?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.