mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD-Display AV1640 - Zeilenfehler


Autor: M. B. (freiberger77)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe das Display von Conrad AV1640 ( 16 Buchstaben & 4 Zeilen) am 
ATTiny2313. (4Bit-Modus)
Angeschlossen ist alles richtig.
Wenn ich einen Text sende, wird er nur in Zeile 1 und 3 angezeigt (Zeile 
2 wird automatisch übersprungen).
Wie kann ich auf Zeile 2 und 4 zugreifen ?

Wenn ich den Text mehrfach sende, wird irgendwann Zeile 2 und 4 
beschrieben.
Die CLS-Funktion funktioniert auch nicht...

Im Anhang ist das Datenblatt und der Code.

Autor: Hubert G. (hubertg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Datenblatt 1.Seite ganz unten, siehst du die Adressen der einzelnen 
Zeilen. Du wirst da deinen Code anpassen müssen.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn ich einen Text sende, wird er nur in Zeile 1 und 3 angezeigt (Zeile
> 2 wird automatisch übersprungen).
Der Code ist für ein Zweizeiliges Display geschrieben   :-o
Die LCD-Zeilen 1 und 3 entsprechen der Zeile 1 im Code.
Die LCD-Zeilen 2 und 4 entsprechen der Zeile 2 des Codes.

Wenn du 4 Zeilen willst, ist dort der Hebel, wo du ansetzen mußt:
// Zeilenwechsel
void lcd_gotoline (uint8_t zeile)    
{
  if (zeile == 1) lcd_write(0x80,0);   // B 1000 0000 => DD-RAM Adress Set   
  if (zeile == 2) lcd_write(0xC0,0);   // B 1100 0000 => DD-RAM Adress Set   
  if (zeile == 3) lcd_write(0x90,0);   // B 1001 0000 => DD-RAM Adress Set    
  if (zeile == 4) lcd_write(0xD0,0);   // B 1101 0000 => DD-RAM Adress Set 
}
und gleiches bei den Cursorpositionen...

Autor: Michael S. (msk) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie die Vorredner schon sagten, für die zweite und vierte Zeile musst Du 
die Cursor-Position entsprechend setzen. Wenn Du einfach hintereinander 
wegschreibst, ist die Reihenfolge:

1. Zeile
3. Zeile
2. Zeile
4. Zeile

Der Beginn der zweiten Zeile liegt bei den Displays, die ich bisher 
hatte, 0x40h hinter dem Beginn der ersten Zeile. Hier ein Stück 
Quelltext, mit dem Du die Position innerhalb des Displays auf jede 
beliebige Stelle setzen kannst:
switch (row) {

  case 1:           //1. row
    address = SET_DDRAM_ADDRESS | column;  //DB7=1 --> set DDRAM Address, DB0...DB6 --> Address
    break;

  case 2:           //2. row
    address = SET_DDRAM_ADDRESS | (DDRAM_OFFSET + column);   //DB7=1 --> set DDRAM Address, DB0...DB6 --> Address
    break;

  case 3:           //3. row
    address = SET_DDRAM_ADDRESS | (DISPLAY_NUMBER_COLUMNS + column);  //DB7=1 --> set DDRAM Address, DB0...DB6 --> Address
    break;

  case 4:           //4. row
    address = SET_DDRAM_ADDRESS | (DDRAM_OFFSET + DISPLAY_NUMBER_COLUMNS + column);  //DB7=1 --> set DDRAM Address, DB0...DB6 --> Address
    break;

  default:
    return;                   //do nothing if wrong row requested
  }

Row und Column sind von Dir dann entsprechend anzugeben. Die Funktion 
habe ich bewusst so geschrieben, dass man sie an möglichst viele 
Displays adaptieren kann. Für Dein Display müssten die Parameter 
folgendermaßen lauten:
#define SET_DDRAM_ADDRESS                0x80  //set DDRAM Address (DB0...DB6 transport address)
#define DISPLAY_NUMBER_COLUMNS             16  //number of display columns
#define DDRAM_OFFSET                     0x40  //address offset for 2. line (for 2-line-mode)

Die Adresse musst Du dann einfach als Kommando an das Display senden und 
damit ist die gewünschte Cursor-Position gesetzt.

Falls Bedarf besteht, kann ich auch mal meine Display-Routinen hier 
hochladen. Ich habe mir mal die Mühe gemacht, die so adaptierbar wie 
möglich zu machen (Anzahl Zeilen, Zeichen, Pin-Belegung etc.), die 
sollten also auch mit Deinem Display laufen.

Autor: M. B. (freiberger77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, ich versuche die Änderungen dann mal.
Hab leider das Prinzip noch nicht verstanden, wo ich welche Daten senden 
muß, zB für INIT und CLEAR usw.
Aus dem Datenblatt werde ich nicht schlau...

Autor: M. B. (freiberger77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die 4 Zeilen werden jetzt richtig angezeigt.
Aber Bildschirm löschen geht überhaupt nicht.
Obwohl die Bits dafür ja stimmen sollten...

Autor: M. B. (freiberger77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und warum läuft das Dasplay nur am Programmiergerät ?
Wenn ich die Schaltung an nem 9V-Block mit nem 7805 laufen lasse, 
leuchtet zwar das Display und der ATTiny (LED blinkt an Port B), aber 
auf dem Display bleiben die schwarzen Balken in Zeile 1 & 3...

Autor: Michael S. (msk) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marco B. schrieb:
> die 4 Zeilen werden jetzt richtig angezeigt.
> Aber Bildschirm löschen geht überhaupt nicht.
> Obwohl die Bits dafür ja stimmen sollten...

Also der Clear-Befehl scheint mir bei Dir mit dem Cursor-Home-Befehl 
vertauscht zu sein - sollte aber nichts ausmachen. Prüfe mal, ob Du die 
RS-Leitung auch richtig setzt (auf LOW), damit das als Befehl 
interpretiert wird.

Autor: Michael S. (msk) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marco B. schrieb:
> und warum läuft das Dasplay nur am Programmiergerät ?
> Wenn ich die Schaltung an nem 9V-Block mit nem 7805 laufen lasse,
> leuchtet zwar das Display und der ATTiny (LED blinkt an Port B), aber
> auf dem Display bleiben die schwarzen Balken in Zeile 1 & 3...

Dann hat die Initialisierung nicht funktioniert. Hast Du es erst nach 
dem Start angesteckt?

Autor: M. B. (freiberger77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zum CLEAR... die RS-Leitung muß funktionieren, sonst würden die anderen 
Daten ja nicht übertragen.

Wenn ich den Prozessor an das Programmiergerät anstecke, erscheint 
sofort die Schrift.
Nehme ich den ISP-Stecker ab und lege Reset (Pin1) an +5V und lege dann 
die Batterie an, dann zeigt es keine Schrift. Der Prozessor läuft aber 
(LED blinkt).

manchmal kommen aber auch beim Batt. anlegen mit Programmiergerät nur 
Balken oder wirre Zeichen.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Nehme ich den ISP-Stecker ab und lege Reset (Pin1) an +5V und lege dann
>die Batterie an, dann zeigt es keine Schrift. Der Prozessor läuft aber
>(LED blinkt).

Dann solltest du mal die Wartezeit vor der Initialisierung verlängern.

MfG Spess

Autor: Michael S. (msk) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marco B. schrieb:
> zum CLEAR... die RS-Leitung muß funktionieren, sonst würden die anderen
> Daten ja nicht übertragen.
>
> Wenn ich den Prozessor an das Programmiergerät anstecke, erscheint
> sofort die Schrift.
> Nehme ich den ISP-Stecker ab und lege Reset (Pin1) an +5V und lege dann
> die Batterie an, dann zeigt es keine Schrift. Der Prozessor läuft aber
> (LED blinkt).
>
> manchmal kommen aber auch beim Batt. anlegen mit Programmiergerät nur
> Balken oder wirre Zeichen.

Wie ist der Reset-Pin an Deinem Controller beschaltet? Da sollte ein 
10k-Widerstand gegen Vcc und ein 47nF-Kondensator gegen Masse beschaltet 
sein, um beim Anlegen von Betriebsspannung auch einen Reset auszuführen. 
Nach Deiner Beschreibung wird Dein Controller nicht vernünftig resettet.
Dann solltest Du die Wartezeiten bei der Initialisierung Deines Displays 
nachprüfen.

Autor: M. B. (freiberger77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe einen 100nF Kondensator (mit 10nF habe ich auch versucht), sollte 
aber auch gehen.
Auf dem Display blinken jetzt ab und zu Kästchen auf, aber kein Text.
Die Spannung ist bei 5,1V konstant.

Autor: Michael S. (msk) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
100nF sollten auch gehen. Und der Pullup (10k) ist auch dran?

Autor: M. B. (freiberger77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, habe extra nachgemessen.
Ich warte sogar 1 Sek nach Start und init. dann erst das Display.

Wenn ich wärend dem "Fehlbetrieb" das ISP anstecke, muß ich erst den 
USB-Stecker raus/rein machen. Dann geht es erst...

Wenn ich im Batt-Betrieb Reset auf Minus und wieder abnehme ,
dann geht es...

Es muß am Kondensator liegen, aber den habe ich nachgemessen...
Vielleicht nen Elko nehmen ?

Autor: Michael S. (msk) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marco B. schrieb:
> Es muß am Kondensator liegen, aber den habe ich nachgemessen...
> Vielleicht nen Elko nehmen ?

Nein, keinen Elko. Prüfe lieber nochmal Deine Schaltung am Reset-Pin.

Autor: M. B. (freiberger77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
da kann ich nicht mehr prüfen. Habe die Bauteile nachgemessen.
10k gegen +5V und 100nF gegen GND.
Erst wenn ich Reset kurz auf GND lege, dann geht es.

Habe jetzt mal 5 sek Wartezeit vor LCD_INIT.
Die LED leuchtet nach anlegen der Spannung 5 sek und fängt dann an zu 
blinken...
Aber das Display zeigt nur Kästchen...

Autor: M. B. (freiberger77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe gerade zurch Zufall was merkwürdiges festgestellt.
Wenn ich Kurz Reset auf GND lege, geht es.
Mache ich es nochmal, zeigt es Balken an.
Immer abwechselnd. Malg gehts, mal gehts nicht.
Das Display hat aer keinen Reset-Pin...

Ich denke fast, es ist ein Fehler in der INIT-Routine.
Es wird erst auf 8-Bit und dann auf 4-Bit umgeschalten.
Wie erkenne ich im Datenblatt, ob die Routine stimmt ?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Wie erkenne ich im Datenblatt, ob die Routine stimmt ?

Im Datenblatt vom KS0066 steht es drin.

MfG Spess

Autor: Michael S. (msk) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieht mir eher danach aus, dass die Wartezeit zur Initialisierung des 
Displays nicht stimmt oder ähnliches.

Wie Du im Datenblatt erkennst, dass die Routine stimmt? Eigentlich nur 
durch vergleichen des Beispiels zur 4-Bit-Initialisierung, wenn 
vorhanden (oftmals leider nicht). Schau mal hier:
http://www.sprut.de/electronic/lcd/index.htm#init

Das sollte eigentlich so funktionieren.

Autor: M. B. (freiberger77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey, die Seite ist ja richtig gunt erklärt.
Ich lese mir das morgen mal in Ruhe durch.
Dankeschön erstmal...

Autor: M. B. (freiberger77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
WOW,
vielen Dank an Michael S.
Die Seite hat mir sehr geholfen... Jetz hab ich den Durchblick.

Es ist ein Fehler in der Initialisierung gewesen. (Umschaltung auf 4 Bit 
- LOW & HIGH-Bit vertauscht)
Mit folgender Änderung klappt es wunderbar...
// Display initialisieren. Einmal als erstes aufrufen
void lcd_ini ()
{
  DDRD = 0x3F;    // setze Portrichtung (1 = Ausgang): 0011 1111 
  PORTD=0x00;      // alle Leitungen LOW

  _delay_ms(60);    // 10ms warten bis LCD wirklich bereit (max. Wert lt. Datenblatt)


  lcd_write(0b00110000,0);     // 8-Bit-Modus aktivieren, Ist wichtig, falls LCD schon im 4-Bit Modus war und dann               
                  // nach einem Programm-Reset vergeblich versucht würde, den 4-Bit Modus erneut zu aktivieren
  lcd_write(0b00110000,0); 
  lcd_write(0b00110000,0);
  

  lcd_write(0b00100000,0);    // B 0000 0010 => mit 8-Bit-Command in 4-Bit-Modus umschalten 

  lcd_flash_e ();      // Enable

  _delay_us(200);      // sicherheitshalber warten

  // ab jetzt 4-Bit-Modus
  lcd_write(0b00101000,0);     // => Function Set: 4Bit (kein 8-Bit Bus), zweizeiliges Display, 5x7 Dots/Zeichen (kein 5x10)
  lcd_write(0b00001100,0);     // => Display On/Off: Display ein, Cursor aus, Blinken aus
  lcd_write(0b00000110,0);     // => Entry Mode Set: DD-RAM autom. inkr., Cursor bewegen
  
  lcd_cls();        // Display löschen
}

Es ist zwar bestimmt nicht perfekt, aber jetzt kommt sofort der richtige 
Text.
Aber die CLS-Funktion geht trotzdem nicht. Naja, mann kann ja 
Leerzeichen drüberschreiben...

Danke an alle Helfer    ;-)

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.