mikrocontroller.net

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


Autor: Karl (Gast)
Datum:

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

Autor: C3PO (Gast)
Datum:

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

Autor: dave (Gast)
Datum:

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

Autor: ...HanneS... (Gast)
Datum:

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

Autor: Karl (Gast)
Datum:

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

Autor: Bernd (Gast)
Datum:

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

Autor: Rufus T. Firefly (Gast)
Datum:

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

Autor: dave (Gast)
Datum:

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

Autor: ...HanneS... (Gast)
Datum:

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

Autor: Karl (Gast)
Datum:

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

Autor: ...HanneS... (Gast)
Datum:

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

Autor: Bernd (Gast)
Datum:

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

Autor: Rufus T. Firefly (Gast)
Datum:

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

Autor: Hagen (Gast)
Datum:

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

Autor: dave (Gast)
Datum:

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

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.