PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bitmanipulation



raoul4
02.04.2007, 19:12
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

wkrug
02.04.2007, 19:39
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.

raoul4
02.04.2007, 20:15
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

JanB
02.04.2007, 21:01
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

raoul4
02.04.2007, 21:12
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

wkrug
03.04.2007, 08:04
@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.

raoul4
03.04.2007, 12:54
Hallo wkrug,
danke für die Erläuterung.
mfg