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
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
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
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...
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
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:
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.
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
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...
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
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...
@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"
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.
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
;) 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.