mikrocontroller.net

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


Autor: Kjartan Ferstl (kjartan)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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
// lcd initialisierung
void lcd_init(void)
{
  //INIT:LCD
  //PORTC für LCD
  DDRC  = 0b00000000;    // PortC Ausgang
  PORTC = 0b00000010;    // PortC init (enable=1 / fallende flanke aktiv)
  wait_ms(100);

  lcd_db(0b00100100,0);
  wait_ms(3);

  lcd_db(0b00001001,0);
  wait_ms(3);

  lcd_db(0b00100000,0);
  wait_ms(3);

  lcd_db(0b00001111,0);  
  wait_ms(3);

  lcd_db(0b00000001,0);
  wait_ms(3);

  lcd_db(0b00000110,0);
  wait_ms(3);

  lcd_db('H',1);  // TEST
}

// lcd enable
void lcd_e (void)
{
  PORTC|= 0b00000010;
  PORTC&= 0b11111101;
  PORTC|= 0b00000010;
}

// 8bit - 4bit umrechnung
void lcd_db(char data, bool rs)
{
  //HIGHT Teil
  char tmp=data;
  tmp&=0xf0;
  tmp>>=2;
  tmp|=0b00000010;  //enable=1 (lcd:enable reagiert auf fallende Flanke)
  tmp|=rs;
  PORTC=tmp;
  lcd_e();

  tmp=data;
  tmp&=0x0f;
  tmp<<=2;
  tmp|=0b00000010;
  tmp|=rs;
  PORTC=tmp;
  lcd_e();
}

Autor: Florian (Gast)
Datum:

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

Autor: Kjartan Ferstl (kjartan)
Datum:

Bewertung
0 lesenswert
nicht 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..)

Autor: SPS (Gast)
Datum:

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

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kjartan Ferstl (kjartan)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Kjartan Ferstl (kjartan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hier nochmal die lcd_init() Funktion mit etwas mehr Beschreibung (ist 
1:1 aus dem Datenblatt übernommen, lediglich auf 4-Bit Modus umgestellt)
void lcd_init(void)
{
  //INIT:LCD
  //PORTC für LCD
  DDRC  = 0b00000000;    // PortC Ausgang
  PORTC = 0b00000010;    // PortC init (enable=1 / fallende flanke aktiv)
  wait_ms(100);

  lcd_db(0b00100100,0);  // 4-Bit Datenlänge, extenssion bit RE=1
  wait_ms(3);

  lcd_db(0b00001001,0);  // 4 Zeilen Modus
  wait_ms(3);

  lcd_db(0b00100000,0);  // 4-Bit Datenlänge, extenssion bit RE=0
  wait_ms(3);

  lcd_db(0b00001111,0);  // Display ein, Cursor ein, Cursor blinken
  wait_ms(3);

  lcd_db(0b00000001,0);  // Display löschen, Cursor auf Position 1/1
  wait_ms(3);

  lcd_db(0b00000110,0);  // Cursor Auto-Increment
  wait_ms(3);

  lcd_db('H',1);  // TEST
}

Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht 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.
void lcd_data(unsigned char temp1)
{
   unsigned char temp2 = temp1;
 
   LCD_PORT |= (1<<LCD_RS);        // RS auf 1 setzen
 
   temp1 = temp1 >> 4;
   temp1 = temp1 & 0x0F;
   LCD_PORT &= 0xF0;
   LCD_PORT |= temp1;               // setzen
   lcd_enable();
 
   temp2 = temp2 & 0x0F;
   LCD_PORT &= 0xF0;
   LCD_PORT |= temp2;               // setzen
   lcd_enable();
   
   _delay_us(42);
}

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

Gruß
Frank

Autor: Kjartan Ferstl (kjartan)
Datum:

Bewertung
0 lesenswert
nicht 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 ;(

Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kjartan Ferstl (kjartan)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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 ;)
Dann solltest Du Dir die C Grundlagen tatsächlich nochmals zu Gemüte
führen.
...mag ich mal nicht gelesen habe ^.^

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Seh nur ich das???
DDRC  = 0b00000000;    // PortC Ausgang

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

Dann versteht das LCD logischerweise nix...

PS:
Die Lib von hier 
http://homepage.hispeed.ch/peterfleury/avr-softwar... funzt gut

oder
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

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

Autor: Kjartan Ferstl (kjartan)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht 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/Porterweit...

Gruß
Frank

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Benutze bitte die Libs aus einem der beiden Links oben von mir..

Un dann poste mal deine ganze main (als Anhang)

Autor: Kjartan Ferstl (kjartan)
Datum:

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

Autor: Kjartan Ferstl (kjartan)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Kjartan,
herzlichen Glückwunsch.

Gruß
Frank

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.