Forum: Compiler & IDEs Delay Probleme nach Update


von Christian Stark (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen!

Ich arbeite seit ewiger Zeit mit der win avr 2004-04-04 und habe nun
eine Neuinstallation mit win avr 2005-02-14 am laufen.

Ich verwende ein delay.h include (siehe anhang) das mit der neuen win
avr nicht mehr funktioniert. Kompilieren tut er alles ohne Probleme. Es
sieht so aus, als ob die delays nicht mehr ausgeführt werden... also
keine Wartezeiten.

aufruf DELAY_US(1000); für eine ms und diese Routine wird dann noch
einmal 1000 mal aufgerufen für 1s.

F_CPU ist auf 16000000 gesetzt. Die neuen Makefiles bringen jetzt auch
diese Konstante mit. Ich habe es mit beiden Varianten probiert (F_CPU
über makefile vergeben mit UL am Schluß und so wie vorher)

Ich vermutete, daß evtl. die routinen "wegoptimiert" werden und
stellte den compiler auf omtimzation 0. Danach funktionierten die
Routinen einwandfrei. (Nur wird der Code serh groß)

Mit der alten win avr version lief das aber problemlos mit optimization
S !

Ich habe jetzt auch schon im Forum gesehen, daß jetzt anscheinend
Routinen in der avrlib-c enthalten sind. Das werde ich heute Abend
alles mal ausprobieren.

Aber wer kann mir den Grund dazu nennen, warum der Code nicht mehr
läuft? Oder vieleicht ein paar Tips, wie man möglichst kompatibel
bleibt.

(PS: Ich verwende Timer u. ISRs, aber an manchen Stellen benötige ich
trotzdem delays! :)  )

Merci!
Christian

von Jörg Wunsch (Gast)


Lesenswert?

Da der Compiler an diesem inline-asm-Kram nichts zu compilieren hat,
hat er auch nichts daran zu optimieren.  Aber wie das mit inline asm
halt so ist: das Zeug wird schnell hochgradig unübersichtlich.  Es
lässt sich daher nicht so recht auf Anhieb sagen, was da wohl nicht
geht.  Du müsstest das konkret in deiner Umgebung analysieren.

Der Schwenk auf <avr/delay.h> erscheint mir aber in der Tat
angebrachter, da du dann ein offizielles Interface der Bibliothek
benutzt.

von Christian Stark (Gast)


Lesenswert?

Danke! Habe jetzt die <avr/delay.h> eingebunden. Die funktioniert auch
im optimize s level.

Wenn ich die Doku richtig verstanden habe, dann ist der maximale Wert,
den ich der _delay_us(); geben darf 48!? (Bei 16MHz Takt) Übergebe ich
einen größeren Wert, dann wartet die Routine trotzdem nur den max.
möglichen Wert von 48 us oder?

Christian

von Jörg Wunsch (Gast)


Lesenswert?

Hab' jetzt nicht nach den genauen Zahlen geguckt, aber so ungefähr
funktioniert es, ja.

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.