Forum: Mikrocontroller und Digitale Elektronik LCD mit KS0066U


von Sam .. (sam1994)


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:
1
#include <avr/io.h>
2
#define F_CPU 8000000UL
3
#include <util/delay.h>     /* bei alter avr-libc: #include <avr/delay.h> */ 
4
#include "lcd.h"
5
6
#define LCD_RS 7
7
#define LCD_EN 6
8
#define LCD_CTRL PORTD
9
#define LCD_CTRL_DDR DDRD
10
#define LCD_DB4 4
11
#define LCD_DB5 5
12
#define LCD_DB6 6
13
#define LCD_DB7 7
14
#define LCD_DATA PORTC
15
#define LCD_DATA_DDR DDRC
16
17
18
#define LCD2LINEMODE 1
19
#define LCDON 1
20
21
#define LCDBLINK 1
22
#define LCDCURSOR 1
23
24
#define LCDSHIFT 1
25
#define LCDINCREMENT  1
26
27
void LcdInit(void)
28
{
29
    LCD_DATA_DDR = 255;
30
    LCD_CTRL_DDR |= (1 << LCD_RS) | (1 << LCD_EN);
31
  //Wait for Display selftest. You can remove this, if this function is called more than 30ms after start
32
  _delay_ms(40);
33
  
34
  //1. Function set
35
  //RS = ||--| = DATA
36
  //Send 00100 x2
37
  LcdSend4(0b00000100);
38
  LcdSend4(0b00000100);
39
  //Send 000 + DISPLAY ON/OFF + 1/2 LINE MODE
40
  LcdSend4((LCDON << 3) | (LCD2LINEMODE << 4));
41
  //Wait for more than 39µs
42
  _delay_us(40);  
43
44
  //2. Display ON/OFF Control
45
  //Send 0
46
  LcdSend4(0);
47
  //Send 0 + LCDBLINK + LCDCURSOR + LCDON + 1
48
  LcdSend4((LCDBLINK << 1) | (LCDCURSOR << 2) | (LCDON << 3) || (1 << 4));
49
  //Wait for more than 39µs
50
  _delay_us(40);  
51
52
  //3. Display Clear
53
  LcdClear();
54
  //Wait for more than 1.53ms
55
  _delay_ms(2);  
56
57
  //4. Entry Mode Set
58
  //Send 0
59
  LcdSend4(0);
60
  //Send 0 + LCDSHIFT + LCDINCREMENT
61
  LcdSend4((LCDSHIFT << 1) | (LCDINCREMENT << 2) | (1 << 3));
62
  //Wait for more than 39µs
63
  _delay_us(40);  
64
65
  //Initialization end
66
}
67
68
void LcdClear(void)
69
{
70
  LcdSend4(0);
71
  LcdSend4(0b0000010);
72
}
73
74
void LcdSend4(uint8_t data)
75
{
76
    LCD_CTRL &= ~(1 << LCD_RS);
77
    LCD_CTRL |= (data & 0x01) << LCD_RS;        
78
  LCD_DATA = (((data & 0x02) << LCD_DB4) | ((data & 0x04) << LCD_DB5) | ((data & 0x08) << LCD_DB6) | ((data & 0x10) << LCD_DB7));
79
80
  LCD_CTRL |= (1 << LCD_EN);
81
  LCD_CTRL &= ~(1 << LCD_EN);
82
}

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.

von Martin e. C. (eduardo)


Lesenswert?

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

von Purzel H. (hacky)


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.

von Sam .. (sam1994)


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.
1
Display ON/OFF Control
2
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
3
0 0 0 0 0 0 X X X X
4
0 0 1 D C B X X X X
LcdSend sendet einen 4bit Block.

von Spess53 (Gast)


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

von Peter D. (peda)


Lesenswert?


von Spess53 (Gast)


Lesenswert?

Hi

Lustig. Man 'lernt' nie aus.

MfG Spess

von Sam .. (sam1994)


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?

von Spess53 (Gast)


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

von Peter D. (peda)


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&file=download&id=21446

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=download&id=21432


Peter

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.