Forum: Mikrocontroller und Digitale Elektronik Lcd-ansteuerzng mit Mega32 in Assembler


von Pascal H. (pase-h)


Lesenswert?

Hi,
Ich komme einfach nicht weiter mit der Lcd-ansteuerung.
Ich habe nur das LCD(4bit Modus, 2*16Zeichen)angeschlossen.
Der controller ist ein S6A0069 (HD44780 kompatibel).
In Bascom funktionierte die integrierte HD44780 ansteuerung.
LCD:
D7==Portd.7
D6==Portd.6
D5==Portd.5
D4==Portd.4
EN==Portd.3
RS==Portd.2

Das LCD kann nur schlecht umgesteckt werden, da ich das Easyavr5a board 
benutze, und dort kann ich das LCD Pinout nicht ändern
Ich schaffe es einfach nicht lcd-routines.asm aus dem AVR Tutorial so 
umzuschreiben, sodass mein Programm läuft.
Kann mir jemand helfen, das Programm so umzuschreiben, dass es dann 
läuft (Steige von Basic auf Assembler um)?
Habe bis jetzt das ganze tutorial (alles vor der LCD Ansteuerung) 
durchgemacht, doch in der LCD-routines.asm blick ich nicht mehr durch.
Hoffe ihr könnt mir schnell helfen, da ich mich schon die ganzen Ferien 
mit disen Thema beschäftige.

Mfg Pase-h

PS: Benutze das AVRStudio 4.18.

von Oliver J. (skriptkiddy)


Lesenswert?

Folgende Anpassungen müssen durchgeführt werden:

1
lcd_data: 
2
- die LCD-Daten liegen bei dir auf dem oberen Nibble von PORTD und nicht    
3
  auf dem unteren
4
- RS liegt auch an einem anderen PIN
5
6
lcd_command:
7
- die LCD-Daten liegen bei dir auf dem oberen Nibble von PORTD und nicht    
8
  auf dem unteren
9
10
lcd_enable:
11
- Pin ändern 
12
13
lcd_init:
14
- die ohne lcd_command/lcd_data gesendeten Daten auf deine Belegung anpassen


avr-tutorial schrieb:
>Wer eine höhere Taktfrequenz als 4 MHz verwendet, der sollte daran denken,
>die Dauer der Verzögerungsschleifen anzupassen.


Wenn du irgendwo hängen bleibst, kannst du dich gerne hier wieder 
melden.


skriptkiddy

von Pascal H. (pase-h)


Angehängte Dateien:

Lesenswert?

Skript Kiddy schrieb:
> lcd_data:
> - die LCD-Daten liegen bei dir auf dem oberen Nibble von PORTD und nicht
>   auf dem unteren
> - RS liegt auch an einem anderen PIN
> lcd_command:
> - die LCD-Daten liegen bei dir auf dem oberen Nibble von PORTD und nicht
>   auf dem unteren
> lcd_enable:
> - Pin ändern
> lcd_init:
> - die ohne lcd_command/lcd_data gesendeten Daten auf deine Belegung anpassen

Hi,
Habe alles geändert, doch auf 1, 2 oder 4Mhz wird am Display nichts 
angezeigt.
Bei 8Mhz, wird dann nur Müll auf dem Display angezeigt, und das auch 
erst immer nach dem 4. oder 5. Reset.
Im anhang ist die geänderte lcd-routines.asm.

Eigentlich müsste es jetzt alles stimmen, Ich kann zumindest keine 
Fehler mehr Feststellen

von Floh (Gast)


Lesenswert?

andi temp1, 0b11110000       ; oberes Nibble auf Null setzen

das widerspricht sich mit dem Kommentar, hier wird das untere Nibble auf 
Null gesetzt.

Gibt noch einige andere Stellen wie diese.
-> ändern.

von spess53 (Gast)


Lesenswert?

Hi

>;; DB4-DB7:       PD0-PD3                      ;;

>andi temp1, 0b11110000       ; oberes Nibble auf Null setzen

Du setzt aber das untere (D3..D0) Nibble auf Null.

MfG Spess

von Pascal H. (pase-h)


Lesenswert?

spess53 schrieb:
> Hi
>
>>;; DB4-DB7:       PD0-PD3                      ;;
>
>>andi temp1, 0b11110000       ; oberes Nibble auf Null setzen
>
> Du setzt aber das untere (D3..D0) Nibble auf Null.
>
> MfG Spess
Jetz blicke ich irgendwie garnichtmehr durch, Da mir das Lcd ja ab und 
zu mal etwas anzeigt(ungefähr jedes 4.-5. mal, und dann auch nur Müll).
Es zeigt folgendes an:
ein umgedrechtes J, TM übereinander, ', ein umgedrechtes J, Leerstelle, 
G, t, V, E
>>;; DB4-DB7:       PD0-PD3                      ;;
Ich betreibe es ja auch an PD4-PD7 und Nicht an PD0-PD3:
D7==Portd.7
D6==Portd.6
D5==Portd.5
D4==Portd.4
EN==Portd.3
RS==Portd.2
Was müsste ich nun ändern, damit ich einen Output am LCD bekomme?
Laut tutorial sollte im Lcd Test stehen.

Mfg Pase

von Hc Z. (mizch)


Lesenswert?

> andi temp1, 0b11110000       ; oberes Nibble auf Null setzen

Da ist

1) der Kommentar falsch.  Das ist sehr verwirrend.

2) die Reihenfolge falsch.  Da Du die Datenleitungen im oberen Nibble 
hast, musst Du erst ausgeben (ohne swap - denn es muss das obere Nibble 
ausgegeben werden, und das passt bereits) und dann swappen, damit das 
untere Nibble im oberen landet.  Oder erst temp2 ausgeben, dann temp1 
(was aufs Selbe rauskommt).

von Floh (Gast)


Lesenswert?

erstmal änderst du die Kommentare in deinem Programm. Dann weißt du 
auch, was der Befehl tun muss, und kannst das dementsprechend ändern.

Das fängt schon ganz oben an, wenn du PD4 -PD7 als Daten benutzt, auch 
reinschreiben! Dafür sind Kommentare da.

Noch ne Frage nebenbei: Schon viel in Assembler gemacht? :-)

von Pascal H. (pase-h)


Lesenswert?

Hier nochmal die Datei mit Neuen Kommentaren.
Habe jetzt nochmal die lcd.asm angehängt, da dort vielleicht auch ein 
Fehler sein könnte (denke nicht, da ich dort noch nichts geändert habe).

von Pascal H. (pase-h)


Angehängte Dateien:

Lesenswert?

Hier die Dateien:

Floh schrieb:
> Noch ne Frage nebenbei: Schon viel in Assembler gemacht? :-)

Nö, Lerne seit ca. 2 Wochen von Basic auf Assembler um.
Und jetzt wird erstmal Gefrühstuckt!

Mfg Pase

von Karl H. (kbuchegg)


Lesenswert?

Pascal Haury schrieb:

> Jetz blicke ich irgendwie garnichtmehr durch, Da mir das Lcd ja ab und
> zu mal etwas anzeigt(ungefähr jedes 4.-5. mal, und dann auch nur Müll).
> Es zeigt folgendes an:
> ein umgedrechtes J, TM übereinander, ', ein umgedrechtes J, Leerstelle,
> G, t, V, E
>>>;; DB4-DB7:       PD0-PD3                      ;;
> Ich betreibe es ja auch an PD4-PD7 und Nicht an PD0-PD3:
> D7==Portd.7
> D6==Portd.6
> D5==Portd.5
> D4==Portd.4
> EN==Portd.3
> RS==Portd.2
> Was müsste ich nun ändern, damit ich einen Output am LCD bekomme?
> Laut tutorial sollte im Lcd Test stehen.

Dein Problem ist, dass du nicht analysiert hast, was denn die Funktion 
im Tutorial macht und wie sie es genau macht.

Die Funktion bekommt einen 8 Bit Wert

     7   6   5   4   3   2   1   0
   +---+---+---+---+---+---+---+---+
   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+

die sie in 2 Etappen an den Port rausgeben muss, an dem die 
Datenleitungen an den Bits 0 bis 3 hängen.

     7   6   5   4   3   2   1   0
   +---+---+---+---+---+---+---+---+
   |   |   |   |   |   |   |   |   |   Portbelegung
   +---+---+---+---+---+---+---+---+
                     |   |   |   |
                     |   |   |   |
                     v   v   v   v
                  Datenleitungen zum LCD

Die Ausgabe muss in der Reihenfolge:
zuerst die 4 höchstwertigen Bits 4 bis 7, dann die 4 niederwertigen 0 
bis 3
erfolgen


Da im Tutorial die Datenbits am Port an D0 bis D3 liegen, muss also für 
die 4 höchstwertigen Bits im Prinzip diese Verschiebung durchgeführt 
werden


     7   6   5   4   3   2   1   0
   +---+---+---+---+---+---+---+---+
   | o | o | o | o |   |   |   |   |               Datenbyte
   +--\+--\+--\+--\+---+---+---+---+
       \   \   \   \
        \   \   \   \
         \   \   \   \
          \   \   \   \
           \   \   \   \
            \   \   \   \
             \   \   \   \
              \   \   \   \
               \   \   \   \
                \   \   \   \
                 \   \   \   \
     7   6   5   4\  3\  2\  1\  0
   +---+---+---+---\---\---\---\---+
   |   |   |   |   | o | o | o | o |               Byte das an den Port
   +---+---+---+---+---+---+---+---+               geschrieben wird
                     |   |   |   |
                     |   |   |   |
                     v   v   v   v
                  Datenleitungen zum LCD


denn jetzt liegen die 4 höherwertigen Bits an den Positionen D0 bis D3 
und können so an den Port gegeben werden. Gemacht wird das Ganze, indem 
das Byte ganz einfach geswappt wird. Der µC tauscht die 4 höherwertigen 
Bits mit den 4 niederwertigen Bits. Damit liegen dann auch die bewussten 
4 Bits an der richtigen Stelle und da die anderen gezielt auf 0 gesetzt 
werden, interessiert uns nicht weiter, was durch den Swap jetzt in die 
oberen 4 Bits gebracht wurde.

Aber den Fall hast du ja nicht!
Deine Datenleitungen liegen nicht auf D0 bis D3 sondern auf D4 bis D7.

    7   6   5   4   3   2   1   0
   +---+---+---+---+---+---+---+---+
   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+
     |   |   |   |
     |   |   |   |
     v   v   v   v
  Datenleitungen zum LCD


D.h. die 4 höherwertigen Bits sind schon an der richtigen Position! 
Daher ist auch der Swap an dieser Stelle für die 4 höchstwertigen Bits 
nicht notwendig. Ganz im Gegenteil - du würdest dir die 4 richtigen Bits 
unter dem Hintern wegziehen.

Bei den 4 unteren Bits ist es dann genau umgekehrt: Im Code im Tutorial 
sitzen die schon an der richtigen Stelle 0 bis 3. Man braucht nur die 4 
oberen Bits wegmaskieren und kann das Byte dann so wie es ist ausgeben.

Bei dir ist es dann anders rum. Deine 4 niederwertigen Bits müssen 
erstmal nach D4 bis D7 gebracht werden, ehe dann maskiert und ausgegeben 
werden kann. An dieser Stelle kannst du dann den swap sinnvoll 
einsetzen.


Wie gesagt: Du musst Code analysieren um ihn ändern und anpassen zu 
können! Du musst verstehen, warum in einer Funktion bestimmte 
Operationen gemacht werden und warum sie genau an dieser Stelle stehen 
und nicht woanders. Du musst nachvollziehen, welche Bits wohin gehören 
und wie dies durch die Operationen gemacht wird.

Das mit dem Code analysieren gilt grundsätzlich in allen 
Programmiersprachen, aber nirgends so sehr wie in Assembler! Zu denken 
"Ach, da pass ich einfach ein paar Zahlenwerte an und dann passt das 
schon" - das ist ein Trugschluss!

Willkommen in Assembler, wo die Tante-BASCOM nicht mehr mit dir aufs Klo 
Lulu machen geht.

von Oliver J. (skriptkiddy)


Lesenswert?

> @Pascal Haury
Und hast du Zeichen auf das LCD gezaubert?

von Pascal H. (pase-h)


Lesenswert?

Nö, bis jetzt noch nicht.
Kann aber noch dauern, da ich zurzeit noch in der Planung Stecke, wo ich 
nächste Woche Verreise.

Mfg Pase-h

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.