Diskussion:AVR-GCC-Tutorial/LCD-Ansteuerung

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Ich habe da mal einen Vorschlag...

Wie bereits in [Re: LCD an ATmega32 spinnt] geschrieben finde ich es etwas ungeschickt, wenn die Adreßberechnung für das DD-RAM (je nach Zeile und Spalte) in lcd.c fest verdrahtet ist. Je nach LCD-Typ müssen hier nämlich andere Konstanten verwendet werden. Die Version im Tutorial funktioniert für ein- und zweizeilige LCDs sowie für 4x16; aber nicht für 4x20 oder 4x40.

Zum Einen ist es für Anfänger ziemlich frustierend, wenn sie Unfug auf dem LCD sehen und sich dann mit Datenblatt und viel Zeit durch den Quelltext in lcd.c quälen müssen. Zum Anderen ist es auch deshalb ungeschickt, weil man die lcd.c (die ja so eine Art fertige Lib sein soll) nicht unverändert von einem Projekt zum nächsten übernehmen kann.

Besser fände ich, in der lcd.h oder noch besser als Compileroption ein #define zu setzen, und in lcd.c werden dann (ohne Änderungen an der Datei) die richtigen Konstanten verwendet.

(Noch besser fände ich, die möglichen Typen z.B. als enum-Werte zu definieren und einen davon beim Initialisieren zu übergeben; die Berechnung erfolgt dann zur Laufzeit. Dagegen werden aber bestimmt die Puristen einwenden, daß das ein paar Byte Programmcode kostet, falls der Compiler es nicht wegoptimiert.)

Wenn schon kein irgendwie gearteter Mechanismus mehrheitsfähig ist, sollte man zumindest als Kommentar in der lcd.h deutlich machen, was Sache ist und gleich für die verschiedneen Typen die passenden Werte reinschreiben. Dann weiß man wenigstens schnell, was los ist und hat die nötigen Werte zur Hand.

Dies alles gilt gleichermaßen für die erweiterte Version [Erweiterte LCD-Ansteuerung].


Nebenbei hätte ich noch eine C++-Version, die solche Probleme nicht kennt und wesentlich intuitiver zu benutzen ist und zudem auch mehrere LCDs gleichzeitig zulässt. Ich verwende die selbst und habe sie bisher nicht hier eingefügt, weil ich vermutlich ziemlich alleine mit C++ dastehe. Falls das nicht so ist, kann ich die Version oder einen Link darauf gerne ins Tutorial oder in die Codesammmlung packen.

--Mfgkw 19:10, 25. Apr. 2010 (UTC)


(Änderung 51337 von 94.143.89.8 (Diskussion) wurde rückgängig gemacht. ???)

Ich vermute die ??? beziehen sich darauf, wie diese Stelle codiert werden soll:

Version A von Michael h45 (aktuell): <c>

   for ( uint8_t i=0; i<8; i++ )

</c>

Version B von 94.143.89.8: <c>

   uint8_t i;
   for ( i=0; i<8; i++ )

</c>

Pro A:

  • Der Sichtbarkeitsbereich von i ist sehr lokal (innerhalb des for). Der Compiler kann u.U. günstiger optimieren
  • Moderne AVR/WinAVR Versionen haben C99 per default aktiviert

Pro B:

  • Funktioniert auch, wenn der C99 Standard in (älteren) AVR-GCC/WinAVR Installationen nicht per Kommandozeile definiert ist. Version A bringt eine Fehlermeldung beim Kompilieren.

Stefan 07:54, 14. Okt. 2010 (UTC)