www.mikrocontroller.net

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


Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es mag auch sein, das dein Display einfach andere Zeiten braucht...

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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__...

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?

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@mike von welchem code redest du?

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

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

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

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.