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
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.
> 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.
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?
Es mag auch sein, das dein Display einfach andere Zeiten braucht...
> 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?
@mike von welchem code redest du? Der Link oben (http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD) wenthält nur asm-code
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.