Peter Dannegger schrieb:
> Das ist ja ganz schön viel Holz.
> Es geht auch deutlich einfacher.
>
> Hier ein Delay mit Timer auf dem AVR:void delay( int16_t d ) //
> d = 0 ... 32000 ticks
> {
> d += TCNT1;
> while( (TCNT1 - d) & 0x8000 ); // until positive
> }
>
> Der Trick dabei ist, daß es überlauffest ist (Differenzen stimmen
> immer).
>
Peter, der SysTick Timer beim Cortex dient meist Zeitbasis und laeuft
daher sowieso. Ausserdem ist er bei allen Cortex Type vorhanden,
waehrend die anderen Timer herstellerspezifisch sind. Allerdings zaehlt
der Systick im Betrieb als Zeitbasis halt nur von 0 bis x und nicht bis
zum Ueberlauf, daher die komplexere Arithmetik.
> Bei 32Bit wird der Überlauf zwar seltener sein, muß aber trotzdem
> berücksichtigt werden.
>
> Uwe Bonnes schrieb:
>> end_ticks = (us * (SysTick->LOAD +1))/SYS_TICK_FREQ;
>
> Erfordert aber zwingend einen MC mit Divisionsbefehl, sonst kommt da
> noch massig Delay hinzu.
Irgendwo hatte ich (SysTick->LOAD +1))/SYS_TICK_FREQ auch schon mal
waehrend des Startups berechnet und dann in NutMicroDelay nur noch
multipliziert. Der Code ist aber irgendwie nicht im Repsoitory
angekommen. Danke fuer die Codereview!