Forum: Mikrocontroller und Digitale Elektronik LCD DIP204-4NLW macht nix, mySmartControl von myAVR


von Kjartan F. (kjartan)


Angehängte Dateien:

Lesenswert?

Seit gegrüßt, hilfsbereite Bastler, etc. :)

ich habe mir einen mySmartControl von myAVR.net gekauft um einige 
kleinere Steueraufgaben in einem Testaufbau zu übernehmen, nun bekomme 
ich das Display nicht zum laufen
LCD: DIP204-4NLW
LCD-Datenblatt: http://www.lcd-module.de/eng/pdf/doma/dip204-4e.pdf

ich weiß nicht ob es an der Schaltung (meine erste in Eagle) oder an dem 
Programm liegt, allerdings macht das LCD NICHTS! d.h. die Beleuchtung 
funktioniert aber ich kann nichts auf dem LCD sehen (nichtmal einen 
curser etc.)

Bin für jede Hilfe dankbar ;)
*Außerdem fände ich es cool, wenn mir einer die richtigen Bauteile 
(EAGLE) für eine Stiftleiste+Buchse (20polig) sagen könnte.

Programmteil: (Wartezeiten sind mit Absicht viel zu lang)
#Pins:
PORTC.0 lcd.RS
PORTC.1 lcd.e
PORTC.2 lcd.DB4
PORTC.3 lcd.DB5
PORTC.4 lcd.DB6
PORTC.5 lcd.DB7
1
// lcd initialisierung
2
void lcd_init(void)
3
{
4
  //INIT:LCD
5
  //PORTC für LCD
6
  DDRC  = 0b00000000;    // PortC Ausgang
7
  PORTC = 0b00000010;    // PortC init (enable=1 / fallende flanke aktiv)
8
  wait_ms(100);
9
10
  lcd_db(0b00100100,0);
11
  wait_ms(3);
12
13
  lcd_db(0b00001001,0);
14
  wait_ms(3);
15
16
  lcd_db(0b00100000,0);
17
  wait_ms(3);
18
19
  lcd_db(0b00001111,0);  
20
  wait_ms(3);
21
22
  lcd_db(0b00000001,0);
23
  wait_ms(3);
24
25
  lcd_db(0b00000110,0);
26
  wait_ms(3);
27
28
  lcd_db('H',1);  // TEST
29
}
30
31
// lcd enable
32
void lcd_e (void)
33
{
34
  PORTC|= 0b00000010;
35
  PORTC&= 0b11111101;
36
  PORTC|= 0b00000010;
37
}
38
39
// 8bit - 4bit umrechnung
40
void lcd_db(char data, bool rs)
41
{
42
  //HIGHT Teil
43
  char tmp=data;
44
  tmp&=0xf0;
45
  tmp>>=2;
46
  tmp|=0b00000010;  //enable=1 (lcd:enable reagiert auf fallende Flanke)
47
  tmp|=rs;
48
  PORTC=tmp;
49
  lcd_e();
50
51
  tmp=data;
52
  tmp&=0x0f;
53
  tmp<<=2;
54
  tmp|=0b00000010;
55
  tmp|=rs;
56
  PORTC=tmp;
57
  lcd_e();
58
}

von Florian (Gast)


Lesenswert?

Dein enable dürfte keine saubere Flanke erzeugen. Zwischen dem 
Bitwechsel würde ich ein klitzeklein wenig warten. Mal mit dem Oszi 
testen.

von Kjartan F. (kjartan)


Lesenswert?

Danke für deine schnelle Antwort Florian,

Habe zwischen jedem enable-Sprung 1ms Wartezeit eingebaut und trozdem 
kein Erfolg ;(

jedoch zeigt mein LCD überhaupt nichts an, ich denke es müsste zumindest 
irgendwelche falschen Zeichen von sich geben. (bitte seht euch mal die 
Schaltung an, Kontrast sollte so stimmen - 2,5k poti siehe datenblatt - 
komisch dass das keinen Spannungsteiler auf GND geben muss..)

von SPS (Gast)


Lesenswert?

Also einen GND würde ich dem Poti schon spendieren. Das Einstellen der 
Kontrastspannung wird sonst etwas schwer!

von Florian (Gast)


Lesenswert?

Auch die Pausen beim Init sind vermutlich zu kurz, da Du kein Busy 
abfragen kannst. Mal mit 200ms probieren. Siehe Datenblatt. Was machen 
denn die Befehle beim Init? Habe keine Lust im Datenblatt nachzusehen. 
Schaltest Du in den 4-Bit Modus? Das muß manchmal mehrmals (2-3x) getan 
werden.

von Kjartan F. (kjartan)


Lesenswert?

Danke für eure Antworten :)

das mit GND am Kontrast Poti hat mich auch gewundert aber ich habe im 
Datenblatt nichts anderes gesehen.
http://www.lcd-module.de/eng/pdf/doma/dip204-4e.pdf

ich werde euch in kürze die Befehle in der lcd_init() analysieren ;)

von Kjartan F. (kjartan)


Lesenswert?

hier nochmal die lcd_init() Funktion mit etwas mehr Beschreibung (ist 
1:1 aus dem Datenblatt übernommen, lediglich auf 4-Bit Modus umgestellt)
1
void lcd_init(void)
2
{
3
  //INIT:LCD
4
  //PORTC für LCD
5
  DDRC  = 0b00000000;    // PortC Ausgang
6
  PORTC = 0b00000010;    // PortC init (enable=1 / fallende flanke aktiv)
7
  wait_ms(100);
8
9
  lcd_db(0b00100100,0);  // 4-Bit Datenlänge, extenssion bit RE=1
10
  wait_ms(3);
11
12
  lcd_db(0b00001001,0);  // 4 Zeilen Modus
13
  wait_ms(3);
14
15
  lcd_db(0b00100000,0);  // 4-Bit Datenlänge, extenssion bit RE=0
16
  wait_ms(3);
17
18
  lcd_db(0b00001111,0);  // Display ein, Cursor ein, Cursor blinken
19
  wait_ms(3);
20
21
  lcd_db(0b00000001,0);  // Display löschen, Cursor auf Position 1/1
22
  wait_ms(3);
23
24
  lcd_db(0b00000110,0);  // Cursor Auto-Increment
25
  wait_ms(3);
26
27
  lcd_db('H',1);  // TEST
28
}

von Frank L. (franklink)


Lesenswert?

Hallo,
schau Dir mal die Routine lcd_data aus dem Tutorial an, ich glaube, dann 
wirst Du sehr schnell zumindestens den einen Fehler finden.
1
void lcd_data(unsigned char temp1)
2
{
3
   unsigned char temp2 = temp1;
4
 
5
   LCD_PORT |= (1<<LCD_RS);        // RS auf 1 setzen
6
 
7
   temp1 = temp1 >> 4;
8
   temp1 = temp1 & 0x0F;
9
   LCD_PORT &= 0xF0;
10
   LCD_PORT |= temp1;               // setzen
11
   lcd_enable();
12
 
13
   temp2 = temp2 & 0x0F;
14
   LCD_PORT &= 0xF0;
15
   LCD_PORT |= temp2;               // setzen
16
   lcd_enable();
17
   
18
   _delay_us(42);
19
}

Noch ein Tip, Deine Kommandos lassen sich so nicht lesen, dadurch 
passieren die Fehler, die Du jetzt suchen und korrigieren musst.

Gruß
Frank

von Kjartan F. (kjartan)


Lesenswert?

den einzigen unterschied, den ich feststellen konnte ist "unsigned char" 
anstelle von "char" ... hatte irgendwie immer im Kopf, dass char der 
einzige Datentyp ohne Vorzeichen (0..255) sei :S

Naja ... geholfen hat es nicht ;(

von Frank L. (franklink)


Lesenswert?

Dann solltest Du Dir die C Grundlagen tatsächlich nochmals zu Gemüte 
führen.

Aber ein kleiner Hinweis:

Du shiftest die höher wertigen Bits mit >> 2 an Stelle von >> 4.
Du veroderst das ganze dann noch mit irgendwelchen Werten deren Sinn ich 
nicht verstehe und auch nicht verstehen will.

Ein Tip gehe beide Routinen mal Zeile für Zeile durch und vergleiche. 
Dann kommst Du schon drauf.

Gruß
Frank

von holger (Gast)


Lesenswert?

@ franklink

>PORTC.2 lcd.DB4
>PORTC.3 lcd.DB5
>PORTC.4 lcd.DB6
>PORTC.5 lcd.DB7

>Du shiftest die höher wertigen Bits mit >> 2 an Stelle von >> 4.
>Du veroderst das ganze dann noch mit irgendwelchen Werten deren Sinn ich
>nicht verstehe und auch nicht verstehen will.

Es gibt auch noch andere Anschlussmöglichkeiten
die du dir scheinbar nicht vorstellen kannst.

von Frank L. (franklink)


Lesenswert?

Hallo Holger,
sorry, Deine Portbelegung habe ich übersehen!

Trotzdem gibt es einen Unterschied:

Zuerst wird am Port RS gesetzt. Dann werden die Daten übergeben. Das ist 
soweit ja auch alles korrekt. Dazwischen das Enable. und zum Schluss dem 
Kontroller des LCD Zeit geben dass er seine Aufgabe erledigen kann.

Ich gehe davon aus, dass Du im Enable die Pause eingebaut hast und 
Deinen Kontrastregler auf GND gelegt hast, nicht ds Dein Problem am 
Kontrast liegt.

Ansonst kann ich Dir nur sagen, dass ich bei den LCDs schon einiges an 
Lehrgeld gezahlt habe, nur weil ich das Timing nicht korrekt eingehalten 
habe.

Leider fehlt im Datenblatt ein Timing-Diagramm.

Gruß
Frank

von Kjartan F. (kjartan)


Angehängte Dateien:

Lesenswert?

danke für eure Antworten,

dass der Kontrast kein Spannungsteiler VDD-VSS hat mich auch
gewundert(siehe Bild im Anhang - Auszug aus dem Datenblatt), sieht aus
als sollte es ein variabler Vorwiderstand sein (vielleicht wegen an der
Farbe: Blau mit weiser schrift).

*enable: ich werde es mit mehr Pausen probieren, übrigens setzte ich
enable zuerst 1 wegen der negativen Flanke ;)
1
Dann solltest Du Dir die C Grundlagen tatsächlich nochmals zu Gemüte
2
führen.
...mag ich mal nicht gelesen habe ^.^

von ... .. (docean) Benutzerseite


Lesenswert?

Seh nur ich das???
1
DDRC  = 0b00000000;    // PortC Ausgang

damit ist PORTC ein EINGANG und zwar alle PINS!!!
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Datenrichtung_bestimmen

Dann versteht das LCD logischerweise nix...

PS:
Die Lib von hier 
http://homepage.hispeed.ch/peterfleury/avr-software.html#libs funzt gut

oder
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#LCD-Ansteuerung

EDIT:
und tx/rx gehören an die richtigen PINS, da wo auch RXS/TXD beim AVR 
dransteht

von Kjartan F. (kjartan)


Lesenswert?

danke docean,

aber das Display sagt immer noch nix -.-

da es nicht mal falsche Zeichen, Flackern etc. von sich gibt vermute ich 
dass es an der Schaltung noch was haben muss (Anhang in 1. Post).

Ich habe das mit dem Kontrast als Spg-Teiler zw. +5V und 0V probiert 
(haut auch nicht geholfen).

Das Display kann eigentlich auch nicht kaputt sein (habe 2 neue hier und 
keines funktioniert in dieser weise)

von Frank L. (franklink)


Lesenswert?

Hallo Kjartan,
ich habe hier ein kleine selbstgeschriebene LCD Bibliothek die 
eigentlich für die Ansteuerung über einen 74HC595 gedacht war. In dieser 
kannst Du die Ports unabhängig belegen. Du wirst zwar einiges Umbauen 
müssen, aber ich denke das sollte nicht das Problem sein.

Hier findest Du die Beschreibung und etwas weiter unten die Zip-Datei 
mit dem Sourcecode.

http://www.mikrocontroller.net/articles/Porterweiterungen#Porterweiterung_.C3.BCber_74HC595_.28LCD.29_2

Gruß
Frank

von ... .. (docean) Benutzerseite


Lesenswert?

Benutze bitte die Libs aus einem der beiden Links oben von mir..

Un dann poste mal deine ganze main (als Anhang)

von Kjartan F. (kjartan)


Lesenswert?

Danke Frank und docean,
werde mich direkt drum kümmern und euch bald eine Rückmeldung geben. :)

von Kjartan F. (kjartan)


Lesenswert?

GELÖST!

Danke an alle die mich hier so fleißig unterstützt habe,
das Problem habe ich mir leider selbst eingebrockt, da ich zuvor ein 
Grün-Gelbes LCD für die Schaltung benutzt hatte.
d.H. ich hatte für den Kontrast folgende Schaltung

                 VDD
                  |
VDD - 10kOhm - 10kOhm_poti - VSS

VSS habe ich entfernt und den 10kOhm poti auf 2,5kOhm geändert, jedoch 
den 10kOhm Widerstand vergessen -.-"
Aufgefallen ist es mir, als ich nach der Tiefe eines Kratzers auf der 
Folie gesehen habe und feststellen musste das es funktioniert ... nur 
ganz ganz leicht >,<

Also nochmal Danke an docean, Frank, Florian und Holger.

Mit freundlichen Grüßen,
Kjartan Ferstl

von Frank L. (franklink)


Lesenswert?

Hallo Kjartan,
herzlichen Glückwunsch.

Gruß
Frank

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.