www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD mit KS0066U


Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ich quäle mich jetzt schon Stunden mit einem Display rum. Zwischendurch 
hab ich es sogar mal geschafft den Atmega644 zu verfusen, aber das ist 
eine andere Geschichte:

Folgender code sollte das Display initialisieren:
#include <avr/io.h>
#define F_CPU 8000000UL
#include <util/delay.h>     /* bei alter avr-libc: #include <avr/delay.h> */ 
#include "lcd.h"

#define LCD_RS 7
#define LCD_EN 6
#define LCD_CTRL PORTD
#define LCD_CTRL_DDR DDRD
#define LCD_DB4 4
#define LCD_DB5 5
#define LCD_DB6 6
#define LCD_DB7 7
#define LCD_DATA PORTC
#define LCD_DATA_DDR DDRC


#define LCD2LINEMODE 1
#define LCDON 1

#define LCDBLINK 1
#define LCDCURSOR 1

#define LCDSHIFT 1
#define LCDINCREMENT  1

void LcdInit(void)
{
    LCD_DATA_DDR = 255;
    LCD_CTRL_DDR |= (1 << LCD_RS) | (1 << LCD_EN);
  //Wait for Display selftest. You can remove this, if this function is called more than 30ms after start
  _delay_ms(40);
  
  //1. Function set
  //RS = ||--| = DATA
  //Send 00100 x2
  LcdSend4(0b00000100);
  LcdSend4(0b00000100);
  //Send 000 + DISPLAY ON/OFF + 1/2 LINE MODE
  LcdSend4((LCDON << 3) | (LCD2LINEMODE << 4));
  //Wait for more than 39µs
  _delay_us(40);  

  //2. Display ON/OFF Control
  //Send 0
  LcdSend4(0);
  //Send 0 + LCDBLINK + LCDCURSOR + LCDON + 1
  LcdSend4((LCDBLINK << 1) | (LCDCURSOR << 2) | (LCDON << 3) || (1 << 4));
  //Wait for more than 39µs
  _delay_us(40);  

  //3. Display Clear
  LcdClear();
  //Wait for more than 1.53ms
  _delay_ms(2);  

  //4. Entry Mode Set
  //Send 0
  LcdSend4(0);
  //Send 0 + LCDSHIFT + LCDINCREMENT
  LcdSend4((LCDSHIFT << 1) | (LCDINCREMENT << 2) | (1 << 3));
  //Wait for more than 39µs
  _delay_us(40);  

  //Initialization end
}

void LcdClear(void)
{
  LcdSend4(0);
  LcdSend4(0b0000010);
}

void LcdSend4(uint8_t data)
{
    LCD_CTRL &= ~(1 << LCD_RS);
    LCD_CTRL |= (data & 0x01) << LCD_RS;        
  LCD_DATA = (((data & 0x02) << LCD_DB4) | ((data & 0x04) << LCD_DB5) | ((data & 0x08) << LCD_DB6) | ((data & 0x10) << LCD_DB7));

  LCD_CTRL |= (1 << LCD_EN);
  LCD_CTRL &= ~(1 << LCD_EN);
}

Irgendwie tut sicht nichts. Immer weiße Balken in der 1. und 3. Zeile, 
also schlägt die Init fehl. RW liegt bei mir übrigens immer auf LOW. 
Mach ich irgenetwas falsch? Ich bin am verzweifeln.
Datenblatt kann man hier downloaden: 
http://www.lcd-module.de/eng/pdf/zubehoer/ks0066.pdf

Wenn ich nicht mehrmals falsch gemessen habe stimmt die Verkabelung.
Kabel sind höchstens 20cm lang.
Strom kommt nicht mehr vom UsbAsp, da das Display dabei immerwiedermal 
seinen Kontrast änderte (zu wenig Strom?)
JTAG ist ausgeschaltet.
Mega644 läuft mit internem OSC mit 8Mhz.

Autor: Martin e. C. (eduardo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was für Software benutz du? AVRStudio, etc?
Hast du mit andere Rutine probiert?

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der KS0066 ist Standard. Das Wichtigste sind die Zeiten. Nach dem 
DeviceReset und zwischen den ersten paar Commands muss man teilweise 
mehrere 10ms oder so warten. Das machst du. Dann kommt FunctionSet, aber 
als ein Command. Dann kommt DisplayOn, DisplayClear und EntryModeSet. 
Die Reihenfolge kommt etwa hin. Allerdings :
-die LcdSend4(0) machen wenig Sinn.
-Ich hab LcdSend4 nicht angeschaut.

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin e. C. schrieb:
> Was für Software benutz du? AVRStudio, etc?
DevC++, GCC, AVR-Burn-omat (nutzt avrdude)
> Hast du mit andere Rutine probiert?
Alle die ich bisher gesehen hab nutzen den BusyFlag. Den möchte ich 
nicht nutzen.

Mini Nilp schrieb:
> -die LcdSend4(0) machen wenig Sinn.
Display ON/OFF Control
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 0 X X X X
0 0 1 D C B X X X X
LcdSend sendet einen 4bit Block.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>LcdSend sendet einen 4bit Block.

Zu einem Befehl gehören aber 8 Bit.

>#define LCD2LINEMODE 1
>#define LCDON 1
...
> LcdSend4((LCDON << 3) | (LCD2LINEMODE << 4));

Was soll denn das?

MfG Spess

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Lustig. Man 'lernt' nie aus.

MfG Spess

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Spess53 schrieb:
> Zu einem Befehl gehören aber 8 Bit.

Ja und im 2bit Modus sendet man 2*4bit hintereinander

Peter Dannegger schrieb:
> http://www.avrfreaks.net/index.php?name=PNphpBB2&f...

Der Code gefällt mir.
Fehlt da nicht die Funktion lcd_xy und ein paar weitere? Kann man den 
Code auch downloaden?

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>>Spess53 schrieb:
>> Zu einem Befehl gehören aber 8 Bit.

>Ja und im 2bit Modus sendet man 2*4bit hintereinander

Kommst du nicht klar, oder ich?

>Peter Dannegger schrieb:
>> http://www.avrfreaks.net/index.php?name=PNphpBB2&f...

>Der Code gefällt mir.
>Fehlt da nicht die Funktion lcd_xy und ein paar weitere? Kann man den
>Code auch downloaden?

Das ist ein abschreckendes Beispiel. So wie dein Code den Sinn von 
Defines kontakariert:

#define LCD2LINEMODE 1
LcdSend4((LCDON << 3) | (LCD2LINEMODE << 4));

->

#define LCD2LINEMODE 3
LcdSend4((LCDON << 3) | (1<<LCD2LINEMODE));
                        ^^^^^^^^^^^^^^^^^

Übrigens LCDON und LCD2LINEMODE Befinden sich nicht in einem Befehl.

MfG Spess

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Samuel K. schrieb:
> Kann man den
> Code auch downloaden?

Die Anhänge sind wohl nur sichtbar, wenn man sich anmeldet.

http://www.avrfreaks.net/index.php?name=PNphpBB2&f...

http://www.avrfreaks.net/index.php?name=PNphpBB2&f...


Peter

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.