Forum: Mikrocontroller und Digitale Elektronik Probleme mit LCD - Tutorial


von Stefan T. (_distance_07)


Lesenswert?

Guten Morgen,

ich arbeite grade das AVR Tutorial "LCD" ab und bin soeben auf ein 
Problem gestoßen.

Und zwar beim Thema "Ausgabe eines konstanten Textes"... wenn ich das 
Beispielprogramm in den Controller lade, zeigt er nur dne schwarzen 
Balken an, jedoch keinen Text.

Der Assembler weißt auf 3 Dinge hin:

D:\Dokumente und Einstellungen\Stefan Schule\Eigene 
Dateien\LCD2\LCD2.asm(1): Including file 'F:\Programme\Atmel\AVR 
Tools\AvrAssembler2\Appnotes\m8def.inc'
D:\Dokumente und Einstellungen\Stefan Schule\Eigene 
Dateien\LCD2\LCD2.asm(28): Including file 'D:\Dokumente und 
Einstellungen\Stefan Schule\Eigene Dateien\LCD2\Routine1.asm'
D:\Dokumente und Einstellungen\Stefan Schule\Eigene 
Dateien\LCD2\Routine1.asm(12): warning: .def: 'temp2' redefinition 
(r17->r22)                                                <--------- !!!
D:\Dokumente und Einstellungen\Stefan Schule\Eigene 
Dateien\LCD2\LCD2.asm(28): info: 'D:\Dokumente und Einstellungen\Stefan 
Schule\Eigene Dateien\LCD2\Routine1.asm' included from here
D:\Dokumente und Einstellungen\Stefan Schule\Eigene 
Dateien\LCD2\LCD2.asm(4): info: previous definition of 'temp2'
D:\Dokumente und Einstellungen\Stefan Schule\Eigene 
Dateien\LCD2\Routine1.asm(13): warning: .def: 'temp3' redefinition 
(r18->r23)                                               <--------- !!!
D:\Dokumente und Einstellungen\Stefan Schule\Eigene 
Dateien\LCD2\LCD2.asm(28): info: 'D:\Dokumente und Einstellungen\Stefan 
Schule\Eigene Dateien\LCD2\Routine1.asm' included from here
D:\Dokumente und Einstellungen\Stefan Schule\Eigene 
Dateien\LCD2\LCD2.asm(5): info: previous definition of 'temp3'
D:\Dokumente und Einstellungen\Stefan Schule\Eigene 
Dateien\LCD2\LCD2.asm(25): warning: .cseg .db misalignment - padding 
zero byte                                                 <--------- !!!
D:\Dokumente und Einstellungen\Stefan Schule\Eigene 
Dateien\LCD2\LCD2.asm(29): No EEPROM data, deleting D:\Dokumente und 
Einstellungen\Stefan Schule\Eigene Dateien\LCD2\LCD2.eep


Wird es daran liegen ?

Wenn ja, wie ändere ich die Registerbezeichnung, so dass alles 
funktioniert ?


MfG

Stefan

von Johannes M. (johnny-m)


Lesenswert?

Die letzte Warnmeldung besagt lediglich, dass eine ungerade Anzahl von 
Bytes mit .db in ein Codesegment gelegt wurden und so automatisch ein 
Padding-Byte eingfügt wird, um auf eine gerade Anzahl zu kommen (Flash 
ist wortorientiert -> immer zwei Bytes pro Flash-Adresse). Die Meldung 
besagt also, dass Du ein Byte Programmspeicher "verschwendest".

Die beiden anderen Meldungen erzählen Dir, dass in der lcd_routines.asm 
die Bezeichnungen "temp2" und "temp3" ebenfalls definiert sind, und zwar 
mit anderen Registern. Da die Register so wie ich das sehe in den 
Funktionen in der lcd_routines.asm korrekt gepusht und gepopt werden, 
sollte es helfen, die .defs im Hauptprogramm entsprechend zu ändern, 
also aus
1
.def temp2 = r17
2
.def temp3 = r18
einfach
1
.def temp2 = r22
2
.def temp3 = r23
machen.

von Stefan T. (_distance_07)


Lesenswert?

Danke für den Beitrag, jedoch hab ichs versucht und es kommen zwei 
weitere Fehlermeldungen.

D:\Dokumente und Einstellungen\Stefan Schule\Eigene 
Dateien\LCD2\LCD2.asm(1): Including file 'F:\Programme\Atmel\AVR 
Tools\AvrAssembler2\Appnotes\m8515def.inc'
D:\Dokumente und Einstellungen\Stefan Schule\Eigene 
Dateien\LCD2\LCD2.asm(28): Including file 'D:\Dokumente und 
Einstellungen\Stefan Schule\Eigene Dateien\LCD2\lcd-routines.asm'
D:\Dokumente und Einstellungen\Stefan Schule\Eigene 
Dateien\LCD2\lcd-routines.asm(12): warning: .def: 'temp2' redefinition 
(r22->r22)                                                 <--------- 
!!!
D:\Dokumente und Einstellungen\Stefan Schule\Eigene 
Dateien\LCD2\LCD2.asm(28): info: 'D:\Dokumente und Einstellungen\Stefan 
Schule\Eigene Dateien\LCD2\lcd-routines.asm' included from here
D:\Dokumente und Einstellungen\Stefan Schule\Eigene 
Dateien\LCD2\LCD2.asm(4): info: previous definition of 'temp2'
D:\Dokumente und Einstellungen\Stefan Schule\Eigene 
Dateien\LCD2\lcd-routines.asm(12): warning: Register r22 already defined 
by the .DEF directive                                        <--------- 
!!!
D:\Dokumente und Einstellungen\Stefan Schule\Eigene 
Dateien\LCD2\LCD2.asm(28): info: 'D:\Dokumente und Einstellungen\Stefan 
Schule\Eigene Dateien\LCD2\lcd-routines.asm' included from here
D:\Dokumente und Einstellungen\Stefan Schule\Eigene 
Dateien\LCD2\lcd-routines.asm(13): warning: .def: 'temp3' redefinition 
(r23->r23)                                                 <--------- 
!!!
D:\Dokumente und Einstellungen\Stefan Schule\Eigene 
Dateien\LCD2\LCD2.asm(28): info: 'D:\Dokumente und Einstellungen\Stefan 
Schule\Eigene Dateien\LCD2\lcd-routines.asm' included from here
D:\Dokumente und Einstellungen\Stefan Schule\Eigene 
Dateien\LCD2\LCD2.asm(5): info: previous definition of 'temp3'
D:\Dokumente und Einstellungen\Stefan Schule\Eigene 
Dateien\LCD2\lcd-routines.asm(13): warning: Register r23 already defined 
by the .DEF directive 
<--------- !!!
D:\Dokumente und Einstellungen\Stefan Schule\Eigene 
Dateien\LCD2\LCD2.asm(28): info: 'D:\Dokumente und Einstellungen\Stefan 
Schule\Eigene Dateien\LCD2\lcd-routines.asm' included from here
D:\Dokumente und Einstellungen\Stefan Schule\Eigene 
Dateien\LCD2\LCD2.asm(25): warning: .cseg .db misalignment - padding 
zero byte                                                 <--------- !!!
D:\Dokumente und Einstellungen\Stefan Schule\Eigene 
Dateien\LCD2\LCD2.asm(29): No EEPROM data, deleting D:\Dokumente und 
Einstellungen\Stefan Schule\Eigene Dateien\LCD2\LCD2.eep

von Johannes M. (johnny-m)


Lesenswert?

Dann schmeiß die .defs von "temp2" und "temp3" doch einfach ganz aus dem 
Code raus!

von Stefan T. (_distance_07)


Lesenswert?

Hi,

hab die Definitionen der Register r22 und r23 im Hauptprogramm entfernt.

Nun zeigt er mir nur noch das padding zero Byte an...

Aber trozdem wird der Text "Test" leider nicht angezeigt.

Hab shcon mehrmals nen neues Projekt angelegt.


Hat noch wer ne Idee ?


MfG

Stefan

von Karl H. (kbuchegg)


Lesenswert?

Stefan T. wrote:

> Hat noch wer ne Idee ?

Ja.
Wenn dein Display ausser dem schwarzen Balken nichts weiter anzeigt,
dann liegt dein Problem nicht an Registerdefinitionen sondern
schlicht une ergreifend daran, dass dein Display nicht korrekt
initialisiert wird.

Durchsuch das Forum. Genau dieses Problem tritt mittlerweile
jeden Tag mindestens 5 mal auf.

von Stefan T. (_distance_07)


Lesenswert?

... mach ich, aber wenn das display nciht richtig initialisiert wird, 
müsste es doch auch bei der Übertragun der eunzelnen Zeichen, nichts 
anzeigen... Oder liege ich da falsch ?


MfG

Stefan

von Karl H. (kbuchegg)


Lesenswert?

Stefan T. wrote:
> ... mach ich, aber wenn das display nciht richtig initialisiert wird,
> müsste es doch auch bei der Übertragun der eunzelnen Zeichen, nichts
> anzeigen... Oder liege ich da falsch ?
>

Wenn das Display richtig initialisiert ist, dann verschwinden
erst mal die schwarzen Balken. Daran erkennt man, dass die
Initialisierungssequenz korrekt abgearbeitet wurde und
dass die Hardware korrekt verdrahtet ist, bzw. das Programm
auch die richtigen Pins bedient.

von Stefan T. (_distance_07)


Lesenswert?

Hab herumgesucht, doch nichts gefunden !

Daraufhin habe ich mir einmal die Codes ausgedruckt und nachgesehen...

Kann es sein, dass der Fehler hier liegt `?

 ; Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
lcd_init:                     <------------------------------------\
           push  temp1                                              \
           in    temp1, LCD_DDR                                      \
           ori   temp1, (1<<PIN_E) | (1<<PIN_RW) | (1<<PIN_RS) | 0x0F >
           out   LCD_DDR, temp1                                      /
                                                                    /
           ldi   temp3,6      <------------------------------------/
powerupwait:
           rcall delay5ms



MfG

Stefan

von Karl H. (kbuchegg)


Lesenswert?

Was, bitte schön, soll das für einen Unterschied machen?

von Stefan T. (_distance_07)


Lesenswert?

Hallo K. H. Buchegger,

ich habe leider deine Frage nicht verstanden.

MfG

Stefan

von Niels H. (monarch35)


Lesenswert?

Stefan T. wrote:

> ich habe leider deine Frage nicht verstanden.

Ich glaube, du verstehst gerade so vieles nicht. Durch Zeilen tauschen 
und code-raten wirst du jedenfalls nicht weiterkommen.

Vieleicht hälst du dich erstmal an dem, was dir gesagt wird: Wird das 
Display richtig initialisiert, verschwinden die Balken.

Zeigt dein Display schwarze Balken?

von Stefan T. (_distance_07)


Lesenswert?

Ja, das hatte ich doch bereits erwähnt. Er zeigt lediglich den Schwarzen 
Balken an, was darauf hinweist, dass das Display nicht oder nicht 
richtig initialisiert wurde....

Deshalb dachte ich ja, dass in den oben geposteten Zeilen vielelicht der 
Fehler der Initialisierung vorliegt.
Denn die darauffolgenden Zeilen habe ich mit Hilfe der Erklärungen aus 
dem Tutorial bereits einmal überprüft und konnte nichts feststellen.


MfG

Stefan

von Karl H. (kbuchegg)


Lesenswert?

Stefan T. wrote:
> Hallo K. H. Buchegger,
>
> ich habe leider deine Frage nicht verstanden.

Ev. hab ich dich missverstanden. Für mich sieht es so aus,
als ob du den
    ldi temp3, 6
vorziehen willst.

Aber ich seh gerade, dass deine Grafik wahrscheinlich so was
wie eine Klammer sein soll.

           in    temp1, LCD_DDR                                      \
           ori   temp1, (1<<PIN_E) | (1<<PIN_RW) | (1<<PIN_RS) | 0x0F >
           out   LCD_DDR, temp1                                      /


Wenn du LCD_DDR richtig eingetragen hast; PIN_E, PIN_RS auch
dem entsprechen was du verdrahtet hast, dann gibt es keinen
Grund warum das fehlerhaft sein soll.

Achtung: PIN_E, PIN_RW, PIN_RS können nur im Bereich 4 bis 7
sein, da dir Port Bits 0 bis 3 bereits für die Datenleitungen
benutzt werden und auch nicht geändert werden können ohne den
Code massiv umzubauen.

Checkliste:
***********
Mit welcher Taktfrequenz arbeitet der Prozessor?
Tut er das auch wirklich, oder vermutest du das nur?
a) Ist die Taktfrequenz richtig eingetragen (falls der Assembler
      aus der Taktfrequenz die Verzögerungsschleifen berechnet)
b) Wurden die Delay-Konstante entsprechend der Taktfrequenz
      angepasst (falls der Assembler das nicht von alleine machen soll)
Wie und wo ist das LCD angeschlossen?
Hast du auch die richtigen Eintragungen für die Anschlusspins
  im Code vorgenommen?

von Stefan T. (_distance_07)


Lesenswert?

Ja, haha..

es sollte eine Klammer sein, welche den Bereich des Codes markiert, 
inwelchem ich den Fehler vermutete.
Dann verstehe ich auch deine Frage !


Nun denn werde ich nochmal ganz genau die Verdrahtung überprüfen udn 
hoffen, dass ich dort etwas finde.


Mit freundlchen Grüßen und großes Dank an alle Beitragleistenden

Stefan


Re Checkliste:

... Ich arbeite mit dem AMEGA8515 mit 4 MHZ

... Pins waren wie zuvor verbunden(Ausgabe eines Textes anhand einzelner 
Zeichen)

... Taktfrequenz wurd nicht den Delays angepasst, werd mal nachsehen, ob 
sie angepasst werden muss.

LCD ist an PortD angeschlossen, so wie an Anfang des LCD-Tutorials 
beschrieben...

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.