Forum: Mikrocontroller und Digitale Elektronik DOG-M 162 will nichts anzeigen


von Michael (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe mit dem Display DOG-M 16x2 Zeichen so meine Probleme. Habe nun 
schon viel gesucht und hier ist auch viel zu finden, aber vieles eben 
nur zum Anschluss mit SPI.

Ich betreibe das Display an einem Atmega8 mit 5V über 4 Bit.

Angeschlossen ist es dabei wie folgt:

PDO = D7
PD1 = D6
PD2 = D5
PD3 = D4
PD4 = RS
PD5 = E



Zuerst habe ich probiert die init selber zu schreiben aber das wollte 
auch nicht so recht. Dann habe ich hier im Forum eine Codeschnipsel 
gefunden und diese zusammengefügt. Leider zeigt mir das Display nichts 
an! :(

Ich weiß das Programm ist sicherlich nicht hübsch, aber ich möchte auch 
erst einmal nur sehen ob das Display etwas anzeigt und mein Aufbau etc 
alles richtig ist. Mehrfach durchgemessen und überprüft habe ich alles 
aber man weiß ja nie...


Was ich auch im Datenblatt nicht verstehe ist, wie der Contrast 
eingestellt werden kann. Eventuell liegt es bei mir auch daran?!

Wäre dankbar für jeden Ratschlag und HIlfe.

Ich habe mal das Projekt angehangen.


mfg Michael

von Michael (Gast)


Lesenswert?

achso, das Display ist wie nach dem beiliegenden Plan verdrahtet.

von Mike J. (emjey)


Lesenswert?

Sobald du es mit 5V versorgt hast (genau 5V nicht weniger sonst geht das 
Display nicht an)

Sobald es mit 5V versorgt wurde siehst du einen schwarzen Balken und 
erst dann kannst du das Display mit dem ATmega8 initialisieren.

von Spess53 (Gast)


Lesenswert?

Hi

>void lcd_enab(void) {
>  PORTD |= 0x10;
>  _delay_us(100);
>  PORTD = 0x00;
>}

Die Daten werden mit der fallenden Flanke von E übernommen. Du löscht 
aber zum gleichen Zeitpunkt die Datenleitungen.

Außerdem weiß ich nicht so richtig, wo du die Initialisierungswerte her 
hast.

MfG Spess

von PaulMichael (Gast)


Lesenswert?

Also ich habe genau 5 V an den benötigten Pin`s anliegen. 
(Konstantspannungsquelle) Davon wird auch der Atmega gespeist.

Wie gesagt den Code habe ich hier aus dem Forum (Dieser Beitrag recht 
weit untern: http://embdev.net/topic/126291#new)


Einen schwarzen Balken sehe ich jedoch nicht? Habe aber auch gelesen das 
man bei dem Display mit dem Controller nur ein leeres LCD vorfindet!

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> PDO = D7
> PD1 = D6
> PD2 = D5
> PD3 = D4
> PD4 = RS
> PD5 = E

Das ist aber sehr ungeschickt, weil du dann per Software die 
Datenleitungen umknoten musst. Üblicher ist auf jeden Fall

PD3 = D7
PD2 = D6
PD1 = D5
PD0 = D4
PD4 = RS
PD5 = E

RW hast du auf GND gelegt?

von Michael (Gast)


Lesenswert?

dann löte ich die fix um oder ist das mit ein paar Zeilen getan die in 
der Software zu drehen?

Ja RW ist auf GND

von Michael (Gast)


Lesenswert?

hat sich nichts geändert nach dem umlöten..Display bleibt noch immer 
leer :(

von Mike J. (emjey)


Lesenswert?

PaulMichael schrieb:
> Einen schwarzen Balken sehe ich jedoch nicht? Habe aber auch gelesen das
> man bei dem Display mit dem Controller nur ein leeres LCD vorfindet!

Habe auch solche Displays verbaut und man sieht einen schwarzen Balken!

Also wenn du den nicht siehst brauchst du nicht mit initialisieren 
anzufangen.

von Michael (Gast)


Lesenswert?

Aber sicher das es auch bei den invertierten zutrift?! Da müsste es ja 
genau anders herum sein?!

Ich habe noch mal nachgemessen, ich habe es exakt so verkabelt wie es 
auf der Internetseite des Herstellers beschrieben ist :(

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Mit dem geänderten Pinout habe ich Chancen deinen Sourcecode auf meinem 
Testboard laufen zu lassen. Aber heute nicht mehr, ist schon zu spät.

Bei einem inversen LCD sollte nach meiner Spekulation (habe kein 
inverses) über die Funktionsweise (Polarisation) statt schwarzer Balken 
helle Balken sichtbar sein.

von Michael (Gast)


Lesenswert?

Hallo Stefan,

das wäre super, dann komme ich vielleicht irgendwie weiter!

Oder hat jemand vielleicht eine routine für den Atmega8 mit 4 Bit, damit 
ich testen kann?!

von Stefan B. (stefan) Benutzerseite


Lesenswert?

So, habe jetzt deine Beschreibung der Schaltung mit dem Quellcode 
verglichen:

> PD4 = RS
> PD5 = E

Passt auch nicht zum Quellcode.

> void lcd_enab(void) {
>   PORTD |= 0x10;
>   _delay_us(100);
>   PORTD = 0x00;
> }

E wird mit 0x10 geschaltet, also PD4 = E

> void lcd_putc(char c) {
>   PORTD |= ((c>>4) | 0x40);
>   lcd_enab();
>   PORTD |= ((c&0x0F) | 0x40);
>   lcd_enab();
> }

RS wird mit 0x40 geschaltet also PD6 = RS

Steht aber auch beides so in http://embdev.net/topic/126291#1154285 und 
dem Folgepost mit der Umverdrahtung von PORTC nach PORTD.

Dem Hinweis in http://embdev.net/topic/126291#1154251 auf PSB bist du 
mit dem Datenblatt des Displays 
(http://www.lcd-module.de/eng/pdf/doma/dog-me.pdf) nachgegangen?

von Karl H. (kbuchegg)


Lesenswert?

Stefan B. schrieb:

...
> E wird mit 0x10 geschaltet, also PD4 = E
...
> RS wird mit 0x40 geschaltet also PD6 = RS

UNd nur so als Hinweis an den TO.
Beide Fehler hätten sich ganz leicht vermeiden lassen, wenn man den 
üblichen C Gepflogenheiten folgt und keine magischen Konstanten direkt 
in den Code schreibt.

Du schrubst weiter oben

> Angeschlossen ist es dabei wie folgt:
>
> PDO = D7
> PD1 = D6
> PD2 = D5
> PD3 = D4
> PD4 = RS
> PD5 = E

Ergo:
1
#define PIN_E   PD5
2
#define PIN_RS  PD4
3
4
5
...
6
7
void lcd_enab(void) {
8
  PORTD |= ( 1 << PIN_E );
9
  _delay_us(100);
10
  PORTD &= ~( 1 << PIN_E );
11
}

für RS dann genau dasselbe in grün in der anderen Funktion.
Das bischen Mehrarbeit gleich von Anfang an, lohnt sich allemal. Und von 
der besseren Lesbarkeit und Verständlichkeit der lcd_enab Funktion reden 
wir erst mal gar nicht.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Der Vollständigkeit halber:

Der vom TO oben gepostete Code ist für

PD3 = D7
PD2 = D6
PD1 = D5
PD0 = D4
PD6 = RS  <===
PD4 = E   <===

Der TO hat derzeit gelötet (1x umgelötet)

PD3 = D7
PD2 = D6
PD1 = D5
PD0 = D4
PD4 = RS
PD5 = E

Die (begrüßenswerte) Änderung des Codes mit Makros von Karl-Heinz kann 
mit der derzeitigen Verkabelung betrieben werden. Der Originalcode des 
TO nicht.

von Michael (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich danke euch für die schnellen und informativen Antworten!

Das mit dem PSB(23) habe ich befolgt und der liegt auf High.
Ebenso die 24,25,26,32,33,34,35 und 40

Auf Low liegt 27,37,38.

Ich habe jetzt die Anmerkungen noch mal in den Code eingepflegt aber es 
tut sich noch immer nichts :( Das Display bleibt komplett leer!



Ich hänge das aktuelle Projekt nochmal an. Ich kann mir nicht wirklich 
vorstellen, dass das Display defekt ist?!

Kann den Code im Anhang jemand testen und sagen ob er bei sich 
funktioniert und "hello" auf dem LCD erscheint?!

vielen dank

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Der v2 Code kann nicht funktionieren. Offentsichtlichster Fehler ist

> void lcd_putc(char c) {
>   PORTD |= ( 1 << PIN_RS );
>   _delay_us(100);
>   PORTD &= ~( 1 << PIN_RS );
> }

Da ist überhaupt keine Anweisung zur Ausgabe des Zeichens c vorhanden!

Den Rest habe ich nicht kontrolliert, weil deine Änderungen nicht so ins 
Auge springen.

von Stefan B. (stefan) Benutzerseite


Angehängte Dateien:

Lesenswert?

Dann habe ich die Änderungen nach Vorschlag von Karl-Heinz in der v1 
Source selbst gemacht (siehe Anhang).

Der Lauftest mit meinem LCD (kein EA DOGM! sondern ein Data Vision 
DV20208 von Pollin zeigt ein "test" auf der Ausgabe.

Ich habe allerdings ein Board mit 1 MHz intern benutzt (den AVR 
Transitortester aus der Codesammlung) und die fix eingestellten 4 MHz 
aus der lcd.h auskommentiert. Die 4 MHz in der lcd.h passen bei deiner 
Hardware?

Die weiteren Änderungen sind:

1. Nur die Pins manipulieren, die für 4-Bit LCD nötig sind. Auf meinem 
Board ist noch andere Hardware, deshalb kein pauschales Manipulieren 
aller Pins an PORTD

2. Zu Beginn der lcd_init nach dem Hochfahren _delay_ms(200) warten 
bevor das LCD angesprochen wird.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

3. Änderung noch die lcd_goto_xy() für mein LCD...

Der Code ist der lcd_setcursor() aus 
AVR-GCC-Tutorial/LCD-Ansteuerung entnommen.

1
void lcd_goto_xy(uint8_t x, uint8_t y) {
2
#if 0
3
  PORTD |= y | 0x08; 
4
  lcd_enab();
5
  PORTD |= x; 
6
  lcd_enab();  
7
#else
8
#define LCD_SET_DDADR   0x80
9
#define LCD_DDADR_LINE1 0x00
10
#define LCD_DDADR_LINE2 0x40
11
12
    uint8_t data;
13
 
14
    switch (y)
15
    {
16
        case 1:    // 1. Zeile
17
            data = LCD_SET_DDADR + LCD_DDADR_LINE1 + x;
18
            break;
19
 
20
        case 2:    // 2. Zeile
21
            data = LCD_SET_DDADR + LCD_DDADR_LINE2 + x;
22
            break;
23
 
24
        default:
25
            return;                                   // für den Fall einer falschen Zeile
26
    }
27
28
  PORTD |= (data>>4);
29
  lcd_enab();
30
  PORTD |= (data&0x0F);
31
  lcd_enab();
32
#endif
33
}

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Spess53 schrieb:

>>void lcd_enab(void) {
>>  PORTD |= 0x10;
>>  _delay_us(100);
>>  PORTD = 0x00;
>>}
>
> Die Daten werden mit der fallenden Flanke von E übernommen. Du löscht
> aber zum gleichen Zeitpunkt die Datenleitungen.

Stimmt, überraschenderweise funktioniert das (bei F_CPU 1 MHz. je 
schneller desto kritischer...). Sauber programmieren sollte man das aber 
z.B. so

1
void lcd_enab(void) {
2
  PORTD |= (1<<LCD_E);
3
  _delay_us(100);
4
  PORTD &= ~(1<<LCD_E); // fallende Flanke => Datenübernahme
5
  _delay_us(100); // Mindestlänge im Datenblatt nachsehen und anpassen
6
  PORTD &= ~LCD_PINS;
7
}

von Michael (Gast)


Lesenswert?

oh wow es geht :) tausend dank :) bei mir erscheint ein test auf dem 
Bildschirm!

Da fällt mir ein Stein vom Herzen!

Vielen dank für die Mühen :)

von Sesk K. (zeborok)


Lesenswert?

Und der schwarze Balken blieb nach wie vor fern?

von Sesk K. (zeborok)


Lesenswert?

Ich kann es mittlerweile selbst bestätigen: Es gibt, jedenfalls wohl bei 
den neueren, keinen schwarzen Balken!

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.