www.mikrocontroller.net

Forum: Compiler & IDEs LCD -> Probleme mit Optimierungsgrad


Autor: Florian H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Liebe Forengemeinde,

ich habe ein Problem mit meinem HD44780 kompatiblen Pollin LCD!

Das Display funktioniert ind e rOptimierungsstufe "-O0" wunderbar. 
Allerdings gibt es Probleme wenn ich den Optimierungsgrad auf "-Os" 
stelle. Dann kommen nur Hieroglyphen auf dem Display an.
Ich verwende die LCD Routinen aus dem AVR-GCC Tutorial mit einem 
ATMega16-16PU und einem 16 MHz Quarz.

Was mir aufgefallen ist: Der compiler spuckt bei der 
Optimierungs-Einstellung "-O0" die Warnung:
c:/winavr-20070525/bin/../avr/include/util/delay.h:89:3: warning: #warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed"

aus. Das ist ja kurios, da das Display genau bei dieser Einstellung 
funktioniert.

Ich vermute dass es mit den <utils/delay.h>  Routinen zusammenhängt.

habe im Makefile "F_CPU = 16000000UL" angegeben.

btw.: Kann mir bitte einer sagen was hinter dem Takt das "UL" oder 
manchmal auch nur das "L" bedeuten?

Hat da jemand eine Idee was ich tun kann???

Viele Grüße,

Florian H.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du nicht erzählst, was für Delays Du verwendest, kann man nur 
raten. Ich vermute aber, dass Du die Begrenzung der _delay_ms-Funktion 
überschritten hast. Die ist nämlich auf 262,14ms/F_CPU[MHz] begrenzt, 
also bei 16 MHz auf maximal ca. 16,4 ms. Bei allem was länger ist kommt 
Murks raus. Ohne Optimierung werden die _delay_XX-Funktionen aufgebläht 
und wesentlich länger als gewünscht, so dass es durchaus nachvollziehbar 
ist, dass es ohne Optimierung funktioniert (schließlich sind die Pausen 
zwischen den einzelnen Zugriffen dann länger, was im Prinzip nicht 
schlimm ist. Nur kürzer dürfen sie halt nicht sein).

"L" bedeutet "long" und "UL" "unsigned long". Soll dafür sorgen, dass 
Berechnungen mit diesen Werten in einem Wertebereich durchgeführt 
werden, der ausreichend groß ist, dass es keinen Überlauf gibt. 
Standardmäßig rechnet der Compiler mit 16 Bit, und da passen 16000000 
nunmal nicht rein.

Autor: Andreas Paulin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. 'UL 'steht für unsigned long, ist eine Art und Weise, einer 
Konstanten direkt einen Typ zuzuweisen.
16000000UL entspricht
(unsigned long)16000000

2. Die _delay - Routinen haben in der Optimierungsstufe -O0 eine 
wesentlich längere (falsche) Laufzeit als in -01, -02 etc (hier dann 
Soll-Laufzeit). Wenn Dein Display mit -O0 funktioniert, aber sonst nicht 
heißt das: Deine delays sind (bei Soll-Verzögerung) zu KURZ. Versuchs 
mal mit längeren delay-Werten.
Die Befehlsausführungszeiten des LCD-Controllers stehen im 
Datenblatt....

Autor: Florian H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

es lag tatsächlich daran, dass die Delay-Routinen zu kurz waren! Im 
GCC-Tutorial ist in der lcd_enable Funktion eine "kurze Pause" von 1us 
eingestellt. erhöhen dieses Wertes brachte den gewünschten Erfolg! Danke 
Leute :-)

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.