Hallo, ist die Funktion "_delay_ms()", und ihre Verwandten, durch interrupts zu unterbrechen? In der avr-libc 1.6 Anleitung kann ich keine genaue Beschreibung finden. Gruß Christian
Hallo, kannst du es etwas genauer beschreiben? Laut Lib läuft dort doch ein Timer? Gruß
Da läuft kein Timer. Hast Du Dir schon mal das Header-file dazu angesehen? Darin steht geschrieben:
1 | void
|
2 | _delay_ms(double __ms) |
3 | {
|
4 | uint16_t __ticks; |
5 | double __tmp = ((F_CPU) / 4e3) * __ms; |
6 | if (__tmp < 1.0) |
7 | __ticks = 1; |
8 | else if (__tmp > 65535) |
9 | __ticks = 0; /* i.e. 65536 */ |
10 | else
|
11 | __ticks = (uint16_t)__tmp; |
12 | _delay_loop_2(__ticks); |
13 | }
|
Und zusätzlich:
1 | void
|
2 | _delay_loop_2(uint16_t __count) |
3 | {
|
4 | __asm__ volatile ( |
5 | "1: sbiw %0,1" "\n\t" |
6 | "brne 1b"
|
7 | : "=w" (__count) |
8 | : "0" (__count) |
9 | );
|
10 | }
|
Du siehst, da hier kein Timer verwendet wird, ist sie interruptable.
>Wo findest du die Sourcen?
In den header-files delay.h und delay_basic.h unter
C:\WinAVR-20070525\avr\include\util (kann bei Dir natürlich anders
sein).
Weil die delay-Routinen keinen Timer benutzen, ist natürlich zu beachten, dass sich die Verzögerungszeit um die Dauer der Ausführung des Interrupthandlers verlängert.
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.