mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Konstante und Makro (ASM)


Autor: Axel H. (mf-futzi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Normalerweise schreibt man Hex-Konstanten als 0x..
also in diesem Fall

.EQU   Zeile1=0x80

Grüße,

Peter

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Normalerweise schreibt man Hex-Konstanten als 0x..

In AVR-Asm gelten beide Schreibweisen. Ich benutze auch nur $... .

MfG Spess

Autor: Sascha Weber (sascha_w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei mir funkionierts AVR-Studio 4.13SP2 b571

Sascha

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Axel H. (mf-futzi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Mit dem Code-Brocken lässt sich nicht viel anfangen.

MfG Spess

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Axel H. (mf-futzi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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"

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Glaskugelmodus an:
das Macro steht über der Konstantendefinition.
Glaskugel aus:
Wenn du hier wirklich Hife erwartest, poste deinen Code!

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht ein Stacküberlauf?
Ich mein, weil es davon abhängt, ob man push vorher ausführt oder nicht.

Grüße,

Peter

Autor: Axel H. (mf-futzi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.