-
+ Antworten
Ergebnis 1 bis 8 von 8

Thema: Bascom und Assembler: konstanten Wert in Variable laden

  1. #1
    RN-Premium User Roboter Genie Avatar von malthy
    Registriert seit
    19.04.2004
    Ort
    Oldenburg
    Beiträge
    1.176

    Bascom und Assembler: konstanten Wert in Variable laden

    Hallo,

    ich möchte in einer in Assembler geschriebenen ISR einfach nur einen konstanten Wert in einen Integer übernehmen. Also angenommen es gäbe die Variable Int1, so soll dieser zB in der ISR unter einer bestimmten Bedingung der Wert -1234 zugewiesen werden. Im Moment brauche ich dazu vier Assembler Befehle, zwei mal LDI um gewünschtes low- und highbyte in zwei Register zu laden, und zwei mal STS um diese Register in die Variable zu schreiben. Ich finde, das müsste doch auch irgendwie ohne den Umweg über die Register gehen, also mit nur zwei Befehlen indem ich low- und higbyte direkt an die entsprechende Adressen von Int1 schreibe. Geht das und wenn ja, wie?

    Vielen Dank für alle Tipps!
    Malte

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.822
    Geht nicht. sry
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von malthy Beitrag anzeigen
    Ich finde, das müsste doch auch irgendwie ohne den Umweg über die Register gehen, also mit nur zwei Befehlen indem ich low- und higbyte direkt an die entsprechende Adressen von Int1 schreibe.
    Ist dann halt unpraktisch, wenn der µC anderer Meinung ist. Was soll denn das für eine ISR sein, die keine 2 Zyklen mehr verträgt ?
    Es gibt rein theoretisch schon eine Möglichkeit, indem man die Konstante in bestimmten Registern vorhält, diese Register dürfen dann aber nicht von Bascom-Code verwendet werden.

    Außer den von Bascom für bestimmte Funkionen reservierten Registern gibt's keine Garantie dafür, dass der Compiler ein bestimmtes Register nicht in den Code einbaut. Es gibt aber dezidierte Register, wie z.B. R8/R9, welches als Zeiger für Read verwendet wird, bei dem man sicher sein kann, dass es der Compiler außer für Read für nichts anderes verwendet. Sollte also kein Read im Code vorkommen, so wäre dieser Zeiger frei und man könnte ihn mit der Konstanten vorladen, dann braucht's im Code nur noch 2 STS.

    Der Sinn erschließt sich mir wie gesagt jedoch nicht so recht, meist ist der Code noch woanders optimierungsfähig, so dass man diese 2 Takte locker reinbringt und keine solchen Verrenkungen benötigt.
    Zeig doch mal, wie die ISR jetzt aussieht.

  4. #4
    RN-Premium User Roboter Genie Avatar von malthy
    Registriert seit
    19.04.2004
    Ort
    Oldenburg
    Beiträge
    1.176
    Vielen Dank für die Info! Ich war mittlerweile selber mehr oder weniger soweit...

    Zitat Zitat von MagicWSmoke Beitrag anzeigen
    Was soll denn das für eine ISR sein, die keine 2 Zyklen mehr verträgt ?
    War mir klar, dass dieser Einwand kommt . Und er ist ja im Prinzip auch zutreffend. Der Punkt interessierte mich erstens rein der Sache nach. Zweitens fand ich, dass, falls es diese Möglichkeit gegeben hätte, es unelegent gewesen wäre, vier Befehle für etwas zu verwenden, was man eigentlich mit zweien lösen kann. That's all. Grundsätzlich sind die zwei Befehle mehr zu verkraften, ja.

    Gruß
    Malte

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von malthy Beitrag anzeigen
    War mir klar, dass dieser Einwand kommt
    Sagen wir so, der Einwand war nur logisch.
    ...falls es diese Möglichkeit gegeben hätte...
    Hast Du Dir das AVR Instruction Set Datenblatt von Atmel geholt ? Dort findest Du alle verfügbaren Befehle.

  6. #6
    RN-Premium User Roboter Genie Avatar von malthy
    Registriert seit
    19.04.2004
    Ort
    Oldenburg
    Beiträge
    1.176
    Hallo,

    ja, ich habe doc0856 (ich denke das meinst Du). Da die Befehle da alphabetisch und nicht sachlich angeordent sind, war ich mir zunächst nicht ganz sicher, ob ich nicht was übersehen habe...

    Aber es scheint ja auch eine prinzipielle Sache zu sein, dass beim AVR nahezu alles über die Register läuft. Mit "naiven Verständnis" könnte man ja schon auf die Idee kommen, dass es eigentlich möglich sein sollte, mit einer Instruktion direkt von einer Speicherstelle in eine andere (die nicht Register ist) zu schreiben.

    Aber ich gebe Dir ja Recht, +/- zwei ASM-Befehle ist eher sportlicher Ehrgeiz, als ein praktisches Problem (wobei dieser "Ehrgeiz" für mich ja ein bißchen die Faszination an ASM ausmacht... )

    Gruß
    Malte

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von malthy Beitrag anzeigen
    ja, ich habe doc0856 (ich denke das meinst Du).
    Das meinte ich.
    Da die Befehle da alphabetisch und nicht sachlich angeordent sind, war ich mir zunächst nicht ganz sicher, ob ich nicht was übersehen habe...
    Im Controller Datenblatt findest Du üblicherweise am Schluss die für den entsprechenden Controller verfügbaren Opcodes, dort unter DATA TRANSFER INSTRUCTIONS nachsehen.
    ...mit einer Instruktion direkt von einer Speicherstelle in eine andere (die nicht Register ist) zu schreiben.
    Alles was Atmel in Silizium ätzen möchte ist möglich, auch z.B. ein LISTS Opcode.
    Andererseits steht ja im Datenblatt gleich zu Anfang: Advanced RISC Architecture, was expandiert zu Reduced Instruction Set Computer wird.
    Ziel eines reduzierten Befehlssatzes ist es eben nicht, für alle möglichen Konstellationen einen Befehl bereit zu halten, sondern dem Programmierer die Möglichkeit zu geben, aus möglichst wenigen Befehlen sich das Benötigte zusammenzustricken.
    Im Gegenzug dazu wird ein Großteil der Befehle die innerhalb der Prozessorregister arbeiten, in nur einem Zyklus ausgeführt, während Speicherzugriffe meist 2+ Takte benötigen, man kann also durch Halten der Zwischenergebnisse in den Prozessorregistern die Ausführungsgeschwindigkeit beeinflussen.
    ...ist eher sportlicher Ehrgeiz, als ein praktisches Problem (wobei dieser "Ehrgeiz" für mich ja ein bißchen die Faszination an ASM ausmacht...
    Aus diesem Grund wollte ich Deinen Code sehen, um beurteilen zu können wie weit Du mit diesem Ehrgeiz schon gekommen bist

  8. #8
    RN-Premium User Roboter Genie Avatar von malthy
    Registriert seit
    19.04.2004
    Ort
    Oldenburg
    Beiträge
    1.176
    Aus diesem Grund wollte ich Deinen Code sehen, um beurteilen zu können wie weit Du mit diesem Ehrgeiz schon gekommen bist
    Ich will's erstmal selbst in Ruhe durchdenken und zu Ende bringen. Dann kann ich den Code hier ggf posten. Auf jeden Fall vielen Dank für das Angebot, den Code anzugucken!

    Gruß
    Malte

+ Antworten

Ähnliche Themen

  1. wert einer variable über ht an pc senden
    Von Mk1.12.91 im Forum Asuro
    Antworten: 7
    Letzter Beitrag: 04.06.2010, 21:36
  2. Variable - unerklärlicher Wert (Simulator)
    Von Bloodyben im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 18.09.2008, 17:12
  3. ADC von rnmega2560 gibt einen konstanten Wert zurück!
    Von turi79 im Forum Sensoren / Sensorik
    Antworten: 6
    Letzter Beitrag: 14.02.2008, 15:21
  4. Variable enthält falschen Wert
    Von contrero im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 14.09.2007, 09:15
  5. Wert einer Variable eingrenzen?
    Von TobiasBlome im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 25.05.2007, 23:15

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •