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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.