Forum: Mikrocontroller und Digitale Elektronik LCD gibt keine String aus


von Alexander E. (foley)


Angehängte Dateien:

Lesenswert?

Hallo,

Hab seit 2 Tagen ein myavr board 2 usb mit lcd add on zugelegt.

Folgendes Problem hab ich jetzt.
Das LCD hab ich dank eures Tutorial zum laufen bekommen, aber bei dem 
Punkt wo das LCD einen konstanten Text ausgeben soll scheitert es.
Macht einfach garnichts.

Vielleicht sieht jemand was ich da falsch mache.

Vielen Dank im Vorraus.

Gruss Alex

von Der S. (derschelm)


Lesenswert?

Sorry, meine Glaskugel ist gerade im Wochenende, da muss ich wohl ein 
wenig raten:

Spannung eingeschaltet?

Programm geladen?

LCD mit Schraubenzieher gepeinigt?

Wenn die Antworten ja ja nein lauten, dann hilft uns nur noch ein 
bisschen Code oder bis Montag warten weil dann meine Glaskugel wieder 
zurück aus Wochenende.

von Der S. (derschelm)


Lesenswert?

Mist das wichtigste vor lauter Lästern vergessen schäm
Bei mir zeigt die RAR einen Fehler und ich sehe nichts.

von Alexander E. (foley)


Angehängte Dateien:

Lesenswert?

sry, ich versuchs ma so :)

von Alexander E. (foley)


Angehängte Dateien:

Lesenswert?

hoffe jetzt klappts

von Raoul D. (Gast)


Lesenswert?

das .rar archiv ist total in Ordnung gewesen...Der Schelm hatte wohl nur 
ein Problem damit

von Alexander E. (foley)


Lesenswert?

ausserdem bring mir das avr studio immer diese warnung:

LCD_Alex.asm(25): warning: .cseg .db misalignment - padding zero byte

Weiss zufällig jemand was die bedeutet?

Gruss Alex

von Falk B. (falk)


Lesenswert?

@ Alexander E. (foley)

>LCD_Alex.asm(25): warning: .cseg .db misalignment - padding zero byte

>Weiss zufällig jemand was die bedeutet?

Unkritisch. In einer Datendefinition im Flash mit .db ist eine ungerade 
Anzahl Bytes gespeichert. Das mag der Assembler nicht und fügt ein 
Füllbytes (padding byte) an.

MFG
Falk

von Alexander E. (foley)


Lesenswert?

ok. danke.

aber leider kann ich immer noch nicht richtig erkennen warum der Text 
nicht ausgegeben wird.

War schon froh das ich mithilfe dieverser Codesammlungen, das gerät 
schonmal zum laufen bekommen habe, aber hier hackt es dann aus.

gruss alex

von Markus B. (wolframator)


Lesenswert?

Hast Du es mal mit einem anderen Quellcode der in C geschrieben ist 
versucht? Gibt hier im Forum ja Beispiele :) Hab leider keines für 
Textdisplays, sonst würde ich es Dir anhängen...

von Spess53 (Gast)


Lesenswert?

Hi

Habe ich etwas übersehen, oder wo wird dein Port initialisiert?

MfG Spess

von Alexander E. (foley)


Lesenswert?

in der selflcdroutines.asm.

zuerst das lcd dann der port deklariert.

von Spess53 (Gast)


Lesenswert?

Hi

Ich meinte die Stelle wo der Port auf Ausgang gesetzt wird.
Also

  ldi tempx,xy
  out DDRD,tempx

MfG Spess

von Alexander E. (foley)


Lesenswert?

hm, jetzt wo es erwähnt wird.  ?

keine ahnung, hab das ganze mit der Ausgabe von einzelnen zeichen 
probiert, und da hats funktioniert. bin davon ausgegangen das ich das in 
dem fall nicht brauche.


Habs gerade mal eingefügt in die lcd-ini aber hat leider keine 
auswirkungen.

gruss alex

von Spess53 (Gast)


Lesenswert?

Hi

>keine ahnung, hab das ganze mit der Ausgabe von einzelnen zeichen
>probiert, und da hats funktioniert. bin davon ausgegangen das ich das in
>dem fall nicht brauche.

Dann bist du der erste, der ein LCD mit Eingängen angesteuert hat.
Was hast du denn jetzt in deine LCD-Ini geschrieben?
An deiner Stelle wurde ich erst mal wieder testen, ob die Ausgabe 
einzelner Zeichen mit deinen Routinen funktioniert. Dann müsste auch die 
Stringausgabe funktionieren.

MfG Spess

von Alexander E. (foley)


Lesenswert?

die einzelausgabe funktioniert.

.include "m8def.inc"



; als zweites Stack initaliesieren
       ldi r16, LOW(RAMEND)
           out SPL, r16
       ldi r16, HIGH(RAMEND)
           out SPH, r16

; dann portD als Ausgang setzen
       ldi r16, 0xFF
           out DDRD, r16

; dann display initalisieren via lcd_init
           rcall lcd_init

; dann Display löschen via lcd_clear

           rcall lcd_clear

; danach Zeichen ausgeben, erst in r16 laden und dann mit lcd_data 
ausgeben


           ldi r16, 'H'
           rcall lcd_data

           ldi r16, 'I'
           rcall lcd_data

           ldi r16, ' '
           rcall lcd_data

           ldi r16, 'A'
           rcall lcd_data

     ldi r16, 'L'
           rcall lcd_data

           ldi r16, 'E'
           rcall lcd_data

           ldi r16, 'X'
           rcall lcd_data
loop:
           rjmp loop

       .include "selflcdroutines.asm"

jetzt hab ich folgendes:
.include "m8def.inc"

.def temp1 = r16
.def temp2 = r17
.def temp3 = r18


           ldi temp1, LOW(RAMEND)      ; LOW-Byte der obersten 
RAM-Adresse
           out SPL, temp1
           ldi temp1, HIGH(RAMEND)     ; HIGH-Byte der obersten 
RAM-Adresse
           out SPH, temp1

           rcall lcd_init              ; Display initialisieren
           rcall lcd_clear             ; Display löschen

           ldi ZL, LOW(text*2)         ; Adresse des Strings in den
           ldi ZH, HIGH(text*2)        ; Z-Pointer laden

           rcall lcd_flash_string      ; Unterprogramm gibt String aus 
der
                                       ; durch den Z-Pointer adressiert 
wird
loop:
           rjmp loop

text:
           .db "Test", 0                ; Stringkonstante, durch eine 0
                                       ; abgeschlossen


       .include "selflcdroutines.asm"

und das in die routinen eingefügt:
 ; Einen konstanten Text aus dem Flash Speicher
 ; ausgeben. Der Text wird mit einer 0 beendet
lcd_flash_string:
           push  temp1

lcd_flash_string_1:
           lpm   temp1, Z+
           cpi   temp1, 0
           breq  lcd_flash_string_2
           rcall  lcd_data
           rjmp  lcd_flash_string_1

lcd_flash_string_2:
           pop   temp1
           ret

und das funktioniert nicht.

von Spess53 (Gast)


Lesenswert?

Hi

Bitte entscheide dich für die Benutzung von Registerbezeichnungen (rxy) 
oder für dieses tempX. Das Vermischen ist tödlich.

MfG Spess

von Fred S. (Gast)


Lesenswert?

Hi Alex,

formell ist das Lesen mit "lpm" in Deinem Programm in Ordnung und müsste 
mit "lcd_data" funktionieren, vorausgestzt, dieses verwendet nicht Z. 
Das würde ich zunächst überprüfen. Die Lockbits (LB) und Bootlockbits 
(BLB)sind alle unprogrammiert?

Gruß

Fred

von Michael U. (amiga)


Lesenswert?

Hallo,

wenn er die Routinen aus der obigen selflcdroutines.asm benutzt, wird Z 
nicht anderweitig genutzt, sollte also gehen.

Ansonsten schließe ich mich Spess53 an, saubere Definitionen der 
Register, es ist sonst eine Strafe, Fehler zu suchen und andere brauchen 
viel Zeit, daß auseinander zu sortieren...

Gruß aus Berlin
Michael

von Alexander E. (foley)


Lesenswert?

ok. ich werde es mal sauber schreiben.

vielleicht ergibt sich daraus ja schon der Fehler.

Danke erstmal.

Gruss Alex

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.