Hmm...ich hab das jetzt so gelöst:
Code:
;Programm
;CDurTonleiter rauf und runter spielen
.include "m8def.inc"
.def tmp = r16 ;Mein Universallregister
.def lpm_reg = r0 ;Mein lpm-Register
.def zaehler = r17 ;Mein Zählregister, prüft, ob das Wort zu Ende ist
.org 0x000
rjmp reset ;Interruptvektor "reset:"
reset:
;Stack einrichten
ldi tmp, HIGH(RAMEND) ;HIGH-Byte der obersten RAM-Adresse
out SPH, tmp
ldi tmp, LOW(RAMEND) ;Low-Byte der obersten RAM-Adresse
out SPL, tmp
ldi ZH, HIGH(daten1 * 2)
ldi ZL, LOW(daten1 * 2)
ldi zaehler, 0b00000000 ;Zähler auf 0 setzen
sei ;Interrupts zulassen
loop:
cpi zaehler, 0b00000110 ;Vergleich Zähler mit 6
breq loop ;wenn Zähler != 6, dann wieder zu "loop:" springen
einlesen:
lpm ;nächstes Byte des String nach r0 einlesen
mov tmp, lpm_reg ;Inhalt von R0 nach "tmp" kopieren
adiw ZL,1 ;Adresse des Z-Pointers um 1 erhöhen
inc zaehler ;Zähler um 1 erhöhen
rjmp loop ;wieder zurück zu "loop:"
daten1:
.db "Hallo!" ;immer eine gerade Anzahl an Bytes
Sorry, versteh die Befehle cp und cpc aber leider nicht (wegen untere Bytes und obere?) Aber mein Code geht auch.
Nachteil ist eben, dass von Anfang an klar sein muss, aus wieviel Zeichen dsa Wort besteht.
[edit]
Ich bin auch mal eben was essen.
Lesezeichen