DOG-M 162 will nichts anzeigen

Gast #1998230
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
Angehängte Dateien:
Gast #1998272
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
Gast #1998321
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!
Gast #1998426
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 :(
Persönliche Seite #1998987
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?
#1999020
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.
Persönliche Seite #1999040
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.
Gast #1999257
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
Angehängte Dateien:
Persönliche Seite #1999944
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.
Angehängte Dateien:
Persönliche Seite #1999947
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
}
Persönliche Seite #1999958
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
}

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