mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega16 delay Compilererror


Autor: heiko_h (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Micha H. (mlh) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steht z.B. bei 
http://www.nongnu.org/avr-libc/user-manual/group__...

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.

Autor: heiko_h (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: heiko_h (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: g457 (Gast)
Datum:

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: heiko_h (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: heiko_h (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.