Forum: Mikrocontroller und Digitale Elektronik _delay_ms mit zufälligem Wert


von Phil (Gast)


Lesenswert?

Hallo Zusammen,

ich möchte in meinem Programm eine Pause mit zufälliger Länge haben.
Ich habe das mit der rand() Funktion wie folgt realisiert:
1
#define F_CPU 8000000UL
2
#define RAND_MAX 255
3
4
#include <avr/io.h>
5
#include "util/delay.h"
6
#include <stdlib.h>
7
8
int main(void)
9
{
10
    while(1)
11
    {
12
        _delay_ms(rand());
13
    }
14
}
Beim Kompilieren bekomme ich allerdings den Error
"__builtin_avr_delay_cycles expects a compile time integer", aus dem ich 
leider nicht sehr schlau werde.
Hat jemand eine Idee, wo das Problem liegen könnte?

Danke und Grüße
Phil

von Max H. (hartl192)


Lesenswert?

Phil schrieb:
> "__builtin_avr_delay_cycles expects a compile time integer",
_delay_ms will einen zum Compilezeit bekannten Wert.

Man könnte es so lösen:
1
char cnt;
2
3
while(1)
4
{
5
  cnt=rand();
6
  while(cnt--)
7
    _delay_ms(1); 
8
}

von benpeters (Gast)


Lesenswert?

Steht doch da.  Die delay Funktion erwartet zum Kompilierzeitpunkt einen 
Integerwert. Du könntest deine Zufalligkeit in der Verzögerung mit einer 
Zahlschleife erreichen, die dir deinen Randomwert dekrementiert.

von Frank G. (frank_g53)


Lesenswert?

Das _delay fest vorgeben und in eine, durch eine Zufallszahl 
festgelegte, Schleife laufen lassen.

von Basti B. (basti195) Benutzerseite


Lesenswert?

du kanst aber den random wert in eine for schleife packen und dann das 
_delay_us(1) in die schleife schreiben.
da wie bereits gesagt das delay eine feste Zahl braucht.
Ebenso wenig ist es möglich eine Variable in das delay zu schreiben

expl.
for (a= 0; a<random a++)
{_delay_us(random);
}

von Max H. (hartl192)


Lesenswert?

Sebastian Balz schrieb:
> for (a= 0; a<random a++)
> {_delay_us(random);
> }
"__builtin_avr_delay_cycles expects a compile time integer"

außer du hast radom vorher mit einem Würfelwurf oder ähnlichem bestimmt 
und dann mit einem #define definiert.

von HildeK (Gast)


Lesenswert?

Phil schrieb:
> #define F_CPU 8000000UL
> #define RAND_MAX 255
>
> #include <avr/io.h>
> #include "util/delay.h"
> #include <stdlib.h>

RAND_MAX wird in stdlib.h definiert. Da diese nach deinem "#define 
RAND_MAX 255" aufgerufen wird, würde ich mal vermuten, dass deine 
Definition überschrieben wird. Vielleicht warnt der Compiler auch davor 
oder es passiert noch anderes ...

von Phil (Gast)


Lesenswert?

Ich danke euch für die zahlreichen Antworten, ich habe es jetzt wie 
vorgeschlagen mit einer Schleife gelöst.

Warum erwartet die delay Funktion einen Wert, der beim Kompilieren schon 
bekannt ist? Bringt das irgendwelche Stabilitätsvorteile?

von Falk B. (falk)


Lesenswert?

@ Phil (Gast)

>Warum erwartet die delay Funktion einen Wert, der beim Kompilieren schon
>bekannt ist? Bringt das irgendwelche Stabilitätsvorteile?

Weil sie so gemacht ist! Lies die Doku der libc im WinAVR!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Phil schrieb:
> Warum erwartet die delay Funktion einen Wert, der beim Kompilieren schon
> bekannt ist?

Weil sie daraus die einzusetzenden Befehle möglichst exakt ermitteln
will.  Wie willst du um eine Mikrosekunde genau verzögern können,
wenn bereits deine Rechnung 50 oder 100 Mikrosekunden dauert?

_delay_us() und _delay_ms() sind Bequemlichkeits-Funktionen, die das
umständliche Vorberechnen der CPU-Zyklenzahl auf den Compiler verlagern
möchten, damit der Nutzer den Stress nicht hat.  Sie arbeiten intern
mit Gleitkommazahlen, damit man auch sowas angeben kann, wie
1
#define F_CPU 3.686E6 /* 3.686 MHz */

oder
1
_delay_ms(0.8);

Du wärst schätzungsweise besser beraten, einen Timer damit zu
beauftragen.  Dafür sind die Dinger da.

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.