Forum: Mikrocontroller und Digitale Elektronik ASM AVR CBR - Clear Bits in Register


von Holger (Gast)


Lesenswert?

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.
von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

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
von Sascha W. (sascha-w)


Lesenswert?

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
von Noname (Gast)


Lesenswert?

>
> 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.
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.
von spess53 (Gast)


Lesenswert?

Hi

>      ldi   tempreg,0       ;hilfsreg
>      sec                   ;CY=1
>loop: rol   tempreg         ;Bit reinschieben
>      dec   r24
>      brne  loop

Und wenn r24=0 ist?

MfG Spess
von Noname (Gast)


Lesenswert?

>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? :-)
von Sascha W. (sascha-w)


Lesenswert?

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
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.
von spess53 (Gast)


Lesenswert?

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
von Sascha W. (sascha-w)


Lesenswert?

spess53 schrieb:
> Hi
>
> Passt auch nicht. Wenn r24 Null ist wird es nach dem 1. dec zu 255.
drum vorher das inc r24

Sascha
von spess53 (Gast)


Lesenswert?

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
von Klaus 2. (klaus2m5)


Lesenswert?

..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
von Herr M. (herrmueller)


Lesenswert?

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
von Holger (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.