Forum: Mikrocontroller und Digitale Elektronik Atmega16 delay Compilererror


von heiko_h (Gast)


Lesenswert?

Hallo, vielleicht kann mir hier jemand helfen, ich habe ein 
Compilerproblem mit folgendem Code:

_delay_us(Korrektur1);

inialisiert als:

uint32_t Korrektur1=0;

wenn ich Compalieren will bringt er immer eine Fehlermeldung die lautet:

163 error: __builtin_avr_delay_cycles expects an integer constant


kann mir villeicht jemand sagen, wo der Fehler liegt? Habe schon im 
Internet geschaut und finde nichts dazu.

von Klaus W. (mfgkw)


Lesenswert?

Bei den delay...-Funktionen braucht es eine Konsztante als
Parameter, keine Variable.
Daher auch die Fehlermeldung "...expects an integer constant"

von Micha H. (mlh) Benutzerseite


Lesenswert?

heiko_h schrieb:
> 163 error: __builtin_avr_delay_cycles expects an integer constant

Der Fehler wird vom Compiler schon genau beschrieben.Achte besonders auf 
das letzte Wort.

von Peter (Gast)


Lesenswert?

heiko_h schrieb:
> 163 error: __builtin_avr_delay_cycles expects an integer constant

steht doch da, du sollte nicht eine variable übergeben sonder eine wert.
(delay ist ein Makro und arbeitet sonst nicht richtig)

Falsch:
uint32_t Korrektur1=0;
_delay_us(Korrektur1);


Richtig:
_delay_us(1);

von Klaus W. (mfgkw)


Lesenswert?

Steht z.B. bei 
http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html

Note:
    In order for these functions to work as intended, compiler 
optimizations must be enabled, and the delay time must be an expression 
that is a known constant at compile-time.

von heiko_h (Gast)


Lesenswert?

In der Korrektur1 Variablen steht bei mir ein Zeitwert drin, den ich aus 
einem Timer ausgelesen und in Korrektur1 übergeben habe. Wie kann ich
delay dann definieren das mir delay genau so lange verzögert wie es in
Korrektur1 steht? Korrektur 1 hat nach jedem Programmablauf einen 
anderen Wert.

von heiko_h (Gast)


Lesenswert?

Habe gerade etwas in einem Tutorial gefunden, das scheint mir eine 
Verzögerungsschleife zu sein.

_delay_loop_1(uint8_t __count)


dann müsste das so ja eventuell gehen


_delay_loop_1(uint32_t __Korrektur1)

von g457 (Gast)


Lesenswert?

Ungefähr so:
1
for (int i = 0; i < meinekorrekturzeitinµs; i++)
2
   _delay_us(1);

von Klaus W. (mfgkw)


Lesenswert?

heiko_h schrieb:
> ... das mir delay genau so lange verzögert

Wobei  man die _delay_* eh meist nicht nehmen kann, wenn es
genau sein soll.
Die warten nicht nämlich nicht wirklich eine bestimmte Zeit,
sondern verballern einfach CPU-Zeit.
Das bewirkt die erwartete Verzügerung bestenfalls dann, wenn
das Warten nicht durch eine ISR unterbrochen wird. In diesem
Fall verlängert sich die Wartezeit klammheimlich um die
Rechenzeit der ISR.

von heiko_h (Gast)


Lesenswert?

heiko_h schrieb:
> Habe gerade etwas in einem Tutorial gefunden, das scheint mir eine
> Verzögerungsschleife zu sein.
>
> _delay_loop_1(uint8_t __count)
>
>
> dann müsste das so ja eventuell gehen
>
>
> _delay_loop_1(uint32_t __Korrektur1)

Kann mir jemand was du der Delay loop sagen? Kann ich dort meine 
Korrektur1 Variable einfügen?

von g457 (Gast)


Lesenswert?

> Kann mir jemand was du der Delay loop sagen?

Ja, die Doku :-) Ums kurz zu machen: Nein, das ist nicht das was Du 
suchst. Machs so wie oben vorgeschlagen mit einer schönen Schleife 
aussen rum.

von heiko_h (Gast)


Lesenswert?

g457 schrieb:
>> Kann mir jemand was du der Delay loop sagen?
>
> Ja, die Doku :-) Ums kurz zu machen: Nein, das ist nicht das was Du
> suchst. Machs so wie oben vorgeschlagen mit einer schönen Schleife
> aussen rum.

Dann könnte ich die Schleife aber auch so schreiben ohne das delay zu 
verwenden.

for (Korrektur1 != 0; Korrektur1--)
{}

So müsste das doch auch gehen, oder?

von Klaus W. (mfgkw)


Lesenswert?

Von der falschen Syntax abgesehen:
Klar geht das, sogar sehr schnell. Es wartet nur nicht.

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.