Forum: Mikrocontroller und Digitale Elektronik Studio4 Assembler Macro Fragen


von Chris O. (lupin_iii)


Lesenswert?

Ich schreibe gerade ein Programm, das mir einige LEDs mit verschiedenen 
Mustern blinken lässt. Der Übersicht wegen wird jeder dieser Effekte in 
eine eigene Datei ausgelagert, wobei jede von diesen Labels der Art 
Effect_NAME_init, Effect_NAME_step, Effect_NAME_ADC_complete usw. hat.

Im Hauptprogramm habe ich dann Zeilen wie

.equ EFFECTS = 3
#define EFFECT_1 alles_an           ; alle LEDs leuchten
#define EFFECT_2 lauflicht_punkt    ; Punktlauflicht
#define EFFECT_3 lauflicht_balken   ; Balkenlauflicht

und an den entsprechenden Stellen im Programm Makroaufrufe wie

EFFECT_SWITCH mode,1,EFFECT_1,init,init_done
EFFECT_SWITCH mode,2,EFFECT_2,init,init_done
EFFECT_SWITCH mode,3,EFFECT_3,init,init_done

wobei das Macro nicht viel macht:

.macro EFFECT_SWITCH
  cpi   @0,    @1
  brne  next
  rcall Effect_@2_@3
  rjmp  @4
  next:
.endmacro

"mode" (@0) ist der Name des Registers in dem die Nummer des aktuell 
ausgewählten Effekts steht. Wenn @1 damit übereinstimmt wird 
Effect_@2_@3 aufgerufen (also z.B. "Effect_lauflicht_punkt_init" falls 
mode=0x02). Schließlich wird nach einem Aufruf zum Label @4 (hier 
"init_done") gesprungen, das nach dem ganzen Block der Makro-Aufrufe 
ist.


So, das war die Einleitung. Jetzt meine Fragen:

1.) Mir gefällt z. B. gar nicht, dass ich sowohl den Vergleichswert (@1) 
als auch den Namen (@2) angeben muss. Die Verwendung von "EFFECT_@1" 
anstatt "@2 "innerhalb des Makros führt nicht zu dem was es soll (was 
ich auch erwartet habe). Gibt es trotzdem eine Möglichkeit das zu 
optimieren?

2.) Die Makroaufrufe sind ja bis auf die laufende Ziffer identisch. Gibt 
es eine Möglichkeit da eine Art Schleife draus zu machen, sodass ich 
beim Hinzufügen/Entfernen eine Effekts einfach nur das .equ und die 
#define am Anfang ändern muss?

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.