Forum: Mikrocontroller und Digitale Elektronik LCD (Ks0066) initialisieren


von Dantor (Gast)


Lesenswert?

Hallo, ich bekomme ein LC Display von Conrad mit KS0066 Controller nicht 
initialisiert.
Angeblich ist der Controller kompatibel zum HD44780, aber dann frage ich 
mich, warum um Datenblatt eine völlig andere Initialisierung beschrieben 
wird als im Tutorial.

Tutorial:

0000 0011
5ms
0000 0011
5ms
0000 0011
5ms

0000 0010
5ms
0000 0010
0000 1000
50us
0000 0000
0000 1100
50us
0000 0000
0000 0100

Datenblatt:

0000 0010
0000 0010
0000 11xx
39u

0000 0000
0000 11CB

39u

0000 0000
0000 0001

1.53ms
0000 0000
0000 00IS

Das Display funktioniert leider weder mit der einen, noch mit der 
anderen Version.



von Dantor (Gast)


Lesenswert?

Falls es weiterhilft, hier der von mir entsprechend geänderte 
Programmabschnitt:

lcd_init:
           ldi  temp3,50
powerupwait:
           rcall  delay5ms
           dec  temp3
           brne powerupwait
           ldi temp1, 0b00000010
           out PORTD, temp1
           rcall lcd_enable
           rcall lcd_enable
           ldi temp1, 0b00001100
           out PORTD, temp1
           rcall delay50us
           ldi temp1, 0b00000000
           out PORTD, temp1
           rcall lcd_enable
           ldi temp1, 0b00001111
           out PORTD, temp1
           rcall lcd_enable
           rcall delay50us
           ldi temp1, 0b00000001
           rcall lcd_command
           rcall delay5ms
           ldi temp1, 0b00000111
           rcall lcd_command

           ret

Das Datenblatt gibt es hier: 
http://www.datasheets.org.uk/pdf/ks0066-datasheet/ks0066-datasheet.html

von Problemlöser (Gast)


Lesenswert?

Sind die delay Funtionen auch Quartz unabhängig geschrieben, oder kann 
hier das Timing möglicherweise verschieden sein ?

von Dantor (Gast)


Lesenswert?

Nein, sie sind auf 4Mhz abgestimmt, wie im Tutorial.
Ich verwende aber auch 4Mhz.

von Dantor (Gast)


Lesenswert?

Display verrichtet nun endlich seinen Dienst.
Habe nun alles nach http://www.myke.com/lcd.htm programmiert.

von Neubi (Gast)


Lesenswert?

hey,

stehe jetzt genau vor dem selben problem ... leider funktionierts bei 
mir nach myke-lcd nicht

könntest du mir bitte einen source-schnippsel der lcd-init posten ?!?


danke
neubi

von Faxe (Gast)


Lesenswert?

Hi, ich habe grad das selbe Problem und kriege dieses Ding einfach nicht 
zum Laufen!
Bei http://www.myke.com/lcd.htm wird zur Initialisierung dreimal ein 
0x03 auf den Datenbus gelegt und dann ein 0x02 um 4-Bit-Modus 
einzustellen und das sollte dann zur Initialisierung doch reichen, 
oder??
Kannst du kurz posten wie dus hingekriegt hast?
Grüß Peter

von Patrick P. (radio)


Lesenswert?

Hast du dein Display auch von Pollin gekauft?

von avrlex (Gast)


Lesenswert?

Hi.
Ich habe auch genau dasselbe Problem.
Hab ein Display von Conrad AV1624YFBY.

Ich habe schon versucht das Display mit Bascoms Lcd routinen zum laufen 
zu kriegen, genauso wie mit Peter Fleurys lib in c.

Hat jemand von euch schon dieses Display zum laufen gekriegt?

mfg alex

von Dantor (Gast)


Lesenswert?

Es kann schlicht am Kontrastregler liegen. So war es bei mir.
Dreht man ihn zu sehr in die eine Richtung, sieht man einfach garnichts.
Im anderen Fall sieht man nur schwarze Balken.
Diese müssen also nicht zwangsläufig bedeuten, dass die Initialisierung 
noch nicht abgeschlossen ist.

Mfg, falls das Thema noch aktuell sein sollte,
Dantor

von Jürgen (Gast)


Lesenswert?

Hallo,
Ich habe das Driverprogramm für ein Display mit dem Controller KS0066, 
jedoch finde ich bei keinem Elektronic ein Display mit diesem 
Kontroller. Habe bis jetzt lediglich LCD-Displays mit KS0070B gefunden. 
Ist dieser auch Kompatibel?

Danke
Jürgen

von Alan (Gast)


Lesenswert?

buddel
Ist es normal, dass bei keiner Initialisierung nur die ersten 8 Zeichen 
schwarz sind?
PS: Wie muss ich die LCD-Lib aus dem AVRgcc Tutorial anpassen, damit sie 
auch mit dem KS0066 funktioniert?

von Michael U. (amiga)


Lesenswert?

Hallo,

ist dann normal, wenn es z.B. ein 1x16 Display ist, daß intern als 2x8 
organisiert ist. Muß dann auch 2-zeilig initialisiert werden und bei der 
Ausgabe ab dem 9. Zeichen die Adresse auf den Beginn von Zeile 2 gesetzt 
werden.

Gruß aus Berlin
Michael

von Alan (Gast)


Lesenswert?

Jup, 1x16; Nur das Datenblatt versteh ich nicht so recht. -> ich kann 
die LCD-Lib nicht anpassen.

von Timo (Gast)


Lesenswert?

Hallo,
habe nun beruflich 1 1/2 Tage mit einem 20x2 Display rumgekämpft. Es 
wird intern der Controller KS0066U verwendet.
Die Initialisierung schien nicht zu funktionieren und ich schaffte es 
nicht auch nur irgend etwas anzuzeigen.

Folgende Dingen haben dem Abhilfe geschafft:

1. Poti an Pin3 hängen um Kontrast einstellen zu können. Die Displays 
sind nur in einem sehr schmalen Band "sehbar" justierbar. Wenn der Pin 
gegen GND oder 5V geschalten wird, sieht man in beiden Fällen gar 
nichts.

2. Mein Datenblatt war in Punkto Initialisierung falsch. Ich habe dann 
nach KS0066U gegoogelt und mir das Samsung Datenblatt heruntergeladen. 
Siehe da, ein komplett anderer Initialisierungsablauf mit dem es dann 
funktionierte.
   2.1. Power ON
   2.2. Wait > 30ms
   2.3. Function Set & wait > 39us   (nicht 3x wie so oft angegeben)
   2.4. Display on/off control & wait > 39us
   2.5. Display clear & wait > 1.53ms
   2.6. Entry Mode Set

3. Das blaue Display (RS Part Numer 532-6593). Hat einen Fehler im 
Function Set Register. Das Bit DB3 (Line Mode) ist hier entgegen allen 
Datenblättern invertiert. Schreibt man eine 1, so erhält man nicht zwei 
sondern nur eine Zeile initialisiert!!!
Das grüne/gelbe Display zeigt diesen Fehler nicht.

Nach Behebung dieser Fehler laufen beide Displays einwandfrei.

Hoffe das hilft einigen weiter.

von Michael K. (aemkai)


Lesenswert?

Hallo,

ich bekomme auch mein LCD nicht zum laufen. Es ist ein L2432 von Seiko, 
laut Datenblatt mit KS0066-Controller.

Die delay-Zeiten sollten nach dem Datenblatt eigentlich hinhauen, die 
anderen Funktionen habe ich vom HD44780 übernommen.

Kann mir jemand sagen wo mein Fehler liegt, ich such und probier jetzt 
schon mehrere Tage und finde nix.

Danke schonmnal.

Micha

von roflmeister (Gast)


Lesenswert?

Versuchs doch mal mit dem Init laut Datenblatt, oder wie im dem Post 
über dir.

von Michael K. (aemkai)


Angehängte Dateien:

Lesenswert?

uuups, hab vergessen den Dateianhang mit hochzuladen...

Also die Init wie im Datenblatt habe ich davor schon versucht - funzt 
auch nicht.
Genauso die Init im Post darüber, ging genauso wenig - allerdings weiß 
ich auch nicht, was der Unterschied zwischen KS0066 und KS0066U (im Post 
darüber) ist und was er bewirkt.
Sind denn die anderen Funktionen soweit richtig (lcd_data, lcd_command, 
...) oder muss man da was verändern gegenüber den HD44780-Funktionen?

von R. B. (rabis)


Lesenswert?

Hi,

mein 8x2-LCD (Conrad, Art.-Nr. 183512-62) funktioniert auch nicht 
richtig.
Ich bekomme es initialisiert (nur 1. Zeile ???) und kann z.B. den Cursor 
hin und her bewegen. Zeichen zeigt es keine an (habe LCD_RS schon 
überprüft) und wenn ich die DDRAM-Adresse auf 40H setze ist alles aus, 
bei 00H blinkt das 1. Zeichen in der 1.Zeile, was ja auch richtig ist. 
Wenn ich den Port zurücklese, stimmen die Daten.
Das BUSY habe ich auch länger abgewartet, ohne Erfolg.
Das Ganze läuft auf einem AT89S8253 mit SDCC programmiert.

Hat evtl. noch jemand eine Idee?

RABIS

von Martin (Gast)


Lesenswert?

Micha K. schrieb:
> uuups, hab vergessen den Dateianhang mit hochzuladen...
>
> Also die Init wie im Datenblatt habe ich davor schon versucht - funzt
> auch nicht.
> Genauso die Init im Post darüber, ging genauso wenig - allerdings weiß
> ich auch nicht, was der Unterschied zwischen KS0066 und KS0066U (im Post
> darüber) ist und was er bewirkt.
> Sind denn die anderen Funktionen soweit richtig (lcd_data, lcd_command,
> ...) oder muss man da was verändern gegenüber den HD44780-Funktionen?

Hey, besser spät als nie:

Bei der init Funktion musst du noch das DDR vom RW bit auf 1 setzen! Es 
ist anscheinend nämlich nicht egal was du da dran hast, sondern es muss 
eine 0 sein

von Micha K. (Gast)


Lesenswert?

THX, kann's aber leider nicht mehr ausprobieren, hab die LCDs 
zurückgegeben.

von Daniel (Gast)


Lesenswert?

Habe mich auch länger mit der Initialisierung des KS0066U 
rumgeschlagen...
und habe es nach hirnzermürbendem ausprobieren dann noch hinbekommen :D
so siehts aus ( vlt. nicht der schönste Code aber naja bin kein Profi;) 
):
1
/*
2
 * lcd162c.c
3
 *
4
 * Created: 25.08.2013 12:57:01
5
 *  Author: Daniel
6
 */ 
7
8
9
#include <avr/io.h>
10
#include <avr/delay.h>
11
12
#define F_CPU 16000000UL
13
14
#define LCD_PORT PORTA
15
#define LCD_DDR DDRA
16
#define LCD_DB4 PA0
17
#define LCD_DB5 PA1
18
#define LCD_DB6 PA2
19
#define LCD_DB7 PA3
20
#define LCD_PIN_RS PA4
21
#define LCD_PIN_E PA5
22
23
#define CMD_EMS (1<<2)
24
#define EMS_CURSOR_BACKWARD 0
25
#define EMS_CURSOR_FORWARD (1<<1)
26
#define EMS_NODISPLAYSHIFT 0
27
#define EMS_DISPLAYSHIFT 1
28
29
#define CMD_CLD 1
30
31
#define CMD_RTH 2
32
33
#define CMD_SHIFT (1<<4)
34
#define SHIFT_CURSOR 0
35
#define SHIFT_DISPLAY (1<<3)
36
#define SHIFT_LEFT 0
37
#define SHIFT_RIGHT (1<<2)
38
39
#define CMD_CONFIG (1<<5)
40
#define CONFIG_8BIT (1<<4)
41
#define CONFIG_4BIT 0
42
#define CONFIG_2LINE (1<<3)
43
#define CONFIG_1LINE 0
44
#define CONFIG_5X10 (1<<2)
45
#define CONFIG_5X7 0
46
47
#define CMD_DISPLAY (1<<3)
48
#define DISPLAY_ON (1<<2)
49
#define DISPLAY_OFF 0
50
#define DISPLAY_CURSOR (1<<1)
51
#define DISPLAY_NOCURSOR 0
52
#define DISPLAY_BLINKING 1
53
#define DISPLAY_NOBLINKING 0
54
55
56
#define ENABLE_DURATION 1
57
#define POWERUP_TIME 40
58
59
60
void enable()
61
{
62
  LCD_PORT |= (1<<LCD_PIN_E);
63
  _delay_ms(ENABLE_DURATION);
64
  LCD_PORT &= ~(1<<LCD_PIN_E);
65
}
66
67
void sendNibble(uint8_t nibble)
68
{
69
  LCD_PORT &= 0xF0;
70
  LCD_PORT |= nibble;
71
  enable();  
72
}
73
74
void wd4(uint8_t data)
75
{
76
  uint8_t nibble = (data >> 4); // high nibble speichern
77
  LCD_PORT |= (1<<LCD_PIN_RS); // Datenregister auswählen
78
  sendNibble(nibble);
79
  _delay_ms(5);
80
  nibble = (data&0x0F); // low nibble speichern
81
  sendNibble(nibble);
82
  _delay_ms(5);
83
}
84
85
void cmd4(uint8_t cmd)
86
{
87
  uint8_t nibble = (cmd >> 4); // high nibble speichern
88
  LCD_PORT &= ~(1<<LCD_PIN_RS); // Steuerregister auswählen
89
  sendNibble(nibble);
90
  _delay_ms(5);
91
  nibble = (cmd&0x0F); // low nibble speichern
92
  sendNibble(nibble);
93
  _delay_ms(5);
94
}
95
96
void init()
97
{
98
  LCD_PORT = 0x00;
99
  LCD_DDR = 0xFF;
100
  _delay_ms(POWERUP_TIME);
101
  /* 4-bit Modus konfigurieren ------Function-Set 1*/
102
  LCD_PORT |= (1<<LCD_DB5);
103
  LCD_PORT &= ~(1<<LCD_DB4);
104
105
  _delay_ms(40);
106
  /* 4-bit Modus konfigurieren ------Function-Set 2*/
107
  LCD_PORT |= (1<<LCD_DB5);
108
  LCD_PORT &= ~(1<<LCD_DB4);
109
  
110
  _delay_ms(5);
111
  /* 4-bit Modus konfigurieren ------Function-Set 3*/
112
  LCD_PORT |= (1<<LCD_DB5);
113
  LCD_PORT &= ~(1<<LCD_DB4);
114
115
  /* 4-Bit Modus starten ... */
116
  LCD_PORT |= (1<<LCD_PIN_E);
117
  LCD_PORT &= ~(1<<LCD_PIN_E);
118
  _delay_ms(5);
119
  
120
  cmd4(CMD_CONFIG | CONFIG_2LINE);
121
  cmd4(CMD_DISPLAY | DISPLAY_OFF);
122
  cmd4(CMD_CLD);
123
  cmd4(CMD_EMS | EMS_CURSOR_FORWARD);
124
  cmd4(CMD_DISPLAY | DISPLAY_ON);
125
}
126
127
int main(void)
128
{
129
  init();
130
    while(1)
131
    {
132
    wd4('T');
133
    _delay_ms(255);
134
    wd4('e');
135
    _delay_ms(255);
136
    wd4('s');
137
    _delay_ms(255);
138
    wd4('t');
139
    _delay_ms(255);
140
    _delay_ms(255);
141
    _delay_ms(255);
142
    _delay_ms(255);
143
    cmd4(CMD_CLD);
144
    cmd4(CMD_RTH);
145
        //TODO:: Please write your application code 
146
    }
147
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.