Forum: Mikrocontroller und Digitale Elektronik Probleme mit LCD AV1624


von Frank S. (karnikel)


Angehängte Dateien:

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

von Oliver J. (skriptkiddy)


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

von Frank S. (karnikel)


Angehängte Dateien:

Lesenswert?

Hier noch den Code als TXT-Dateien.

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

Wird das nicht schon mit "lcd_clear()" gemacht?

von Frank S. (karnikel)


Lesenswert?

Ach ja...die Delayzeiten hatte ich schonmal auf das 10-fache 
erhöht...hat leider nix gebracht...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.