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
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...
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?
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*
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.