PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Basisfrage zum IRQs_pre_sencond



tim09
19.10.2009, 13:20
Hallo Leute, ich bräuchte mal eure Hilfe.

Ich habe folgenden Thread gelessen. http://www.rn-wissen.de/index.php/Hallo_Welt_f%C3%BCr_AVR_%28LED_blinken%29

Da steht z.B.
#ifndef F_CPU
#define F_CPU 1000000
#endif

// So viele IRQs werden jede Sekunde ausgelöst.
// Für optimale Genauigkeit muss
// IRQS_PER_SECOND ein Teiler von F_CPU sein
// und IRQS_PER_SECOND ein Vielfaches von 100.
// Ausserdem muss gelten F_CPU / IRQS_PER_SECOND <= 65536
#define IRQS_PER_SECOND 2000 /* 500 µs */

Ich verstehe es nicht, warum F_CPU/IRQS_PER_SECOND<=65536 sein muss? F_CPU ist 1M Takt/Sekunde und IRQ wird 2000 mal/Sekunde aufgerufen. D.h. pro ISR entspricht 500 Takten oder? Kann IRQS_PER_SECOND nicht 1 oder 2 sein?

Ceos
19.10.2009, 14:05
genaugenommen ist <=65536 sogar falsch

65535 is die maximal mögliche positive zahl die mit einem unsigned integer gespeiert werden kann, 0-65535 um mal den zahlenbereich zu nennen ...

in dem beispiel, wäre die aussage immer falsch, es sei denn du schreibst eine 0, denn wenn die zahl überläuft, schlägt sie zum minimum um, in dem falle eben 0

normalerweise müsste es auch
1000000l heissen mit einem kleinen "L" um zu sagen dass der wert ein long wert ist

der timer auf den das beispiel zugeschnitten ist, scheint ein 16bit timer zu sein, bei dem eben diese integergrenze zuschlägt ...

du definierst hier quasi wieviele timerüberläufe pro sekunde du hast und kannst dich danach richten wieviel sekunden UND im wievielten teil einer sekunde du dich gerade befindest

und ausrechnen kannst du das, wenn du die variable, die im timer inkrementiert wird, durch deine konstante teilst ... und den Rest auf millisekunden umrechnest

sofern du den Timer auch richtig eingestellt hast

tim09
20.10.2009, 00:09
Hallo Ceos,
vielen Danke für deine schnelle Antwort. Es war sehr hilfreich. Ich habe jetzt kapiert. Danke nochmal!

mfg
tim