Forum: Mikrocontroller und Digitale Elektronik avr asm makro verständnisproblem


von Bruno M. (brumay)


Lesenswert?

Hallo,

ich habe mal wieder ein Verständnisproblem.
In einem Code habe ich folgenden verkürzten Ausschnitt:
1
.macro  IO        ; <name> <port> <pin>
2
.set  prt_@0    = PORT@1
3
.set  pin_@0    = PIN@1    ; Input use PIN
4
.set  ddr_@0    = DDR@1
5
.set  bit_@0    = P@1@2
6
.endmacro
7
8
IO  freq,D,5     ;hier liegt mein Problem!
9
10
.macro  IOInp          ; <name>
11
  cbi    ddr_@0,bit_@0
12
.endmacro  
13
14
IOInp  freq

von Stefan F. (Gast)


Lesenswert?

Wie lautet deine Frage?

von Bruno M. (brumay)


Lesenswert?

Stefan ⛄ F. schrieb:
> Wie lautet deine Frage?

IO  freq,D,5

Das macro IO definiert doch nur einige .set Befehle. Woher weiß man, daß 
es sich hier um <name> <port> <pin> handelt.

von Oliver S. (oliverso)


Lesenswert?

@0, @1, @2 sind die Parameter des Makro-Aufrufs, und werden dann im 
Makro durhc die entsprechend Zeichenfolgen ersetzt. Schreib dir das auf, 
dann siehst du, was passiert.

Ganz genrell ist das aber eine Frage, die du dir selber über RTFM 
erarbeiten musst. Anders geht das halt nicht.

Oliver

von Samuel C. (neoexacun)


Lesenswert?

Die @0, @1 und @2 innerhalb des Makros werden durch die entsprechenden 
Parameter des Makroaufrufs ersetzt.

von Bruno M. (brumay)


Lesenswert?

Dieses Prinzip ist mir wohl klar. Daher verstehe ich auch das folgende 
macro IOInp und den nachfolgenden Befehl, aber das trifft ja bei IO 
nicht zu.

von Thomas Z. (usbman)


Lesenswert?

Das macro definiert per set doch nur ein paar alias. Ansonsten wird kein 
Code generiert. Was genau erwartest du von dem Makro?

von Bruno M. (brumay)


Lesenswert?

Thomas Z. schrieb:
> Das macro definiert per set doch nur ein paar alias. Ansonsten wird kein
> Code generiert.

Das ist genau das aws ich meine. Wie kommt man dann zu:

IO  freq,D,5

von Oliver S. (oliverso)


Lesenswert?

Bruno M. schrieb:
> Das macro IO definiert doch nur einige .set Befehle. Woher weiß man, daß
> es sich hier um <name> <port> <pin> handelt.

Weil das da so steht? Derjenige, der dieses Makro geschrieben hat, hat 
das halt so geschrieben.

Oliver

von Samuel C. (neoexacun)


Lesenswert?

Hier weiß niemand, wo dein Problem liegt. Versuche mal, genau 
auszuformulieren, was du nicht verstehst.

von Bruno M. (brumay)


Lesenswert?

Meine Frage habe ich oben formuliert. Das macro IO definiert einige 
.set.
Im Befehl

IO  freq,D,5

wird aber einem Namen ein Port und ein Pin zugeordnet, das hat doch 
nichts mit dem macro IO zu tun.

von Moby (Gast)


Lesenswert?

Warum muß man seinen Code nur so unnötig mit Macros verkomplizieren?
Mach ein normales Unterprogramm samt aussagekräftiger Kommentierung 
draus und gut ist.

von Peter D. (peda)


Lesenswert?

Schreib mal
.LISTMAC
an den Anfang. Dann siehst Du was das Macro macht.

von Samuel C. (neoexacun)


Lesenswert?

WARUM sollte das nichts mit dem Makro zu tun haben? Du gibst dem Makro 3 
Parameter und das Makro nutzt 3 Parameter? Wo ist das Problem?

von Bruno M. (brumay)


Lesenswert?

Der Code ist nicht von mir, aber er funktioniert! Da ich aber Änderungen 
vornehmen muß, muß ich ihn verstehen.

von Samuel C. (neoexacun)


Lesenswert?

Aus
1
IO  freq,D,5

wird
1
.set  prt_freq    = PORTD
2
.set  pin_freq    = PIND    ; Input use PIN
3
.set  ddr_freq    = DDRD
4
.set  bit_freq    = PD5

Was gefällt dir daran nicht?

von Thomas Z. (usbman)


Lesenswert?

Nun ja wenn du nicht verstehst wie Makros funktionieren solltest du das 
nicht benutzen. Das ist der schnellste Weg sich ins Knie zu schießen.
Das erste Makro definiert in deinem gezeigten Fall u.a. einen Namen ddr_ 
freq mit DDRD.
Das zweite Makro benutzt die Alias Werte um Code zu erzeugen.

von Bruno M. (brumay)


Lesenswert?

Samuel C. schrieb:
> Was gefällt dir daran nicht?

danke, der Groschen ist gefallen!

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
Noch kein Account? Hier anmelden.