C Programlama diliyle şamatalar

Başlatan z, 23 Ekim 2011, 15:32:04

Mucit23

@Klein Hocam Öneriniz için teşekkür ederim. Yalnız CCS kullanıyorum. verdiğiniz Yapı ccs ile çalışacağını sanmıyorum.  :-[

@HasanKara Hocam Ben AsHeS35 in dediği mantık ile fonksiyon yazdım.

void ShiftLeft(int var1, int var2, int var3, int var4){
  unsigned int32 buffy=0;
  buffy=((((int32)var1<<24)+(int32)var2<<16)+(int32)var3<<8)+var4;
  buffy=buffy<<1;
  var5=((int32)buffy&0xFF000000)>>24;
  var6=((int32)buffy&0x00FF0000)>>16;
  var7=((int32)buffy&0x0000FF00)>>8;
  var8=((int32)buffy&0x000000FF);
}


4 byte ın 32 bitte birleştirme işlemi çalışıyor. Sorun 32biti tekrar eski  haline yani 4 adet 8 bite dönüştürme işleminde. Yukarıdaki Kodda Var8 ve Var7 den değer alıyorum. Yani ilk 16 bit bölünüyor fakat sonraki 16 bit bölünmüyor. Bunu çözersem hız sorununu büyük ihtimalle aşmış olacam. Çünkü Yukarıdaki fonksiyonun çalışma süresini ölçtüğümde işlemcinin fonksiyona girip çıkması tam olarak 8uS sürüyor.

32 bit değer 4 adet byte nasıl bölerim hızlı bir şekilde?

Kabil ATICI


bir değişken tanımla örneğin vart olsun
var8=((int32)buffy&0x000000FF);
vart=((int32)buffy)>>8;
var7=((int32)vart&0x000000FF);
vart=((int32)buffy)>>8;
var6=((int32)vart&0x000000FF);
vart=((int32)buffy)>>8;
var5=((int32)vart&0x000000FF);

sadece bir fikir.
ambar7

z

#542
%f tanimlayicisini kullanmayi bilmiyorum.

8 digitlik ekranim var. 2 bir ekranim da expont  gosterilebiliyor.

A double bir degisken

Ornegin;

Eger A icindeki sayi 1.2 e+7 ise 12000000 olarak ekranda gosterilsin.

Fakat A icindeki sayi 1.234567 e+8 ise ekranda gosterilecek deger 1234567  Exp 2 olsun.

Bunun icin %f nasil kullanilir?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

fatih6761

Alıntı yapılan: z - 20 Temmuz 2013, 15:43:24
%f tanimlayicisini kullanmayi bilmiyorum.

8 digitlik ekranim var. 2 bir ekranim da expont  gosterilebiliyor.

A double bir degisken

Ornegin;

Eger A icindeki sayi 1.2 e+7 ise 12000000 olarak ekranda gosterilsin.

Fakat A icindeki sayi 1.234567 e+8 ise ekranda gosterilecek deger 1234567  Exp 2 olsun.

Bunun icin %f nasil kullanilir?
Hocam %f format tanımlayıcıyla floating point sayıları doğrudan açarak gösterirsiniz. Üstel kısma bakılmaksızın sayının normal hali basılır. %e tanımlayıcısıyla sayı bilimsel gösterimle basılır. Burada da sayı 0.23 bile olsa 2.3e-1 olarak basılır. Sayının büyüklüğüne bakacak şekilde kendiniz bir printf fonksiyonu yazabilirsiniz. Ya da zor yoldan kendiniz bir fpu emülasyonu yapabilirsiniz. (C için konuşuyorum)

kantirici

#544
Bir iş ilanında şu ibareyi gördüm, "Ninja skills in C/C++ programming languages" .Sorum şu "- Ninja skills in C/C++" nedir? ne değildir? C de ne yapabilirsek mınçıka sahibi oluruz.

Mr.Java

Alıntı yapılan: kantirici - 22 Temmuz 2013, 21:23:26
Bir iş ilanında şu ibareyi gördüm, "Ninja skills in C/C++ programming languages" .Sorum şu "- Ninja skills in C/C++" nedir? ne değildir? C de ne yapabilirsek mınçıka sahibi oluruz.

;D ;D

yldzelektronik

#546
Selamlar.

Elimde şu şekilde bir fonksyionum var;
float   *nem =  0.0;
float   *isi = 0.0;


I2C_ERROR hyt271_get_measurements(float* humidity, float *temperature){

   unsigned int buffer[BUFFER_LEN];
   
   i2c_start(); 

   if(i2c_write(ADDR + I2CWrite)){
   
      printf("Sensore Erisim Basarisiz\n\r");
      i2c_stop(); 
      return I2C_BUS_ERROR;
   }
   else{
      printf("Erisim basarili\n\r");
      i2c_write(0x00);
   }     

   i2c_stop();
   
   delay_ms(CONV_DELAY);
   
   i2c_start();
   
   if(i2c_write(ADDR + I2CREAD)){                                                       
   
      printf("Sensorden Veri Okunama Basarisiz\n\r");
      I2C_Stop();                                                                         
      return I2C_BUS_ERROR;   
   }
   else{
          for(unsigned int i = 0;i<(_BUFFER_LEN );i++){
            buffer[i] = i2c_read();
          }
   }
   I2C_Stop();
   printf("I2C: Veri okunuyor\n\r");
   

   
   unsigned int16 rawhum = ((buffer[0]<<8 | buffer[1]) & 0x3FFF);
   *humidity = (100.0/16383.0*rawhum);
   unsigned int16 rawtemp = buffer[2]<<6 | (buffer[3] & 0x3F);
   *temperature = (165.0/16383.0*rawtemp) - 40.0;
   
   return I2C_ERROR_NONE;

}


Ben bu fonksiyona giriş parametresi olarak pointer mi girmeliyim?Yani isi ve nem i tanımlarken * koymadan tanımlasam da fonksiyona parametre olarak girsem?Bu iş nasıldır?Bir de derleyici ccs c nin ve orada yazdığı kadarıyla float unsupport. Ben double mı tanımlamalıyım değişkenleri mi?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

yamak

Hocam ilk parametreye değişkenin adresini girmelisiniz.
Örneğin
float nem,temp;

hyt271_get_measurement(&nem,temp)
{

}
şeklinde.
CCS yi daha önce hiç kullanmadığım için  bişey diyemeyecem.

Tagli

Fonksiyon dışındaki tanımlamaların float nem = 0.0; float isi = 0.0; gibi olması gerekir. Aslında ilk değer vermeye gerek de yok ama yine de vermek daha iyi. Fonksiyon çağrılırken de hyt271_get_measurements(&nem, &isi); şeklinde çağrılmalı. Tercihen dönüş değeri kontrol edilerek bir hata olup olmadığı anlaşılabilir ama "kendimi şanslı hissediyorum" dersen, fonksiyonun hatasız olarak çalıştığını varsayıp dönüş değerine bakmasan da olur. İşler yolunda gittiyse, nem ve isi değişkenleri sensörden gelen verilere göre güncellenmiş olacaktır.
Gökçe Tağlıoğlu

Mucit23

Merhabalar

Bir adet 64 elemanlı sabit bir dizim bir dizim var. Bu diziyi ramde tanımladığım yine 64 elemanlı başka bir diziye nasıl kopyalayabilirim.

yamak

Hocam memcpy komutunu kullanabilirsiniz.Bu komutu bi araştırın isterseniz.

Mucit23

Evet memcpy sanırım işimi görür. Teşekkürler

z

Objective C de;

A ve B double degiskenler.

B=0 iken A/B inf sonucu veriyor.

(long int) A / (long int) B sifir sonucunu veriyor. Sebebi hakkinda ne dusunuyorsunuz?

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

haydarpasamikro

Sıfıra bölme tanımsızdır. x/y = z ise ve ondalıklı bölmede kalanda w ise x= y.z + w yapar. y=0 ise o zaman sıkıntı.
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

z

B sifir oldugu halde neden (long int) A / (long int) B sonucu sifir cikiyor onu merak ediyorum. Aklima derleyicinin hatasi geliyor sadece.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com