Forum: Mikrocontroller und Digitale Elektronik AVR _delay_ms interruptable ?


von Christian V. (caegger)


Lesenswert?

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

von Benedikt K. (benedikt)


Lesenswert?

Ja, ist sie.

von Christian V. (caegger)


Lesenswert?

Hallo,

kannst du es etwas genauer beschreiben? Laut Lib läuft dort doch ein 
Timer?

Gruß

von Patrick (Gast)


Lesenswert?

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.

von Christian V. (caegger)


Lesenswert?

Ok, vielen Dank für die Info. Wo findest du die Sourcen?

Gruß

von Patrick (Gast)


Lesenswert?

>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).

von yalu (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.