Werbung
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
Linus TorvaldSoftware is like s e x: its better when its free.
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...
Naja, bin eigentlich was am machen aber zur Entspannung guckt man mal reinHuch, so spät noch im Forum unterwegs![]()
Nun ja, das hast Du jetzt falsch verstanden PD0 ist kein Bit aus einem Register, sondern eine Konstante die mit
Erzeugt/deklariert wirdCode:.equ PD0 = 0
in C würde das z.B. so aussehen
Dieses 0 bezieht sich hier auf die Bitnummer 0Code:#define PD0 0
wenn man sich so ein Byte mit Nummern aufschreibt sieht es so aus:
Wobei Bit Nummer 0 hat die Wertigkeit 1Code:76543210
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
Linus TorvaldSoftware is like s e x: its better when its free.
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?
Genau das !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.
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
Das ist kein Trennstrich, sondern eine logische oder VerknüpfungIch 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?
in diesem Fall wird in r16 PD0 oderverknüpft mit PD7.
Kennst Du die ODER Funktion ?
sieht hier so aus:
Du kannst natürlich mehr als nur 2 Bits Oderverknüpfen und nicht nur PD*Code:10000000 <- (1<<PD7) 00000001 <- (1<<PD0) ------------ ODER Ergibt 10000001 <- (1<<PD7)|(1<<PD0)
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
Linus TorvaldSoftware is like s e x: its better when its free.
Danke... *wink*
Lesezeichen