Hallo,
ich muss für ein Projekt das LC-Display von myAVR mit einem Arduino
verwenden. Dafür darf jedoch nur Ansi-C verwendet werden, und keine
Arduinospezifischen Funktionen.
Meine Frage ist also, gibt es einen einfachen Weg die vorgegebenen
LCD-Funktionen für den Arduino umzuschreiben? Muss ich die Funktionen
überhaupt umschreiben? eigentlich werden die PORTS ja genau so
angesprochen wie beim AVR, und von der Programmierung her sollte es auch
gleich sein. Einzig die wait_ms funktionen müssen angepasst werden.
Aktuell tut sich mit dem vorgegebenen Zeug nämlich absolut nichts.
Was mir außerdem auffällt, in dem beigefügten Code gibt es 3 lcd_write
Funktionen. Im Lehrbuch und im Internet findet man den Code so das alle
3 Funktionen lcd_write heißen. Hier spuckt mein Atmel Studio aber nur
Fehler aus. Deshalb habe ich die funktionen lcd_write, lcd_write1 und
lcd_write2 genannt. Ist das falsch?
Hoffe mir kann jemand weiterhelfen :)
Viele Grüße
Calytras schrieb:> Aktuell tut sich mit dem vorgegebenen Zeug nämlich absolut nichts.
Wie ist das Display angesschlossen? Ohne weitere Infos ist es schwierig
was sinvolles dazu zu sagen.
> Was mir außerdem auffällt, in dem beigefügten Code gibt es 3 lcd_write> Funktionen.
Das ist der Unterschied zwischen C und C++.
Die +5V kommen vom Arduino ebenso wie die Masse.
Ansonsten:
PortD-2 -> LCD4(RS)
PortD-3 -> LCD6(E)
PortD-4 -> LCD11(DB4)
PortD-5 -> LCD12(DB5)
PortD-6 -> LCD13(DB6)
PortD-7 -> LCD14(DB7)
PORTB-1 -> LCD15(BLA)
exakt so wies in dem Lehrbuch steht. Die Datenbits 0-3 liegen auf Masse.
Ich hab den Controller grade nochmal resettet, da ist mir aufgefallen
das das LCD ganz schwach, ganz kurz aufleuchtet und sofort wieder
ausgeht.
Wie meinst du das mit dem Unterschied zwischen C und C++?
Musst du denn alles selber schreiben? Falls nicht, benutze doch Peter
Fleurys gut funktionierende Bibliothek:
http://homepage.hispeed.ch/peterfleury/avr-software.html#libs
Hat eine geringfügig andere Syntax als der Arduinokram, aber sonst ist
sie sehr flexibel in Bezug auf Taktfrequenzen und Portbelegung.
Muss ich noch genauer abklären. Eigentlich sollte es kein Problem sein
wenn ich diese Bibliothek verwende. Es dürfen halt keine
Arduino-Funktionen wie z.B. Serial.Begin() oder Serial.println
vorkommen.
Calytras schrieb:> Wie meinst du das mit dem Unterschied zwischen C und C++?
C++ erlaubt Funktionen mit der gleiche Name, solange die Signatur (Typen
von Rückgabewert und Parameter) unterschiedlich sind. Bei C geht das
nicht, wie du schon erfahren hast.
Calytras schrieb:> Die Datenbits 0-3 liegen auf Masse.
Das ist übrigens Unsinn. Die Pins haben interne Pullups und sollten
einfach freigelassen werden, wenn sie unbenutzt sind. RW aber bitte fest
auf Masse.
Eric B. schrieb:> C++ erlaubt Funktionen mit der gleiche Name, solange die Signatur (Typen> von Rückgabewert und Parameter) unterschiedlich sind. Bei C geht das> nicht, wie du schon erfahren hast.
Dann ist mir schleierhaft warum in dem Lehrbuch bei "Programmierung des
LC-Displays in C" 3 Funktionen mit gleichem Namen vorhanden sind. Wie
gesagt, hab ich hier schwarz auf weiß liegen, auf sowas wäre ich auch
nicht gekommen. Hab mir dann nur gedacht dass anhand der Parameter
(einmal char, einmal char*, und einmal char* + int) erkannt wird um
welche der 3 es sich handelt.
Matthias S. schrieb:> Das ist übrigens Unsinn. Die Pins haben interne Pullups und sollten> einfach freigelassen werden, wenn sie unbenutzt sind. RW aber bitte fest> auf Masse.
RW ist auf Masse, die D0-3 sind hier in meinem "Anschlussplan" auf
Masse. Deshalb dachte ich ich mach das auch so. Ich habs aber auch
schon probiert das ich die freigelassen habe, ändert aber nichts an der
nichtvorhandenen Funktion des Displays.
Jemand sonst ne Idee warum das Ding keinen Mucks macht? :)
Der Kontrast-Pin wird durch einen Spannungsteiler mit einem Poti
angesteuert. eine Seite auf 5V und eine auf Masse. Eine Veränderung des
Potis bewirkt nichts.
Ich hab das jetzt mal so gemacht wie in dem Tutorial, also 4 mal ins
Steuerregister für den 4-Bit-Modus. Fehlanzeige. funktioniert nicht.
Calytras schrieb:> Eine Veränderung des Potis bewirkt nichts.
Dann ist dein Display defekt oder du hast falsch verdrahtet. Über den
Kontrast muss sich die erste Zeile von nichts-sichtbar hin zu schwarzen
Blöcken verstellen lassen, auch ohne Initialisierung und Software.
Könnte es theoretisch sein das der Arduino nicht genug Strom für das LCD
liefern kann? Er ist nur via USB mit dem Rechner verbunden.
Verdrahtung hab ich schon gefühlte 1000 mal überprüft, es war und ist
richtig angeschlossen. Entweder es bekommt nicht genügend Saft oder es
ist defekt. Naja, ich geb morgen nochmal Bescheid, heute habe ich leider
keine Zeit mehr mich länger damit zu befassen.
Danke an alle bisher!
Im Datenblatt steht 5V. An der Stromversorgung liegts nicht, habs mit
einer externen Quelle versucht, läuft nicht.
tommy_v schrieb:> Kannst Du mal ein Foto machen?
Naja, kann ich schon, aber es ist halt wirklich genau so angeschlossen
wie oben steht, und wie es im Datenblatt steht.
Defekt ist das Display auch nicht, weil ich es gestern an einem
myAVR-Board testen konnte. An diesem hat es funktioniert.
Calytras schrieb:> Naja, kann ich schon, aber es ist halt wirklich genau so angeschlossen> wie oben steht, und wie es im Datenblatt steht.
Dann bleibt als Schlussfolgerung nur, dass man generell keine Lcds mit
microcontrollern betreiben kann.
Es gibt endlos funktionierenden LCD-code im Netz. Wenn die Hardware
wirklich in Ordnug ist, nimm doch einfach anderen code.
Das Display ist in Ordnung, alles ist richtig angeschlossen, nur das
Verhalten entspricht nicht dem, was der User erwartet. Ich fürchte, hier
kann nicht geholfen werden.
Nochmals, ganz langsam geschrieben, damit es keine Missverständnisse
gibt: Wenn Änderungen an der Kontrastspannung nichts bewirken, liegt ein
Hardware Problem vor.