PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ldi register, (1<<irgendwas)?



pacer_one
07.12.2007, 23:13
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

izaseba
07.12.2007, 23:22
nach dem Tipp von izaseba hab ich mir sein Tutorial angeschaut und bin auf die folgende Anweisung gestoßen:
ldi RegisterA, (1<<RegisterB)

:shock: kannst Du mir bitte sagen, wo ich sowas geschrieben habe ?
Habe eben geguckt, und nichts in der Art gefunden... <such weiter>

Gruß Sebastian

pacer_one
07.12.2007, 23:39
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...

izaseba
07.12.2007, 23:53
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


.equ PD0 = 0


Erzeugt/deklariert wird
in C würde das z.B. so aussehen


#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:


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

pacer_one
08.12.2007, 00:16
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?

izaseba
08.12.2007, 00:35
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:



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

pacer_one
08.12.2007, 00:40
Danke... *wink*