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.
Bei den delay...-Funktionen braucht es eine Konsztante als Parameter, keine Variable. Daher auch die Fehlermeldung "...expects an integer constant"
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.
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);
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.
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.
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)
Ungefähr so:
1 | for (int i = 0; i < meinekorrekturzeitinµs; i++) |
2 | _delay_us(1); |
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.
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?
> 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.
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 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.