Hi, bei meinem Display (4x20 Zeichen) kann ich nur die erste und dritte Zeile ansprechen (mit set_cursor() ). In der zweiten und vierten werden alle Zeichen der Vorzeile ab dem 13. Zeichen wiederholt. - LCD-Modul EA DIP204-4 - lcd-routines.h Könnt Ihr mir einen Tipp geben? Vielen Dank und beste Grüße Volker
Hallo, wie rufst du die Funktion set_cursor auf. In meiner lcd.c ist diese so definiert:
1 | void set_cursor(uint8_t x, uint8_t y) |
2 | {
|
3 | uint8_t tmp; |
4 | |
5 | switch (y) { |
6 | case 1: tmp=0x80+0x00+x; break; // 1. Zeile |
7 | case 2: tmp=0x80+0x40+x; break; // 2. Zeile |
8 | case 3: tmp=0x80+0x10+x; break; // 3. Zeile |
9 | case 4: tmp=0x80+0x50+x; break; // 4. Zeile |
10 | }
|
11 | lcd_command(tmp); |
12 | }
|
Aus dem Datenblatt deines LCDs habe ich: 1. Zeile $00..$13 2. Zeile $20..$33 3. Zeile $40..$53 4. Zeile $60..$73 Du musst also set_cursor so modifizieren, denke ich:
1 | void set_cursor(uint8_t x, uint8_t y) |
2 | {
|
3 | uint8_t tmp; |
4 | |
5 | switch (y) { |
6 | case 1: tmp=0x80+0x00+x; break; // 1. Zeile |
7 | case 2: tmp=0x80+0x20+x; break; // 2. Zeile |
8 | case 3: tmp=0x80+0x40+x; break; // 3. Zeile |
9 | case 4: tmp=0x80+0x60+x; break; // 4. Zeile |
10 | }
|
11 | lcd_command(tmp); |
12 | }
|
Viel Erfolg
Mannometer, bis ich diese Tabelle da oben gesehen hab'... :-( Ja, da ist was dran. Allerdings bleibt diese Wiederholung in der nächsten Zeile immer noch und die geraden Zeilen kann ich trotzdem nicht ansteuern. Ich hab mir mal jetzt alle Befehle und Initialisierungen angesehen. In der lcd-routines.h steht in einer Zeile // 4Bit 2 Zeilen 5x7 lcd_command(0x28); Nun, das ist ja ein Wink mit dem Zaunpfahl. Aber laut Tabelle im Datenblatt gibt es nur die Möglichkeit, mit dem DB3 auf 1-zeilig oder 2-zeilig zu schalten - hä? Ich hab doch 'n Vierzeiler!? Auf der Seite 3 oben ist dann aber eine Initialisierungssequenz angegeben, wo "4 Zeilen Modus" dran steht - die hat aber mit 0x09 nix mit dem zu tun, was links unten in der Tabelle steht. Aber dadrüber steht 8-BIT-MODUS ! Bedeutet das eventuell, dass ich den Vierzeilenmodus nur im 8-Bit-Modus bekomme?? Danke und Grüße Volker
Probier doch mal alternativ die LCD-Files von Peter Fleury aus, vielleicht geht es mit denen besser. http://homepage.hispeed.ch/peterfleury/avr-software.html
Probiers mal mit dem NW im 'Extended Function set' :-) HTH
'Extended Function set' ist das richtige Stichwort, das Problem liegt in der Initialisierung (fuer 4 Zeilen). Habe eine funktionierende Initialisierung fuer Dein Display in ASM. Bitte melden bei Interesse. Volker
Volker Schulz schrieb: > 'Extended Function set' ist das richtige Stichwort, das Problem liegt in > der Initialisierung (fuer 4 Zeilen). Habe eine funktionierende > Initialisierung fuer Dein Display in ASM. Bitte melden bei Interesse. Ei, sicher ;-) Ich will das ja verstehen. Man muss nicht alles neu erfinden, aber bei Displays lohnt es sich, sie zu verstehen, denke ich. Die braucht man ja ständig. Danke und Grüße der andere Volker
@Mike und @g457: danke! Ich berichte, was passiert, auch Peter Fleury werde ich mal ausprobieren - aber erst mal das eine verstehen ;-)
Volker schrieb: > Ei, sicher ;-) Noch besser... Schau mal hier: http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD und lad Dir anschliessend die Lcd-routines.asm hier herunter: http://www.mikrocontroller.net/wikifiles/9/96/Lcd-routines.asm Um das Ganze nun DIP204-tauglich zu machen, musst Du bei der Initialisierung folgendes veraendern: ORIGINAL:
1 | ldi temp1, 0b00000010 ; 4bit-Modus einstellen |
2 | out LCD_PORT, temp1 |
3 | rcall lcd_enable |
4 | rcall delay5ms |
5 | ldi temp1, 0b00101000 ; 4 Bot, 2 Zeilen |
6 | rcall lcd_command |
7 | ldi temp1, 0b00001100 ; Display on, Cursor off |
8 | rcall lcd_command |
9 | ldi temp1, 0b00000100 ; endlich fertig |
10 | rcall lcd_command |
MUSS LAUTEN:
1 | ldi temp1, 0b00100100 ; 4bit-Modus einstellen, RE=1 |
2 | rcall lcd_command |
3 | ldi temp1, 0b00001001 ; 4 Zeilen |
4 | rcall lcd_command |
5 | ldi temp1, 0b00100000 ; 4bit-Modus einstellen, RE=0 |
6 | rcall lcd_command |
7 | ldi temp1, 0b00001100 ; Display on, Cursor off, no blinking |
8 | rcall lcd_command |
9 | rcall lcd_clear |
10 | ldi temp1, 0b00000100 ; endlich fertig |
11 | rcall lcd_command |
Vielleicht wird auch so klar, was gemacht wird... Volker
Success, yeah! Hab's in C 'raus: // zuerst den 4Bit-Modus einschalten // ... // lcd_command(0x28); ist für 2zeilig ausgelegt - stattdessen: lcd_command(0b00100100); // DB5=1: 4-bit-Modus; DB2=1: Extension-Bit einschalten _delay_ms(5); lcd_command(0b00001001); // DB3=1 ^ DB0=1 : 4zeilig einschalten _delay_ms(5); lcd_command(0b00100000); // DB2=0: Extension-Bit wieder ausschalten _delay_ms(5); // danach die weiteren Einstellungen Die delays sind sicher zu lang, kann man ja noch anpassen. Deine Bemühungen um den Assembler-Code, Volker, waren aber nicht umsonst, die werde ich als nächstes testen. Danke Euch allen erstmal für Eure schnelle Hilfe! Schönes Bastelwochenende noch :-) Volker
Volker schrieb: > Die delays sind sicher zu lang, kann man ja noch anpassen. Ja, der Controller im Display ist recht schnell im Vergleich zu manch anderem. > Deine Bemühungen um den Assembler-Code, Volker, waren aber nicht > umsonst, die werde ich als nächstes testen. Das brauchst Du nicht, ist naemlich genau das Gleiche! ;) Volker
Volker Schulz schrieb:
> Das brauchst Du nicht, ist naemlich genau das Gleiche! ;)
Ou, ich sehs jetzt :-)) Klar...
Bis bald...
Volker schrieb:
> Die delays sind sicher zu lang, kann man ja noch anpassen.
Busy-Flag-Auswerting bringt erhebliche (aka maximale praktikable)
Beschleunigung und schont die Nerven wenn das _delay* (aus welchem Grund
auch immer, seis ein kaputter Quarz oder ein falscher welcher oder zu
niedrige Temperatur oder wasauchimmer) mal nicht klappert. BTDT :-)
HTH und HF mit dem Vierzeiler ;-)
Ja, das ist einzusehen. Ich hab das Ding jetzt so verdrahtet, wie die lcd-routines das vorsehen, da ist die RW-Leitung fest auf Masse gelötet. Muesste ich kurz umlöten auf den PD6, damit ich das Busy abfragen kann. Kommt... :-) Was hat Peter Fleury denn zu bieten, sind da bessere Routinen dabei? Danke und Grüße Volker
Volker schrieb: > Ja, das ist einzusehen. Ich hab das Ding jetzt so verdrahtet, wie die > lcd-routines das vorsehen, da ist die RW-Leitung fest auf Masse gelötet. > Muesste ich kurz umlöten auf den PD6, damit ich das Busy abfragen kann. Jau, auf Busy-Flag habe ich aber auch verzichtet. Ich uebertrage ohnehin nur seriell Daten vom Rechner ueber ATMEGA8 und dann auf's Display. Immer volle 4x20 Zeichen und dann (zur Sicherheit) Cursor Home. Alle 100ms einen kompletten Screen mit 9600bps... Klappt prima und laeuft absolut stabil, da nach "Cursor Home" ja noch ein paar ms bis zur naechsten Uebertragung uebrig sind. ;) Also werden Delays bei mir nur waehrend der Initialisierung benutzt. Volker
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.