Forum: Compiler & IDEs LCD -> Probleme mit Optimierungsgrad


von Florian H. (Gast)


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:
1
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.

von Johannes M. (johnny-m)


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.

von Andreas Paulin (Gast)


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....

von Florian H. (Gast)


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 :-)

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.