LCD mit KS0066U

OP #2038315
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.
#2038446
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.
OP #2038625
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.
Gast #2039346
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren