Hallo zusammen Ich bin mittlerweile echt am verzweifeln. Mein LCD will einfach nicht laufen an einem Atmega 32. Sieht hier evtl. jemand einen Fehler? Die oberste Zeile des 16x2 Displays zeigt nach Anlegen der Versorgungsspannung nur schwarze Balken an :-/ Das Display sollte ienen HD44780 kompatiblen controller besitzen. Als Steuerbits habe ich Port A (0-2) spendiert und als Datenport PortD (8Bit modus)
1 | //LCD.c
|
2 | //F_CPU = 1MHz
|
3 | //CTRL = Port A
|
4 | //DATA = Port D
|
5 | |
6 | |
7 | #include "LCD.h" |
8 | |
9 | unsigned char lcd_init(){ |
10 | |
11 | //Benötigte Ports als ausgänge definieren
|
12 | DDRA = 0xFF; |
13 | DDRD = 0xFF; |
14 | |
15 | CTRL &= 0x00; |
16 | |
17 | //Strom anschalten
|
18 | CTRL |= 0b00000100; |
19 | |
20 | |
21 | //Sämtlihe Ports mit Null belegen
|
22 | |
23 | //30 Millisekunden warten
|
24 | _delay_ms(30); |
25 | DATA = 0; |
26 | |
27 | //Initislisierungssequen
|
28 | pulse_LCD(0b00110000); |
29 | _delay_ms(5); |
30 | |
31 | pulse_LCD(0b00110000); |
32 | _delay_ms(5); |
33 | |
34 | pulse_LCD(0b00110000); |
35 | _delay_ms(1); |
36 | |
37 | //5x8 Dot, 2-Line, 5x8
|
38 | pulse_LCD(0b00111000); |
39 | _delay_ms(30); |
40 | |
41 | //Display Off, Cursor On, Blinking
|
42 | pulse_LCD(0b00111100); |
43 | _delay_ms(30); |
44 | |
45 | //Clear Display
|
46 | pulse_LCD(0b00000001); |
47 | _delay_ms(30); |
48 | |
49 | //Set Entry Mode
|
50 | pulse_LCD(0b00000110); |
51 | _delay_ms(30); |
52 | |
53 | Display On |
54 | pulse_LCD(0b00001111); |
55 | |
56 | return 0x00; |
57 | }
|
58 | |
59 | //Funktion zur Übernahme der Daten an das Display
|
60 | void pulse_LCD(uint8_t data){ |
61 | |
62 | _delay_ms(30); //30 Millisekunden warten |
63 | |
64 | //Enable setzen
|
65 | CTRL |= 0b00000010; |
66 | _delay_us(2); //2 Millisekunden warten |
67 | |
68 | DATA = 0; |
69 | _delay_us(2); |
70 | DATA |= data; |
71 | _delay_us(2); |
72 | |
73 | //Enable löschen
|
74 | CTRL &= 0b11111101; |
75 | _delay_us(2); |
76 | |
77 | |
78 | //Ausgangswerte wieder lsöchen
|
79 | DATA &= 0b00000000; |
80 | }
|
81 | |
82 | void lcd_write(uint8_t data){ |
83 | |
84 | DATA = 0; |
85 | _delay_us(2); |
86 | |
87 | //30 Millisekunden warten
|
88 | _delay_ms(30); |
89 | |
90 | //RS setzen
|
91 | CTRL |= 0b00000001; |
92 | _delay_us(2); |
93 | |
94 | //Enable-Impuls setzen
|
95 | CTRL |= 0b00000010; |
96 | _delay_us(2); |
97 | |
98 | //Übernahme der Daten
|
99 | DATA = data; |
100 | _delay_us(2); |
101 | |
102 | //Löschen der Flags (Enable)
|
103 | CTRL &= 0b11111101; |
104 | _delay_us(2); |
105 | |
106 | //Löschen der restlichen Flags
|
107 | DATA &= 0x00; |
108 | CTRL &= 0b11111110; //RS löschen |
109 | }
|
Vielen Dank im Voraus!!