Forum: Mikrocontroller und Digitale Elektronik String auslesen in ASM 20 byte


von Der G. (jonnyk)


Lesenswert?

Hallo Leute habe hier ein kleines Problemchen und komme einfach nicht 
weiter.

Ich habe in ASM (Mega128) einen String mit 20 bytes angelegt.
1
.dseg
2
Kartenname: .byte 20

ne..

dann habe ich jetzt eine funktion die die zeichen die ich wo anders rein 
schreibe ausliest
1
ldi R20,$0
2
3
DATEN_DISP:
4
 lds R25,Kartenname
5
 inc R20
6
 sts HW_display_adr,R25 ; Daten ins Display
7
 cpi R20,$14
8
 brne DATEN_DISP
9
 dealy  2 ; warten 1 ms

usw. Funktioniert auch super ich kriege 20 mal das 1-te zeichen 
angezeigt.
Aber ich weiß jetzt nicht wie ich den wert von Kartenname+1 ...+2 und so 
weite bekomme.


Kann mir wer helfen?

bedanke mich im Vorraus.

von Martin (Gast)


Lesenswert?

Ich kenne mich AVr zwar nicht aber einfach einen Pointer verwenden 
(indirekte Adressierung) und den Pointer bei jedem Zeichen erhöhen.

von Der G. (jonnyk)


Lesenswert?

Martin wrote:
> Ich kenne mich AVr zwar nicht aber einfach einen Pointer verwenden
> (indirekte Adressierung) und den Pointer bei jedem Zeichen erhöhen.

Das ist auch mein Problem hat jemand so´n beispiel also CODE oder so zur 
erklärung.

In asm kommt mir das etwas kompliziert vor.

oder sehe ich da was falsch?

von Matthias L. (Gast)


Lesenswert?

>Funktioniert auch super ich kriege 20 mal das 1-te zeichen
>angezeigt.

Logisch. Du springst ja immer an den Anfang deiner Routine zurück.


Das geht so gar nicht. Das LDS wird nicht gehen. Das kann nur statisch 
adressieren.

von Matthias L. (Gast)


Lesenswert?

Das könnte gehen:
(bin schon etwas aus asm raus..)
1
 ldi r20, 0                    ; Zeichenzähler
2
 ldi r31, HIGH(Kartenname)
3
 ldi r30, LOW (Kartenname)     ; Z-Pointer auf Stringanfang
4
DATEN_DISP:
5
 ld  r25, z+                   ; erstes Zeichen holen
6
 sts HW_display_adr,  r25      ; Daten ins Display
7
; inc r20                       ; Zeichen zählen
8
 cpi r25, 0                    ; Stringende?
9
; cpi r20, 20                   ; falls Abbruch nach 20Zeichen gewünscht
10
 brne DATEN_DISP               ; nein, dann zurück

Du musst natürlich dafür sorgen, dass im D-Seg hinter dem letzten 
Zeichen eine 0 steht.

von Der G. (jonnyk)


Lesenswert?

Matthias Lipinsky wrote:

> Das geht so gar nicht. Das LDS wird nicht gehen. Das kann nur statisch
> adressieren.

Was meinst du damit? wie geht das?

von Der G. (jonnyk)


Lesenswert?

Matthias Lipinsky wrote:
> Das könnte gehen:
> (bin schon etwas aus asm raus..)
>
>
1
>  ldi r20, 0                    ; Zeichenzähler
2
>  ldi r31, HIGH(Kartenname)
3
>  ldi r30, LOW (Kartenname)     ; Z-Pointer auf Stringanfang
4
> DATEN_DISP:
5
>  ld  r25, z+                   ; erstes Zeichen holen
6
>  sts HW_display_adr,  r25      ; Daten ins Display
7
> ; inc r20                       ; Zeichen zählen
8
>  cpi r25, 0                    ; Stringende?
9
> ; cpi r20, 20                   ; falls Abbruch nach 20Zeichen gewünscht
10
>  brne DATEN_DISP               ; nein, dann zurück
11
> 
12
>
>
> Du musst natürlich dafür sorgen, dass im D-Seg hinter dem letzten
> Zeichen eine 0 steht.

Und es Geht tatsächlich...

Ich bedanke mich hezlich...

so schnell und dann noch so einfach. hätte ich nie gedacht.

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.