www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik HD44780 4x20, Fleury Lib und letzte Zeile


Autor: Daniel H. (crazor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe am ATmega8 ein HD44780-basierendes 4x20 LCD angeschlossen. 
Verwende die Fleury-Lib. Soweit ist auch alles gut, nur wird im Line 
Wrap Modus die vierte Zeile nicht beschrieben.
Schalte ich Line Wrap aus, dann läuft der Text (erwartungsgemäß) von 
Zeile 1 in 3, dann in 2 und dann in 4 über, das Display ist also heile. 
(Die komische Reihenfolge liegt am Speicheraufbau des Displays).

[edit]Im Line Wrap Modus läuft der Text von Zeile 3 in Zeile 2 (statt 4) 
und von dort wieder in Zeile 3 über, ist mir gerade aufgefallen.[/edit]

Habe folgende Defines in der lcd.h:

#define LCD_CONTROLLER_KS0073 0

#define LCD_LINES           4
#define LCD_DISP_LENGTH    20
#define LCD_LINE_LENGTH  0x40
#define LCD_START_LINE1  0x00
#define LCD_START_LINE2  0x40
#define LCD_START_LINE3  0x14
#define LCD_START_LINE4  0x54
#define LCD_WRAP_LINES      1

#define LCD_IO_MODE      1

#define LCD_PORT         PORTC
#define LCD_DATA0_PORT   LCD_PORT
#define LCD_DATA1_PORT   LCD_PORT
#define LCD_DATA2_PORT   LCD_PORT
#define LCD_DATA3_PORT   LCD_PORT
#define LCD_DATA0_PIN    0
#define LCD_DATA1_PIN    1
#define LCD_DATA2_PIN    2
#define LCD_DATA3_PIN    3
#define LCD_RS_PORT      LCD_PORT
#define LCD_RS_PIN       4
#define LCD_RW_PORT      PORTB
#define LCD_RW_PIN       2
#define LCD_E_PORT       LCD_PORT
#define LCD_E_PIN        5

Autor: Daniel H. (crazor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es sieht so aus als ob das Display sich am Ende der Zeile 3 nicht so 
verhält wie von der Library erwartet.

Aus der lcd.c:
void lcd_putc(char c)
{
    uint8_t pos;


    pos = lcd_waitbusy();   // read busy-flag and address counter
    if (c=='\n')
    {
        lcd_newline(pos);
    }
    else
    {
#if LCD_WRAP_LINES==1
#if LCD_LINES==1
        if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) {
            lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0);
        }
#elif LCD_LINES==2
        if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) {
            lcd_write((1<<LCD_DDRAM)+LCD_START_LINE2,0);    
        }else if ( pos == LCD_START_LINE2+LCD_DISP_LENGTH ){
            lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0);
        }
#elif LCD_LINES==4
        if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) {
            lcd_write((1<<LCD_DDRAM)+LCD_START_LINE2,0);    
        }else if ( pos == LCD_START_LINE2+LCD_DISP_LENGTH ) {
            lcd_write((1<<LCD_DDRAM)+LCD_START_LINE3,0);
        }else if ( pos == LCD_START_LINE3+LCD_DISP_LENGTH ) {
            lcd_write((1<<LCD_DDRAM)+LCD_START_LINE4,0);
        }else if ( pos == LCD_START_LINE4+LCD_DISP_LENGTH ) {
            lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0);
        }
#endif
        lcd_waitbusy();
#endif
        lcd_write(c, 1);
    }

}/* lcd_putc */

Ändere ich die Zeile
        }else if ( pos == LCD_START_LINE3+LCD_DISP_LENGTH ) {
in
        }else if ( pos == LCD_START_LINE3+LCD_DISP_LENGTH-1 ) {
so funktioniert der Umbruch in die vierte Zeile, aber ein Zeichen zu 
früh natürlich. Ohne die -1 wird wieder in Zeile zwei gesprungen.

Oben in der Funktion wird der aktuelle Adresszähler des Displays 
ausgelesen. Im Display-RAM ist die Organisation ja etwas eigentümlich, 
wohl um Displays mit weniger Zeilen und mehr Zeichen pro Zeile zu 
unterstützen. Offenbar scheint aber nun mein spezielles (oder alle 4x20 
Displays mit dem HD44780?) nach der Zeile drei von selbst einen "Line 
Wrap" zu machen auf die Display-Zeile 2.

Verwendet sonst keiner die Fleury Lib mit einem 4x20? Hat jemand eine 
andere Lib im Einsatz für ein 4x20? Würde mich interessieren ob der 
"Bug" auch bei anderen 4x20 existiert oder ob sonst andere Libs 
existieren, die z.B. den Adresszähler selbst vorhalten. Die Fleury Lib 
ist ja sonst recht vollständig, würde gern dabei bleiben. Habe aber auch 
nicht so viel Lust, ein Workaround einzubauen...

[edit]Habe gerade hier nochmal ein Speicher"diagramm" irgendwo geklaut:
2x40 display:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 01 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27
40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67

4x20 display:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13
40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53
14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27
54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 

Es ist genau die Stelle 27, bei der das Display offenbar von selbst 
wrapped auf die Stelle 40[/edit]

Autor: risu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Daniel,

die P. Fleury Bibliothek habe ich bisher nur mit zweizeiligen LCDs 
eingesetzt, kann also keinen Erfahrungsbericht zu vierzeiligen LCDs 
geben. Wie wär's, wenn Du das Problem P. Fleury mitteilst?

Gruß
 risu

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du XTAL korrekt gesetzt?

Autor: !!! (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Benutze auch die P. Fleury Bibliothek mit einem 4x20 Display.
Habe damit überhaupt keine Problem.
Alle 4 Zeilen werden wie gewünscht beschrieben.

Gruß

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.