-
        

Ergebnis 1 bis 7 von 7

Thema: Bitmanipulation

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    11.01.2005
    Ort
    Bayern
    Alter
    29
    Beiträge
    161

    Bitmanipulation

    Anzeige

    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
    (-_-)

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    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.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    11.01.2005
    Ort
    Bayern
    Alter
    29
    Beiträge
    161
    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
    (-_-)

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.12.2004
    Ort
    LEV
    Beiträge
    505
    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

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    11.01.2005
    Ort
    Bayern
    Alter
    29
    Beiträge
    161
    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
    (-_-)

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    @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.

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    11.01.2005
    Ort
    Bayern
    Alter
    29
    Beiträge
    161
    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
  •