Forum: Compiler & IDEs LCD aus Forum nur bei O0 und O1


von Mike (Gast)


Lesenswert?

Hallo

Der Code aus diesem Forum für ein LCD funktioniert bei mir nur bei 
Optimierung  O0 und 01. Bei allen anderen läuft nicht mal die 
Initialisierung richtig ab.
Nach der Init soll das Display leer sein. Das ist es aber nur bei O0 und 
O1 Optimierung der Fall.

Wie kann das sein? Ist der Code für das LCD hier nicht ausreichend 
getestet worden?

http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD

von Karl H. (kbuchegg)


Lesenswert?

Eine mögliche Ursache könnte sein, dass das Timing nicht eingehalten 
wird. Das kann zb. sein, weil deine Taktfrequenz nicht richtrig 
eingestellt wird oder aber auch, weil du dem Display ganz am Anfang 
nicht genug Zeit gibst sich selbst zu initialisieren.

Also, mach einfach mal die Zeiten etwas länger, bzw. mach noch einen 
delay_ms() bevor du den Init aufrufst.

PS: Ich werde den Code vom Assembler Tutorium in das C Tutorium 
verfrachten, da C Code im Assembler Tutorium nichts verloren hat.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> Wie kann das sein? Ist der Code für das LCD hier nicht ausreichend
> getestet worden?

Möglich. Dein Test ist insofern ein wichtiger Schritt zu stabilem Code 
im Tutorial.

> Der Code aus diesem Forum für ein LCD funktioniert bei mir nur bei
> Optimierung  O0 und 01.

Erstaunlich. Eigentlich ist der Code für ausgeschaltete Optimierung 
(-O0) überhaupt nicht gedacht, weil die verwendeten Wartefunktionen 
(_delay_us und _delay_ms aus der avr-libc) nur bei eingeschalteter 
Optimierung zuverlässig arbeiten.

von Mike (Gast)


Lesenswert?

Es lag definitv am Timing.
Das Ganze wundert mich jedoch sehr. Die _delay_xs() dürften vom 
Optimierungsgrad nicht abhängig sein. Gerade bei O0 und O1 dürfte das 
delay nicht mehr so gut gehen. Aber genau dann funktioniert es. Und auch 
nur dann.
Ich denke, es liegt vor allem an dem Enable Impuls. Ich musste den auf 
20µs erhöhen. Das Display lief und läuft z.T. auch nicht immer direkt 
los.
Hier und da kommt dann doch noch mal ein Displaywirrwarr.
Der interne Takt beim verwendeten mega8 liegt bei 5Mhz, also nicht zu 
hoch für 42 ms in _delay_ms.

Alles sehr sonderbar.

Wie sieht das eigentlich mit dem Enable Puls aus? Benötigt der jetzt 
eine steigende oder fallende Flanke?

von Werner (Gast)


Lesenswert?

Es mag auch sein, das dein Display einfach andere Zeiten braucht...

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> Die _delay_xs() dürften vom Optimierungsgrad nicht abhängig sein.

Aus der Doku von avr-libc:
"Note: In order for these functions to work as intended, compiler 
optimizations must be enabled, and the delay time must be an expression 
that is a known constant at compile-time. If these requirements are not 
met, the resulting delay will be much longer (and basically 
unpredictable), and applications that otherwise do not use 
floating-point calculations will experience severe code bloat by the 
floating-point library routines linked into the application."
http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html

D.h. du hast bei -O0 ein LÄNGERES Timing. Wenn dein Display - so wie es 
aussieht - LÄNGERE Zeiten als das "Tutorial-LCD" mag, profitierst du von 
dem Effekt.

Hast du ein Datenblatt vom Display mit der Beschreibung des Timings?

von Ulrich (Gast)


Lesenswert?

@mike von welchem code redest du?

Der Link oben 
(http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD) wenthält nur 
asm-code

von Johannes M. (johnny-m)


Lesenswert?

@Ulrich:
Lies Dir das PS im Posting von Karl Heinz von 11:10 durch. Dann weißt Du 
Bescheid.

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.