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.