bit degisimi

Başlatan SpeedyX, 13 Eylül 2006, 18:39:04

SpeedyX

Selamlar, aşağıdaki kodu nasıl kısaltırız?
char bit_uydur(char x) {
char y;
   y=x;
   #asm
      btfss x,0
      bcf   y,3
      btfsc x,0
      bsf   y,3
      btfss x,1
      bcf   y,2
      btfsc x,1
      bsf   y,2
      btfss x,2
      bcf   y,1
      btfsc x,2
      bsf   y,1
      btfss x,3
      bcf   y,0
      btfsc x,3
      bsf   y,0
      btfss x,4
      bcf   y,7
      btfsc x,4
      bsf   y,7
      btfss x,5
      bcf   y,6
      btfsc x,5
      bsf   y,6
      btfss x,6
      bcf   y,5
      btfsc x,6
      bsf   y,5
      btfss x,7
      bcf   y,4
      btfsc x,7
      bsf   y,4
   #endasm
   return y;
}


bitler
76543210
45670123
şeklinde değişecek.

Prof.EleCTroN

clrf	Kaydedici2

	btfsc	Kaydedici1,7
	bsf	Kaydedici2,4

	btfsc	Kaydedici1,6
	bsf	Kaydedici2,5

	btfsc	Kaydedici1,5
	bsf	Kaydedici2,6
	
	btfsc	Kaydedici1,4
	bsf	Kaydedici2,7

	btfsc	Kaydedici1,3
	bsf	Kaydedici2,0

	btfsc	Kaydedici1,2
	bsf	Kaydedici2,1

	btfsc	Kaydedici1,1
	bsf	Kaydedici2,2

	btfsc	Kaydedici1,0
	bsf	Kaydedici2,3
Böyle birşey istiyorsun değil mi?

memed52

bcf   status,c
rlf   x,f
rlf   x,f
rlf   x,f
movf   x,w
movwf   y

İyi çalışmalar

SpeedyX

Alıntı yapılan: "Prof.EleCTroN"Böyle birşey istiyorsun değil mi?
Evet, teşekkürler.
Nasıl düşünemedim  :roll:

memed52

Altı adım çok daha kısa değilmi, üstelik bitlerin değerine göre sürede değişmiyor.

CaFFeiNe

@memed52

yazdığın kod yukarıda isteneni yapıyormu? açabilirmisin biraz

memed52

İstenilen buysa,
76543210
45670123

Kod aşagidaki gibi kulanilabilir, ilk cevabimda biraz acele etmişim eksik ve sonuç evrik olmuş. Bir satircik uzadi

rlf x,w         ; Msb--Lsb  , 7.biti carry bitine yazar x iceriği değişmez
rlf x,f     ; 65432107 , 0 bitine carry den gelen bir evvelki 7. bitin değeri taşınır. 6. bit carry atanir.
rlf x,f      ; 54321076
rlf x,f     ; 43210765
rlf x,f      ; 32107654
comf x,w      ; 45670123
movwf y       ; 45670123

Dört kere sola kaydırıp evriğini alinca sonuca ulaşiliyor.

İyi çalışmalar.

Prof.EleCTroN

Bir bite sekizli (octal) sayı yüklenemez değeri ya "1" dir yada "0". Burada rakamlar kaçıncı bit olduğunu gösterir.

CaFFeiNe

comf komutunun yaptığı iş bit diziliminimi yoksa içeriğinimi terslemek?

76543210    76543210
--------    --------
01100111 -> 10011000 ?

yalnayak

comf den once      b'10101010'
comf den sonra     b'01010101'

comf den once      b'11110000'
comf den sonra     b'00001111'

comf den once       b'11001100'
comf den sonra      b'00110011'
Kızımın iffeti batmakta rezîlin gözüne... Acırım tükürüğe billâhi, tükürsem yüzüne..! MEHMED AKİF ERSOY  Kardan Adaminla,GUNES'e calim mi satiyorsun?

memed52

Sayın Caffein haklısınız comf komutu sizin dediginiz gibi içeriği terslemektedir. Dolayısıyla tongaya düştük   :(
comf komutunun yaptığı iş bit diziliminimi yoksa içeriğinimi terslemek?

Kod:
76543210    76543210
--------    --------
01100111 -> 10011000 ?

Sayın Prof.EleCTroN, kimsenin bir bitte octal sayı yükladigini sanmıyorum. benim verdiğim örnekte msb--Lsb şeklinde rakamların bitlerin sıra degeri olduğu anlaşılır olduğunu düşünüyorum.

Comf komutunda tongaya düştüğümden en avantajı kod Prof.EleCTroN önerdiği kod olmakta.

Ben genede örnek olsun diye eğer bitlerin değerine bağlı olarak sürenin değişkenlik göstermiyeceği bir kod önereyim.

call         bit_change
swapf      y,f      ; ilk 4 bit le 2. 4bitin yeri degiştirillir.

bit_change
movlw      8
movwf     temp
rlf           x,w
decfsz     temp,f   ; 8 kere X soldan Y sağdan kaydırarak bit sırasını tersine çevirir.
return
rlf          x,f
rrf         y,f
goto      $-4


Herkese iyi calışmalar.