Forum: Mikrocontroller und Digitale Elektronik Atmega8 und LCD Display


von MartinO (Gast)


Lesenswert?

Hallo,

ich würde gern meinen Atmega8 und mein Display von Pollin zum Laufen 
bekommen. Ich sitze nun schon 2 Tage dran, aber bekomme kein Zeichen, 
geschwiege denn die Uhrzeit wie geplant, auf das Display.

Ich habe die Beschaltung wie in LCD-Ansteuerung beschrieben, 
aufgebaut.

Was kann die Ursache dafür sein ?

Anhänge:
- Datasheed Display http://www.pollin.de/shop/downloads/D120422D.PDF

HW:
- Atmega8
- STK 500
- Display TC1602A-09 
(http://www.pollin.de/shop/dt/Nzc1OTc4OTk-/Bauelemente_Bauteile/Aktive_Bauelemente/Displays/LCD_Modul_TC1602A_09.html)

von Timmo H. (masterfx)


Lesenswert?

MartinO schrieb:
> Was kann die Ursache dafür sein ?
Vermutlich dein nicht geposteter Quellcode

von MartinO (Gast)


Lesenswert?

Ich nutze den gleichen Quellcode wie in LCD-Ansteuerung

von MartinO (Gast)


Lesenswert?

Was könnte ich noch posten, dass mir jmd. weiterhelfen kann ?

von Dietrich L. (dietrichl)


Lesenswert?

MartinO schrieb:
> LCD-Ansteuerung
versuch mal Deinen Link :-((

Aber unabhängig davon: es geht nicht um den "gleichen Code", sondern um 
genau Deinen. Ich nehme mal an, dass da doch einige winzige Details 
anders sind - und wenn es nur Schreibfehler sind.

Außerdem ist ein Schaltplan sehr sinnvoll.

Gruß Dietrich

von HP (Gast)


Lesenswert?

abgesehn vom Schaltplan und Code. Hast du mal mit dem Displaykontrast 
gespielt? Ich erinner mich noch an meine ersten Gehversuche mit LCDs als 
der vermeintliche Fehler eine falsche Kontrasteinstellung war

von MartinO (Gast)


Angehängte Dateien:

Lesenswert?

@DietrichL: hier mal meinen Code:
1
#include <avr/io.h>
2
#include "lcd-routines.h"
3
#include <util/delay.h>
4
 
5
int main(void)
6
{
7
   lcd_init();
8
 
9
  lcd_data( 'T' );
10
  lcd_data( 'e' );
11
  lcd_data( 's' );
12
  lcd_data( 't' );
13
 
14
  lcd_setcursor( 0, 2 );
15
 
16
  lcd_string("Hello World!");
17
 
18
  DDRB = 0x01;
19
  while(1)
20
  {
21
    PORTB = 1;
22
  _delay_loop_2(100000);
23
  PORTB = 0;
24
  _delay_loop_2(100000);
25
  }
26
 
27
  return 0;
28
}
das ist mein Code.
Im Makefile habe ich noch folgendes angepasst:
1
MCU = atmega8
hier dann nochmal der Link AVR-GCC-Tutorial/LCD-Ansteuerung

Schaltplan habe ich angehangen.

@HP: nein, habe ich noch nicht!

von holger (Gast)


Lesenswert?

@DietrichL: hier mal meinen Code:

Wo ist die "lcd-routines.h" ?

von MartinO (Gast)


Lesenswert?

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 3686400
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           15
35
#define LCD_ENABLE_US           20
36
#define LCD_WRITEDATA_US        46
37
#define LCD_COMMAND_US          42
38
 
39
#define LCD_SOFT_RESET_MS1      5
40
#define LCD_SOFT_RESET_MS2      1
41
#define LCD_SOFT_RESET_MS3      1
42
#define LCD_SET_4BITMODE_MS     5
43
 
44
#define LCD_CLEAR_DISPLAY_MS    2
45
#define LCD_CURSOR_HOME_MS      2
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[5] mit den Spaltencodes 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

von holger (Gast)


Angehängte Dateien:

Lesenswert?

>Wo ist die "lcd-routines.h" ?

Und warum schliesst du dein Display nicht so an wie es
da drin steht?

Nimm mal meine HEX Datei.

von Wicht (Gast)


Lesenswert?

Hast du die Ports entstprechend geändert?
Im Tut liegt imho PD0-PD3 an den Datenleitungen ...

von Gerhard W. (dd4da) Flattr this


Lesenswert?

Nun, da ich den rest des codes nicht sehen kann, kann ich leider nicht 
nachvollziehen wie der Mega8 den 44780 in den 4-Bit mode schalten soll - 
denn dass muss er machen.
Ich nutze die LCD-Support Routinen von Peter Fleury. ( $Id: lcd.c,v 
1.14.2.1 2006/01/29 12:16:41 peter Exp $) Die funktionieren im 4-Bit 
Mode bei mir sehr gut.

Mein Init sieht so aus:

      lcd_init ( LCD_DISP_ON );
      lcd_clrscr ();
      lcd_gotoxy ( 0, 0 );
      lcd_puts ( " Antennenkoppler Controller " );

     sprintf(cpa, "  Version 
%d.%d.%d%d",version[0],version[1],version[2],version[3]);

      lcd_gotoxy (0, 2);
      lcd_puts (cpa);



Es ist wichtig dass die richtigen 4 Bit's des I/O-Ports der Displays 
benutzt werden.

Ich finde bei deinem Code nicht die Stelle wo der 4/8 Bit Mode 
initialisiert wird.

init(); <--- ??????????
Sehe mal da rein - ob noch was übergeben werden muss.
Kontrolliere die Anschlüsse des Displays an den ATMEGA8.

von MartinO (Gast)


Lesenswert?

Habe meine Beschaltung gemäß der Anleitung:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
geändert und @holger dein .hex eingespielt... leider nix!

von holger (Gast)


Lesenswert?

>Habe meine Beschaltung gemäß der Anleitung:
>http://www.mikrocontroller.net/articles/AVR-GCC-Tu...
>geändert und @holger dein .hex eingespielt... leider nix!

Dann funktionieren schon mal zwei komplett unterschiedliche
Programme bei dir nicht.

Jetzt will ich ein Bild von deinem Aufbau sehen.

von holger (Gast)


Lesenswert?

Nachtrag:

>Habe meine Beschaltung gemäß der Anleitung:
>http://www.mikrocontroller.net/articles/AVR-GCC-Tu...
>geändert und @holger dein .hex eingespielt... leider nix!

Meine HEX Datei war für deine Anschlussbelegung und nicht die
aus dem Tutorial;)

von MartinO (Gast)


Angehängte Dateien:

Lesenswert?

Hier das Bild!

von MartinO (Gast)


Lesenswert?

holger schrieb:
> Nachtrag:
>
>>Habe meine Beschaltung gemäß der Anleitung:
>>http://www.mikrocontroller.net/articles/AVR-GCC-Tu...
>>geändert und @holger dein .hex eingespielt... leider nix!
>
> Meine HEX Datei war für deine Anschlussbelegung und nicht die
> aus dem Tutorial;)

habe ich mir schon gedacht und zuerst probiert, dann umgebaut!

von holger (Gast)


Lesenswert?

>Hier das Bild!

Ab in die Tonne damit. Man sieht nichts.

von MartinO (Gast)


Lesenswert?

ich bau das morgen nochmal um, sodass man was sieht :) ich weiß, aber 
hab halt noch nicht so viel equipment... morgen siehts besser aus

von Klaus W. (mfgkw)


Lesenswert?

holger schrieb:
> Ab in die Tonne damit. Man sieht nichts.

Das kannst du so nicht sagen!

Man kann ein Steckbrett erkennen, ein LCD und einen Quarz auf der 
Flucht.

von holger (Gast)


Lesenswert?

>Das kannst du so nicht sagen!
>
>Man kann ein Steckbrett erkennen, ein LCD und einen Quarz auf der
>Flucht.

Zwei Kerkos und ein Widerstand scheinen auch zu flüchten.

Kommt nur mir das so vor oder hat er die Datenleitungen
zum Teil auf die VCC GND Schiene gelegt?

von MartinO (Gast)


Angehängte Dateien:

Lesenswert?

@holger: kommt dir nur so vor
Habe nun nochmal versucht einen sauberen Aufbau zu starten:
Die LCD Pins sind von oben bis unten K, A, DB7 ... VSS

Hoffe es sieht besser aus :/

von holger (Gast)


Lesenswert?

>Habe nun nochmal versucht einen sauberen Aufbau zu starten:

Und warum schliesst du das Display immer noch nicht richtig an?

von holger (Gast)


Lesenswert?

>>Habe nun nochmal versucht einen sauberen Aufbau zu starten:
>
>Und warum schliesst du das Display immer noch nicht richtig an?

Ach Shit vergiss es;) Jetzt nach Tutorial.

von holger (Gast)


Lesenswert?

Wo und wie wird eigentlich die Kontrastspannung eingestellt?
Hast du die schwarzen (weissen bei Blau) Balken schon mal gesehen?

von MartinO (Gast)


Lesenswert?

Ja, die Balken sehe ich.
Die Kontrastspannung geht direkt über einen 10kOhm an VCC.

von spess53 (Gast)


Lesenswert?

Hi

>Die Kontrastspannung geht direkt über einen 10kOhm an VCC.

Kein Einstellregler?

MfG Spess

von MartinO (Gast)


Lesenswert?

Nope! Ist das ein MUSS
 ?

von Klaus W. (mfgkw)


Lesenswert?

nein, nur wenn es ohne nicht geht ;-)

von MartinO (Gast)


Lesenswert?

Ok, also einen kleineren wiederstand, wenn ich zuvfllig nicht noch ein 
regler finde ?

von Benjamin R. (shooter_benny)


Lesenswert?

MartinO schrieb:
> Die Kontrastspannung geht direkt über einen 10kOhm an VCC.

Ich kenne das eher über nen Widerstand an GND.

Im Datenblatt steht auch
Supply Voltage For LCD:  VDD-V0 typ: 4.7V
Nach V0 umstellen müsste dann eher 0,3V als Kontrastspannung angelegt 
werden, also kommt 10kOhm gegen GND eher hin als 10kOhm gegen VCC ;)

Gruß Benny

von MartinO (Gast)


Lesenswert?

Benjamin R. schrieb:
> MartinO schrieb:
>> Die Kontrastspannung geht direkt über einen 10kOhm an VCC.
>
> Ich kenne das eher über nen Widerstand an GND.
>
> Im Datenblatt steht auch
> Supply Voltage For LCD:  VDD-V0 typ: 4.7V
> Nach V0 umstellen müsste dann eher 0,3V als Kontrastspannung angelegt
> werden, also kommt 10kOhm gegen GND eher hin als 10kOhm gegen VCC ;)
>
> Gruß Benny

Ne, dass geht nicht!

von spess53 (Gast)


Lesenswert?

Hi

>Ne, dass geht nicht!

Und dein unsinniger Widerstand nach VCC geht noch weniger.

Die richtige Beschaltung von Vo steht sogar groß und breit in den 
Datenblatt.

MfG Spess

von MartinO (Gast)


Lesenswert?

Ok, via 10kOhm gegen Ground hab ich! Es bewegt sich aber nix!

von HP (Gast)


Lesenswert?

genau solche "Sparmaßnahmen" sind echt mist wenn man das erste Mal mit 
nem LCD spielt. Nimm ein Poti dann kannst du den Kontrast vernünftig 
einstellen bzw. weißt dass es nicht am Kontrast liegt das nix angezeigt 
wird.
Glaub mir ich sprech da aus Erfahrung. Du kannst das Poti ja später 
gegen nen Festwiderstand austauschen wenn alles funktioniert.

von Sascha M. (sascha32)


Lesenswert?

Da muss ich HP recht geben, da mit habe ich auch meine erfahrung 
gemacht. mfg

von Alex W. (a20q90)


Lesenswert?

Welchen Takt hat der Mega8 den intern? 8MHz?

von MartinO (Gast)


Lesenswert?

Ok, werde mir morgen ein 10kOhm Poti holen.

Er hat 1MHz intern!

von Alex W. (a20q90)


Lesenswert?

MartinO schrieb:

> Er hat 1MHz intern!

Dann bitte die "#define F_CPU 3686400" da drauf anpassen!

von MartinO (Gast)


Lesenswert?

hab noch einen Poti gefunden! :) nun kann ich den Kontrast einstellen... 
aber sehen tue ich immer noch nix

von MartinO (Gast)


Lesenswert?

Alex W. schrieb:
> MartinO schrieb:
>
>> Er hat 1MHz intern!
>
> Dann bitte die "#define F_CPU 3686400" da drauf anpassen!

ist definiert!

von eProfi (Gast)


Lesenswert?

Wechselt die Spannung an PortB? Evtl. mit LED kontrollieren, ob der µC 
überhaupt läuft.


> ich würde gern meinen Atmega8 und mein Display von Pollin zum Laufen
bekommen.

Bei Pollin TC1602E kommen sofort die Alarmglocken:
Beitrag "Vorsicht unübliche Pinbelegung beim LCD TC1602E (Pollin 120420): Pin1=VDD=+5V Pin2=VSS=Gnd"
Du hast ja das TC1602A und es hat schonmal die Balken angezeigt, dann 
ist es richtig gepolt.

Ist Dein Steckbrett zuverlässig? Es genügt eine Unterbrechung, dass es 
nicht läuft. Ich löte lieber. Da weiß man, was man hat (na zu 99%).

von Benjamin R. (shooter_benny)


Lesenswert?

> // LCD Ausführungszeiten (MS=Millisekunden, US=Mikrosekunden)

> #define LCD_BOOTUP_MS           15
> #define LCD_ENABLE_US           20
> #define LCD_WRITEDATA_US        46
> #define LCD_COMMAND_US          42

> #define LCD_SOFT_RESET_MS1      5
> #define LCD_SOFT_RESET_MS2      1
> #define LCD_SOFT_RESET_MS3      1
> #define LCD_SET_4BITMODE_MS     5

> #define LCD_CLEAR_DISPLAY_MS    2
> #define LCD_CURSOR_HOME_MS      2

Erhöhe die Wartezeiten testweise und zwar um den Faktor 10 bis 100.

von MartinO (Gast)


Lesenswert?

Hallo,

habe heute nochmal alles verlötet! Nun auch mit Poti.
Leider sehe ich nur die Striche auf meinem LCD. :/

Ebenfalls habe ich mein Prog nochmal angepasst um zu sehen, ob der 
Mikrocontroller überhaupt läuft und habe dazu eine LED über einen 1kOhm 
an VCC gehangen. Leider blinkt die nicht auf.. Auf meinem STK500 funzt 
es.

Hier das Programm:
1
#include <avr/io.h>
2
#include "lcd-routines.h"
3
#include <util/delay.h>
4
 
5
int main(void)
6
{
7
  lcd_init();
8
 
9
  lcd_data( 'T' );
10
  lcd_data( 'e' );
11
  lcd_data( 's' );
12
  lcd_data( 't' );
13
 
14
  lcd_setcursor( 0, 2 );
15
 
16
  lcd_string("Hello World!");
17
 
18
   DDRB=0x01;
19
  while(1)
20
  {
21
    PORTB = 0x01;
22
    _delay_loop_2(100000);
23
    PORTB = 0x00;
24
    _delay_loop_2(100000);
25
  }
26
 
27
  return 0;
28
}
habe die LED an PB0 gehangen!

Ich weiß langsam nicht mehr weiter :?

von MartinO (Gast)


Lesenswert?

es blinkt es blinkt es blinkt :)

leider noch nicht außer dicke unterstriche auf dem lcd :?

Was kann das sein =? DatenKabel sind ordnungsgemäß angeschlossen

von MartinO (Gast)


Lesenswert?

Kann mir nicht jemand helfen ? :(

von MartinO (Gast)


Angehängte Dateien:

Lesenswert?

auf meinem Display sieht es übrigens mittlerweile so aus: siehe Anhang!

von Klaus W. (mfgkw)


Lesenswert?

Datenleitungen richtig angeschlossen?

Ansonsten bevor hier noch Mannjahre verschwendet werden: nimm für ein 
paar Euro mal ein neues und probiere das.
Ein zweites kann eh nicht schaden auf Dauer.

von MartinO (Gast)


Lesenswert?

Datenleistungen sind ordnungsgemäß dran!

Kann ja nicht sein, dass ein neues LCD kaputt ist. (also kann schon 
sein, aber eher unwahrscheinlich)

von Klaus W. (mfgkw)


Lesenswert?

Erstens kann es wohl, zweitens ist es ja jetzt nicht mehr neu :-)

von Benjamin R. (shooter_benny)


Lesenswert?

Haben die unbeschalteten LCD Pins D0...D3 auch definiert Masse. Man kann 
sie ja gewöhnlich offen lassen aber ich selbst hab sie immer mit GND 
verbunden und es noch nie offen probiert.

Hast du die Wartezeiten erhöht?

>DDRB=0x01;    // LCD_Init Einstellungen werden wieder überschrieben!
Schreib das mal lieber so: DDRB |= 0x01;

Gruß
Benny

von Klaus W. (mfgkw)


Lesenswert?

Benjamin R. schrieb:
> Haben die unbeschalteten LCD Pins D0...D3 auch definiert Masse. Man kann
> sie ja gewöhnlich offen lassen aber ich selbst hab sie immer mit GND
> verbunden und es noch nie offen probiert.

Sie offen zu lassen, schadet definitiv nicht.

Sie auf Masse zu legen, geht schief, wenn man versehentlich das LCD dazu 
bewegt, etwas auszugeben - dann ziehen zwei an einer Leitung, einer nach 
GND und einer nach VCC.

Nachdem hier nicht klar ist, was eigentlich passiert, würde ich alles 
tun, aber nicht Leitungen unnötig auf Masse legen.

von Benjamin R. (shooter_benny)


Lesenswert?

Ja ok macht natürlich Sinn kein weiteres Risiko einzugehen.

Btw: Wenn wirklich R/W mit GND verbunden ist, befindet sich das Display 
immer im Daten-Empfangmodus und sollt die DBx Pins nicht beschreiben.

Gruß
Benny

von spess53 (Gast)


Lesenswert?

Hi

>Haben die unbeschalteten LCD Pins D0...D3 auch definiert Masse. Man kann
>sie ja gewöhnlich offen lassen aber ich selbst hab sie immer mit GND
>verbunden und es noch nie offen probiert.

Dieser Irrglaube hält sich sehr hartnäckig.
Hast du eigentlich schon mal das Datenblatt eines Displaycontrollers 
(z.B. HD44780) gelesen? Die Dinger haben interne Pull-Up-Widerstände . 
Also ist GND für unbenutzte Pins bei Displays der falsche Weg. Entweder 
offen lassen oder externe Pull-Ups.

MfG Spess

von Klaus W. (mfgkw)


Lesenswert?

Benjamin R. schrieb:
> Btw: Wenn wirklich R/W mit GND verbunden ist, befindet sich das Display
> immer im Daten-Empfangmodus und sollt die DBx Pins nicht beschreiben.

Wenn...

Alles scheint jedenfalls nicht richtig gemacht zu sein, sonst würde es 
ja gehen.

von Ingo D. (ingo2011)


Lesenswert?

MartinO schrieb:
> auf meinem Display sieht es übrigens mittlerweile so aus: siehe Anhang!

.. für mich sieht es so aus, als wenn das Ding überhaupt keine
Initialisierung bekommt.
Das ist doch ein zweizeiliges Display oder ?
Gruss Ingo

von Benjamin R. (shooter_benny)


Lesenswert?

spess53 schrieb:
> Dieser Irrglaube hält sich sehr hartnäckig.
> Hast du eigentlich schon mal das Datenblatt eines Displaycontrollers
> (z.B. HD44780) gelesen?

Ja, allerdings nur die Abschnitte mit den Daten zur Ansteuerung. 
"Meinen" typischen Aufbau habe ich damals auch aus einem Tutorial 1:1 
nachgebaut und ihn seitdem nicht mehr verändert, da es auf Anhieb 
funktioniert hatte.

Aber danke für den Tipp, unnötig Strom verschwenden braucht man ja auch 
nicht. Zukünftig werd ich das berücksichtigen.

Wieder Back2Topic:
Ich möchte nochmal explizit auf die Wartezeit hinweisen, da es bei mir 
in der Vergangenheit öfters ein Fehler war und man ließt auch immer 
wieder das die kompatiblem Kontroller sich nicht 1:1 an das 
Timingverhalten des HD44780 halten.

EDIT:
Wie lange braucht denn ein AVR bis der interne Quarz eingeschwungen ist?
Die LCD_init wird ja sofort aufgerufen. Vielleicht ist das Display nach 
dem Spannungseinschalten noch nicht bereit.
Fügt doch mal vor der Init ein _delay_ms ein.


Gruß
Benny

von MartinO (Gast)


Lesenswert?

Habe die Werte erhöht(um Faktor 10 - 100), aber ohne Erfolg!
1
#define LCD_BOOTUP_MS           150
2
#define LCD_ENABLE_US           200
3
#define LCD_WRITEDATA_US        460
4
#define LCD_COMMAND_US          420
5
 
6
#define LCD_SOFT_RESET_MS1      50
7
#define LCD_SOFT_RESET_MS2      10
8
#define LCD_SOFT_RESET_MS3      10
9
#define LCD_SET_4BITMODE_MS     50
10
 
11
#define LCD_CLEAR_DISPLAY_MS    20
12
#define LCD_CURSOR_HOME_MS      20

von Stryker_2k (Gast)


Lesenswert?

Stimmt das denn jetzt zu 100% mit deiner Verkabelung überein?


MartinO schrieb:
> //  LCD DB4-DB7 <-->  PORTD Bit PD0-PD3               <--- !!!!!!!!!!!
> #define LCD_PORT      PORTD
> #define LCD_DDR       DDRD
> #define LCD_DB        PD0
>
> //  LCD RS      <-->  PORTD Bit PD4     (RS: 1=Data, 0=Command)
> #define LCD_RS        PD4
>
> //  LCD EN      <-->  PORTD Bit PD5     (EN: 1-Impuls für Daten)
> #define LCD_EN        PD5


Falls nicht, frag lieber ruhig - sonst kommen wir nie zum Ziel ;-)

von MartinO (Gast)


Lesenswert?

Ja, ist ja richtig!

JA, die Verkabelung stimmt zu 100%!

von MartinO (Gast)


Lesenswert?

Hier nochmal die Pinbelegung des Atmega8 mit dem LCD 1602A-09 von 
Pollin!

Pinbelegung Atmega8:

Reset --> via 10kOhm zu VCC
PD0   --> DB4 vom LCD
PD1   --> DB5 vom LCD
PD2   --> DB6 vom LCD
PD3   --> DB7 vom LCD
PD4   --> RS vom LCD
VCC   --> VCC
GND   --> GND
PB6   -->
PB7   -->
PD5   --> E vom LCD
PD6   -->
PD7   -->
PB0   --> via 1kOhm und LED zu VCC

PC5   -->
PC4   -->
PC3   -->
PC2   -->
PC1   -->
PC0   -->
GND   --> GND
AREF  -->
AVCC  --> VCC
PB5   -->
PB4   -->
PB3   -->
PB2   -->
PB1   -->

Pinbelegeung LCD:

Vss   --> GND
Vdd   --> VCC
V0    --> Schleifer 10kOhm Poti(Poti zwischen GND und VCC)
RS    --> PD4 vom AVR
R/W   --> GND
E     --> PD5 vom AVR
DB0   -->
DB1   -->
DB2   -->
DB3   -->
DB4   --> PD0 vom AVR
DB5   --> PD1 vom AVR
DB6   --> PD2 vom AVR
DB7   --> PD3 vom AVR
A     --> via 1kOhm an VCC
K     --> GND

Der AVR läuft auch, da die LED blinkt!

von Oliver J. (skriptkiddy)


Lesenswert?

Hast du an allen VCC Anschlüssen 100nF nach Masse?

von MartinO (Gast)


Lesenswert?

Nein habe ich nicht! ein MUSS ?

von Oliver J. (skriptkiddy)


Lesenswert?

MartinO schrieb:
> Nein habe ich nicht! ein MUSS ?
Definitiv.

von MartinO (Gast)


Lesenswert?

Einfach bspw. von
VCC am AVR - zu VCC auf meiner Platine
             UND
           - via 100nF zu GND ?
:?

von Oliver J. (skriptkiddy)


Lesenswert?


von MartinO (Gast)


Lesenswert?

... done!
leider ohne Erfolg!

von holger (Gast)


Angehängte Dateien:

Lesenswert?

So, noch mal ein Versuch von mir.
Nimm mal die HEX im Anhang. Wurde für 16MHz compiliert,
also bitte ein wenig warten. Kann etwas dauern bevor was kommt.

Dann kannst du noch mal folgendes tun falls noch nicht geschehen:
BODLEVEL und BODEN Fuse aktivieren.
Den Watchdog abschalten falls aktiviert.

Pass auf das du dir dabei den Resetpin nicht wegfused.

Wenn das alles nichts bringt ist entweder dein
Display hinüber oder etwas nicht richtig angeschlossen.
Also auf Kurzschlüsse oder falsche Verbindungen testen:

Dieses Miniprogramm flashen und messen ob nur ein Pin auf High
ist, und kontrollieren ob es der richtige Pin ist.

void main(void)
{
  DDRD = 0xFF;

 // Jeweils immer nur eine dieser Zeilen aktivieren, flashen
 // und dann messen
 PORTD = 0x01; // DB4

//  PORTD = 0x02; //DB5
//  PORTD = 0x04; //DB6
//  PORTD = 0x08; //DB7
//  PORTD = 0x10; //RS
//  PORTD = 0x20; //E

  while(1)
  {
  }
}

von MartinO (Gast)


Lesenswert?

hab deine .hex mal geflasht, aber nix zu sehen.
Nun habe ich alle PINs geprüft und es sah gut aus, immer nur der 
entsprechende PIN auf HIGH.

Nun habe ich das LCD mal an mein STK500 via Flachbandkabel an PORTD 
geklemmt, also das gleiche wie vorher, nur über das STK500.

Nun ist die gestrichelte Linie in der Mitte des Displays.. hm..
Aber mehr hats auch nicht gebracht!

Die Fuses hab ich auch mal gesetzt! - keine Auswirkung!

von Oliver J. (skriptkiddy)


Lesenswert?

Dann ist das Display wohl wirklich defekt.

von MartinO (Gast)


Lesenswert?

langsam glaub ich das auch :/

von Klaus W. (mfgkw)


Lesenswert?

Aber es ist doch neu :-)

von MartinO (Gast)


Lesenswert?

haha ;)
Naja, hab eben nen neues bestellt!

von MartinO (Gast)


Lesenswert?

Hallo,

nun ist das neue Display da!
Ebenfalls ähnlich wie bei dem Alten!

Hier sind aber im Gegenteil zum alten alle Pixel in der oberen Zeile = 
1! :?

Langsam versteh ich das nicht mehr!

von MartinO (Gast)


Lesenswert?

Oh, nach erneutem flashen sind nun alle Pixel beider Zeilen High! :)

von spess53 (Gast)


Lesenswert?

Hi

>Oh, nach erneutem flashen sind nun alle Pixel beider Zeilen High! :)

Dann dreh mal mal am Kontrast.

MfG Spess

von MartinO (Gast)


Lesenswert?

Hab ich schon, bringt nix!

von holger (Gast)


Lesenswert?

>Dann dreh mal mal am Kontrast.

>Hab ich schon, bringt nix!

Dann ist das Poti falsch angeschlossen.

von MartinO (Gast)


Lesenswert?

V0 - Schleifer
Poti zwischen GND und VCC
Falsch ?

von MartinO (Gast)


Lesenswert?

MartinO schrieb:
> V0 - Schleifer
> Poti zwischen GND und VCC
> Falsch ?

Die Beschaltung stimmt doch, oder ?

von chrisl77 (Gast)


Lesenswert?

Gruß,
irgendwie scheinen deine Timings nicht zu stimmen...
ich habe nur #include <util/delay.h> gesehen...
wenn du mal in der delay.h nachschaust wirst du sehen
"delay.h" wird nur richtig ausgeführt, wenn du optimization 
einschaltest...
also setzt die mal auf level3.

du benutzt doch avr studio oder?

von MartinO (Gast)


Lesenswert?

ja, benutze ich! Wie stelle ich das ein?

von chrisl77 (Gast)


Lesenswert?

habe jetzt avr studio nicht da aber unter einstellungen müsste da 
irgendwo compiler und debugger stehen da durchklicken und dann müste ein 
dropdownmenue mit optim kommen standart auf none eingestellt... du 
stellst dann da o3 ein....

von MartinO (Gast)


Lesenswert?

was sollte das bringen ?
Ich habs gemacht, aber ohne Erfolg!

von Mike .. (90peter90)


Lesenswert?

Hallo MartinO,
habe auch einen Atmega8 mit einem LCD 1602. Ebenfalls sind bei mir nur 
alle Pixel beider Zeilen auf 1. Komme da auch irgendwie nicht weiter.
???
Falls du eine Lösung hast, sag mal Bescheid!

LG pete

von holger (Gast)


Lesenswert?

@ Mike, pete

>habe auch einen Atmega8 mit einem LCD 1602. Ebenfalls sind bei mir nur
>alle Pixel beider Zeilen auf 1. Komme da auch irgendwie nicht weiter.

Dein Kontrast stimmt nicht. Den musst du mit einem Poti einstellen.

Häng dich hier bitte nicht dran. Mach einen neuen Thread auf.
Dann beschreibst du wo und wie du das Display angeschlossen hast.
Taktrate des AVR angeben, Schaltplan, Foto vom Aufbau, Code
posten. Dann kann dir geholfen werden.

@MartinO
Für dich seh ich irgendwie schwarz. Da hilft ja gar nix.
Das ist wohl der längste erfolgloseste LCD Thread bisher.
Entweder du machst deine Displays beim ersten einschalten kaputt
oder deine Schaltung ist komplett von Arsch.

von MartinO (Gast)


Lesenswert?

Wieso sollte mein Display kaputt sein ? Habe alle Anschlüsse 1000mal 
geprüft. Diese sind zu 100% richtig verkabelt!

Leider halt wie seitdem ich das neue Display habe alle Pixel auf HIGH.

Irgendwie kann das doch nicht sein! ?

von holger (Gast)


Lesenswert?

>Irgendwie kann das doch nicht sein! ?

Miss mal die Spannung an VO wenn du am Poti drehst.

von MartinO (Gast)


Lesenswert?

holger schrieb:
>>Irgendwie kann das doch nicht sein! ?
>
> Miss mal die Spannung an VO wenn du am Poti drehst.

0 - 4,87V
bei 0,47V hat das Display den richtigen Kontrast!

von holger (Gast)


Lesenswert?

> Miss mal die Spannung an VO wenn du am Poti drehst.

>0 - 4,87V
>bei 0,47V hat das Display den richtigen Kontrast!

Ach was.

>Dann dreh mal mal am Kontrast.
>Hab ich schon, bringt nix!

Ich verabschiede mich jetzt hier einfach mal für immer.

von MartinO (Gast)


Lesenswert?

wieso ?

von chrisl77 (Gast)


Lesenswert?

MartinO schrieb:
> was sollte das bringen ?
> Ich habs gemacht, aber ohne Erfolg!

habe ich oben schon beschrieben, da du ja offensichtlich delay.h 
benutzt, wird jetzt bei_delayms(200) auch 200ms und nicht 2 oder 1 sec 
gewartet.
ich glaube du machst besser einen neuen threat auf....
oder gib mal deinen kompletten code...

von MartinO (Gast)


Angehängte Dateien:

Lesenswert?

hier nochmal mein kompletter code.
die lcd-routines.h habe ich von AVR-GCC-Tutorial/LCD-Ansteuerung und 
nix dran geändert!!!

von Dietrich L. (dietrichl)


Lesenswert?

MartinO schrieb:
> die lcd-routines.h habe ich von AVR-GCC-Tutorial/LCD-Ansteuerung und
> nix dran geändert!!!

Wenn Du nichts geändert hast, sollten die LCD-Anschlüsse auch so 
verdrahtet werden wie es in lcd-routines.h (bzw. in der Liste darüber: 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung#Anschluss_an_den_Controller) 
angegeben ist.

Wenn der Schaltplan noch so ist:
MartinO schrieb:
> Schaltplan habe ich angehangen.
dann sehe ich bei allen Anschlüssen, die zum ATmega8 gehen, 
Unterschiede!
Woher hast Du Deine Beschaltung?

Gruß Dietrich

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.