Probleme mit LCD AV1624

OP #2395417
Lesenswert?

Hallo Mikrokontroller.net-Gemeinde...

Wie schon öfters in diesen und anderen Foren Diskutiert habe auch ich 
Probleme etwas sinnvolles aus dem LC-Display AV1624 von Conrad heraus zu 
bekommen.
Datasheet: 
http://www.produktinfo.conrad.com/datenblaetter/175000-199999/183342-da-01-ml-LCD_Modul_16x2_Zeichen_de_en.pdf

Ich verwende einen ATMega16 und die Pinbelegung ist wie folgt:
GND-->VSS
5V -->Vdd
      V0: So eingestellt wie auf dem Bild zu sehen
GND-->DB0
GND-->DB1
GND-->DB2
GND-->DB3
PD0-->DB4
PD1-->DB5
PD2-->DB6
PD3-->DB7
PD4-->RS
PD5-->E
GND-->R/W

Der Takt wurde angepasst (1MHz) und wurde mit einer Blink-LED überprüft

Das Display soll wie in der Pinbelegung zu sehen im 4Bit-Modus betrieben 
werden.
Mein Programmaufbau wurde nach dem Tuturial von 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD realisiert.

Hier nochmal der Code mit den relavanten Stellen für das Display. Mit 
Pfeilen ("-->") steht dahinter welche Hexzahl übertragen wird.
1
#include <avr/io.h>
2
#include "includes/lcd-routines.h"
3
#include <util/delay.h>
4
 
5
////////////////////////////////////////////////////////////////////////////////
6
// Erzeugt einen Enable-Puls
7
static void lcd_enable( void )
8
{
9
    LCD_PORT |= (1<<LCD_EN);     // Enable auf 1 setzen
10
//_delay_ms(5000);
11
  _delay_us( LCD_ENABLE_US );  // kurze Pause
12
    LCD_PORT &= ~(1<<LCD_EN);    // Enable auf 0 setzen
13
}
14
 
15
////////////////////////////////////////////////////////////////////////////////
16
// Sendet eine 4-bit Ausgabeoperation an das LCD
17
static void lcd_out( uint8_t data )
18
{
19
    data &= 0xF0;                       // obere 4 Bit maskieren
20
 
21
    LCD_PORT &= ~(0xF0>>(4-LCD_DB));    // Maske löschen
22
    LCD_PORT |= (data>>(4-LCD_DB));     // Bits setzen
23
    lcd_enable();
24
}
25
 
26
////////////////////////////////////////////////////////////////////////////////
27
// Initialisierung: muss ganz am Anfang des Programms aufgerufen werden.
28
void lcd_init( void )
29
{
30
    // verwendete Pins auf Ausgang schalten
31
    uint8_t pins = (0x0F << LCD_DB) |           // 4 Datenleitungen
32
                   (1<<LCD_RS) |                // R/S Leitung
33
                   (1<<LCD_EN);                 // Enable Leitung
34
    LCD_DDR |= pins;
35
 
36
    // initial alle Ausgänge auf Null
37

38
    LCD_PORT &= ~pins;
39

40
    // warten auf die Bereitschaft des LCD
41
    _delay_ms( LCD_BOOTUP_MS ); //Zeitverzögerung von 31ms
42

43
    // Soft-Reset muss 3mal hintereinander gesendet werden zur Initialisierung
44
    lcd_out( LCD_SOFT_RESET );
45
    _delay_ms( LCD_SOFT_RESET_MS1 ); //Zeitverzögerung von 5ms
46

47
    lcd_enable();
48
    _delay_ms( LCD_SOFT_RESET_MS2 ); //Zeitverzögerung von 1ms
49

50
    lcd_enable();
51
    _delay_ms( LCD_SOFT_RESET_MS3 ); //Zeitverzögerung von 1ms
52

53
    // 4-bit Modus aktivieren --> 20h
54
    lcd_out( LCD_SET_FUNCTION |
55
           LCD_FUNCTION_4BIT );
56
    _delay_ms( LCD_SET_4BITMODE_MS );
57

58
    // 4-bit Modus / 2 Zeilen / 5x7 -->20h
59
    lcd_command( LCD_SET_FUNCTION |
60
                 LCD_FUNCTION_4BIT |
61
                 LCD_FUNCTION_2LINE |
62
                 LCD_FUNCTION_5X7 );
63

64
    // Display aus / Cursor aus / Blinken aus --> 08h
65
    lcd_command( LCD_SET_DISPLAY_CONTR |
66
                 LCD_DISPLAY_OFF |
67
                 LCD_CURSOR_OFF |
68
                 LCD_BLINKING_OFF);
69

70
  // Diplay Clear --> 01h
71
  lcd_clear();
72

73
    // Cursor inkrement / kein Scrollen --> 06h
74
    lcd_command( LCD_SET_ENTRY_MODE |
75
                 LCD_ENTRY_INCREMENT |
76
                 LCD_ENTRY_NOSHIFT );
77
}
78
  
79
////////////////////////////////////////////////////////////////////////////////
80
// Sendet ein Datenbyte an das LCD
81
void lcd_data( uint8_t data )
82
{
83
    LCD_PORT |= (1<<LCD_RS);    // RS auf 1 setzen
84
 
85
    lcd_out( data );            // zuerst die oberen, 
86
    lcd_out( data<<4 );         // dann die unteren 4 Bit senden
87
 
88
    _delay_us( LCD_WRITEDATA_US );
89
}
90
 
91
////////////////////////////////////////////////////////////////////////////////
92
// Sendet einen Befehl an das LCD
93
void lcd_command( uint8_t data )
94
{
95
    LCD_PORT &= ~(1<<LCD_RS);    // RS auf 0 setzen
96

97
    lcd_out( data );             // zuerst die oberen, 
98
    lcd_out( data<<4 );           // dann die unteren 4 Bit senden
99
 
100
    _delay_us( LCD_COMMAND_US );
101
}
102
 
103
////////////////////////////////////////////////////////////////////////////////
104
// Sendet den Befehl zur Löschung des Displays
105
void lcd_clear( void )
106
{
107
    lcd_command( LCD_CLEAR_DISPLAY );
108
    _delay_ms( LCD_CLEAR_DISPLAY_MS );
109
}
110
 
111
////////////////////////////////////////////////////////////////////////////////
112
// Sendet den Befehl: Cursor Home
113
void lcd_home( void )
114
{
115
    lcd_command( LCD_CURSOR_HOME );
116
    _delay_ms( LCD_CURSOR_HOME_MS );
117
}
118
int main(void)
119
{
120
    // Initialisierung des LCD
121
    // Nach der Initialisierung müssen auf dem LCD vorhandene schwarze Balken
122
    // verschwunden sein
123
    lcd_init();
124
  _delay_ms(5000);
125
    lcd_data( '1' );
126
   lcd_string ("1");
127
    while(1)
128
    {
129
    }
130
 
131
  return 0;
132
}

Wenn sich jemand über das
1
_delay_ms(5000);
 in der main wundert: wenn ich das weglasse wird gar nichts im Display 
angezeigt. Mit dem Code oben werden die im Bild gezeigten Zeichen 
angezeigt...eigentlich sollten da aber zwei Einsen stehen

Ich hoffe ihr könnt mir nen Tipp geben woran es liegen kann...ich spiele 
hier schon 3 Tage mit den Parametern rum und komm einfach auf keinen 
grünen Zweig.
Vielen Dank schonmal im Vorraus
Angehängte Dateien:
#2395747
Lesenswert?

Mach mal die Wartezyklen in der Initialisierung größer. Eventuell bringt 
das was.

Vielleicht hilft es den Daten-Zeiger im Display explizit auf den DD-RAM 
zu setzen, bevor du Zeichen drauf schickst.

Und zeig mal das komplette Projekt. Bitte als Anhang (C- und H-Dateien 
einzeln) posten, sonst kann man das nicht vernünftig lesen.

Gruß Oliver

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