Forum: Mikrocontroller und Digitale Elektronik LCD 202A Conrad und Atmega 8


von Snack (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

folgendes Problem:

Ansteuerung LCD 202A von Conrad mit einem ATMEGA 8 über das Pollin 
Evulationsboard. Datenblatt vom LCD siehe Anhang.

Ich habe schon einige Funktionen programmiert Taster Abfragen, Eingang 
einlesen, LED blinken lassen, auch schon Timer und PWM mit guten 
Beispielen hier aus dem Forum.

Was aber absolut nicht klappt und was ich aktuell auch nicht verstehe 
ist die Anwendung des LCD.

Habe das LCD wie im Datenblatt und wie hier auf den Seiten 
angeschlossen:

[[http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung]]
oder wie hier
[[http://www.mikrocontroller.net/articles/Absolute_Beginner-AVR_Steckbrettprojekte#LCD_ansteuern]]

habe auch schon deren beiden Beispielcodes auf den µC übertragen.

Jedoch zeigt mein LCD nur 16 schwarze Balken in der ersten Zeile an.

Habe auch den Pin 3 VEE über einen 5kOhm Poti angeschlossen. Kann somit 
den Kontrast regeln.


Was kann noch flasch sein? So wie ich die Beispiele verstanden habe, 
müssten alle Einstellungen FCPU usw, Pin Belegung stimmen.
Was könnte man noch für Einstellzeiten prüfen?

Denke der Aufbau ist soweit richtig. DB0-DB3 offen.

Hat jemand noch gute Tipps?

von g457 (Gast)


Lesenswert?

Zeig doch mal aussagekräftige Fotos vom Aufbau (ggf. mit Schaltplänen) 
sowie den vollständigen(!) Quellcode.

von Karl H. (kbuchegg)


Lesenswert?

Und bitte:
Deinen!

Verweise nicht auf irgendwelche anderen Seiten oder anderen Code. Die 
Schaltungen dort und er Code dort funktionieren. Bei dir funktioniert es 
nicht. Also muss bei dir irgendwas anders sein. Das kriegen wir aber 
nicht raus, wenn du auf andere Seiten verlinkst. Das die Schaltungen 
dort, der Code dort funktioniert, wissen wir. Aber wir wissen nicht, was 
du anders gemacht hast. (Und du weißt es auch nicht. Denn sonst müsstest 
du nicht fragen.)

PS: Die Taktfrequenz deines µC hast du kontrolliert? Die stimmt auf 
jeden Fall?
Wenn ein LCD nicht richtig initialisiert, dann ist oft das Timing das 
Problem. Man könnte zb einfach mal die ersten paar Timings im LCD-Init 
länger machen. Das Datenblatt sagt zb, nach dem Anlegen dr 
Versorgungsspannung dauert es 15ms, bis man das LCD das erste mal 
ansprechen kann. Das kann man auch verlängern. Du darfst nicht kürzer 
sein, aber du darfst ruhig auch 200ms warten, ehe dann versucht wird das 
LCD zu initialisieren. Und genauso ist es mit den anderen Timings. Laut 
Datenblatt dürfen von der ersten 0x30 bis zum nächsten nicht weniger als 
4.5ms vergehen. Es dürfen aber problemlos mehr sein. zb auch 10ms. usw. 
usw.

von Snack (Gast)


Angehängte Dateien:

Lesenswert?

So, habe das LCD nochmal neu verdrahtet.

Anbei mein Code den ich verwenden möchte:

LCD_Main:
1
// 
2
// Anpassungen im makefile:
3
//    ATMega8 => MCU=atmega8 im makefile einstellen
4
//    lcd-routines.c in SRC = ... Zeile anhängen
5
// 
6
#include <avr/io.h>
7
#include "lcd-routines.h"
8
 
9
int main(void)
10
{
11
  // Initialisierung des LCD
12
  // Nach der Initialisierung müssen auf dem LCD vorhandene schwarze Balken
13
  // verschwunden sein
14
  lcd_init();
15
 
16
  // Text in einzelnen Zeichen ausgeben
17
  lcd_data( 'T' );
18
  lcd_data( 'e' );
19
  lcd_data( 's' );
20
  lcd_data( 't' );
21
 
22
  // Die Ausgabemarke in die 2te Zeile setzen
23
  lcd_setcursor( 0, 2 );
24
 
25
  // erneut Text ausgeben, aber diesmal komfortabler als String
26
  lcd_string("Hello World!");
27
 
28
  while(1)
29
  {
30
  }
31
 
32
  return 0;
33
}


lcd_routines.c
1
// Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
2
// http://www.mikrocontroller.net/articles/HD44780
3
// http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
4
//
5
// Die Pinbelegung ist über defines in lcd-routines.h einstellbar
6
 
7
#include <avr/io.h>
8
#include "lcd-routines.h"
9
#include <util/delay.h>
10
 
11
////////////////////////////////////////////////////////////////////////////////
12
// Erzeugt einen Enable-Puls
13
static void lcd_enable( void )
14
{
15
    LCD_PORT |= (1<<LCD_EN);     // Enable auf 1 setzen
16
    _delay_us( LCD_ENABLE_US );  // kurze Pause
17
    LCD_PORT &= ~(1<<LCD_EN);    // Enable auf 0 setzen
18
}
19
 
20
////////////////////////////////////////////////////////////////////////////////
21
// Sendet eine 4-bit Ausgabeoperation an das LCD
22
static void lcd_out( uint8_t data )
23
{
24
    data &= 0xF0;                       // obere 4 Bit maskieren
25
 
26
    LCD_PORT &= ~(0xF0>>(4-LCD_DB));    // Maske löschen
27
    LCD_PORT |= (data>>(4-LCD_DB));     // Bits setzen
28
    lcd_enable();
29
}
30
 
31
////////////////////////////////////////////////////////////////////////////////
32
// Initialisierung: muss ganz am Anfang des Programms aufgerufen werden.
33
void lcd_init( void )
34
{
35
    // verwendete Pins auf Ausgang schalten
36
    uint8_t pins = (0x0F << LCD_DB) |           // 4 Datenleitungen
37
                   (1<<LCD_RS) |                // R/S Leitung
38
                   (1<<LCD_EN);                 // Enable Leitung
39
    LCD_DDR |= pins;
40
 
41
    // initial alle Ausgänge auf Null
42
    LCD_PORT &= ~pins;
43
 
44
    // warten auf die Bereitschaft des LCD
45
    _delay_ms( LCD_BOOTUP_MS );
46
    
47
    // Soft-Reset muss 3mal hintereinander gesendet werden zur Initialisierung
48
    lcd_out( LCD_SOFT_RESET );
49
    _delay_ms( LCD_SOFT_RESET_MS1 );
50
 
51
    lcd_enable();
52
    _delay_ms( LCD_SOFT_RESET_MS2 );
53
 
54
    lcd_enable();
55
    _delay_ms( LCD_SOFT_RESET_MS3 );
56
 
57
    // 4-bit Modus aktivieren 
58
    lcd_out( LCD_SET_FUNCTION |
59
             LCD_FUNCTION_4BIT );
60
    _delay_ms( LCD_SET_4BITMODE_MS );
61
 
62
    // 4-bit Modus / 2 Zeilen / 5x7
63
    lcd_command( LCD_SET_FUNCTION |
64
                 LCD_FUNCTION_4BIT |
65
                 LCD_FUNCTION_2LINE |
66
                 LCD_FUNCTION_5X7 );
67
 
68
    // Display ein / Cursor aus / Blinken aus
69
    lcd_command( LCD_SET_DISPLAY |
70
                 LCD_DISPLAY_ON |
71
                 LCD_CURSOR_OFF |
72
                 LCD_BLINKING_OFF); 
73
 
74
    // Cursor inkrement / kein Scrollen
75
    lcd_command( LCD_SET_ENTRY |
76
                 LCD_ENTRY_INCREASE |
77
                 LCD_ENTRY_NOSHIFT );
78
 
79
    lcd_clear();
80
}
81
  
82
////////////////////////////////////////////////////////////////////////////////
83
// Sendet ein Datenbyte an das LCD
84
void lcd_data( uint8_t data )
85
{
86
    LCD_PORT |= (1<<LCD_RS);    // RS auf 1 setzen
87
 
88
    lcd_out( data );            // zuerst die oberen, 
89
    lcd_out( data<<4 );         // dann die unteren 4 Bit senden
90
 
91
    _delay_us( LCD_WRITEDATA_US );
92
}
93
 
94
////////////////////////////////////////////////////////////////////////////////
95
// Sendet einen Befehl an das LCD
96
void lcd_command( uint8_t data )
97
{
98
    LCD_PORT &= ~(1<<LCD_RS);    // RS auf 0 setzen
99
 
100
    lcd_out( data );             // zuerst die oberen, 
101
    lcd_out( data<<4 );           // dann die unteren 4 Bit senden
102
 
103
    _delay_us( LCD_COMMAND_US );
104
}
105
 
106
////////////////////////////////////////////////////////////////////////////////
107
// Sendet den Befehl zur Löschung des Displays
108
void lcd_clear( void )
109
{
110
    lcd_command( LCD_CLEAR_DISPLAY );
111
    _delay_ms( LCD_CLEAR_DISPLAY_MS );
112
}
113
 
114
////////////////////////////////////////////////////////////////////////////////
115
// Sendet den Befehl: Cursor Home
116
void lcd_home( void )
117
{
118
    lcd_command( LCD_CURSOR_HOME );
119
    _delay_ms( LCD_CURSOR_HOME_MS );
120
}
121
 
122
////////////////////////////////////////////////////////////////////////////////
123
// Setzt den Cursor in Spalte x (0..15) Zeile y (1..4) 
124
 
125
void lcd_setcursor( uint8_t x, uint8_t y )
126
{
127
    uint8_t data;
128
 
129
    switch (y)
130
    {
131
        case 1:    // 1. Zeile
132
            data = LCD_SET_DDADR + LCD_DDADR_LINE1 + x;
133
            break;
134
 
135
        case 2:    // 2. Zeile
136
            data = LCD_SET_DDADR + LCD_DDADR_LINE2 + x;
137
            break;
138
 
139
        case 3:    // 3. Zeile
140
            data = LCD_SET_DDADR + LCD_DDADR_LINE3 + x;
141
            break;
142
 
143
        case 4:    // 4. Zeile
144
            data = LCD_SET_DDADR + LCD_DDADR_LINE4 + x;
145
            break;
146
 
147
        default:
148
            return;                                   // für den Fall einer falschen Zeile
149
    }
150
 
151
    lcd_command( data );
152
}
153
 
154
////////////////////////////////////////////////////////////////////////////////
155
// Schreibt einen String auf das LCD
156
 
157
void lcd_string( const char *data )
158
{
159
    while( *data != '\0' )
160
        lcd_data( *data++ );
161
}
162
 
163
////////////////////////////////////////////////////////////////////////////////
164
// Schreibt ein Zeichen in den Character Generator RAM
165
 
166
void lcd_generatechar( uint8_t code, const uint8_t *data )
167
{
168
    // Startposition des Zeichens einstellen
169
    lcd_command( LCD_SET_CGADR | (code<<3) );
170
 
171
    // Bitmuster übertragen
172
    for ( uint8_t i=0; i<8; i++ )
173
    {
174
        lcd_data( data[i] );
175
    }
176
}

lcd_routines.h
1
// Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
2
// http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
3
//
4
 
5
#ifndef LCD_ROUTINES_H
6
#define LCD_ROUTINES_H
7
 
8
////////////////////////////////////////////////////////////////////////////////
9
// Hier die verwendete Taktfrequenz in Hz eintragen, wichtig!
10
 
11
#ifndef F_CPU
12
#define F_CPU 1000000
13
#endif
14
 
15
////////////////////////////////////////////////////////////////////////////////
16
// Pinbelegung für das LCD, an verwendete Pins anpassen
17
// Alle LCD Pins müssen an einem Port angeschlossen sein und die 4
18
// Datenleitungen müssen auf aufeinanderfolgenden Pins liegen
19
 
20
//  LCD DB4-DB7 <-->  PORTD Bit PD0-PD3
21
#define LCD_PORT      PORTD
22
#define LCD_DDR       DDRD
23
#define LCD_DB        PD0
24
 
25
//  LCD RS      <-->  PORTD Bit PD4     (RS: 1=Data, 0=Command)
26
#define LCD_RS        PD4
27
 
28
//  LCD EN      <-->  PORTD Bit PD5     (EN: 1-Impuls für Daten)
29
#define LCD_EN        PD5
30
 
31
////////////////////////////////////////////////////////////////////////////////
32
// LCD Ausführungszeiten (MS=Millisekunden, US=Mikrosekunden)
33
 
34
#define LCD_BOOTUP_MS           30
35
#define LCD_ENABLE_US           30
36
#define LCD_WRITEDATA_US        60
37
#define LCD_COMMAND_US          60
38
 
39
#define LCD_SOFT_RESET_MS1      25
40
#define LCD_SOFT_RESET_MS2      21
41
#define LCD_SOFT_RESET_MS3      21
42
#define LCD_SET_4BITMODE_MS     25
43
 
44
#define LCD_CLEAR_DISPLAY_MS    22
45
#define LCD_CURSOR_HOME_MS      22
46
 
47
////////////////////////////////////////////////////////////////////////////////
48
// Zeilendefinitionen des verwendeten LCD
49
// Die Einträge hier sollten für ein LCD mit einer Zeilenlänge von 16 Zeichen passen
50
// Bei anderen Zeilenlängen müssen diese Einträge angepasst werden
51
 
52
#define LCD_DDADR_LINE1         0x00
53
#define LCD_DDADR_LINE2         0x40
54
#define LCD_DDADR_LINE3         0x10
55
#define LCD_DDADR_LINE4         0x50
56
 
57
////////////////////////////////////////////////////////////////////////////////
58
// Initialisierung: muss ganz am Anfang des Programms aufgerufen werden.
59
void lcd_init( void );
60
 
61
////////////////////////////////////////////////////////////////////////////////
62
// LCD löschen
63
void lcd_clear( void );
64
 
65
////////////////////////////////////////////////////////////////////////////////
66
// Cursor in die 1. Zeile, 0-te Spalte
67
void lcd_home( void );
68
 
69
////////////////////////////////////////////////////////////////////////////////
70
// Cursor an eine beliebige Position 
71
void lcd_setcursor( uint8_t spalte, uint8_t zeile );
72
 
73
////////////////////////////////////////////////////////////////////////////////
74
// Ausgabe eines einzelnen Zeichens an der aktuellen Cursorposition 
75
void lcd_data( uint8_t data );
76
 
77
////////////////////////////////////////////////////////////////////////////////
78
// Ausgabe eines Strings an der aktuellen Cursorposition 
79
void lcd_string( const char *data );
80
 
81
////////////////////////////////////////////////////////////////////////////////
82
// Definition eines benutzerdefinierten Sonderzeichens.
83
// data muss auf ein Array[8] mit den Zeilencodes des zu definierenden Zeichens
84
// zeigen
85
void lcd_generatechar( uint8_t code, const uint8_t *data );
86
 
87
////////////////////////////////////////////////////////////////////////////////
88
// Ausgabe eines Kommandos an das LCD.
89
void lcd_command( uint8_t data );
90
 
91
 
92
////////////////////////////////////////////////////////////////////////////////
93
// LCD Befehle und Argumente.
94
// Zur Verwendung in lcd_command
95
 
96
// Clear Display -------------- 0b00000001
97
#define LCD_CLEAR_DISPLAY       0x01
98
 
99
// Cursor Home ---------------- 0b0000001x
100
#define LCD_CURSOR_HOME         0x02
101
 
102
// Set Entry Mode ------------- 0b000001xx
103
#define LCD_SET_ENTRY           0x04
104
 
105
#define LCD_ENTRY_DECREASE      0x00
106
#define LCD_ENTRY_INCREASE      0x02
107
#define LCD_ENTRY_NOSHIFT       0x00
108
#define LCD_ENTRY_SHIFT         0x01
109
 
110
// Set Display ---------------- 0b00001xxx
111
#define LCD_SET_DISPLAY         0x08
112
 
113
#define LCD_DISPLAY_OFF         0x00
114
#define LCD_DISPLAY_ON          0x04
115
#define LCD_CURSOR_OFF          0x00
116
#define LCD_CURSOR_ON           0x02
117
#define LCD_BLINKING_OFF        0x00
118
#define LCD_BLINKING_ON         0x01
119
 
120
// Set Shift ------------------ 0b0001xxxx
121
#define LCD_SET_SHIFT           0x10
122
 
123
#define LCD_CURSOR_MOVE         0x00
124
#define LCD_DISPLAY_SHIFT       0x08
125
#define LCD_SHIFT_LEFT          0x00
126
#define LCD_SHIFT_RIGHT         0x04
127
 
128
// Set Function --------------- 0b001xxxxx
129
#define LCD_SET_FUNCTION        0x20
130
 
131
#define LCD_FUNCTION_4BIT       0x00
132
#define LCD_FUNCTION_8BIT       0x10
133
#define LCD_FUNCTION_1LINE      0x00
134
#define LCD_FUNCTION_2LINE      0x08
135
#define LCD_FUNCTION_5X7        0x00
136
#define LCD_FUNCTION_5X10       0x04
137
 
138
#define LCD_SOFT_RESET          0x30
139
 
140
// Set CG RAM Address --------- 0b01xxxxxx  (Character Generator RAM)
141
#define LCD_SET_CGADR           0x40
142
 
143
#define LCD_GC_CHAR0            0
144
#define LCD_GC_CHAR1            1
145
#define LCD_GC_CHAR2            2
146
#define LCD_GC_CHAR3            3
147
#define LCD_GC_CHAR4            4
148
#define LCD_GC_CHAR5            5
149
#define LCD_GC_CHAR6            6
150
#define LCD_GC_CHAR7            7
151
 
152
// Set DD RAM Address --------- 0b1xxxxxxx  (Display Data RAM)
153
#define LCD_SET_DDADR           0x80
154
 
155
#endif

FCPU =  1MHZ

sollte auch soweit richtig sein. Siehe Fuses Bits Bild im Anhang.
Port Zuordung auf D stimmt auch soweit.
Wartezeiten um 20µs erweitert.

Jedoch sehe ich immer noch 16 schwarze Balken im Display für die erste 
Zeit und dann nach ein paar Sekunden habe ich in beiden Zeilen scharze 
Balken.

Warum? Ist das LCD denn auf 4 Bit Modus eingestellt?

Was aktuell nicht mehr was ich prüfen soll.

Kann wer helfen?

von g457 (Gast)


Lesenswert?

> Jedoch sehe ich immer noch 16 schwarze Balken im Display [..]

'16 Balken' == erste Zeile?

> [..] für die erste Zeit und dann nach ein paar Sekunden habe ich in beiden
> Zeilen scharze Balken.

Das klingt mehr nach Kontrast falsch eingestellt. Würd mich bei dem.. 
ähm.. verbesserungsfähigen Aufbau aber auch nicht wundern wenn Du die 
Pausen mal locker flockig um den Fakter 10 verlängern müsstest damit am 
Display noch halbwegs brauchbare Signale ankommen. Oder es ist ein 
Wackler oder Einstreuungen. Oder nicht unerhebliche Störungen auf der 
Stromversorgung.

Achja, Dateien in den Anhang.

von Karl H. (kbuchegg)


Lesenswert?

Puh, deine Verdrahtung ist nicht wirklich nachvollziehbar.
Kannst du dir nicht ein Kabel machen, das vom LCD in einem Rutsch an den 
einen PortD Verbinder geht?
Bei dem Drahtverhau da auf dem Steckbrett, ist nicht wirklich 
ersichtlich, ob deine Verdrahtung mit den Angaben im Programm 
übereinstimmen.


Alternativ würde ich mir mal ein Programm schreiben, welches am PORTD 
jeden Pin einzeln anspricht und dann am LCD nachsehen ob das dort dann 
auch am richtigen Pin rauskommt.


Edit:
Ja ich weiß. Im Prinzip machts bis auf etwas verschliffene Signalflanken 
keinen Unterschied. In der Praxis machts aber einen Unterschied. Je 
unübersichtlicher und unnachvollziehbar eine Verkabelung ist, desto mehr 
schleichen sich Fehler ein, die man selbst (und  auch andere) nicht 
sieht.

von Mobilist (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Anbei mein Code den ich verwenden möchte:

Geht bei dir die Funktion für Dateianhänge nicht? So scrollt man sich 
die Finger wund.

von Snack (Gast)


Lesenswert?

Hallo
vielen Dank für die Antwort.

Ja der Aufbau könnte besser sein. Werde mir morgen Stecker- und 
Buchsenleisten besorgen, so das ich das LCD direkt auf die 40 polige 
Leiste beim Pollinboard stecken kann.


Ist der Code und die Einstellung der Fusebits soweit ok?

Hat jemand mal den Code auf seinen Aufbau aufgespielt? Funktioniert das?

Wenn der Code in Ordnung ist, kann es ja nur noch am Aufbau liegen.
Da kümmer ich mich drum.

Für mich wäre gut zu Wissen, das ich den Code verwenden kann und dieser 
läuft.

Ware schon mal eine Fehlerquelle weniger.

von Snack (Gast)


Lesenswert?

habe nun mal den Port D angesteuert und die Spannung gemessen.

An PD1(TXD) liegt nur 3.9V an,müssten nicht 5 V anliegen?

Des weiteren liegen an PD6 und PD7 nur 4.6V an. Ist das ausreichend?

von Hubert G. (hubertg)


Lesenswert?

Der Code funktioniert, die Fusebits sollten auch passen.

von Snack (Gast)


Lesenswert?

Das mit den Spannung hat sich erledigt.

Habe mal die Jumper gezogen :)

von Snack (Gast)


Lesenswert?

So habe mir heute Leisten usw gekauft und die Verkabelung neu 
aufgesetzt.

Ist alles ok.

Wie kann ich feststellen ob das LCD Modul funktioniert?

Hat jemand nun noch Tipps für mich?

von holger (Gast)


Lesenswert?

>Wie kann ich feststellen ob das LCD Modul funktioniert?

Mit einem Programm das funktioniert.
Richtig anschliessen muss man es natürlich auch.

Immer noch alles schwarz? Dann stell die Kontrastspannung
richtig ein. Wie hoch war die noch mal?

>Ist alles ok.

Das behaupten fast 100% von den Leuten wo das LCD nicht geht.

von Hubert G. (hubertg)


Lesenswert?

Ein kleiner Unterschied könnte noch sein, das in deinem Display ein 
KS0066 Kontroller ist. Es ist ein kleiner Unterschied in der 
Initialisierung. Ob das in deinem Code berücksichtigt ist kann ich nicht 
sagen. Mein Display ist ein HD44780, das funktioniert mit dem Code.

von Snack (Gast)


Lesenswert?

Danke für den Hinweis,

habe danach mal das Forum durchstöbert.

Habe die ganzen Zeiten um 100 vergrößert, aber sehe immer noch nur 
schwarze Balken in der ersten Reihe.

Denke das das LCD nicht aus der Init Phase raus kommt. Wie kann man das 
sicher stellen?

Wie kann ich herausfinden ob das LCD wirklich im 4 Bit Modus läuft?

von holger (Gast)


Angehängte Dateien:

Lesenswert?

>Denke das das LCD nicht aus der Init Phase raus kommt. Wie kann man das
>sicher stellen?

>Wie kann ich herausfinden ob das LCD wirklich im 4 Bit Modus läuft?

Die HEX Datei im Anhang ausprobieren;)

von Snack (Gast)


Lesenswert?

Danke für den Code,

habe ihn gerade mal ausprobiert,
jedoch habe ich immer noch schwarze Balken.

Was ist in deinem Hex programmiert?

von holger (Gast)


Lesenswert?

>habe ihn gerade mal ausprobiert,
>jedoch habe ich immer noch schwarze Balken.
>
>Was ist in deinem Hex programmiert?

Meine eigenen LCD Routinen die ich schon sehr lange
mit sehr vielen unterschiedlichen LCDs benutze.
Ich habe sie dir für deinen ATmega mit deiner Pinbelegung
und 16MHz Takt compiliert. Die Delays sollten also auf jeden
Fall passen.

So, wo stehen wir jetzt? Dein Programm funktioniert
nicht, mein erprobtes Programm funktioniert nicht bei dir.

>Ein kleiner Unterschied könnte noch sein, das in deinem Display ein
>KS0066 Kontroller ist. Es ist ein kleiner Unterschied in der
>Initialisierung. Ob das in deinem Code berücksichtigt ist kann ich nicht
>sagen. Mein Display ist ein HD44780, das funktioniert mit dem Code.

Da funktioniert dein Code auch noch.

Ich konnte bisher noch keinen Unterschied zwischen HD44780
und KS0066 feststellen. Das wird es auch nicht sein.

Die Wahrscheinlichkeit eines Softwarefehlers geht
so langsam gegen Null. Du hast ein Hardwareproblem.

Fang nochmal hier an:

Beitrag "Re: LCD 202A Conrad und Atmega 8"

Mach es wie Karl Heinz es vorschlägt.
Schreib dir ein Programm was jeden Pin zum LCD einzeln
setzt. Dann misst du nach ob der Pegel stimmt. Und du misst
auch nach ob es einen Kurzschluss zu den anderen Pins gibt.
Oder offene Leitungen.

von Snack (Gast)


Lesenswert?

Hallo,

ich habe beim ATMEGA 1 MHZ CPU eingestellt, per Fusebits.

Wenn ich die Spannung messe, muss ich dann die vollen 5V an den Pins 
messen?

Oder welcher Spannungswert müsste sich einstellen?

von holger (Gast)


Lesenswert?

>Wenn ich die Spannung messe, muss ich dann die vollen 5V an den Pins
>messen?

Das können auch 4.6V sein. Hauptsache nicht 0V.
So, und nun leg los.

von Snack (Gast)


Lesenswert?

So habe mal alle Pegel am LCD gemessen und bin ein bißchen verwundert:

            Soll   gemessen
Pin1 VSS =  GND  = 0V --> Ok
Pin2 VCC =  5V   = 5V --> Ok
Pin3 VEE =  Poti = 1V --> Ok
Pin4 RS  =  PD4  = 5V --> Ok
Pin5 RW  =  GND  = 0V --> OK
Pin6 E   =  PD5  = 1.3V --> NOK
Pin7     =  offen(0V?) =  5V --> OK???
Pin8     =  offen(0V?) =  5V --> OK???
Pin9     =  offen(0V?) =  5V --> OK???
Pin10    =  offen(0V?) =  5V --> OK???
Pin11 DB1 = 5V    = 1.3V  --> NOK?
Pin12 DB2 = 5V    = 5V  --> OK
Pin13 DB3 = 5V    = 5V  --> OK
Pin14 DB4 = 5V    = 5V  --> OK

Ist das richtig das ich an den "offen Pins" die für den 4 Bit Modus 
nicht benutzt werden 5V messe?


Und das ich an PD4 und PD5 keine 5V messe ich doch auch komisch.

Hatte heute morgen noch mal alles gelötet und durch geklingelt.

Ist vielleicht das LCD defekt oder wirklich noch ein Verdrahtungfehler`?

Werde mal weiter messen und überlegen.

von Spess53 (Gast)


Lesenswert?

Hi

>Ist das richtig das ich an den "offen Pins" die für den 4 Bit Modus
>nicht benutzt werden 5V messe?

Ja. Die Datenleitungen des Displaycontrolers haben interne 
Pull-Up-Widerstände.

MfG Spess

von Snack (Gast)


Lesenswert?

An PD5,6,7 liegen beim Pollinboard auch die LED und der Summer an.

Jumper sind aber gezogen.

Habe die Spannungen 1.2V auch direkt am µC Pin gegen Masse gemessen.

von Dietrich L. (dietrichl)


Lesenswert?

Snack schrieb:
> Habe die Spannungen 1.2V auch direkt am µC Pin gegen Masse gemessen.

Und wie hast Du gemessen?
Wenn Du mit einem Multimeter bei laufendem Programm misst, kann es ja 
sein, dass die Leitungen "bewegt" werden und Du den Mittelwert siehst.
Also brauchst Du einen Oszi, oder ein Testprogramm, dass nur die Ports 
fest einstellt oder im x Sekundenraster umschaltet.

Gruß Dietrich

von Snack (Gast)


Lesenswert?

So habe mal den kompletten Port D angesteuert und messe dann 5V an jedem 
Ausgang. Das scheint ok zu sein

von Snack (Gast)


Lesenswert?

Ja habe mit dem Multimeter gemessen.Man konnte sehen das die 
Spannungspegel sich ständig ändern. Oszi habe ich leider nicht =)

von Snack (Gast)


Lesenswert?

@ Holger:

bzgl deines Programmes: Steuerst du Port D an? Denn wenn ich da 
nachmesse, sind nahezu alle Pins 0V.

von holger (Gast)


Lesenswert?

>@ Holger:
>
>bzgl deines Programmes: Steuerst du Port D an? Denn wenn ich da
>nachmesse, sind nahezu alle Pins 0V.

Ja, natürlich. Ich initialisiere das Display und schreibe
Text in beide Zeilen. Danach mach das Programm nichts mehr.
Es ist also gut möglich das die meisten Pins dann auf Null bleiben.

>So habe mal den kompletten Port D angesteuert und messe dann 5V an jedem
>Ausgang. Das scheint ok zu sein.

Wenn du den kompletten Port ansteuerst findest du deinen
Dreher aber nicht. Nimm immer nur einen Pin und setz ihn auf 1.
Das ganze machst du dann sechs mal. Also sechs mal kompilieren
und flashen. Dann misst du jedesmal wo die 5V anstehen.
Die Nachbarpins dürfen keine 5V haben. Wenn doch hast du einen
Kurzschluss. Nach dieser Methode wirst du den Fehler in
höchstens 30Minuten finden.

von snack (Gast)


Lesenswert?

Habe eine allgemeine Verständnisfrage:

Woran kann das liegen, das ich teilweise auf beiden Reihen schwarze 
Balken sehe (Programm vom Holger) und teilweise nur in der 1.Reihe 
schwarze Balken sehe (Programm aus dem Tutorial)?


OK, werde nun mal jeden Ausgang einzeln ansteuern und messen.

Meld mich später wieder.

von snack (Gast)


Lesenswert?

Also ich habe nun mal nur den 1.Port von D angesteuert


DDRD = 0x01;

PORTD = 0x01;


Habe dann an meiner Steckerleiste gemessen und jeder Pin hat 5V gegen 
Masse.

Habe dann direkt am µC gemessen.

Pin2 gegen Pin8 und auch 5V.


µC defekt?

von snack (Gast)


Lesenswert?

"Pin2 gegen Pin8 und auch 5V."

Meinte Pin3 Port2 gegen Pin 8 (GND) und auch 5V
Pin4 usw analog

von Hubert G. (hubertg)


Lesenswert?

Wenn du im Display zwei Reihen schwarz hast, dann hat die 
Initialisierung soweit funktioniert das sie auf 2-Zeilen umgeschaltet 
hat. Also ein bisschen was geht.
Hast du schon mal den Kontroller aus der Fassung genommen und jeden Pin 
des Sockel gegen GND und VCC gemessen?
Dann die Verbindung vom Sockel zum Display, auch jede einzelne Leitung 
messen.
Mit den Billigsockeln auf diesem Board hatte ich nach einiger Zeit 
Kontaktprobleme bekommen. Ich habe diesen Sockel mittlerweile gegen 
einen Nullkraft-Sockel getauscht.

von Karl H. (kbuchegg)


Lesenswert?

snack schrieb:
> Also ich habe nun mal nur den 1.Port von D angesteuert
>
>
> DDRD = 0x01;
>
> PORTD = 0x01;
>
>
> Habe dann an meiner Steckerleiste gemessen und jeder Pin hat 5V gegen
> Masse.

Irgendwie fehlt dir komplett das Verständnis darüber, wie man Tests 
macht.

  DDRD = 0xFF;     alles auf Ausgang
  PORTB = 0x01;    nur 1 Pin auf 1, alle anderen auf 0

Und jetzt wird gemessen!

Ein Pin der auf Eingang gestellt ist, kann jeden denkbaren Pegel 
annehmen! So ein Test sagt also nichts über irgendwas aus.


Und wenn Pin 0 klappt, dann probierst du Pin 1

   PORTB = 0x02;

und wenn der klappt

   PORTB = 0x04;

etc. etc.

Und dann hast du auch eine Aussage darüber, ob deine Pins in Ordnung 
sind oder ob es wo einen Kurzen gibt.

von Snack (Gast)


Lesenswert?

So, habe nun jeden einzelnen Port durchgemessen.

Der Pin 2 von PortD hatte irgendwie kein Kontakt zum Sockel.

Fehler behoben. Nun haben alle Pins 5V gegen Masse.

Anschließend habe ich wieder das LCD Programm geflasht.

Hier hat PD1 bis PD3 5V
Aber PD0 und PD5 haben 1.12V(mit Multimeter gemessen)

Was wird denn hier mit dem Code erwünscht

#define LCD_DB        PD0

von Snack (Gast)


Lesenswert?

Beide Zeilen zeigen nur schwarze Balken an.

Jedoch kein Text wir im Absoulten Beginner Tutorial gewüschnt.

Was könnte noch eine Fehlerquelle sein?

von Snack (Gast)


Lesenswert?

Würde das Programm auch funktionieren wenn  man 2x20 Zeichen hätte? 
Anstatt 2x16Zeichen?

von Hubert G. (hubertg)


Lesenswert?

Grundsätzlich ja, könnte nur beim Schieben Probleme geben.
Zum Testen spielt es keine Rolle.

von Snack (Gast)


Lesenswert?

Ok mein Display hat 2x20Zeichen.

von Dietrich L. (dietrichl)


Lesenswert?

Snack schrieb:
> Pin11 DB1 = 5V    = 1.3V  --> NOK?
> Pin12 DB2 = 5V    = 5V  --> OK
> Pin13 DB3 = 5V    = 5V  --> OK
> Pin14 DB4 = 5V    = 5V  --> OK

Da ist was komisch: was ist hier DB1...DB4?

Die LCD-Pins 11...14 sind die LCD-Datenbits DB4...DB7

Mit den Einstellungen (Auszug aus Deiner lcd_routines.h):

//  LCD DB4-DB7 <-->  PORTD Bit PD0-PD3
#define LCD_PORT      PORTD
#define LCD_DDR       DDRD
#define LCD_DB        PD0

sollten die LCD-Signale DB4...DB7 an den µC-Port PD0...PD3 angeschlossen 
werden.

Gruß Dietrich

von Hubert G. (hubertg)


Lesenswert?

Ich kann mich nur wiederholen, du hast ein Hardwareproblem, außer:
Hast du auch wieder mal am Kontrast gedreht? Nicht das der zu stark 
aufgedreht ist, dann siehst du auch nichts, oder nur schwarze Kästchen.

von Snack (Gast)


Lesenswert?

Hallo Dietrich,

der Fehler liegt bei mir:

Snack schrieb:
> Pin11 DB1 = 5V    = 1.3V  --> NOK?
> Pin12 DB2 = 5V    = 5V  --> OK
> Pin13 DB3 = 5V    = 5V  --> OK
> Pin14 DB4 = 5V    = 5V  --> OK

eigentlich hätte ich das so schreiben müssen


Pin11 DB4 = 5V    = 1.3V  --> NOK?
Pin12 DB5 = 5V    = 5V  --> OK
Pin13 DB6 = 5V    = 5V  --> OK
Pin14 DB7 = 5V    = 5V  --> OK

Deine Aussage ist absolut richtig. Mein LCD ist auch so angeschlossen.

Hatte mich falsch ausgedrückt.

von Snack (Gast)


Lesenswert?

Hallo Hubert,

aus dem Datenblatt vom LCD kann ich keine Kontrastspannung entnehmen.

Ich varriere sie immer leicht.

von Visitor (Gast)


Lesenswert?

Ich hatte vor einigen Jahren auch einmal ein Conrad-LCD, welches ich 
nicht zum Laufen gebracht und dann aus Frust entsorgt habe.

Erst nachdem ich es weggeworfen hatte, habe ich im Datenblatt gelesen, 
daß vor Inbetriebnahme noch Lötverbindungen auf der LCD-Rückseite 
herzustellen sind.

Vielleicht ist das dein Problem.

von Hubert G. (hubertg)


Lesenswert?

Kannst du den Kontrast so weit drehen das die schwarzen Kästchen nur 
mehr schwach sichtbar sind?

von Snack (Gast)


Lesenswert?

Ja kann ich, habe ein 5K Poti angeklemmt.

von Snack (Gast)


Lesenswert?

Hallo Visitor,

danke für die Info.

Aber im Datenblatt steht nichts drin und das LCD sieht auch nicht so 
aus, als ob noch was gelötet werden müsste.

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.