Hi-tech c de carry bitini kullanarak kaydırma nasıl oluyor

Başlatan XX_CİHAN_XX, 24 Eylül 2008, 21:04:39

XX_CİHAN_XX

Arkadaşlar hi-tech de kaydırma yaparken carry bitini temizliyor.
Bildiğim kadarıyla ccs de shiftout gibi bir komut ile carry e değer verebilip o şekilde kaydırabiliyorduk.
Bunu hi-tech de nasıl yapıyoruz. Ben 16 bitlik bir registeri kaydırmadan önce carry bitine değer vererek kaydırmak istiyorum. Bunu hi tech te nasıl yapıyoruz?
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

CLR

Merhaba,

2 şekilde yapabilirsin.
Ya registerini 16bit tanımlayacaksın yada asm kullanacaksın.
reg : register ismi olmak üzere
asm("rlf  _reg,f");  // sola kaydırma örneği
Knowledge and Experience are Power

XX_CİHAN_XX

Cevap için teşekkürler.
Asm işimi istediğim gibi gördü.
Ancak bu işi asm ile yapmak zorunda kalmam C nin bir eksiği bence.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

CLR

merhaba

C ile de yapabilirsin ama registerini 16bit olarak tanımlamalısın

int reg=0x80;   // 80h yükle
reg<<=1;        // sola 1 kaydır
Knowledge and Experience are Power

sigmoid

int sayi=1;
CARRY=1;  //carry e hangi değeri vermek istiyorsan;
sayi<<=1;

XX_CİHAN_XX

Hocam 16 bit tanımlamak zorunda kalmakta sonuçta doğru birşey değil.
8 bit ile asm de bu işi yapabiliyorum. Neden C dede yapılamasın ki?
Diyeceksiniz 1 byte fazla kullansan ne olur?
Şuan yaptığım bir uygulamada ram belleğe çok ihtiyacım var 1 byte bile önemli yani.

Birde bir anormallik daha fark ettim ben
DelayUs(x);
Komutunu kullanırken dikkat ettimde x yerine verdiğim sayının 5us fazlası kadar gecikme yapıyor örneğin 7 yazarsam 12 usluk gecikme programı yazıyor :S
17:                	DelayUs(7);
   7F6    3003     MOVLW 0x3
   7F7    00A3     MOVWF 0x23
   7F8    0BA3     DECFSZ 0x23, F
   7F9    2FF8     GOTO 0x7f8
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

XX_CİHAN_XX

Alıntı yapılan: "abdullaho"
int sayi=1;
CARRY=1;  //carry e hangi değeri vermek istiyorsan;
sayi<<=1;
Öyle olmuyor işte.
Derleyici sola kaydırmadan önce kendisi carry bitini siliyor
Sen set etsen bile :)
Hi-Tech C de böyle kısıtlamalar olmasın üzüldüm.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

CLR

Merhaba,

@XX_CİHAN_XX tam olarak carry ile ne yapmak istiyorsun?
1) aynı registerde rotate mi?
2) 1. registerdeki veriyi 2. registere aktarmak mı?

@abdullaho arkadaşın kodunda carry clear olmaz

1 ise asm kullanacaksın veya abdullaho'nun verdiği gibi yapacaksın

2 ise asm veya registeri 16bit tanımlamamlısın.

örnekler yukarıda var.
Knowledge and Experience are Power

XX_CİHAN_XX

Hocam bence herhalukarda asm kullanmak zorundayım :)
Sebep şu:
Yapmaya çalıştığım olay şöyle:
16 bitlik bir registere carry ile data girmeye çalışıyorum.
Aslında mantık olarak @abdullaho arkadaşımızın yaptığı şeyi yapmaya çalışıyorum. Tabi doğal olarak carry 0 oluyor.
Yapmaya çalıştığım şeyi asm olarak göstereyim siz bunun C de olup olamadığını söylersiniz ki bence olmuyor.
  unsigned char reg8;
   unsigned int reg16;
   CARRY=1;
#asm
   rlf   _reg8,f
   rlf   _reg16,f
   rlf   _reg16+1,f
#endasm

Buradaki RLF ifadelerini asm kullanmadan yapabilirmisiniz ?
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

CLR

Merhaba,
Hitech C'de çözüm tükenmez , Cevabı daha önce söylediğim gibi.

 unsigned int myreg;   

  CARRY=1;                 // veya istediğini yap
  myreg<<=1;             // D0=1 Carry=D15 oldu


Edit :Sen tabii burada high order byte(D15-D8) ve low order byte(D7-D0)'ları maskeleyip kullanacaksın
Knowledge and Experience are Power

sigmoid

Alıntı yapılan: "eemkutay"Merhaba,
Hitech C'de çözüm tükenmez :)

 unsigned int myreg;   

  CARRY=1;                 // veya istediğini yap
  myreg<<=1;             // D0=1 Carry=D15 oldu

aynı cevabı yukarıda bende verdim. malesef böyle olmuyormuş. hitect bende aşağıdaki kodu üretti.

1:                 #include <pic.h>
2:                 
3:                 void main()
4:                 {
5:                 	  unsigned int myreg;    
6:                 
7:                   CARRY=1;                 
  07F6    1403     BSF 0x3, 0 //set etti
8:                   myreg<<=1;             
  07F7    1003     BCF 0x3, 0 //şimdide sıfırla  :oops: 
  07F8    1283     BCF 0x3, 0x5
  07F9    1303     BCF 0x3, 0x6
  07FA    0DA0     RLF 0x20, F
  07FB    0DA1     RLF 0x21, F
9:                 }	
  07FC    0183     CLRF 0x3

XX_CİHAN_XX

Hocam hi-tech sanırım bu konuda çaresiz kalmış :)

25:                  CARRY=1;                 // veya istediğini yap 
   7DB    1403     BSF 0x3, 0      [B]burada istediğmi yapıyorum ama[/B]
26:                  myreg<<=1;             // D0=1 Carry=D15 oldu 
   7DC    1003     BCF 0x3, 0     [B]Burada yine kendi bildiğini okuyor[/B]
   7DD    1283     BCF 0x3, 0x5
   7DE    1303     BCF 0x3, 0x6
   7DF    0DA1     RLF 0x21, F
   7E0    0DA2     RLF 0x22, F

İlk carry girişine izin vermiyor. Low byte ile high byte arasaında böyle bir durum yok tabi o tamam ama her zamanki gibi ilk data girişi kapalı.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

XX_CİHAN_XX

Hocam bu konuda hi tech C de sanırım yapılabilecek hiç birşey yok.
Bu gibi işlemleri asm de yapın diyor yani :)
Birde hi-tech C nin delay fonksiyonu hatalı kod üretiyor.
Asm sini inceleyip bakabilirsiniz. Benim kullandığım versiyon
9.60 STD PL2
Belki bunlar üst versiyonlarda düzeltilmiş olabilir kullanan arkadaşlar varsa deneyebilirler. Hi-tech C den böyle basit handikaplar çıkması beni şaşırttı doğrusu...
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

CLR

Merhaba

Tamam, ben hep iki byte arasını düşündüğüm için hata oluyor, 16bit tanımlamak iki kez rlf komutu yazmak için geçerli yani iki byte arasında carry kullanmak için,

Çözüm: illa carry'yi kullanacaksan


unsigned int myreg;

       if(CARRY){
           myreg<<=1;   // sola 1 kez kaydır
           myreg+=1;    // carry'deki 1'i ekle
        }else
           myreg<<=1; // carry'deki 0'ı ekle
[code]
Knowledge and Experience are Power

XX_CİHAN_XX

Hocam evet bu yöntem sonuç verir ama performansı düşürür :(
Yani basit bir RLF komutu ve bunlardan bende peşi sıra olacak yani 1 değil birçok registeri farklı noktalarda bu şekilde kaydırdığım vakit verimsiz bir kod olacak.
Yani basit bir RLF işleminde Carry durumunu sorgulayıp ona göre kaydırma sonucuna ilave yapmak bana çok abes geliyor.
Bunun yerine ASM kullanarak yapmak çok daha mantıklı değil mi?
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.