Forum: Mikrocontroller und Digitale Elektronik LCD an ATmega8 mit C ansteuern


von Steffen Z. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe mir ein STK500 sowie einige Controller, ein Display und einige 
andere Bauteile geholt und das Display (wie im entsprechenden Artikel 
beschrieben) an Port D angeschlossen.

In Assembler lässt sich das Display ansteuern, in C schaffe ich es 
jedoch nicht. Es werden nur alle Stellen vollständig ausgefüllt.

Das Display ist ein Blueline EA W204B-NLW mit 4x20 Zeichen.

Ich habe es sowohl mit der LCD-Library von 
http://www.wiki.elektronik-projekt.de/mikrocontroller/avr/avr-gcc-library/lcd_library 
probiert als auch mit einigen Beispielen aus dem Forum. Könnte jemand 
bitte nochmal ein Beispiel für diesen Displaytyp einstellen oder mir 
sagen was an der geänderten Konfiguration von der oben genannten Seite 
(im Anhang) falsch ist?


Außerdem wird bei den Beispielen in Assembler bei mir der Text erst in 
Zeile 1, dann in Zeile 3 und erst danach in Zeile 2, dann zum Schluss in 
Zeile 4 angezeigt. Was muss ich ändern, damit die Reihenfolge der Zeilen 
stimmt?


Schonmal vielen Dank

Steffen

von Klaus (Gast)


Angehängte Dateien:

Lesenswert?

Hallo! im Anhang das entsprechende PDF.

Der eingebaute KS0073 unterscheidet sich in den Anfangsadressen
gegenueber HD44780 ein wenig.

1. Zeile $00..$13
2. Zeile $20..$33
3. Zeile $40..$53
4. Zeile $60..$73

Die Initialisierung ist auch etwas anders (siehe Seite 3 oben ).

Vllt. hilft dir das weiter.

von Steffen Z. (Gast)


Angehängte Dateien:

Lesenswert?

Danke, aber wirklich geholfen hat es mir leider nicht.. Bin ein
ziemlicher Anfänger was µC-Programmierung angeht..
Was bedeutet das jetzt? Was muss ich ändern damit es funktioniert?

Als Anhang mal die Dateien, sowohl Assembler als auch vom C-Versuch.

von Guru (Gast)


Lesenswert?

>Danke, aber wirklich geholfen hat es mir leider nicht.. Bin ein
>ziemlicher Anfänger was µC-Programmierung angeht..
>Was bedeutet das jetzt?

Das Du als Anfänger nicht genügend Kenntnisse hast um die die Natur 
Deines Problems zu verstehen auch wenn es Dir genannt wird.

Das einzige was dagegen hilft, ist die Grundlagen zu lernen.

von Klaus (Gast)


Lesenswert?

Schau nochmal auf Seite 3 im Datenblatt.
Im Initialisierungsbeispiel wird das sog. RE bit gesetzt, das wird 
benötigt damit das Display in den 4 Zeilenmodus gesetzt werden kann.

Ansonsten bleibt es im 2 Zeilenmodus.

Du musst nur die 3 Befehle Function Set in deine LCD_Init Routine 
unterbringen an der richtigen stelle.
Hinweis: Für den 4-Bit Modus  muss DL=0 sein.

Schau dir Function Set genau an und Studier die Befehlstabelle.

von Steffen Z. (Gast)


Lesenswert?

Okay, ich werde mir nochmal alles ganz genau ansehen und versuchen, es 
diesmal zu verstehen. Wenn es läuft oder ich nochmal Hilfe brauche, 
melde ich mich wieder :) Vielen Dank!

von Martin e. C. (eduardo)


Angehängte Dateien:

Lesenswert?

Hallo Steffen,

wo hast du den Code (C Code) her?
das habe irgenwie ergänz oder besser gesagt "gestrickt" um etwa mit 
"laufenden" Text zu experimentieren, nimmt lieber ein "Normales" C Code 
und verstehe es bzw. geht nach dem Tutorial 
(http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung) 
damit du näheres verstehen kannst.

Die meisten Code funktionieren auf Anhieb man muß nur paar Änderungen in 
.h Datei (PORT, Pin usw.) vornehmen.

z.B. im Anhang noch ein Code, da muß man nur in "lcd-routines.h" PORT 
und PIN ändern, fertig

Gruß
Martin

von Steffen Z. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Martin,

woher ich den Code habe kann ich leider nicht mehr sagen, da ich zu 
viele Codes ausprobiert habe um das noch rausfinden zu können.
Ich habe sowohl die Codes aus dem Tutorial als auch die im Anhang 
ausprobiert, aber das einzige was geschieht ist, dass die erste und 
dritte Zeile komplett ausgefüllt werden. Im Anhang ist meine geänderte 
Header-Datei (die Version von deinem Beitrag). Das Display ist, wie 
schonmal geschrieben, an Port D auf dem STK500 angeschlossen, dabei sind 
die Anschlüsse an dem Stecker genau wie im Artikel "AVR-Tutorial: LCD" 
verlötet.

Nochmal Danke und viele Grüße

Steffen

von ... (Gast)


Lesenswert?

Bis jetzt hast Du es immer noch nicht geschafft das Display richtig zu 
initialisierren!

Um mit Deiner ursprünglichen lcd-routines.asm anzufangen.
Diese Zeilen hier sind Schrott:
1
           ldi   temp1,    0b00101000   ; 4 Bot, 2 Zeilen
2
           rcall lcd_command
Wie kommst Du darauf, daß etwas mit "2 Zeilen" kommentiertes so ohne 
weiteres mit einem vierzeiligen Display funktionieren könnte?
Besser wäre stattdessen:
1
           ldi   temp1,    0b00100100
2
           rcall lcd_command
3
           ldi   temp1,    0b00001001
4
           rcall lcd_command
5
           ldi   temp1,    0b00100000
6
           rcall lcd_command
Und warum das so ist darfst Du jetzt anhand des von Klaus geposteten 
Datenblattes und insbesondere seines zweiten Posts selbst nachvollziehen 
und dann die fehlenden Kommentare noch dazu schreiben.
Und wenn Du das geschafft hast, dann müsstest Du eigentlich auch wissen 
was Du an der von Martin geposteten lcd-routines.c ändern müsstest(Tip: 
eine Zeile durch drei neue ersetzen). Wenn Du Dir dann den ersten Post 
von Klaus auch noch mal durchliest und dann Martins 'set_cursor' 
Funktion auch noch entsprechend korrigierst, dann sollte es auch mit C 
klappen.

Btw. für C ist die Lib von Peter Fleury mit die beste die Du finden 
kannst:
http://jump.to/fleury
direkt:
http://homepage.hispeed.ch/peterfleury/lcdlibrary.zip
Und schau unbedingt in die darin enthaltene HTML-Datei!

Du müßtest in der enthaltenen lcd.h vermutlich nur folgende Zeilen 
ändern
1
#define XTAL 4000000              /**< clock frequency in Hz, used to calculate delay timer */
1
#define LCD_CONTROLLER_KS0073 0  /**< Use 0 for HD44780 controller, 1 for KS0073 controller */
Tip: Du hast einen KS0073.
1
#define LCD_LINES           2     /**< number of visible lines of the display */
2
#define LCD_DISP_LENGTH    16     /**< visibles characters per line of the display */
1
#define LCD_START_LINE1  0x00     /**< DDRAM address of first char of line 1 */
2
#define LCD_START_LINE2  0x40     /**< DDRAM address of first char of line 2 */
3
#define LCD_START_LINE3  0x14     /**< DDRAM address of first char of line 3 */
4
#define LCD_START_LINE4  0x54     /**< DDRAM address of first char of line 4 */
(siehe 2. Post von Klaus bzw. Datenblatt Seite 3)
1
#define LCD_PORT         PORTA        /**< port for the LCD lines   */
1
#define LCD_RS_PIN       4            /**< pin  for RS line         */
1
#define LCD_RW_PIN       5            /**< pin  for RW line         */
1
#define LCD_E_PIN        6            /**< pin  for Enable line     */

PS:
Steffen Z. schrieb:
> das Display (wie im entsprechenden Artikel
> beschrieben) an Port D angeschlossen.

Welchen Artikel meinst Du? Zufällig diesen: 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD#Anschluss_an_den_Controller 
?
Dann funktioniert die Lib von Peter leider nicht so ohne weiteres :(
Die setzt voraus, daß auch der Pin 5 vom Display ('RW') mit 
angeschlossen ist.

von Hubert G. (hubertg)


Angehängte Dateien:

Lesenswert?

Die Lib von Fleury gibt es auch ohne R/W

von ... (Gast)


Lesenswert?

Hubert G. schrieb:
> Die Lib von Fleury gibt es auch ohne R/W

Ja, da hast Du Dir zwar Mühe gegeben und versucht das RW aus der Lib 
raus zu operieren, aber leider nicht vollständig. Die Lib wird so nur 
teilweise funktionieren, beispielsweise geht die Behandlung von '\n' 
schief und das Linewrapping dürfte auch nicht mehr gehen.

von Steffen Z. (Gast)


Lesenswert?

Vielen, vielen Dank nochmal für eure Geduld und die guten 
Tipps/Anleitungen. Ich glaube so langsam beginne ich das alles zu 
verstehen..


... schrieb:
> Welchen Artikel meinst Du? Zufällig diesen:
> http://www.mikrocontroller.net/articles/AVR-Tutori...
> ?
> Dann funktioniert die Lib von Peter leider nicht so ohne weiteres :(
> Die setzt voraus, daß auch der Pin 5 vom Display ('RW') mit
> angeschlossen ist.

Ja, den Artikel meinte ich. Wie müsste ich den Pin denn noch anschließen 
bzw. ist das überhaupt noch ohne Weiteres möglich?

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.