CCS'de sin ve cos hesaplama sorunu ???

Başlatan YARGICH, 07 Mayıs 2009, 04:15:32

YARGICH

Merhaba,

    Arkdaşlar CCS de (Kullandığım işlemci 18F452) cos ve sin hesabı yaparken şöyle bir sorunla karşılaştım. Mesela cos veya sin için bazı değerlerde her ölçümde farklı bir sonuç üretiyor ve bu ürettiği farklı sonuç sayısı genelde iki. Ayrıca bu sonuçlardan bir tanesi doğru sonuç. Aşağıdaki örnekte kullanacağım değerler radyandır.

Örneğin;

   Sin(0,987) için  Hesaplanan değer = 0,834
                          PIC ile hesaplanan = 0,83 ve 0,77 değerleri.
   Yukarıdaki işlemi her çalıştırdığımda bu iki değerden birini hesaplıyor.

   Ancak Sin(0,650) için  her seferinde doğru sonuç üretiyor.

Başka bir Örnek,

   Cos(0,987) için Hesaplanan değer = 0,551
                          PIC ile hesaplanan = 0,55 ve 0,88 değerleri
   Yuakarıdaki işlemi de her çalıştırdığımda bu iki sonucu üretiyor.
   
   Ancak Cos(0,237) için her seferinde doğru sonucu üretiyor.


  Bu arada bu denemeyi yaparken kullandığım değişkenlerin tamamını rezerve ederek kullandım ki CCS o alanları bozmasın diye ama, artık kendi math kütüphanesinde mi bir sorunla karşılaşıyorum bilmiyorum.

Yukarıdaki gibi bir sorunlar karşılaşan var mı veya herhangi bir fikri olan var mı?


Teşekkürler, İyi çalışmalar
Uçurtmalar, rüzgarın kuvvetiyle değil, rüzgara karşı koydukları direnç ile yükselirler.

ahmet2004

Örnek kod verebilirmisiniz?

Hesaplamalarda sorun göremedim ben?

YARGICH

Aslında kodda birşey yok, sadece ondalıklı sayıyı benim istediğim şekilde integer hale getiriyor. Burda sorun olduğunu düşünmüyorum zaten gönderdiğim ondalıklı sayıyı doğru alarak test etmiş oldum.

Burda değişkenleri fonksiyona göndermek istemememin sebebi, sonucun hatalı ölçülmesinden sonra huylandığım için, değişkenleri tanımladıktan sonra #locate ile C nin bu değişkenlere yanlışlıkla karışmasını önlemek istedim. Gerçi zaten karışmıyormuş bir değişiklik olmadı. Tekrar eski haline getirme gereği de duymadım.

void main (void) {
while(true) {

   Float_G = cos(0.987); 
   Float_to_Int();
 
   itoa(Tam_G,10,sayi_string); Lcd_String_Yaz(Tam_G);Lcd_yaz(".");
   itoa(Ondalik_G,10,sayi_string); Lcd_String_Yaz(Ondalik_G);

}}

//##############################################################################
//                           Float to Int
//##############################################################################
void Float_to_Int(){

   Ondalik_F_G = modf(Float_G, &Tam_I_G);
   Ondalik_F_G = Ondalik_F_G * 100;
   Kusur_F_G = modf(Ondalik_F_G, &Ondalik_I_G);   
   if (Kusur_F_G > 0.5) { Ondalik_I_G = Ondalik_I_G + 1.0; }
   
   Tam_G   = (int)Tam_I_G;
   Ondalik_G = (int)Ondalik_I_G;
   
}// Float_to_Int
Uçurtmalar, rüzgarın kuvvetiyle değil, rüzgara karşı koydukları direnç ile yükselirler.