Float noktadan sonra kaç hane alır

Başlatan baranekrem9, 26 Mart 2014, 23:25:29

baranekrem9

Merhaba baslıkta belırttıgım gıbı ds18b20 den okudum float tıpındekı sıcaklıgı dısplayde gostermek ıstıyorum int tipinde alıp 23'C gibi  yazdırıyorum fakat 4 lu dısplay ıle noktadan sonra 2 hane alarak bununda eklemek ıstıyorum yanı 23.12'C gibi bir değer yazdırmak istiyorum takıldıgım kısım şu
float temp; temp = ds18b20; burda float kaç basamaklaı olur fazla ise bunu nasıl xx,yz türünde aktarıp bu y ve zyı nasıl ayırabilirim biraz kafam karısıtı % ve / bolumunden kalan ve bolum ıle tam kısmını alıyorum ama ondalık kısım benı zorlardı yardımcı olursanız sevınırım .

Iyı çalışmalar.

zengar

float ondalik_kisim, tam_kisim;
int8 sonuc;

ondalik_kisim=modf(xx.yz,tam_kisim);//modf tam kısmı ve ondalık kısmı ayrı ayrı //değişkenlere aktarır
// ondalik_kisim= 0.yz ve tam_kisim= xx.00
0.yz*100=yz;
sonuc=fmod(yz,10);//yz 10'a bölünür ,sonuc  y olur
z=yz-(sonuc*10);//burdada z değerini bulmuş olduk

Böyle olması lazım.
ama tabi sensör virgülden sonra kaç dijit hassasiyeti var bilmek lazım.
Umarım yardımcı olmuşumdur. Dualarınızı beklerim
Selametle.

baranekrem9

Çok tesekkur ederim bu aksam bulduğum yöntemleri deniycem iyi çalışmalar dilerim

baranekrem9

Mucıt23 hocamın dedıgı bır yontemle yaptım fakat bır problem var sıcaklıgı alabılıyorum ama tam kısmını alabılırıyorum noktadan sonrakı 2 kısım 08 seklınde kalıyor kodlar asasagıda zaten projem bıtm uzere yardımcı olursanız sevınırım.


#include <16F88.h>
#FUSES NOWDT,XT,NOBROWNOUT,NOLVP,NOFCMEN
#use delay(clock=4000000)

#define digit_birdebirler  pin_A3
#define digit_ondabirler   pin_A2
#define digit_birler       pin_A1
#define digit_onlar        pin_A0

#include "ds18b20.c"

int sayac = 0,onlar = 0,birler = 0,bb = 0,ob = 0;
float temp;
const int digit[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

#int_timer0
void timer0_kesme()
{
   disable_interrupts(INT_TIMER0);
   switch(sayac)
   {
      case 0:
      output_low(digit_onlar);
      birler = (int)temp % 10;
      output_b(digit[birler]);
      output_high(digit_birler);
      sayac = 1;
      break;
     
      case 1:
      output_b(0x7F);
      sayac = 2;
      break;
     
      case 2:
      output_low(digit_birler);
      onlar = (int)temp / 10;
      output_b(digit[onlar]);
      output_high(digit_onlar);
      sayac = 3;
      break;
     
      case 3:
      output_low(digit_onlar);
      ob = (((int16)temp * 100) % 100) % 10;
      output_b(digit[ob]);
      output_high(digit_ondabirler);
      sayac = 4;
      break;
     
      case 4:
      output_low(digit_ondabirler);
      bb = (((int16)temp * 100) % 100) / 10;
      output_b(digit[bb]);
      output_high(digit_birdebirler);
      sayac = 0;
      break;
   }
   enable_interrupts(INT_TIMER0);
}

void main()
{
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(T0_INTERNAL | T0_DIV_16 );
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_CCP1(CCP_OFF);
   set_timer0(6);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);
   
   set_tris_a(0x00);
   set_tris_b(0x00);
   output_a(0x00);
   output_b(0x00);

   while(TRUE)
   {
      temp = ds1820_read();
   }
}


ds18b20 kutuphane


#define ONE_WIRE_PIN PIN_A4

void onewire_reset()
{
output_low(ONE_WIRE_PIN);
delay_us( 500 ); //1-wire resetleme için sıfıra çekilir
output_float(ONE_WIRE_PIN); //1-wire bir yapılır
delay_us( 500 ); // sensörün hazırlanması için beklenir.
output_float(ONE_WIRE_PIN);
}

void onewire_write(int data)
{
int count;
for (count=0; count<8; ++count)
{
output_low(ONE_WIRE_PIN);
delay_us( 2 ); // Sensöre yazma işlemine başlamak için  1-wire sıfıra çekilir.
output_bit(ONE_WIRE_PIN, shift_right(&data,1,0)); // yazılacak bilgi 1-wire'da
delay_us( 60 ); // Yazma işlemi zamanı doldurulur.
output_float(ONE_WIRE_PIN); // 1-wire bir yapılır,
delay_us( 2 ); // 1us'den fazla beklenir.
}
}

int onewire_read()
{
int count, data;
for (count=0; count<8; ++count)
{
output_low(ONE_WIRE_PIN);
delay_us( 2 ); //Sensördem okuma işlemi içinl 1-wire sıfıra çekilir.
output_float(ONE_WIRE_PIN); //1-wire bir yapılır,
delay_us( 8 ); // Sensörün kendine gelmesi beklenir,
shift_right(&data,1,input(ONE_WIRE_PIN)); // sonuc bilgisi alınır.
delay_us( 120 ); //Okuma işlemi zamanı doldurulur.
}
return( data );
}

float ds1820_read()
{
int8 busy=0, temp1, temp2;
signed int16 temp3;
float result;
onewire_reset();
onewire_write(0xCC);
onewire_write(0x44);
while (busy == 0)
busy = onewire_read();
onewire_reset();
onewire_write(0xCC);
onewire_write(0xBE);
temp1 = onewire_read();
temp2 = onewire_read();
temp3 = make16(temp2, temp1);
result = (float) temp3 / 16.0;//18b20 icin
//result = (float) temp3 / 2.0;//18s20 icin
delay_ms(200);
return(result);
}

baranekrem9

noktadan sonra 2 basamak hala gosteremedım 80 değerini gösteriyor sureklı yardımcı olurmusunuz ?

Tesla Coil

#5
Merhaba kardeşim. Eğer değişkenini "float" veya "double" komutuyla tanımladıysan ve sonuçlarının virgülden sonrası gözükmüyorsa sorunun bulduğun sonucu ekrana yazdırmada olabilirmi? Tamam işlemleri bilimsel olarak yapıyosun ama ekrana nası yazdırıyosun ? Ben printf ya da cout komutlarını kullanıyorum ama senin ekrana sonuçları nasıl yazdırdığını anlamadım. ? Fikir yürütüyorum sadece çok bilgili değilim.

         d : decimal (integer)
         u : unsigned decimal
         c : char (tek karakter)
         s : string
         e : float/double sayıyı bilimsel gösterimde yaz
         f : float/double sayıyı [-] mmm.nnnnn biçiminde yaz
        ld : long integer
        lu : unsigned long integer
        Le,Lf : long double

Powered by EzPortal