-         

Ergebnis 1 bis 7 von 7

Thema: ldi register, (1<<irgendwas)?

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.03.2006
    Beiträge
    200

    ldi register, (1<<irgendwas)?

    Anzeige

    Hallo,

    nach dem Tipp von izaseba hab ich mir sein Tutorial angeschaut und bin auf die folgende Anweisung gestoßen:
    ldi RegisterA, (1<<RegisterB)
    Es wurde zwar versucht den Sinn dieser Anweisung darzulegen, aber irgendwie bin ich nicht dahinter gestiegen.
    Wird bei diesem Befehl das Register B verändert? Normalerweise würde ich ja mit dem ldi-Befehl das Register A mit einer 1 laden, was hat nun das Register B damit zu tun?

    Gruß, JK

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    nach dem Tipp von izaseba hab ich mir sein Tutorial angeschaut und bin auf die folgende Anweisung gestoßen:
    ldi RegisterA, (1<<RegisterB)
    kannst Du mir bitte sagen, wo ich sowas geschrieben habe ?
    Habe eben geguckt, und nichts in der Art gefunden... <such weiter>

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.03.2006
    Beiträge
    200
    Huch, so spät noch im Forum unterwegs.... Hallo Sebastian

    konkret unter "Das erste Programm"
    ldi arbeitsregister,(1<<PD0)

    okay, PD0 ist nur ein Bit aus einem Register, aber trotzdem Blick ichs nicht...

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Huch, so spät noch im Forum unterwegs
    Naja, bin eigentlich was am machen aber zur Entspannung guckt man mal rein

    Nun ja, das hast Du jetzt falsch verstanden PD0 ist kein Bit aus einem Register, sondern eine Konstante die mit
    Code:
    .equ PD0 = 0
    Erzeugt/deklariert wird
    in C würde das z.B. so aussehen
    Code:
    #define PD0 0
    Dieses 0 bezieht sich hier auf die Bitnummer 0
    wenn man sich so ein Byte mit Nummern aufschreibt sieht es so aus:
    Code:
    76543210
    Wobei Bit Nummer 0 hat die Wertigkeit 1
    Bit 1 2
    Bit 2 4
    Bit 3 8
    Bit 4 16 usw.
    Statt ldi r16,(1<<PD0) kannst Du auch ldi r16,1 schreiben das ist Wurst,
    nur wenn Du z.B. irgendein Pin am PortD schalten willst ist es lesbarer

    ldi r16,(1<<PD0)
    out PORTD,r16

    zu Schreiben

    oder
    ldi r16,(1<<PD0)|(1<<PD7)
    statt
    ldi r16,0x81

    um PD0 und PD7 einzuschalten.

    Klarer ?
    Wenn nicht kannst Du nochmal fragen

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.03.2006
    Beiträge
    200
    na das Angebot nehme ich doch gern an...

    verstehe ich das jetzt richtig, dass ich damit ein einzelnes Bit setzen kann, egal von der Wertigkeit her, das der Assembler ja weiß auf Grund der Bitbezeichnung welche Binärzahl er erzeugen muss.

    Gesetzt dem Falle ich weiß z.B. nicht welche Wertigkeit das Bit CS12 hat, dann kann ich einfach schreiben:
    ldi r16,(1<<CS12) und CS12 wird auf 1 gesetzt unabhängig davon welchen Wert es in dem augenblick hat?!
    Würde aus meiner Sicht jetzt einen Sinn ergeben.

    Ich nehme an hierbei handelt es sich um eine Assemblerdirektive, weil hiermit ldi r16,(1<<PD0)|(1<<PD7) könnte ich ja alle Bits eines Bytes so setzen wie es dort steht. Wie kommt man zu dem Trennstrich?

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Gesetzt dem Falle ich weiß z.B. nicht welche Wertigkeit das Bit CS12 hat, dann kann ich einfach schreiben:
    ldi r16,(1<<CS12) und CS12 wird auf 1 gesetzt unabhängig davon welchen Wert es in dem augenblick hat?!
    Würde aus meiner Sicht jetzt einen Sinn ergeben.
    Genau das !
    Mal angenommen bei Mega 128 wäre CS12 Bit Nummer 3 und bei Mega 64
    wäre CS12 Bit Nummer 4 (das ist so nicht, aber wir nehmen es mal so an)

    könntest Du ein Programm, wo
    ldi r16,(1<<CS12) steht auf beiden µC verwenden, ohne was zu ändern.

    die Definition für CS12 steht in der entsprechenden *def.inc drin

    Ich nehme an hierbei handelt es sich um eine Assemblerdirektive, weil hiermit ldi r16,(1<<PD0)|(1<<PD7) könnte ich ja alle Bits eines Bytes so setzen wie es dort steht. Wie kommt man zu dem Trennstrich?
    Das ist kein Trennstrich, sondern eine logische oder Verknüpfung
    in diesem Fall wird in r16 PD0 oderverknüpft mit PD7.
    Kennst Du die ODER Funktion ?

    sieht hier so aus:

    Code:
    10000000 <- (1<<PD7)
    00000001 <- (1<<PD0)
    ------------ ODER Ergibt
    10000001 <- (1<<PD7)|(1<<PD0)
    Du kannst natürlich mehr als nur 2 Bits Oderverknüpfen und nicht nur PD*
    auch ales andere (auch CS12 mit anderen Bits von diesem Register)

    Diese Verknüpfung macht der Assembler aber beim Assemblieren, im fertigem Programm (was in den µC geladen wird) steht dann
    ldi r16,0x81

    Gute Nacht

    Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.03.2006
    Beiträge
    200
    Danke... *wink*

Berechtigungen

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