mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD 8x2 (KS0066) ansteuern


Autor: Alex Bürgel (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Dieses Thema wurde schon min. 1000x behandelt, jedoch bekomme ich das 
o.g. Display einfach nicht ans laufen... vielleicht seht ihr ja meinen 
Fehler und könnt mir helfen.
Zu den Randbedingungen: Ein "Anag Vision 0820"-Display mit 
KS0066-Controller ist an einen ATMega32 über 8-Bit-Interface 
angeschlossen.
Die Datenbits liegen an PORTC0-7. PORTB0 = Enable, PORTB1 = R/W, PORTB2 
= RS.

Der Quelltext, mit dem ich versuche das Display zu betreiben:
int main(void){

  //Initialization

  //Configure I/Os
  DDRA  = 0b00000000;
  PORTA = 0b00000000;

  DDRB  = 0b00000111;
  PORTB = 0b11111000;

  DDRC  = 0b11111111;
  PORTC = 0b00000000;

  DDRD  = 0b11111111;
  PORTD = 0b00000000;

  //Configure Timers
  TCCR0 = 0b00000101;

  pause(100);

  init_display();

  lcd_send(1, 0x66);
  lcd_send(1, 0x66);
  lcd_send(1, 0x66);
  lcd_send(1, 0x66);
    
  while(1){
  
  }
}

//Function definitions

//Initialize the LCD
void init_display(void){
  lcd_send(0, 0x30);
  lcd_send(0, 0x30);
  lcd_send(0, 0x30);
  lcd_send(0, 0x38);
  lcd_send(0, 0x08);
  lcd_send(0, 0x02);
  lcd_send(0, 0x0F);
  return;
}

//lcd send command
void lcd_send(int type, int value){
  PORTB |= 1;
  PORTB &= 0b11111001;
  if(type == 1)
    PORTB |= 0b100;
  PORTC = value;
  PORTB &= 0b11111110;
  pause(30);
  PORTB |= 1;
  pause(30);

  return;
}

//Pause
void pause(uint8_t length){
  uint8_t stop;
  stop = TCNT0 + length;
  while(TCNT0 < stop);
  return;
}

Ist es richtig, dass die "Enable"-Leitung des Displays immer high ist 
und zur Übernahme eines neuen Befehls auf low gezogen wird?
(=Ändern der Werte auf den Datenleitung bei EN = high?)

Was passiert ist folgendes: Beide Zeilen des Displays werden vollständig 
eingeschaltet. Es ist weder ein Zeichen noch ein Cursor sichtbar...

Kann mir vielleicht jemand helfen?

Das Tutorial habe ich mir durchgelesen. Da wird leider nur die 
Ansteuerung im 4-bit-Modus besprochen.
In Zahlreichen anderen Threads, bei denen es um das gleiche Problem 
ging, wurden keine Lösungen gefunden?! Irgendwann waren die Threads dann 
einfach tot...

Vielen Danke & schöne Grüße,
Alex

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

<void init_display(void){
>  lcd_send(0, 0x30);
>  lcd_send(0, 0x30);
>  lcd_send(0, 0x30);
>  lcd_send(0, 0x38);
>  lcd_send(0, 0x08);
>  lcd_send(0, 0x02);
>  lcd_send(0, 0x0F);
>  return;
>}

Zur Initialisierung des Displays im 8-Bit-Mode bedarf es lediglich 4 
Befehle:

Function Mode Set
Display ON/OFF
Clear Display
Entry Mode Set

Die Beschreibung findest du im Datenblatt vom Display/KS0066

MfG Spess

Autor: Alex Bürgel (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Spess,

danke dass du dir die Sache mal angeschaut hast. Das war auch mein 
erster Ansatz (nur die 4 von dir erwähnten Schritte). Leider führt das 
zum gleichen Ergebnis...
In diversen anderen Foren/Beiträgen fand ich dann, dass manche Leute 4x 
diesen ersten Initialisierungsbefehl senden?!

Was ich noch vergessen habe zu erwähnen: der ATMega läuft mit 4MHz.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Leider führt das zum gleichen Ergebnis...

Es ist allerdings auch ein bestimmtes Timing notwendig:

     Power On
          |
  mindestens 30ms warten
          |
  Function Mode Set
          |
     > 39µs warten
          |
  Display ON/OFF
          |
     > 39µs warten
          |
  Clear Display
          |
     >1.53 ms warten
          |
  Entry Mode Set

Dein Programm wäre übrigens besser lesbar, wenn du statt

  PORTB |= 1;   so etwas wie   PORTB |= 1<<E;  benutzen würdest. Muss 
natürlich definiert werden.

MfG spess

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Als erstes sollte mal die pause() Routine bereinigt werden;)
Die funktioniert nicht immer richtig.

Einfache Lösung:

//Pause
void pause(uint8_t length){

  TCNT0 = 0;
  while(TCNT0 < length);
  return;
}

Autor: Alex Bürgel (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, kurzer Zwischenbericht:

Das JTAG-Interface war (durch die Standard-Fuse-Einstellungen) enabled. 
Aus diesem Grund war PORTC5 (=Data-Bit5) immer HIGH -> Die Kommandos an 
das LCD wurden verfälscht.

Nachdem ich die JTAG-Fuse disabled habe blinkte spontan der Cursor :-)

Ich hoffe von nun an alleine weiter zu kommen!

Vielen Dank trotzdem für eure Mühen.

Falls es weitere Probleme gibt melde ich mich.

Viele Grüße,
Alex

Autor: Alex Bürgel (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank noch Mal, nachdem ich den Fehler mit der alternativen 
Funktion von PortC-Pin5 (JTAG) entdeckt hatte, lief alles problemlos.

Der Thread ist damit für mich erstmal geschlossen.

Autor: Alex Nitsche (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alex Bürgel schrieb:
> Das JTAG-Interface war (durch die Standard-Fuse-Einstellungen) enabled.
> Aus diesem Grund war PORTC5 (=Data-Bit5) immer HIGH -> Die Kommandos an
> das LCD wurden verfälscht.

Danke für diesen Hinweis, hatte den selben Fehler und hab einfach nicht 
an die JTAG-Fuse gedacht und statt dessen 100 mal die 
Initialisierungsroutine umgeschrieben ;). Nochmals Danke :)

Schöne Grüße

Alex

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.