S

7 segmentle eksi sıcaklık göstermeyi yapamadım

Başlatan semfero, 27 Aralık 2013, 20:09:57

semfero

Sayın Ete hocam,  sizden 7 segmentte eksi değerlerle sıcaklık ölçmede yardımcı olmanızı istiyorum.
sıcaklığı d18b20 ile ölçüyorum."0" dereceden aşağısını göremiyorum.Sizin bu konuda 7-8 tane yaptığınız çalışma var.Ama ccs c de yazılmadıkları için işi çözemedim.Aşağıda verdiğim kodlarda ne gibi değişiklik yapmalıyım.Ne olur yardımcı olunuz.Benim için çok gerekli bir çalışma.


#include <16f877.h>  
#device *=16
#device adc=10
#fuses XT,NOWDT,NOPROTECT   
#use delay (clock=20000000)                   
#include <ds18b20.c>                                       
               
char display1_onlar,display1_birler,temp; 
const int display_digit[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};  // ortak anotlu için             
float sicaklik; 
int i;
void sicaklik_tara()
{

output_d(0b00000100);       
output_b(display_digit[display1_onlar]);   
delay_ms(2);           
output_d(0b00001000);                   
output_b(display_digit[display1_birler]);     
delay_ms(2);               
output_d(0b00010000);
output_b(0x9c); // derece simgesi   
delay_ms(2);           
output_d(0b00100000);
output_b(0xc6); // C harfi   
delay_ms(2);
output_d(0b00000000);

}


//------- ana program ----------------------------------------------------------
void main ()                                 


setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);

setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);





   output_a(0x00);
   output_b(0x00);
   output_d(0x00); 
   delay_ms(2);
 
   while(1)               
   {
   sicaklik = ds1820_read();  //Sıcaklık bilgisi okunuyor ve çevriliyor
 
   temp = sicaklik;
        for(i=0;i<=100;i++){
       display1_birler=temp%10;
       display1_onlar=(temp/10)% 10;
       
       
       sicaklik_tara();
       delay_ms(2);
       }
       }                   
           
       
   }

semfero

Ete hocam nerdesin, bu konuda degerli yardımını bekliyorum. Saygilarimla.

Mucit23

Sıkıntının bu kodlarda olduğunu sanmıyorum.  Büyük ihtimal ds18b20.c de problem var. Onun içeriğini ekle bakalım.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Buralardayım ancak C dili elimi kolumu bağlıyor. Bir şey yapamıyorum. Sensör DS1820.  Bunun hesabı biraz daha zor. Neden DS18B20 değil. ?

Ete

Mucit23

Hocam yok Fonksiyon ds18b20 için yazılmış.

Ben şimdi isiste denedim.

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;   //Calculation for DS18S20 with 0.1 deg C resolution
 
delay_ms(200);
return(result);
}


ds1820_read()  fonksiyonunun içeriği bende böyle. Negatif sıcaklığada iniyor.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

kasner

d18b20 için

#define ONE_WIRE_PIN PIN_b3
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);
}



kartal_0689

#6
Arkadaşlar,

Daha yeni (-) sıcaklık gösteren devre yaptım. Amacım portatif olması ve anlık ölçmek için. Çok az akım sarfiyatı var.
Yazılımınıda veriyorum. MikroPascal ile yazdım.

Devre 4x7 segment ile taranarak yapıldı. Amacım aslında ölçülen en yüksek ve en düşük sıcaklıkları da kaydetmek olacaktı fakat işlerimden dolayı ilgilenemedim. Şu anda böyle iş görür.
Ben şu anda kullanıyorum kimsenin aklında soru işareti kalmasın.
Kolay Gelsin...

Software:
program TempMeasure;

{ Declarations section }

CONST
  SCREEN_REFRESH      = 50;              //Display Ekranı Taramı Süresi uS * dongu kadar


 
  TEMP_RESOLUTION : byte = 12; // 18S20: 9----18B20:12
  RES_SHIFT = TEMP_RESOLUTION - 8;




var
  Olculen_Deger_Analog               : Word;
  Hesaplanan_Deger                   : word;            //Hesaplanan Hesaplanan_Deger Degeri   Real


 
  Temp : word;
  SAYI              : array [0..10] of byte;    //Display numaraları
  Dig1              : byte;              //1.Digit Gösterge Değişkeni
  Dig2              : byte;              //2.Digit Gösterge Değişkeni
  Dig3              : byte;             //3.Digit Gösterge Değişkeni
  Dig4              : byte;              //4.Digit Gösterge Değişkeni



  Digit_Ayir        : word; //Real
 
  temp_real1        : real;

  TEMP_WORD1        : word;
  TEMP_WORD2        : word;              //temp_word2 değişkeni
  TEMP_WORD3        : word;              //temp_word4 değişkeni

  TEMP_WORD4        : word;              //temp_word4 değişkeni
  TEMP_WORD5        : word;              //temp_word2 değişkeni
  TEMP_WORD6        : word;              //Olculen_Toplam değişkeni
  TEMP_WORD7        : word;              //temp_word4 değişkeni

  Temp_Byte1        : byte;              //temp_byte değişkeni
  Temp_Byte2        : byte;              //temp_byte değişkeni
  Temp_Byte3        : byte;              //temp_byte2 değişkeni
  Temp_Byte4        : byte;              //temp_byte3 değişkeni
  Temp_Byte5        : byte;              //temp_byte3 değişkeni
  Temp_Byte6        : byte;              //temp_byte3 değişkeni
  Temp_Byte7        : byte;              //temp_byte3 değişkeni
  Temp_Byte8        : byte;              //temp_byte3 değişkeni
  Temp_Byte9        : byte;              //temp_byte3 değişkeni


  Sign : Byte;



  Seg1        : sbit at RA0_bit;
  Seg2        : sbit at RA1_bit;
  Seg3        : sbit at RA2_bit;
  Seg4        : sbit at RA3_bit;

  //UpButton    : sbit at RA0_bit;
  //SetButton   : sbit at RA1_bit;
  //DownButton  : sbit at RA2_bit;

//------------------------------------------------------------------------------
Procedure Start_Register_Config;
  begin


       ADCON1 := %00000110;

       TRISA := 0xFF;
       TRISB := 0xFF;
       TRISC := 0xFF;
       //TRISD := 0xFF;
       TRISE := 0xFF;
       
       Delay_10ms;
       
       TRISA := %00000000;
       LATD := 0x00;
       TRISB := 0x00;
       
       Delay_10ms;
       
       PORTA := 0x00;
       PORTB := 0x00;
       PORTC := 0x00;
       PORTD := 0x00;
       PORTE := 0x00;

       Delay_10ms;
       

       Dig1   := 0x00;
       Dig2   := 0x00;
       Dig3   := 0x00;
       Dig4   := 0x00;
       SEG1   := 1;
       SEG2   := 1;
       SEG3   := 1;
       SEG4   := 1;

       Temp_Byte1            := 0;

       
       SAYI[0] := 0xC0 ; // Number 0
       SAYI[1] := 0xF9 ; // Number 1
       SAYI[2] := 0xA4 ; // Number 2
       SAYI[3] := 0xB0 ; // Number 3
       SAYI[4] := 0x99 ; // Number 4
       SAYI[5] := 0x92 ; // Number 5
       SAYI[6] := 0x82 ; // Number 6
       SAYI[7] := 0xF8 ; // Number 7
       SAYI[8] := 0x80 ; // Number 8
       SAYI[9] := 0x90 ; // Number 9
       SAYI[10]:= 0x7F ; // Dot leds
 
  end;
//------------------------------------------------------------------------------
Procedure Time_Screen_Refresh;     //Screen_Refresh value subprog.
Begin
  for Temp_Byte1:=1 to 30 do
  begin
    Delay_Us(SCREEN_REFRESH);
  end;
End;
////////////////////////////////////////////////////////////////////////////////
Procedure Digit_Goster;
  begin
       PORTB := dig4; Seg1:=0; Time_Screen_Refresh; Seg1:=1; delay_us(10);
       PORTB := Dig3; SEG4:=0; time_Screen_Refresh; SEG4:=1; delay_us(10);
       
       PORTB := Dig2; SEG2:=0; time_Screen_Refresh; SEG2:=1; delay_us(10);
       PORTB := Dig1; SEG3:=0; time_Screen_Refresh; SEG3:=1; delay_us(10);
       PORTB := 0x7F; SEG3:=0; Time_Screen_Refresh; SEG3:=1; Delay_us(10);
       
  end;
//------------------------------------------------------------------------------
procedure Display_Temperature( temp2write : word );
const RES_SHIFT = TEMP_RESOLUTION - 8;

var temp_whole : byte;
    temp_fraction : word;

  begin
    //text := '000.0000';
    // Check if temperature is negative
    if (temp2write and 0x8000) then
      begin
        PORTB := 0xBF; SEG1:=0; Time_Screen_Refresh; SEG1:=1; Delay_us(10);
        temp2write := not temp2write + 1;
      end;


    // Extract temp_whole
    temp_whole := word(temp2write shr RES_SHIFT);

    // Convert temp_whole to characters
     if ( temp_whole div 100 ) then
       begin
            Temp_byte1 := temp_whole div 100;
            Temp_byte2 := lo(temp_byte1);
            dig4       := SAYI[Temp_byte2];
       end
    else
       dig4       := 255;//SAYI[0];

    Temp_Byte3 := (temp_whole div 10)mod 10;      // Extract tens digit
    Temp_byte4 := lo(temp_byte3);
    dig2       := SAYI[Temp_byte4];
   
    Temp_Byte5 := (temp_whole mod 10);           // Extract ones digit
    Temp_byte6 := lo(temp_byte5);
    dig1       := SAYI[Temp_byte6];
   

    // Extract temp_fraction and convert it to unsigned int
    temp_fraction  :=  word(temp2write shl (4-RES_SHIFT));
    temp_fraction  := temp_fraction and 0x000F;
    temp_fraction  := temp_fraction * 625;
   
    Temp_word1 := word(temp_fraction div 1000);         // Extract thousands digit
    Temp_byte8 := lo(TEMP_WORD1);
    dig3       := SAYI[Temp_byte8];


  end;

begin
  { Main program }

  Delay_ms(10); //Açılışta 10ms bekle
 
  Start_Register_Config; // Ayarları yükle
 
  while (true) do
    begin

      //--- Perform temperature reading
      Ow_Reset(PORTE, 0);                                    // Onewire reset signal
      Ow_Write(PORTE, 0, 0xCC);                              // Issue command SKIP_ROM
      Ow_Write(PORTE, 0, 0x44);                              // Issue command CONVERT_T
      Delay_us(120);

      Ow_Reset(PORTE, 0);
      Ow_Write(PORTE, 0, 0xCC);                              // Issue command SKIP_ROM
      Ow_Write(PORTE, 0, 0xBE);                              // Issue command READ_SCRATCHPAD

      temp :=  Ow_Read(PORTE, 0);
      temp := (Ow_Read(PORTE, 0) shl 8) + temp;

      Display_Temperature(temp);

      Digit_Goster;

    end;
 
end.


Hardware:


TURKEY/ANK

Powered by EzPortal