www.mikrocontroller.net

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


Autor: Pascal H. (pase-h)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Folgende Anpassungen müssen durchgeführt werden:

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


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

Autor: Pascal H. (pase-h)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Pascal H. (pase-h)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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? :-)

Autor: Pascal H. (pase-h)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Pascal H. (pase-h)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> @Pascal Haury
Und hast du Zeichen auf das LCD gezaubert?

Autor: Pascal H. (pase-h)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.