Delay Probleme nach Update

Gast #180468
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
Angehängte Dateien:
Gast #180469
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.
Gast #180470
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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.