Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

Float değerlerde bir sorun var

Başlatan baran123, 28 Mart 2014, 01:22:16

baran123

Merhaba uzun zamandır ugrastıgım ds18b20 ile 4x7 seg ortak anot displayde 25,68 gibi bir sıcaklık degerini göstermek istiyorum topladıgım bılgıler ve burdan ytardım eden arkadaslarla bır seyler yaptım fakat bır yerde takıldım hala cozemıyorum noktadan sonra 2 degerı dısplaylere yazdıramıyorum surekli 25.08 gibi 08 değeri hep kalıyor tam kısmında sorun yok yanı ondalık kısım sureklı 08 seklınde kalıyor tahmınen 18b20 nın kutuphanesınden ve ayırma ıslemınde kaynaklanan bır problem gıbı kodlar assagıda yardımcı olursanız sevınırım ıyı calısmalar

#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 kutuphanem
#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);
}