Forum: Mikrocontroller und Digitale Elektronik Atmega16 und LCD Tutorial


von Helmut (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?

Display an PORTC angeschlossen?
Dann JTAG deaktivieren.

von Helmut (Gast)


Lesenswert?

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.

von holger (Gast)


Lesenswert?

>Hier mal die Pin-Belegung:

Zeig deinen kompletten Code.

von michel (Gast)


Lesenswert?

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.

von Helmut (Gast)


Angehängte Dateien:

Lesenswert?

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.

von holger (Gast)


Lesenswert?

>Mit sehr hoher Wahrscheinlichkeit hast Du ein Timing Problem.

Ich denke eher das da was falsch angeschlossen ist.

von Carsten R. (kaffeetante)


Lesenswert?

Helmut schrieb:
> PINS in Zeile für Daten, RS
> und E geändert.

Und was hast du mit read/write gemacht? Und Kontrastspanung?

von Icke ®. (49636b65)


Lesenswert?

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.

von Helmut (Gast)


Lesenswert?

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?

von Carsten R. (kaffeetante)


Lesenswert?

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."

von Helmut (Gast)


Lesenswert?

okay dann werd ich mal den Lötkolben anschmeißen.

von Helmut (Gast)


Lesenswert?

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.

von Helmut (Gast)


Lesenswert?

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.

von Helmut (Gast)


Lesenswert?

Stelle ich den Takt mit F_CPU ein?

von Helmut (Gast)


Lesenswert?

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 :(

von Dietrich L. (dietrichl)


Lesenswert?

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

von Helmut (Gast)


Lesenswert?

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 :(

von Helmut (Gast)


Lesenswert?

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 ?

von Dietrich L. (dietrichl)


Lesenswert?

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

von Carsten R. (kaffeetante)


Lesenswert?

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
von Helmut (Gast)


Lesenswert?

Danke für eure Hilfe.

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.