Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Picproje Kütüphane (Library) => Konuyu başlatan: Erol YILMAZ - 31 Temmuz 2010, 10:06:03

Başlık: Karekök Bulmak: 16 bit Integer ile Çok Hızlı
Gönderen: Erol YILMAZ - 31 Temmuz 2010, 10:06:03
Karekökü;
Derleyicilerin, genel matematik fonksiyonları, Float sayılar ile çok uzun sürelerde hesaplayabilmektedir.

Oysa bize INTEGER ve hızlı sonuç veren bir fonksiyon lazım ise ( ki genelde bu lazımdır )
aşağıdaki fonksiyonu kullanabilirsiniz....

Tarafımdan Hi-tech PICC'de True RMS hesaplarında başarı ile kullanılmıştır.

Embedded Yazılım sektöründe kabul görmüş bir uygulamadır.

2MIPS, PIC16 ile 440 uS'de sonucu vermektedir.

#define SQRT_ROUND 0 -> yuvarlama YOK
#define SQRT_ROUND 1 -> yuvarlama VAR

NOT : Kullandığınız C derleyiciye göre Typedef ile 16 bitlik tamsayıları ayarlamanız gerekmektedir.


#define SQRT_ROUND   0

INT16U sqrt16(INT16U A)
{
   INT16U x_sh ;
   INT16U bit_sh ;
   INT16U trial ;
   
   bit_sh = 0x4000 ;
   x_sh = 0 ;
   
   while ( bit_sh != 0 )
   {
      trial = x_sh + bit_sh ;
      if ( trial <= A )
      {
         A -= trial ;
         x_sh = trial + bit_sh ;
      }
      x_sh >>= 1 ;
      bit_sh >>= 2 ;
   }
#if SQRT_ROUND
   if ( A > x_sh )
   {
      ++ x_sh ;
   }
#endif
   
   return ( x_sh ) ;
}
Başlık: Ynt: Karekök Bulmak: 16 bit Integer ile Çok Hızlı
Gönderen: Maxim - 31 Temmuz 2010, 14:37:04
bende aynı şeyi protonda test ettim  (Proton + )

proteus simulasyon (7.2 SP6)
16F628A
8 mhz
süre 127us çıkıyor.

kod basitçe şöyle :


Dim Sonuc As Word
Dim Sayi As Word
'
Sayi=15482
Sonuc = Sqr Sayi