avr-gcc Tutorial LCD Ansteuerung

Gast #662276
Lesenswert?

Hallo,

ich habe gemäß des avr-gcc Tutorials ein 2x16 LCD von Reichelt (KS0070B) 
mit einem ATmega8 angesteuert. Das geht soweit auch erstmal.
Schreibe ich nun allerdings mit lcd_data('x'); mehrere Zeichen und komme 
an Stelle 16, dann bekomme ich keine oder eine ganz fehlerhafte Ausgabe. 
Lasse ich das letzte Zeichen aus und gehe dann mit set_cursor(0,2); in 
Zeile 2, dann kann ich auch bis einschließlich Zeichen 15 schreiben, das 
16. verursacht auch diesen Fehler. Woran liegt das? Wie kann ich das 
vermeiden?

Der Codeschnipsel:

  lcd_init();
  set_cursor(0,1);
  lcd_data('1'); // 1
  lcd_data('2'); // 2
  lcd_data('3'); // 3
  lcd_data('4'); // 4
  lcd_data('5'); // 5
  lcd_data('6'); // 6
  lcd_data('7'); // 7
  lcd_data('8'); // 8
  lcd_data('9'); // 9
  lcd_data('0'); // 10
  lcd_data('A'); // 11
  lcd_data('B'); // 12
  lcd_data('C'); // 13
  lcd_data('D'); // 14
  lcd_data('E'); // 15
  lcd_data('F'); // 16   lasse ich diese Stelle weg, gehts
  set_cursor(0,2);
  lcd_data('1'); // 1
  lcd_data('2'); // 2
  lcd_data('3'); // 3
  lcd_data('4'); // 4
  lcd_data('5'); // 5
  lcd_data('6'); // 6
  lcd_data('7'); // 7
  lcd_data('8'); // 8
  lcd_data('9'); // 9
  lcd_data('0'); // 10
  lcd_data('A'); // 11
  lcd_data('B'); // 12
  lcd_data('C'); // 13
  lcd_data('D'); // 14
  lcd_data('E'); // 15
  lcd_data('F'); // 16 lasse ich diese Stelle weg, gehts


Danke für Eure Hilfe!
Grüße Pascal
Gast #662363
Lesenswert?

Ja, stimmt. Es liegt wirklich an _delay_us(42). Mit -O1 funktioniert es 
einwandfrei. Leider wird so mein Code eine ganze Ecke größer...
Weiß jemand ob man irgendwie noch das Problem in den Griff bekommen 
kann?

Zwischenzeitlich hatte ich auch mal die lcdlibrary von P. Fleury 
getestet, leider kann ich trotz Anpassungen in der .h dem Display kein 
Zeichen entlocken. Es stehen in der oberen (1.) Zeile nur schwarze 
Quadrate. Das Hardware-Setup ist dasselbe.
Habe auch im Forum schon alle Beiträge durchgelesen, leider ohne Erfolg. 
Die lcdlibrary würde ich gerne nehmen, nur weiß ich nicht wie ich die 
mit dem KS0070B zum Laufen bekommen soll...

Grüße Pascal
Gast #662454
Lesenswert?

Nochmal Hallo!

Also ich habe irgendwie Probleme mit dem Timing oder so...

Ich habe mal eine ganze Zeit eine perfekte Anzeige, dann wieder zeigt 
das LCD mir nur Wirr-Warr. Wie kann ich den Fehler eingrenzen und 
beseitigen?

Grüße Pascal
#662593
Lesenswert?

Pascal wrote:
> Ja, stimmt. Es liegt wirklich an _delay_us(42). Mit -O1 funktioniert es
> einwandfrei. Leider wird so mein Code eine ganze Ecke größer...
> Weiß jemand ob man irgendwie noch das Problem in den Griff bekommen
> kann?

Denn geh mal auf die Compileroption -Os oder -O3

> Zwischenzeitlich hatte ich auch mal die lcdlibrary von P. Fleury
> getestet, leider kann ich trotz Anpassungen in der .h dem Display kein
> Zeichen entlocken. Es stehen in der oberen (1.) Zeile nur schwarze
> Quadrate. Das Hardware-Setup ist dasselbe.
> Habe auch im Forum schon alle Beiträge durchgelesen, leider ohne Erfolg.
> Die lcdlibrary würde ich gerne nehmen, nur weiß ich nicht wie ich die
> mit dem KS0070B zum Laufen bekommen soll...

Das klingt alles nach Timingproblemen.
Such mal alle Warteschleifen, die damit im Zusammenhang stehen,
und mach die Konstanten etwas größer.

Aber Achtung: Wenn die _delay_xx Funktionen benutzt werden,
dann muss (!) der Optimizer des Compilers eingeschaltet sein,
ansonsten stimmt das Timing überhaupt nicht.
Persönliche Seite #704207
Lesenswert?

Ein Variablenausgabebeispiel ergänze ich gerade.

Veränderungen in der Source können notwenig sein bei

1/ einem anders anzusteuernden LCD-Controller auf dem Ersatz-LCD. Das 
kann die Initialiserung (Timing, Kommandos) und/oder die 
Kommandosequenzen (CURSOR_HOME...) betreffen. Näheres hierzu im 
Datenblatt des LCD-Controllers

2/ bei anderer Adresslage der einzelnen Zeichen in den Zeilen/Spalten 
(Funktion set_sursor). Näheres hierzu ebenfalls im Datenblatt des 
LCD-Controllers.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren