Ich bekomme folgende Fehlermeldung: Error : adiw can only use
registers R24, R26, R28 or R30
Soweit ich das verstehe, wird in den Z Registern die Anfangs-Adresse der
db gespeichert. Wie Funktioniert da genau die Zeigererhöhung? Wird dabei
die Adresse des nächsten zeichens ins Z Register geladen?
Wie kann ich den Befehl adiw "umgehen". Eine erhöhung im zl wird wohl
nicht reichen oder? Oder muss ich nur noch kontrollieren falls es im zl
einen Überlauf gibt, und diesen dann im zh "übertragen".
USART_TX_STRING:
lpm ; nächstes Byte aus dem Flash laden
and r0,r0 ; = Null?
breq string_ende ; wenn ja, -> Ende
warten:
lds temp, UCSR0A
sbrs temp, UDRE0 ; Warten bis Senden möglich
rjmp warten
sts UDR0, r0
ldi temp, 0x01
adiw zl:zh,1 ; Zeiger erhöhen
rjmp USART_TX_STRING ; nächstes Zeichen bearbeiten
string_ende:
ret ; zurück zum Hauptprogramm
ADIW funktioniert schon, aber mit ZH:ZL nicht ZL:ZH
ADIW ZH:ZL, 1
> Wie kann ich den Befehl adiw "umgehen".
LPM R0, Z+
> Eine erhöhung im zl wird wohl nicht reichen oder?
Das W ind ADIW steht für Word, also 2 Bytes. Machst du einen
ADIW ZL, 1
dann 'weiß' ADIW schon, dass es auch das ZH Register berücksichtigen
muss. Sonst wäre der Befehl ja ein bischen sinnlos.
Hi >ADIW funktioniert schon, aber mit ZH:ZL nicht ZL:ZH >ADIW ZH:ZL, 1 Oder auch adiw Z,1 >> Wie kann ich den Befehl adiw "umgehen". >LPM R0, Z+ Funktioniert nicht nur mit r0 > and r0,r0 ; = Null? Dafür gibt es auch 'tst rxy' MfG Spess
horst schrieb: > Soweit ich das verstehe, wird in den Z Registern die Anfangs-Adresse der > db gespeichert. Wie Funktioniert da genau die Zeigererhöhung? Wird dabei > die Adresse des nächsten zeichens ins Z Register geladen? Du musst ZH und ZL zuerst initialisieren, das heißt, die Startadresse selbst laden. Beispiel: ldi ZH,high(daten<<1) ldi ZL,low(daten<<1) Das "<<1" (Wertverdopplung) ist notwendig, weil Adressen im PM (Flash) immer als Wort-Adressen gespeichert werden. String:Beispiel: daten: .db 0x41 0x42 0x43 0x00 > Wie kann ich den Befehl adiw "umgehen". Eine erhöhung im zl wird wohl > nicht reichen oder? Oder muss ich nur noch kontrollieren falls es im zl > einen Überlauf gibt, und diesen dann im zh "übertragen". Warum willst du adiw umgehen? Verwende doch einfach eines der vorgesehenen Registerpaare (r25:r24, XH:XL, YH:YL oder ZH:ZL). Falls du das wirklich nicht willst, brauchst du zwei Befehle hintereinander: add und adc. Zuerst wird das Low-Byte normal addiert, dann das High-Byte einschließlich Übertrag, der bei der Erhöhung des Low-Bytes entstanden ist.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.