Forum: Mikrocontroller und Digitale Elektronik LCD an ATMEGA zum xten...


von Thilo (Gast)


Lesenswert?

LCD die 100ste...

Tag Ihr Leute.

Bevor ich mit meinem Problemchen beginne:
Ja, ich habe diese Forum durchsucht und
Ja, ich habe andere Foren durchsucht und
Ja, ich habe auch Google & Konsorten bemüht.

Nun folgendes:
Ich hab eine 2x16 DotMatrix-LCD mit  HDD44780-Controller (nicht 
kompatibel, sondern genau DER) an einen ATmega16 (auf dem Pollin-Board) 
angeschlossen und der weigert sich, das zu initialisieren bzw. 
Anzusprechen. Das Display ist i.O. (läuft an C51) und weist das übliche 
(14-)Pinout auf.
Da es, wie gesagt, an einem anderen Controller (89s8252) läuft, gehe ich 
davon aus, dass es ein Programmierfehler ist.

(Fest) verdrahtet ist es folgendermassen:
4 RS - C.4
5 RW - GND
6 EN - C.5
7 D0 - GND
.
.
10 D3 - GND
11 D4 - C.0
12 D5 - C.1
13 D6 - C.2
14 D7 - C.3

RW ist an GND, da mich das BSY nicht wirklich interessiert, ich habe 
zeit...
Ich wäre nun wahnsinnig dankbar, wenn sich jemand den Quelltext (anhang) 
mal ansehen könnte und mir dann sagt, was ich da falsch mache. Ich gehe 
nämlich mal davon aus, dass ich da als AVR & WinAVR - Neuling irgendwas 
vergessen habe.

Besten Dank auf jeden Fall,

Thilo

von Thilo (Gast)


Angehängte Dateien:

Lesenswert?

anhang hat wohl  nicht geklappt... hier der src.

von Michael U. (Gast)


Lesenswert?

Hallo,

sieht für mich auf die Schnelle recht glaubwürdig aus.

Aaaaber....
Mega16.... JTAG-Fuse aktiv?
Dann ist PortC.2 bis 5 mit dem JTAG belegt.

Nimm einen anderen Port als C oder/und lies Dich über die Fuses schlau 
und über eventuelle Probleme damit.

Gruß asu Berlin
Michael

von pluto (Gast)


Lesenswert?

Hi,
Du solltest nach jedem Enable eine Pause einlegen, wie lange die ist 
hängt von deinem Display ab.
Das Programm ist sehr umständlich geschrieben. Kann es sein das Du im 4 
Bit modus falschrum sendest, also Hi-nibble und Low-nibble vertauscht.
Hab mir das nicht so genau angeschaut aber Du solltest Dir ein paar 
Routinen bauen die ein Byte in die Nibbles zerlegt und dann entsprechend 
die Enablepulse geben. Das macht das ganze viel Transparenter

Ich hoffe ich konnte Dir ein paar Denkanstöße geben.

von Thilo (Gast)


Lesenswert?

Vielen Dank! Die JTAG-Fuse war's. Es gibt halt immer was, woran man 
nicht denkt...
Auch Danka an Pluto, werde mich mal an die SWAP-Routinen machen. In 
c51-ass wär das ganz einfach : ) Aber bietet GCC nicht auch ne fertige 
routine für den Fall. Oder hast Du zufällig ein Code-Snippet?

Thomas

von pluto (Gast)


Lesenswert?

Das sollte es sein..

data=((uint8_t)data)>>4|(data<<4);

von Thilo (Gast)


Lesenswert?

das nenn ich kryptisch : )
der schiebt mir also im prinzip die oberen vier bit auf die unteren 
vier?

von pluto (Gast)


Lesenswert?

Ist einfach ein swap...
Die Oberen 4Bit runter die Unteren 4Bit rauf.

von Michael U. (Gast)


Lesenswert?

Hallo,

ich sag es mal so: es wird eine Kopie von data als 8Bit-Wert erzeugt, 
diese wird 4x rechts verschoben.
Dann wird eine Kopie erzeugt, die 4x nach links verschoben wird.
Dann werden die beiden Kopien oder-Verknüft und nach data kopiert.

Wenn der Compiler gut ist, merkt er, was er da triben soll und benutzt 
den ASM-Befehl:
swap data
Wenn er nicht klug ist, macht er es wie beschrieben:

((uint8_t)data)>>4
mov temp1,data
lsr temp1
lsr temp1
lsr temp1
lsr temp1

(data<<4)
mov temp_2,data
lsl temp2
lsl temp2
lsl temp2
lsl temp2

|
or temp1,temp2

data=
mov data,temp1

Alle möglichen Varianten dazwischen hängen auch von der 
Optimierungsstufe ab. ;)

Gruß aus Berlin
Michael

von Schorsch (Gast)


Lesenswert?

> Wenn er nicht klug ist, macht er es wie beschrieben:

Wie macht es der GCC? Hat mal jemand geschaut?

von Thilo (Gast)


Lesenswert?

Ihr seid gaaanz grosses kino, Jungens. Danke

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.