Forum: Mikrocontroller und Digitale Elektronik LCD Keypad Shield zeigt nichts an


von Stefan W. (stefan_w13)


Lesenswert?

Hallo!

Ich hab ein LCD Keypad Shield von DFRobot in C programmiert! Ich habe 
dazu die Vorlagen von 
mikrocontroller.net(http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung) 
verwendet und an meinen ATMega2560 angepasst!

-Wenn ich es runterlade zeigt mir das Display nichts an!

-Kann dies an den Delay Zeiten liegen? Und wenn das so ist wie finde ich 
heraus welche Zeiten das LC Display benötigt?

-Oder kann es da noch andere Gründe geben? ( An der Programmierung liegt 
es sehr wahrscheinlich nicht)

Dank im Voraus!

von Alex R. (itaxel)


Lesenswert?

Was für eine Programmierumgebung benutzt du?
Hast du die Beispiele von dfrobot schon ausprobiert?

Wenn du ein Arduino-Board benutzt dann kannst du es ja einfach da drauf 
stecken. Die "LiquidCrystal" Library ist in der Arduino-Umgebung schon 
mit dabei.

von Stefan W. (stefan_w13)


Lesenswert?

Das habe ich schon ausprobiert und es hat auch funktioniert!

Es ist nur das Problem das das Display ein Teil eines Projektes ist!
Es sollen dann Daten auf dem Display angezeigt werden, welche per 
Funkmodul gesendet werden!
So weit ich weiß geht das mit der Arduino-Umgebung nicht!

Das Funkmodul ist auch in  C programmiert also mit Atmel Studio!
Deshalb wäre es vom Vorteil das das Display auch mit Atmel Studio 
programmiert wird!
Das Display ist auf dem Board draufgesteckt!

von Jürgen S. (jurs)


Lesenswert?

Stefan Weninger schrieb:
> Das Display ist auf dem Board draufgesteckt!

Ob das Shield in Ordnung ist, kannst Du leicht testen, indem Du es auf 
ein Arduino-Board (UNO, MEGA, LEONARDO oder vergleichbar) aufsteckst, 
ohne jegliche andere Beschaltung, und dann mit einem geeigneten 
Arduino-Sketch ansteuerst.

Wenn es dann tut, ist das Shield in Ordnung und es stimmt entweder etwas 
nicht an Deiner Schaltung oder an Deinem Programm.

Bei der Schaltung mit dem LCD-Keypad-Shield wäre zu beachten: Am Arduino 
Pin-10 hängt das Backlight des Displays. D.h. für Deine Schaltung: Den 
Arduino Pin-10 darfst Du nicht selbst beschalten und Du darfst ihn nur 
als Eingang betreiben und auf keinen Fall als Output setzen (auch NICHT 
als PWM-Ausgang).

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Stefan Weninger schrieb:
> -Oder kann es da noch andere Gründe geben? ( An der Programmierung liegt
> es sehr wahrscheinlich nicht)

 Wahrscheinlich doch.
 Und warum schreist du dauernd ?

von Alex R. (itaxel)


Lesenswert?

Stefan Weninger schrieb:
> So weit ich weiß geht das mit der Arduino-Umgebung nicht!

Doch das geht...
Ich habe letzte woche ein Funkthermometer mit Display als sender gebaut. 
Der Sender ist im Heizungskeller mit einem Temperatursensor am Ofen. 
Momentan bin ich dabei den Handempfänger mit Display zu bauen.

Für den Sender und Empfänger habe ich das RF73 Modul von Pollin. Das 
Display LCD-Modul TC1602A-09, auch von Pollin, ist am Sender. Das ganze 
mit dem Arduino Duemilanove (ATmega168). Für den Empfänger werde ich ein 
anderes Display benutzen.

: Bearbeitet durch User
von M.O. (Gast)


Lesenswert?

Stefan Weninger schrieb:
> So weit ich weiß geht das mit der Arduino-Umgebung nicht!

Wer hat dir diesen Bären aufgebunden?

Was hindert den Arduino daran, mit einem Funkmodul zu kommunizieren?

von Stefan W. (stefan_w13)


Angehängte Dateien:

Lesenswert?

Das Problem ist, dass wir dieses Projekt vor einer Kommision verteidigen 
müssen (Diplomarbeitsverteidiung).

Also die werden Fragen stellen wie wir das programmiert haben und dann 
kann ich nicht sagen ich habe es ganz einfach mit dem Arduino Modul 
programmiert (steckt ja nicht viel Know-How dahinter)!

Deshalb muss ich das Display in C programmieren.

Ich hab das Programm hochgeladen. Wäre jemand so nett und würde sich das 
mal anschauen??

Das wäre sehr nett.
Danke im Voraus!

von Paul Baumann (Gast)


Lesenswert?

Stefan Weninger schrieb:
> Das Problem ist, dass wir dieses Projekt vor einer Kommision verteidigen
> müssen (Diplomarbeitsverteidiung).

Na, das ist doch ideal zur Verteidigung: Schwert und Shield!
;-)

MfG Paul

von Jürgen S. (jurs)


Lesenswert?

Stefan Weninger schrieb:
> Das Problem ist, dass wir dieses Projekt vor einer Kommision verteidigen
> müssen (Diplomarbeitsverteidiung).
>
> Also die werden Fragen stellen wie wir das programmiert haben und dann
> kann ich nicht sagen ich habe es ganz einfach mit dem Arduino Modul
> programmiert (steckt ja nicht viel Know-How dahinter)!
>
> Deshalb muss ich das Display in C programmieren.

Aha, und dabei kannst Du die Verwendung einer Library aus dem 
www.mikrocontroller.net besser als die Verwendung der Arduino-Library 
"Liquidcrystal" verteidigen?

Sehr merkwürdig.

Die Arduino-Libraries sind Deiner Meinung nach wohl nicht in C 
programmiert? OK, hast Recht, die sind in C++. Und C++ kannst Du nicht 
verteidigen?

Um so merkwürdiger, da Du Dir die richtige Pinbelegung Deines 
Keypad-Shields im Schaltbild offenbar überhaupt nicht angesehen hast, 
sondern Du scheinst die Pinbelegung aus einem Beispiel zur 
Liquidcrystal-Library übernommen zu haben:
1
/* 
2
LCD_DB7 hat am Arduino Borad die Nummer 2-->  Hardware nachschauen-->  ist PE4
3
LCD_DB6 hat am Arduino Borad die Nummer 3-->  Hardware nachschauen-->  ist PE5
4
LCD_DB5 hat am Arduino Borad die Nummer 4-->  Hardware nachschauen-->  ist PG5
5
LCD_DB4 hat am Arduino Borad die Nummer 5-->  Hardware nachschauen-->  ist PE3
6
LCD_RS  hat am Arduino Borad die Nummer 12--> Hardware nachschauen-->  ist PB6
7
LCD_EN  hat am Arduino Borad die Nummer 10--> Hardware nachschauen-->  ist PB4
8
*/

Diese Verkabelung entspricht 100% sämtlichen Programmierbeispielen der 
Arduino-Liquidcrystal Library, wie Du das LCD mit dem Arduino-Board 
verkabeln SOLLST, damit es dann mit der Initialisierungszeile:
1
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
funktioniert.

Dein Problem: Dies entspricht NICHT der Verkabelung des 
Keypad-Shields! Das Keypad-Shield ist so verkabelt, dass es mit dieser 
Zeile initialisiert wird:
1
// Für LCD-Keypad-Shield mit Arduino Liquidcrystal-Library
2
//LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

So, und nun kommst Du, suchst Dir anhand des von Dir verwendeten 
Arduino-Boards und einem Board-Pinout die entsprechenden Atmega 
Port-Pins raus, und ordnest die Pins erstmal richtig zu!

Also:
LCD_RS  ==> Arduino Pin-8 ==> Atmega2560 P??
LCD_EN  ==> Arduino Pin-9 ==> Atmega2560 P??
LCD_DB7 ==> Arduino Pin-7 ==> Atmega2560 P??
LCD_DB6 ==> Arduino Pin-6 ==> Atmega2560 P??
LCD_DB5 ==> Arduino Pin-5 ==> Atmega2560 P??
LCD_DB4 ==> Arduino Pin-4 ==> Atmega2560 P??

Und wenn Du dann "mit C Programmierung" die richtigen Pins Deines 
Controllers ansteuerst, sollte es auch "mit einer C Library" 
funktionieren.

von Stefan W. (stefan_w13)


Angehängte Dateien:

Lesenswert?

Jürgen S. schrieb:
> Um so merkwürdiger, da Du Dir die richtige Pinbelegung Deines
> Keypad-Shields im Schaltbild offenbar überhaupt nicht angesehen hast,
> sondern Du scheinst die Pinbelegung aus einem Beispiel zur
> Liquidcrystal-Library übernommen zu haben

Das LCD Keypad Shield ist auf den Controller raufgesteckt.
So liegt:
D7-->     Pin 2
D6-->     Pin 3
D5-->     Pin 4
D4-->     Pin 5
LCD_RS--> Pin 10
LCD_EN--> Pin 12

Das Bild im Anhang soll dies verdeutlichen.

Oder meinst du das das LCD Keypad Schield nicht funktioniert wenn man es 
raufsteckt? Und es so anders verkabelt werden muss?

Also so:

Jürgen S. schrieb:
> // Für LCD-Keypad-Shield mit Arduino Liquidcrystal-Library
> //LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

von Jürgen S. (jurs)


Lesenswert?

Stefan Weninger schrieb:
> Das LCD Keypad Shield ist auf den Controller raufgesteckt.
> So liegt:
> D7-->     Pin 2
> D6-->     Pin 3
> D5-->     Pin 4
> D4-->     Pin 5
> LCD_RS--> Pin 10
> LCD_EN--> Pin 12

Das hat mit dem Schaltbild des Keypad-Shields NICHTS zu tun.

> Oder meinst du das das LCD Keypad Schield nicht funktioniert wenn man es
> raufsteckt? Und es so anders verkabelt werden muss?

Für das LCD-Keypad-Shield gilt dieses Schaltbild:
http://www.sainsmart.com/media/wysiwyg/Schematic.jpg

Bitte beachte oben rechts am Display, an welche Digital-Pins RW, E, DB4, 
DB5, DB6 und DB7 angeschlossen sind.

Das sind NICHT die Pin-Nummern, die Du in Deinem Programm stehen hast 
und die Du in Deinem letzten Posting nochmals genannt hast. Das Display 
muss mit den Pins von Deiner Software angesteuert werden, mit denen es 
tatsächlich angeschlossen ist.

Es gelten die Pins, die im Schaltbild stehen und die ich oben gepostet 
habe.

: Bearbeitet durch User
von Jürgen S. (jurs)


Lesenswert?

Hier als Nachtrag noch die verwendeten Pins des Keypad-Shields, wenn Du 
es auf ein Arduino MEGA Board aufsteckst:
1
Shield  µC   LCD
2
------  ---  --------
3
Pin-8   PH5  RS
4
Pin-9   PH6  Enable
5
Pin-4   PG5  DB4
6
Pin-5   PE3  DB5
7
Pin-6   PH3  DB6
8
Pin-7   PH4  DB7

Wie Du siehst, werden am µC insgesamt drei verschiedene Portregister (H, 
G und E) verwendet, wenn das Shield aufgesteckt wird.

Deine Library geht allerdings davon aus, dass alle verwendeten Pins zu 
einem einzigen Portregister gehören, d.h.:

Entweder muss das LCD-Display auf ganz spezielle Weise angeschlossen 
werden, also nicht "einfach aufstecken", sondern Du mußt die 
Verbindungen zwischen Board und Shield so herstellen, dass es für die 
Library passt und nur ein einziges Portregister verwendet wird.

Oder Du mußt die Library umschreiben auf "freie Pin-Wahl", so dass das 
LCD-Shield mit beliebig ausgewählten Pins des Controllers verwendet 
werden kann.

Ich persönlich würde wohl die Library ändern, denn das scheint mir nicht 
besonders schwierig zu sein.

von Stefan W. (stefan_w13)


Lesenswert?

Sehr gut danke!

Du hast mir sehr geholfen ;)

von Jürgen S. (jurs)


Lesenswert?

Stefan Weninger schrieb:
> Sehr gut danke!
>
> Du hast mir sehr geholfen ;)

Heureka!

Und das Umschreiben der LCD-Library auf die Verwendung von Pins in den 
diversen Portregistern und für nicht direkt aufeinanderfolgende 
Datenpins im Portregeister bekommt ihr selber hin?

Oder soll ich dazu noch was posten?

von stefan.weninger@htlpinkafeld.at (Gast)


Lesenswert?

Jürgen S. schrieb:

> Oder soll ich dazu noch was posten?

Ja bitte, dann würden wir schneller vorankommen!

von Jürgen S. (jurs)


Angehängte Dateien:

Lesenswert?

stefan.weninger@htlpinkafeld.at schrieb:
> Ja bitte, dann würden wir schneller vorankommen!

Anbei die geänderte Version der LCD-Routinen mit "freier Pin-Auswahl".

In der .h Datei habe ich gleich die Pinbelegung eingetragen, die Du 
bekommst, wenn Du ein LCD-Keypad-Shield auf ein Arduino-MEGA Board 
draufsteckst, so dass Du gleich direkt ein Beispielprogramm kompilieren 
kannst.

Ich habe die Anpassungen unter der Arduino-IDE gemacht und getestet, 
dabei auf alle Arduino-spezifischen Befehle verzichtet, so dass es ganz 
normal unter AVR-GCC laufen sollte.

Funktioniert's?

von Stefan W. (stefan_w13)


Lesenswert?

Jürgen S. schrieb:
> In der .h Datei habe ich gleich die Pinbelegung eingetragen, die Du
> bekommst, wenn Du ein LCD-Keypad-Shield auf ein Arduino-MEGA Board
> draufsteckst, so dass Du gleich direkt ein Beispielprogramm kompilieren
> kannst.

Heißt das jetzt, dass ich das Keypad Shield auf den ATMega draufstecken 
kann ?
Oder benötige ich noch eine Zusatzplatine?

Habe noch Schule werde es dann am Ambend testen.

von Jürgen S. (jurs)


Lesenswert?

Stefan Weninger schrieb:
> Heißt das jetzt, dass ich das Keypad Shield auf den ATMega draufstecken
> kann ?

Ja klar, so ist das vorgesehen: LCD-Keypad-Shield draufstecken auf das 
Arduino-Board und gut.

Das Pin-Mapping zwischen LCD und Controller ist bei dieser geänderten 
Library völlig frei wählbar (in der .h Datei) und Du bist nicht mehr 
gezwungen, das LCD so anzuschließen, dass alle LCD-Pins auf ein und 
dasselbe Portregister des Controllers gemappt werden müssen, mit der 
Zusatzbedingung, dass die Datenpins sogar im selben Portregister direkt 
nebeneinander liegen müssen.

Solche Einschränkungen entfallen mit der Änderung. Und daher kannst Du 
mit den Änderungen beliebige LCD-Shields und LCD-Keypad-Shields auf 
beliebige Arduino-Boards direkt draufstecken und mit der geänderten 
Library verwenden, einfach durch Änderung des Pin-Mappings in der .h 
Datei.

> Oder benötige ich noch eine Zusatzplatine?

Nein, das LCD-Keypad-Shield ist Deine Zusatzplatine zum Anschließen des 
LCDs durch Draufstöpseln.

Aufpassen beim #include: Beim Dateinamen der geänderten Library ist kein 
Bindestrich im Dateinamen wie in der Original-Library.

von Stefan W. (stefan_w13)


Lesenswert?

Juhu es funktioniert!

War mein Fehler eigentlich nur das ich die falschen Pins angesprochen 
habe?

von Jürgen S. (jurs)


Lesenswert?

Stefan Weninger schrieb:
> Juhu es funktioniert!

Na bravo!

> War mein Fehler eigentlich nur das ich die falschen Pins angesprochen
> habe?

Da fragst Du mich zuviel, das habe ich mir nicht angesehen. Wenn es Dich 
interessiert: Korrigiere Deine falsch vorgenommenenen Codeänderungen für 
die tatsächlichen Pins/Portregister und probiere es aus!

Was ich aber zwischenzeitlich herausgefunden habe: Eigentlich hätte ich 
die Library von Peter Dannegger aus dem LCD-Tutorial hier gar nicht 
anzupassen brauchen, denn mit der LCD-Library von Peter Fleury gibt es 
auch eine fertige und frei downloadbare Nicht-Arduino Library, bei der 
jeder LCD-Pin zu einem anderen Portregister des Controllers gehören 
kann. Braucht man eigentlich nur hier herunterladen als "LCD library for 
HD44870 based LCD's":
http://homepage.hispeed.ch/peterfleury/avr-software.html
Und die Pins entsprechend anpassen.

Das habe ich jetzt auch erst gemerkt, nachdem ich die LCD-Routinen von 
Peter Dannegger für freie Portauswahl angepasst hatte.

von Stefan W. (stefan_w13)


Lesenswert?

Jürgen S. schrieb:
> Das habe ich jetzt auch erst gemerkt, nachdem ich die LCD-Routinen von
> Peter Dannegger für freie Portauswahl angepasst hatte.

Trotzdem Danke!

Eine Frage hätte ich da noch:
An Welchen Pins liegen die Eingänge bzw. wie werden sie eingelesen ( Pin 
Change oder Externer Interrupt) ?

von Jürgen S. (jurs)


Lesenswert?

Stefan Weninger schrieb:
> Eine Frage hätte ich da noch:
> An Welchen Pins liegen die Eingänge bzw. wie werden sie eingelesen ( Pin
> Change oder Externer Interrupt) ?

Schaltbild von dem Shield hatte ich bereits weiter oben gepostet:
http://www.sainsmart.com/media/wysiwyg/Schematic.jpg

Einlesen kannst Du vom Display bei diesem Shield gar nichts, denn 
LCD-Pin R/W ist auf GND gelegt. Damit ist das Display eine 
Einbahnstrasse, d.h. auf dem Display kannst Du nur schreiben, aber 
danach nicht mehr auslesen, was draufsteht. Das müßtest Du Dir im 
Programm merken, falls notwendig.

Die Taster liegen laut Schaltbild auf AD0 und damit meint der Hersteller 
A0 auf dem Arduino-Board, also den ersten Analogeingang. Die Taster sind 
über ein Widerstandsnetzwerk verschaltet, so dass Du nur durch Abfrage 
von A0 alle 5 Taster (Up, Down, Left, Right und Select) abfragen kannst.

Aber nur immer einen Taster zur Zeit.
Mehrfachtastendrücke kannst Du nicht auswerten.
Vorteil: Es wird nur ein einziger Pin benötigt.

Abgefragt wird mit der Arduino-Software per "analogRead()" Funktion, 
z.B. so:
1
int readButton()
2
{
3
  static int NUM_KEYS=5;
4
  static int adc_key_val[5] ={  
5
    30, 150, 360, 535, 760     };
6
  int k, input;
7
  input=analogRead(A0);
8
  for (k = 0; k < NUM_KEYS; k++)
9
  {
10
    if (input < adc_key_val[k])
11
    {
12
      return k;
13
    }
14
  }
15
  if (k >= NUM_KEYS)
16
    k = -1;     // No valid key pressed
17
  return k;
18
}

Zurückgeliefert wird entweder "-1" für keine Taste gedrückt oder ein 
Wert von 0 bis 4 für eine der gedrückten Tasten.

ADC-Messungen sind langsam, daher ist keine Entprellung notwendig.

Wenn Du die Arduino-Software mit analogRead() nicht verwenden möchtest, 
mußt Du den ADC an A0 direkt abfragen, dazu gibt es hier auch ein 
Tutorial, wie auf AVR-Controllern der ADC abgefragt wird:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Analoge_Ein-_und_Ausgabe#Der_interne_ADC_im_AVR

von Stefan W. (stefan_w13)


Lesenswert?

Ok Danke für die Mühe!

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.