Hi, habe eine Frage. Im Register 24 steht z.B. eine 4. Die wird da reigeladen.(Werte zwischen 0 u.7 liegen da drin.) Dann möchte ich im Register 18 das 4te Bit setzten bzw. löschen. So geht es. cbr r18,4 ;Löscht das Bit 4 im Register R18 aber wie mache ich das wenn ich das Register R24 verwenden will als konstante? Danke.
Holger schrieb: ... > Dann möchte ich im Register 18 das 4te Bit setzten bzw. löschen. > > So geht es. > cbr r18,4 ;Löscht das Bit 4 im Register R18 > Ich vertue mich damit auch immer. Vielleicht sogar jetzt auch. Aber für mich löscht DU das Bit2 in r18 ( 2^2 = 4 ). müsstest daher cbr r18,1<<4 schreiben. > > aber wie mache ich das wenn ich das Register R24 verwenden will als > konstante? > Die Frage verstehe ich leider nicht. Kannst DU sie vielleicht etwas anders formulieren ? Bernd_Stein
Holger schrieb: > Hi, > > habe eine Frage. > aber wie mache ich das wenn ich das Register R24 verwenden will als > konstante? aus dem Wert in R24 musst du mithilfe einer Schleife eine Bitmaske erstellen, die du dann mit r18 UND verknüpfst. ldi tempreg,0 ;hilfsreg sec ;CY=1 loop: rol tempreg ;Bit reinschieben dec r24 brne loop com tempreg ;Maske invertieren and r18,tempreg ;gewünschtes Bit löschen Sascha
> > aber wie mache ich das wenn ich das Register R24 verwenden will als > konstante? > Das wäre also sozusagen ein "parametrisches" setzen oder löschen. Dafür gibt es beim AVR keinen Maschinenbefehl. Andere CPUs haben sowas. Aber eben nicht alle und jede. Beim AVR ist die Begründung insbesondere, das es sich um einen Prozessor mit RISC-Befehlssatz ("Reduced Instruction Set Computer", also "Reduzuierter-Befehlsatz-Computer") handelt. Manche, sicherlich wünschenswerte und sinnvolle Befehle gibt es eben da nicht. In so einem Fall muss man also dafür ein Programm schreiben, das sowas erledigt. Schau Dir mal den Befehlssatz an und den Artikel http://www.mikrocontroller.net/articles/Bitmanipulation hier.
Noname schrieb: > Beim AVR ist die Begründung insbesondere, > das es sich um einen Prozessor mit RISC-Befehlssatz ("Reduced > Instruction Set Computer", also "Reduzuierter-Befehlsatz-Computer") > handelt. Manche, sicherlich wünschenswerte und sinnvolle Befehle gibt es > eben da nicht. Ist nur die halbe Begründung. Die andere Hälfte der Begründung ist, dass die CPU keinen barrel shifter hat, d. h. sie kann nicht um beliebige Bitanzahlen auf einmal schieben, sondern pro Befehl nur um ein Bit.
Hi > ldi tempreg,0 ;hilfsreg > sec ;CY=1 >loop: rol tempreg ;Bit reinschieben > dec r24 > brne loop Und wenn r24=0 ist? MfG Spess
>Ist nur die halbe Begründung.
Naja. Was war zuerst da? Die Henne oder das Ei? Gibt es den Befehl nicht
weil es keinen Barrelshifter gibt oder keinen Barrelshifter weil es den
Befehl nicht gibt. Oder ganz anders: Gibt es wegen Kosten und Chipfläche
keinen Barrelshifter und deswegen keinen Befehl dafür? Oder gibt es das
wegen des RISC-Aufklebers beides nicht? :-)
spess53 schrieb: > Hi > >> ldi tempreg,0 ;hilfsreg >> sec ;CY=1 >>loop: rol tempreg ;Bit reinschieben >> dec r24 >> brne loop > > Und wenn r24=0 ist? ja, ja - hatte erst den dec vorn dran und dann noch mal umgestellt, so wär's dann richtig ... ldi tempreg,0 ;hilfsreg inc r24 sec ;CY=1 loop: rol tempreg ;Bit reinschieben dec r24 brne loop com tempreg ;Maske invertieren and r18,tempreg ;gewünschtes Bit löschen Sascha
Noname schrieb: > Gibt es wegen Kosten und Chipfläche > keinen Barrelshifter und deswegen keinen Befehl dafür? Das wird es treffen. Ohne den RISC-Aufkleber wiederum könnte es einen solchen Befehl halt auch trotz fehlendem barrel shifters trotzdem geben. > Oder gibt es das > wegen des RISC-Aufklebers beides nicht? :-) Andere RISC-CPUs haben sowas durchaus, ARM beispielsweise.
Hi Passt auch nicht. Wenn r24 Null ist wird es nach dem 1. dec zu 255.
1 | ldi r24,7 |
2 | |
3 | ldi r17,1 |
4 | tst r24 |
5 | aaa: breq bbb |
6 | lsl r17 |
7 | dec r24 |
8 | rjmp aaa |
9 | |
10 | bbb: com r17 |
11 | and r18,r17 |
MfG Spess
spess53 schrieb: > Hi > > Passt auch nicht. Wenn r24 Null ist wird es nach dem 1. dec zu 255. drum vorher das inc r24 Sascha
Hi >> Passt auch nicht. Wenn r24 Null ist wird es nach dem 1. dec zu 255. >drum vorher das inc r24 Entschuldige. Hatte ich übersehen. MfG Spess
..oder linear (immer 8 clocks)
1 | ldi tempreg,0b1 ;mask for bit 0 - tempreg must be immediate |
2 | sbrc r24,1 ;+2 ? |
3 | ldi tempreg,0b100 ;mask bit 2 |
4 | sbrc r24,0 ;+1 ? |
5 | lsl tempreg ;mask bit+1 |
6 | sbrc r24,2 ;+4 ? |
7 | swap tempreg ;mask bit+4 |
8 | eor r18,tempreg ;toggle bit in r18 |
Noch ein Tick kürzer und mit Wortspiel:
ldi temp,$FF ; Alles an
inc BitNummer ; wegen 0 * Schleife
clc ; 0 ins Carry
L1:
rol temp ; beim 1. Mal 0 reinschieben - 1 ins Carry
dec BitNummer ; beim 2.-7. 1 reinschieben - 1 ins Carry
brne L1 ;
ANDe: and ZielReg,temp ; Bit löschen
gruss herrmueller
Hi, erstmal danke für das Bemühen. Ich werde das gleich mal testen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.