Hallo Allerseits
Nach Langem habe ich nun endlich wieder einmal Zeit gefunden um mich
mit meinem AVR zu beschäftigen und somit auch wiedereinmal dieses tolle
Forum zu nutzen! :-)
Ich habe ein C-Projekt und nutze AVR-GCC. Da die Interruptroutine in C
zu lange dauerte. Schreibe ich sie nun in Assembler, in einem separaten
*.S-File. Das hat eignetlich alles gut geklappt, jedoch bin ich auf ein
kleines Problem gestossen:
Mit folgendem Code lade ich eine Variable (Pointer auf ein Array), was
natürlich auch funktioniert:
LDI r31, hi8(RDSEnc_pcBiphaseOutputSignalNext)
LDI r30, lo8(RDSEnc_pcBiphaseOutputSignalNext)
Dieser Pointer (also hier in Assembler das Z-Register) wird dann
genutzt um etwas auszulesen und wird inkrementiert. Der neue Wert
(alter Wert + 1) will ich dann natürlich wieder zurück in den Speicher
der C-Variable schreiben...
STS hi8(RDSEnc_pcBiphaseOutputSignal), r31
STS lo8(RDSEnc_pcBiphaseOutputSignal), r30
..., was zu meiner Verwunderung nicht funktioniert hatte, und mir diese
Fehlermeldung ausgespuckt hatte:
====================================================
../../RDSInt.S: Assembler messages:
../../RDSInt.S:56: Error: `,' required
../../RDSInt.S:56: Error: register name or number from 0 to 31
required
../../RDSInt.S:56: Error: garbage at end of line
====================================================
Als ich dann das Ganze nach langem herumsurfen auf diese Art probiert
habe...
STS RDSEnc_pcBiphaseOutputSignal+1, r31
STS RDSEnc_pcBiphaseOutputSignal, r30
..., hat's natürlich geklappt.
Jetzt zu meiner eigentlichen Frage: Wieso funktioniert Variante 1
nicht, und Variante 2 schon? Gibt's dafür eine Erklärung oder ist das
einfach "ist so weil ist so!"?
Danke für eure Hilfe
Fab