Hallo, in Asm habe ich eine Kontante festgelegt mit .equ Zeile1 = $80 Wenn ich diese Konstante in einem Macro aufrufe, z.B. ldi temp1, Zeile1 steht dann in temp1 ein anderer Wert als $80. (Zufälliger Wert?) Wenn ich die Konstante in einem Unterprogramm aufrufe, ist der Wert korrekt. Mache ich da mit dem Makro etwas falsch? Vielen Dank im Voraus
Normalerweise schreibt man Hex-Konstanten als 0x.. also in diesem Fall .EQU Zeile1=0x80 Grüße, Peter
Hi >Normalerweise schreibt man Hex-Konstanten als 0x.. In AVR-Asm gelten beide Schreibweisen. Ich benutze auch nur $... . MfG Spess
Hi >Wenn ich diese Konstante in einem Macro aufrufe, z.B. > ldi temp1, Zeile1 >steht dann in temp1 ein anderer Wert als $80. (Zufälliger Wert?) Schnell mal getestet: Funktioniert bei mir problemlos. MfG Spess
Hallo, habe mittlerweile eine neue Version des AVR-Studios installiert, mit dem selben Ergebnis. :( In meinem Makro steht derzeit nur .macro locate push temp1 ldi temp1, Zeile1 rcall lcd_number ;Wert von Zeile1 im LCD anzeigen pop temp1 .endmacro Angezeigt wird im LCD der Wert 73. Wenn ich nun push und pop aus dem Makro entferne, zeigt das LCD den Wert 72 (?) Was kann das für ein Wert sein?
Axel Hüser schrieb: > .macro locate > push temp1 > ldi temp1, Zeile1 > rcall lcd_number ;Wert von Zeile1 im LCD anzeigen > pop temp1 > .endmacro lcd_number zeigen, am besten auch den gesamten Testquellcode. Debugger schon befragt?
Axel Hüser schrieb: > push temp1 > ldi temp1, Zeile1 > rcall lcd_number ;Wert von Zeile1 im LCD anzeigen > pop temp1 [...] > Angezeigt wird im LCD der Wert 73. > > Wenn ich nun push und pop aus dem Makro entferne, zeigt das LCD den Wert > 72 (?) Daraus kannst Du getrost schließen, dass das Unterprogramm lcd_number nicht das tut, was Du erwartest. Würde es tatsächlich den Inhalt von Register temp1 anzeigen, könnte sich die Anzeige nicht ändern, weil Du irgendwas anderes vorher und nachher machst. Also den gesamten Code, bitte.
Hallo, vielen Dank für Eure Mühe. Ich bin auch nicht beratungsresistent und werde mein lcd_number nochmals prüfen. Aber mit dem arbeite ich schon längere Zeit und es war immer einwandfrei. Nochmal: Im Hauptprogramm steht nur: ldi temp1, Zeile1 rcall lcd_number ...und da werden die 128 ($80) im LCD richtig angezeigt. Also sollte lcd_number doch auch korrekt sein. Und wenn ich im Hauptprogramm nur den Macro aufrufe mit locate ...dann zeigt das LCD den Wert 72 an (Im Makro stehen dann auch nur diese 2 Zeilen drin, wie vorher im Hauptprogramm). An welcher Stelle im Programm sollte eigentlich der Verweis auf die Macrodatei stehen? .include "macros.inc" steht bei mir ganz oben im Programm direkt unter .include "m8def.inc"
Glaskugelmodus an: das Macro steht über der Konstantendefinition. Glaskugel aus: Wenn du hier wirklich Hife erwartest, poste deinen Code!
Hi >Glaskugelmodus an: >das Macro steht über der Konstantendefinition. >Glaskugel aus: >Wenn du hier wirklich Hife erwartest, poste deinen Code! Glaskugelmodus nochmal aus: Funktioniert auch in diesem Fall. MfG Spess
Vielleicht ein Stacküberlauf? Ich mein, weil es davon abhängt, ob man push vorher ausführt oder nicht. Grüße, Peter
Hallo Peter, das war der entscheidende Hinweis von Dir. In meinem Macro stand noch eine Sprungmarke Zeile1: Darunter standen zwar keine Befehle, ist aber der gleiche Name, wie die Konstante. Ein dummer Fehler von mir!!! Ich werde jetzt alle meine Sprungmarken mit "_" (_Zeile1:) beginnen, damit mir das nicht wieder passiert. Danke an alle!
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.