Hallo, ich habe kurz eine Frage bzgl des LCD Tutorials (in C). Ich benute den Code des Tuts schon seit zwei Jahren problemlos mit einem Atmega8. Nun habe ich das erste mal einen Atmega16. Nun klappt nichts mehr. Es wird nichts auf dem Display angezeigt. Muss ich den Code des Atmega8 für einen Atmega16 irgendwie anpassen? (Von PIN-Belegung mal abgesehen). Da bisher mit Atmega8 immer alle geklappt hat habe ich die Vermutung, dass evtl. mein Display kaputt ist. VG Helmut
Hier mal die Pin-Belegung: Atmega LCD PD0 E PD1 RS PD2 Datenpin DB4 PD3 Datenpin DB5 PD4 Datenpin DB6 PD5 Datenpin DB7 Hab eben auch noch mal alle Lötstellen überprüft. Kein Fehler feststellbar. Der Poti zum Regeln des Kontrastes funktioniert einwandfrei. Bin ratlos.
Mit sehr hoher Wahrscheinlichkeit hast Du ein Timing Problem. Läuft der 16er mit dem gleichen Takt wie der 8er. Eine wirklich gute Library ist die Peter Fleury: http://jump.to/fleury Einfach in lcd.h alles einstellen und es passt. Rennt bei mir auf allen AVRs.
Hier die Dateien. Ich werde die Library ist die Peter Fleury mal ausprobieren Habe eigentlich nur in "lcd-routines.h" die PINS in Zeile für Daten, RS und E geändert.
>Mit sehr hoher Wahrscheinlichkeit hast Du ein Timing Problem.
Ich denke eher das da was falsch angeschlossen ist.
Helmut schrieb: > PINS in Zeile für Daten, RS > und E geändert. Und was hast du mit read/write gemacht? Und Kontrastspanung?
Helmut schrieb: > PD2 Datenpin DB4 > PD3 Datenpin DB5 > PD4 Datenpin DB6 > PD5 Datenpin DB7 Sicher, daß das richtig ist? Normalerweise schließt man die Datenleitungen des LCDs entweder am oberen (4-7) oder unteren Nibble (0-3) des Ports an, weil der Code sonst wegen der erfdorderlichen Bitschiebereien unnötig kompliziert wird.
Aber sind doch an den oberen (4-7) oder was meinst du damit? R/W ist auf GND zum schreiben. Kontrastspannung über Poti angeschlossen. Wenn ich am Poti schraube werden irgendwann alle Segmente der ersten Zeile des LCD komplett weiß (habe ein weiß/blaues LCD). Sollte also funktionieren oder?
Er meint PD2-PD5. Das ist mitten drin vom Port dseitens des µC. Das könnte den Code etwas unübersichtlicher machen. um die Daten korrekt in die Mitte zu shiften. R/W auf GND, dann kannst du das busyflag nicht auslesen. Aus dem Tutorial: " Deshalb kann man RW dauerhaft auf low lassen (= an GND anschließen), so dass man noch ein IO-Pin am Controller einspart. Der Nachteil ist, dass man dann das Busy-Flag nicht lesen kann, weswegen man nach jedem Befehl vorsichtshalber ein paar Mikrosekunden warten sollte, um dem LCD Zeit zum Ausführen des Befehls zu geben. Dummerweise schwankt die Ausführungszeit von Display zu Display und ist auch von der Betriebsspannung abhängig. Für professionellere Sachen also lieber den IO-Pin opfern und Busy abfragen."
klappt leider immer noch nicht. hab die Anschlüsse am AVR jetzt korrigiert (PD 0-3 sind datenleitungen). Das R/W habe ich immer schon auf GND gelassen. Hatte das Display auch schon mal so betrieben. Aber nun funktioniert es mit einem Atmega16 nicht mehr.
okay also am Display scheint es nicht zu liegen. Habe ebene ein anderes aus einer funktionierenden Schaltung ausgebaut und angeschlossen. Klappt nicht. Komm nich weiter.
also ich meinte eigentlich, wie ich die Taktfrequenz meines Atmega ohne externen Quarz ändenr kann. Ich habe in der lcd-routine.h mal als F_CPU 1, 4 und 8 Mhz ausprobiert. geht alles nicht :(
Helmut schrieb: > Stelle ich den Takt mit F_CPU ein? Nein, F_CPU sagt dem Compiler nur, welche Taktfrequenz Du verwendet hast. Und was Du verwenden willst stellst Du mit den Fuses CKSEL3..0 ein (also nicht im Programm). Näheres steht im Datenblatt. Gruß Dietrich
Ich benutze AVR Studio zum Programmieen und eXtreme Burner zum Überspielen auf den µC. Wenn ich jetzt im AVR Studio due Fußes einstelle aber mit einem anderen Programm (eXtreme Burner) überspiele, dann macht das keinen Sinn oder? Leider kann man im eXtreme Burner nichts einstellen :(
Okay es klappt endlich. Habe die Fuses über den Programmer programmiert bekommen. Nicht so leicht für nen Newbie ^^ Kann ich eigentlich auch einen anderen Wert als 1/4/8 Mhz nutzen? bspw. 3,6864 Mhz ?
Helmut schrieb: > Kann ich eigentlich auch einen anderen Wert als 1/4/8 Mhz nutzen? > > bspw. 3,6864 Mhz ? Ja, mit einem externen Takt. Auszug aus dem Datenblatt: - External Crystal/Ceramic Resonator - External RC Oscillator (ungenau!) - External Clock Aber schau doch bitte mal ins Datenblatt, da steht alles drin unter "Clock Sources". Gruß Dietrich
Also war es ein Timing problem. Unter anderem genau dafür ist das Bbusyflag da! Entweder R/W auf GND und und das LCD garantiert langsam genug ansprechen, so daß es auch bei ungünstiger Versorgugsspannung noch reicht, oder das busyflag abfragen. Helmut schrieb: > Kann ich eigentlich auch einen anderen Wert als 1/4/8 Mhz nutzen? Kannst Du, aber dann mußt du im Quelltext das Verhältnis von CPU-Takt zu LCD-Kommunikation anpassen, damit du das LCD nicht wieder überrennst, sofern das nicht automatisch im Quellcode erledigt wird. Und das ist ja hier ja offenbar nicht der Fall. F_CPU ist zunächst einmal nur eine Konstante und hat keinen Einfluß auf den tatsächlichen Takt. Sinn und Zweck besteht darin hier den tatsächlichen Takt einzutragen und anschließend in taktabhängigen Teilen des Quellcodes diese Konstante zu verwenden, anstatt überall den Wert eintragen zu müssen. Damit wird aber keinesfalls Takt für die Hardware vorgegeben! Man kann da auch völligen Unfug eintragen. Stimmt der Wert nicht mit dem tatsächlichen Takt überein, so kommen bei den Formeln im Quelltext natürlich falsche Werte heraus und das Programm arbeitet nicht korrekt, weil das Timing nicht stimmt. Verwendet der Quellcode diese Konstante nicht, so hat ein falscher Wert dann natürlich auch keine Konsequenzen.
:
Bearbeitet durch User
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.