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!
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.
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!
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).
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 ?
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.
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?
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!
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
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
LiquidCrystallcd(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.
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);
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.
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.
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?
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?
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.
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.
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.
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) ?
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
intreadButton()
2
{
3
staticintNUM_KEYS=5;
4
staticintadc_key_val[5]={
5
30,150,360,535,760};
6
intk,input;
7
input=analogRead(A0);
8
for(k=0;k<NUM_KEYS;k++)
9
{
10
if(input<adc_key_val[k])
11
{
12
returnk;
13
}
14
}
15
if(k>=NUM_KEYS)
16
k=-1;// No valid key pressed
17
returnk;
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