_delay_ms mit zufälligem Wert

Gast #3842703
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
Gast #3842709
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.
Gast #3842747
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 ...
Gast #3842827
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?
Moderator Persönliche Seite #3842892
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren