LCD an ATMEGA zum xten...

Gast #507372
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
Gast #507384
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
Gast #507385
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.
Gast #507399
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
Gast #507505
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren