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.
:
Bearbeitet durch User
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 | 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.
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.
:
Bearbeitet durch User
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?
Jürgen S. schrieb: > Oder soll ich dazu noch was posten? Ja bitte, dann würden wir schneller vorankommen!
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.
Juhu es funktioniert! War mein Fehler eigentlich nur das ich die falschen Pins angesprochen habe?
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 | 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.