Forum: Mikrocontroller und Digitale Elektronik Gibt es auch lokale Variablen in Assembler


von Karl (Gast)


Lesenswert?

Hallo zusammen,

mein ganz besonderes Lauflicht kann jetzt fast alles, was es soll:
Es läuft, hat Pilotlicht (Also glimmt auch im Auszustand ein bischen)
ich kann mit einem Taster mehreren Lauflicht-Typen auswählen und die
Helligkeitserkennung ist auch fast schon fertig.

Aaaaaaber:
Der Code ist nun schon (für meine Verhältnisse) relativ umfangreich
geworden. Und nun wird die Namensvergabe langsam unübersichtlich.
Gibt es eigentlich die Möglichkeit in Prozduren lokale Variablen und
Labels zu deklarieren? Damit ich mir nicht immer neue Variablennamen
für ähnliche Dinge ausdenken muss. Z.B. wenn ich drei Prozeduren habe,
die alle eine Tmp oder Laufindexvariable i haben, muss ich mir
momentan noch immer neue Namen ausdenken. Macht die Sache doch unnötig
schwierig und auch nicht unbedingt übersichtlicher.


Danke für Eure Hilfe
Karl

von C3PO (Gast)


Lesenswert?

Ja wenn du sie auf dem Stack anlegst, dann sind sie lokal, musst auch
keine Namen vergeben, ist aber dafür vielleicht etwas umständlicher.

ansonsten wirst du wohl nur lokale Variablen haben, wenn du für jede
Prozedur/Funktion eine eigene asm-Datei anlegst, weis ich aber nicht
genau

von dave (Gast)


Lesenswert?

Willst du jetzt Speicherplatz haben, oder einfach nur Namen haben
hehe..

Für Speichern von Zählern (erst recht so langsam) ist der Befehl
LDS/STS doch nur so geschaffen. LDS r16, 0x100 (läd Zelle 0x100 in
r16)

Für Namen von Labels und anderem Zeugs, da nehm ich immer das, für was
es ist...

menu_taster_settings_1:
.equ ram_menu_nr = 0x80

Blöd ist halt, dass solche Labels nicht länger als glaub 30 sein
dürfen.

Assembler kennt nur global.. einmal vergeben, gibts das nicht nochmal.

dave

frohes Fest

von ...HanneS... (Gast)


Lesenswert?

Wer hindert dich daran, in mehreren Programmteilen, von denen immer nur
einer läuft, die gleichen Register bzw. Variablen zu verwenden?
Allerdings sollten diese vor dem Aufruf des Programmteils initialisiert
werden, damit dein Lauflicht von vorn beginnt und nicht mittendrin...

von Karl (Gast)


Lesenswert?

Hallo HanneS

mir ist klar, dass ich die gleichen Register in mehreren Programmteilen
verwenden kann, sofern ich deren Inhalt vor der Zweitbenutzung sichere
und nach der Zweitbenutzung wieder herstelle.

Mir geht es mehr um die Variablennamen. Die scheinen in Assembler
eindeutig sein zu müssen.
So muss ich mir für die gleiche Aufgabe unterschiedliche Namen
ausdenken, was nach Monaten vielleicht unnötig schwer nachzuvollziehen
ist.

Aber wo du gerade da bist:

Wie realisiere ich folgendes

x=16-x

in Assembler?

Der Zweck ist der:

Die Phasen von LED-Ein und LED-Aus sollen zusammen 16 Zeiteinheiten
dauern.
Durch ein Poti (später durch ein LDR) wird die LED-Ein-Phase gesteuert,
so dass sich dabei die Helligkeit regeln lässt.
Blöderweise ändert das Lauflicht bei der Helligkeitsänderung aber
auch seine Geschwindigkeit.

So müsste das 16er-Komplement für die Dunkelphase erzeugt werden.

Die Zeit für LED-Ein wäre X (Ein Wert von 0 bis 16)
Die Zeit für LED-Aus sollten nun 16-x sein.
Beide Zeiten zusammen ergeben eine Konstante, so dass das Lauflicht
seine Laufzeit nicht ändert.
Ich hoffe, ich habe das jetzt nicht unnötig kompliziert erklärt.

Viele Grüsse
Karl

von Bernd (Gast)


Lesenswert?

Versuchs doch mal so.

Funktion

LauflichtLos:

Verwende die Initialen der im Funktionsnamen vorkommenden Wörter und
hänge dann den eigentlichen Variabel/Label-Namen hinten dran.

LL_Loop:

von Rufus T. Firefly (Gast)


Lesenswert?

Es gibt auch Assembler, die lokale Labels unterstützen. So hat's
beispielsweise der 6809-Assembler gehandhabt, mit dem ich früher mal
gearbeitet habe.

Ich muss allerdings gestehen, nicht zu wissen, ob es einen
AVR-Assembler gibt, der das auch unterstützt.

von dave (Gast)


Lesenswert?

Kennst du (oder jemand) nen Assembler (für AVR), bei dem man z.B.
Routinen ausblenden kann? Von Programmer's Notepad kenn ich die
Funktion.. dann stehen links immer so Plus (oder Minus)Zeichen, um ne
Routine auszublenden.

Ich weiß selber, dass das in Assembler schwieriger ist, aber es würde
manchmal sehr viel zur übersichtlichkeit beitragen... Mir auch egal,
wenn man die Routinen vorher im Programm festlegen müsste.

dave

von ...HanneS... (Gast)


Lesenswert?

Hi...

Labels, z.B. wie Bernd vorschlägt...

x=16-x
Wenn du dir den Befehlssatz ansiehst, dann wirst du feststellen, dass
Konstanten (wenn überhaupt) immer als zweiter Operator auftreten. Da
musst du also einen Umweg gehen.
y=16-x
Also ein Register mit der Konstante belegen (ein "oberes Register",
ldi yl,16) und dann dein x subtrahieren. Das wird meist auch nicht
aufwendiger als das, was die meisten Compiler da machen.

Trotzdem würde ich versuchen, die Funktion deiner drei Lauflichter auf
Gemeinsamkeiten zu untersuchen und mit nur einem Programm zu erzeugen
(unterschiedliche Parameter). Und dies am besten in einem Timer-Int.

Übrigens: Wenn dir leichtes Glimmen der ausgeschalteten Lampen wichtig
ist, das geht auch bei meinem Lauflichtvorschlag:
- Richte eine weitere Konstante ein, "wie hell die glimmen sollen"
  (oben im Kopf des Programms).
- Schalte bei PWM-Null alle Lampen ein.
- überprüfe PWZ auf die neue Konstante und schalte bei Gleichstand
  alle Lampen aus und nur die aktuelle (Tabellenwert) Lampe ein.

...HanneS...

von Karl (Gast)


Lesenswert?

Hallo HanneS,

ich habe das Problem mit dem 16-er-Komplement jetzt so gelöst:

com AD_Wandler_Inhalt
ANDI AD_Wandler_Inhalt, 0b00001111

Ist mir gerade beim Autofahren eingefallen:)
Das klappt wunderbar.

Im Prinzip ist das Ding jetzt fertig.
Muss nur noch nen passenden Widerstand in Reihe mit dem LDR
suchen und einbauen.

Ich bin ja so froh :-))

Danke nochmals für alles
Karl

von ...HanneS... (Gast)


Lesenswert?

Hi...

COM und ANDI hätte ich dir auch beinahe vorgeschlagen. Das geht aber
nur dann, wenn der Zählumfang einer Zweierpotenz entspricht. Manchmal
gibt es aber Gründe, einen anderen Zählumfang zu haben. Daher der
andere Vorschlag...

...HanneS...

von Bernd (Gast)


Lesenswert?

@Dave:
"Kennst du (oder jemand) nen Assembler (für AVR), bei dem man z.B.
Routinen ausblenden kann?"

Kenne ich zwar nicht, aber wenn dir lange Listings zu unübersichtlich
werden, pack doch einfach einzelne Teile in einzelne Dateien ".inc".

Und bau Dir eine Datei, in der alle .incs aufgerufen werden.

.include "Funktion1.inc"
.include "Funktion2.inc"
.include "Funktion3.inc"

von Rufus T. Firefly (Gast)


Lesenswert?

Ich glaube, Dave meint nicht einen Assembler, sondern einen für
Assembler optimierten Editor mit Faltenfunktion*. Das lässt zumindest
die Erwähnung von "Programmer's Notepad" ahnen.

Alternative wäre echtes modulares Programmieren - aber das setzt
entweder viel Disziplin beim Sourcecodeschreiben, Dateibenennen und
.include-Anweisung-Schreiben voraus, oder bedarf eines Assemblers, der
mit einem Linker zusammenarbeitet. Eizelne Funktionen/Routinen werden
in einzelne Module verpackt, die - wenn sie fertig sind - auch noch in
einer echten Library zusammengefasst werden können ... und mit .include
werden nur noch Deklarationen eingebunden (analog zu Headerdateien in
C).

*) Erinnert sich eigentlich noch wer an das Occam-Entwicklungssystem
für die Inmos-Transputer? - Das hatte einen Falteneditor.

von Hagen (Gast)


Lesenswert?

Der Name einer lokalen Variablenist nur ein Synonym für einen
Speicherbereich oder ein Register. Das gleiche geht auch in
Assembler,nur benutzt du nicht die Register Namen sondern Defines.


function1:

.def  Variable1 = r16
.def  Variable2 = r17

      push Variable1
      push Variable2
      ldi  Variable1, 1
      add  Variable2, Variable1
..
..
..

      ret

.undef Variable1
.undef Variable2

; end function1

So macht man es meistens und könnte es man machen wenn AVRStudio das
.undef kennen würde.

Im WinAVR gcc Assembler geht das aber.

Gruß Hagen

von dave (Gast)


Lesenswert?

;) Jaaaa...
mit .includes könnte ich mich auch rumschlagen.
Aktuell nehm ich das AVR Studio, aber mit includes isses ja nicht grad
so das Wahre. Mir reichen jetzt schon meine 4 Stück, und wenn man mal
schnell wechseln will oder den Überblick sucht, dann wäre das
"Faltenfunktion" sehr viel besser. Rufus hats auch richtig erkannt,
was ich such.

Deswegen bleibt die Frage noch: Gibts sowas, oder muss ich mir das
selbst programmieren (wenn ichs auch nicht hinbekomm hehe, aber der
Wille zählt LOL)

Dave

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.