static inline void _delayFourCycles(unsigned int __count) { if ( __count == 0 ) _asm_ __volatile__( "rjmp 1f\n 1:" ); // 2 cycles else _asm__ __volatile_ ( "1: sbiw %0,1" "\n\t" "brne 1b" // 4 cycles/loop : "=w" (__count) : "0" (__count) ); } #define delay(us) _delayFourCycles( ( ( 1*(XTAL/4000) )*us)/1000 ) die delay funktion wird dann mit der Angabe der verzögerung ausgeführt. z.b. delay(500) müssten 500µs delay sein. Kann mir jemand erklären wie das ungefähr funktioniert. Wenn count 0 ist dann habe ich ja alleine durch den overhead einige cycles dabei, und somit stimmen die 2 cycles ja nicht oder? --( ( ( 1*(XTAL/4000) )*us)/1000 ) <- was wird da genau berechnet? bitte um eure comments!!! danke
Das ganze funktioniert unter 2 Voraussetzungen * Für us benutzt du eine Konstante * Der Optimizer ist eingeschaltet. > --( ( ( 1*(XTAL/4000) )*us)/1000 ) <- was wird da genau berechnet? Was denkst du? Hinweis: XTAL wird gerne als Makro für die tatsächliche Taktrequenz (in Herz) genommen. XTAL ist also für den Compiler eine Konstante, mit zb dem Wert 4000000 (bei 4MHz Taktfrequenz) > Wenn count 0 ist dann habe ich ja alleine durch den overhead > einige cycles dabei, Nicht wenn der Optimizer eingeschaltet ist. Von der ganzen Orgie bleibt letztendlich nur noch _asm_ __volatile__( "rjmp 1f\n 1:" ); übrig. Alles andere schmeist der Optimizer raus.
-Was denkst du? -Hinweis: XTAL wird gerne als Makro für die tatsächliche -Taktrequenz (in Herz) genommen. -XTAL ist also für den Compiler eine Konstante, mit zb dem -Wert 4000000 (bei 4MHz Taktfrequenz Das ist mir schon klar, dass die taktfrequenz in die berechnung mit einfließen muss, nur wie es genau funktioniert wäre interresant. Ok. das mit dem Optimizer geht mir ein.... danke erstmal.. Also falls mir das jemand noch genau erklären könnte wäre ich froh.. danke für eure mühen.. danke karl heinz...
chriss wrote: > -Was denkst du? > -Hinweis: XTAL wird gerne als Makro für die tatsächliche > -Taktrequenz (in Herz) genommen. > -XTAL ist also für den Compiler eine Konstante, mit zb dem > -Wert 4000000 (bei 4MHz Taktfrequenz > > Das ist mir schon klar, dass die taktfrequenz in die berechnung mit > einfließen muss, nur wie es genau funktioniert wäre interresant. Ach komm. Das ist doch ein simpler Dreisprung: 10 Äpfel kosten 2 Euro, wieviel kosten 7 Äpfel. Wenn in einer Sekunde XTAL (zb 4000000) Takte anfallen, wieviele Takte müssen dann für 1 µs vergehen. 1µs, das sind 0.000001 oder 1E-6 Sekunden XTAL ....... 1 x ....... 1E-6 ------------------------- XTAL * 1E-6 x = ------------- = XTAL * 1E-6 1 XTAL oder was gleichbedeutend ist: -------- 1000000 jetzt wollen wir aber nicht 1 µs sondern wir wollen y µs. Ergo: y * XTAL ---------- 1000000 Wenn wir jetzt mal genau nachdenken, wollen wir ja nicht Takte haben, die verbrutzelt werden müssen, damit y µs vergehen, sondern wir brauchen die Anzahl der Schleifenwiederholungen. Eine Schleifenwiederholung dauert 4 Takte, also brauchen wir y * XTAL ------------- 4 * 1000000 Schleifenwiederholungen. Jetzt gibt es noch ein kleines C-Problem: Die Berechnungen müssen so gestaffelt werden, dass * es zu keinen Overflow kommt * bei der Division nichts, oder nicht viel verloren geht. Wenn XTAL 4879000 ist, dann ist XTAL / 1000000 nun mal 4 und nicht 4.879000 Daher wird ein bischen umgestellt, ein Tausender im Nenner von den 1000000 zu den 4 verschoben ( 4 * 1000000 ergibt dasselbe wie 4000 * 1000), und es kommt zu ( ( ( 1*(XTAL/4000) )*us)/1000 )
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.