-
-
Erfahrener Benutzer
Fleißiges Mitglied
Bitmanipulation
Hallo!
Einfache Dinge sind manchmal doch ziemlich knifflig:
Wenn in dem Register16 (=Temp) das 7te Bit gesetzt ist, soll PORTB,2 high, wenn nicht, PORTB,2 low gesetzt werden.
Hört sich einfach an, ist für mich als Asm Anfänger aber nicht einfach.
Zudem unterstützt mein Mega8 nichtmal den Befehl jmp...
Kann mir jemand helfen? Danke!
mfg
-
Erfahrener Benutzer
Robotik Einstein
Wie wärs mit:
BST r16,7 ; Speichert das 7 Bit des Registers r16 im T Register
BRTS machein ; Verzweigt ob das Bit 1 oder 0 war
CBI PORTB,2 ; Legt eine 0 an PORTB,2 an wenn T=0 ist
RJMP raushier ; Überspringt die Set Routine "machein"
machein:
SBI PORTB,2 ; Legt eine 1 an PORTB,2 an
raushier:
; Weitererer Code von Dir
Das T Register im SREG ist für solche Eizelbit Verzweigungen sehr gut geeignet.
Zum JMP - Befehl:
Wenn ein Controller so wenig Speicher hat, das der gesamte Speicherinhalt mit RJMP übersprungen werden kann, wird der Befahl JMP vom Controller nicht unterstützt (ATMEL Philosophie).
Ausserdem braucht der JMP Befehl 3 Takte, der RJMP aber nur 2 (beim ATMEGA 16).
Also ist RJMP auch schneller.
-
Erfahrener Benutzer
Fleißiges Mitglied
Hallo,
danke für deine Lösung, werde ich mal austesten.
Wobei ich mir nicht so sicher bin, ob das denn so funktioniert. RJMP wollte ich nicht benützen, da ich denke, dass die Rücksprungadresse für das RET im Stack gespeichert wird. Wenn ich nun RJMP öfters ausführe, ohne RET zu benützen, wird dann nicht der Stack zugemüllt?
mfg
-
Erfahrener Benutzer
Roboter Experte
Hallo,
mein Vorschlag:
4 Befehle lösen das Problem
Die Laufzeit ist in beiden Fällen gleich, nämlich 5 Takte
.
.
SBRS r16,7 ; überspringe den nächsten Befehl wenn Bit 7 in R16 = 1 ist
CBI PortB,2 ; Setze PortB Bit 2 auf 0
SBRC r16,7 ; überspringe den nächsten Befehl wenn Bit 7 in R16 = 0 ist
SBI PortB,2 ; Setze Portb Bit 2 auf 1
.
.
Übrigens, der RJMP Befehl benutzt den Stack nicht.
Es ist ein ganz normaler SprungBefehl, nur eben mit
relativer Adressierung. Die Berechnung des relativen
Sprunges übernimmt der Assembler, wenn du eine
absolute Adresse also z.B ein Label als Sprungziel angibst.
Den RJMP-Befehl kannst du also genau wie den "vermissten JMP-Befehl" benutzen.
Die Sprungweite ist allerdings auf +-64 Worte ab PC begrenzt.
Gruß Jan
-
Erfahrener Benutzer
Fleißiges Mitglied
Hallo Jan,
das klingt ja sehr kompakt
Hab mir schon gedacht, dass das mit den SBRS/-C gehen muss aber bin nich drauf gekommen...
Danke
-
Erfahrener Benutzer
Robotik Einstein
@raoul4
Der Befehl, der dir den Stack zumüllen kann ist der "CALL" bzw. "RCALL" befehl.
Also der Aufruf einer Subroutine.
Dieser speichert die Absprungadresse auf dem Stack, die dann am Ende der Routine wieder mit "RET" zurückgeschrieben wird.
-
Erfahrener Benutzer
Fleißiges Mitglied
Hallo wkrug,
danke für die Erläuterung.
mfg
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen