Hallo zusammen.
Nach durcharbeiten der ganzen Posts und Tutorials zum Thema LCD bin
leider immer noch nicht weiter gekommen daher wende ich mich direkt an
euch.
Ich habe ein altes 204B-Display mit 20x4 Zeilen im Schrank gefunden.
Leider weiß ich nicht, welcher Controller verbaut ist. Falls jemand
anhand des Photos es eindeutig bestimmen kann, wäre ich ihm sehr
verbunden.
Das ganze scheitert schon mit der Initialisierung. Ursprünglich wollte
ich die Bibliothek von Peter Fleury nutzen aber nachdem sie nicht
funktionierte bin ich auf das Beispielprogramm vom LCD-Tutorial
umgestiegen und habe es für meine Bedürfnisse modifiziert.
Hier die Initialisierungsroutine:
1 | void lcd_init( void ) {
|
2 |
|
3 | // verwendete Pins auf Ausgang schalten
|
4 | LCD_DATA_DDR |= (1<<LCD_DATA0) | (1<<LCD_DATA1) | (1<<LCD_DATA2) | (1<<LCD_DATA3);
|
5 | LCD_CTRL_DDR |= (1<<LCD_RS) | (1<<LCD_RW) | (1<<LCD_E);
|
6 |
|
7 | // initial alle Ausgänge auf Null
|
8 | LCD_DATA_PORT &= ~( (1<<LCD_DATA0) | (1<<LCD_DATA1) | (1<<LCD_DATA2) | (1<<LCD_DATA3) );
|
9 | LCD_CTRL_PORT &= ~( (1<<LCD_RS) | (1<<LCD_RW) | (1<<LCD_E) );
|
10 |
|
11 | _delay_ms(LCD_BOOTUP_MS);
|
12 |
|
13 | // Soft-Reset muss 3mal hintereinander gesendet werden zur Initialisierung
|
14 | lcd_out( LCD_SOFT_RESET ); _delay_ms( LCD_SOFT_RESET_MS1 );
|
15 | lcd_enable(); _delay_ms( LCD_SOFT_RESET_MS2 );
|
16 | lcd_enable(); _delay_ms( LCD_SOFT_RESET_MS3 );
|
17 |
|
18 | // 4-bit Modus aktivieren
|
19 | lcd_out( LCD_SET_FUNCTION | LCD_FUNCTION_4BIT );
|
20 | _delay_ms( LCD_SET_4BITMODE_MS );
|
21 |
|
22 | // 4-bit Modus / 2 Zeilen / 5x7
|
23 | lcd_command( LCD_SET_FUNCTION | LCD_FUNCTION_4BIT | LCD_FUNCTION_2LINE | LCD_FUNCTION_5X7 );
|
24 |
|
25 | // Display ein / Cursor aus / Blinken aus
|
26 | lcd_command(LCD_SET_DISPLAY | LCD_DISPLAY_ON | LCD_CURSOR_OFF | LCD_BLINKING_OFF);
|
27 |
|
28 | // Cursor inkrement / kein Scrollen
|
29 | lcd_command( LCD_SET_ENTRY | LCD_ENTRY_INCREASE | LCD_ENTRY_NOSHIFT );
|
30 |
|
31 | lcd_clear();
|
32 | }
|
sowie die beiden Subfunktionen lcd_enable() und lcd_out()
1 | static void lcd_enable( void ) {
|
2 | LCD_CTRL_PORT |= (1<<LCD_E);
|
3 | _delay_us( LCD_ENABLE_US ); // kurze Pause
|
4 | LCD_CTRL_PORT &= ~(1<<LCD_E); // Enable auf 0 setzen
|
5 | }
|
6 |
|
7 | static void lcd_out( uint8_t data ) {
|
8 | data &= 0xF0; // obere 4 Bit maskieren
|
9 | LCD_DATA_PORT &= 0x0F; // Maske löschen
|
10 | LCD_DATA_PORT |= (data>>4); // Bits setzen
|
11 | lcd_enable();
|
12 | }
|
Im Header sind die Ports definiert.
1 | #define LCD_DATA_PORT PORTC
|
2 | #define LCD_DATA_DDR DDRC
|
3 | #define LCD_DATA0 0
|
4 | #define LCD_DATA1 1
|
5 | #define LCD_DATA2 2
|
6 | #define LCD_DATA3 3
|
7 |
|
8 | #define LCD_CTRL_PORT PORTD
|
9 | #define LCD_CTRL_DDR DDRD
|
10 | #define LCD_RS 5
|
11 | #define LCD_RW 6
|
12 | #define LCD_E 7
|
Das ganze entspricht mehr oder weniger dem Guide für die erweiterte
LCD-Ansteuerung hier aus dem Board, mit der Ergänzung das meine
Steuerleitungen auf einem anderen Port liegen.
(http://www.mikrocontroller.net/articles/Erweiterte_LCD-Ansteuerung)
Die Timing-Delays sind alle von dort übernommen. Bei den Startadressen
habe ich so ziemlich alle ausprobiert, die in hier im Forum empfohlen
wurden, ohne Erfolg.
Der gesamte Quellcode habe ich auch in den Anhang gepackt. Darin wird
auch die UART zum Debuggen initialisiert, die funktionierte auf Anhieb.
Mein Problem entsteht bereits bei der Initialisierung des LCDs. Die
schwarzen Balken verschwinden einfach nicht, es bleibt im einzeiligem
Betrieb (1. und 3. Zeile haben Balken, 2. und 4. Zeile nicht).
So langsam hab' ich das Gefühl das Ding ist defekt. Ich trete hier seit
drei Tagen auf der Stelle.
Grüße