Ynt: 7segmentte sıcaklığın eksi değerini okutamıyorum.

Başlatan Recep METE, 26 Aralık 2013, 22:47:40

Recep METE

Alıntı yapılan: xoom - 31 Aralık 2013, 10:40:55
Son şema ve güncel kodlarını ekle - işareti kısmını tamamlayalım.

Hocam yardımını merakla bekliyorum.İyi yıllar dilerim.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

xoom

Cepten yanıtlıyorum denemedim ama çalışıcaktır. bilgi verirsin. Olmazsa pc'ye geçince yine bakarım.

if (bit_test(okunansicaklik,11))  //12.bit kontrol ediliyor.
               {  
   
               okunansicaklik= ~okunansicaklik+ 1 ; // Tümleyeni alınıyor.
               output_d(0x03); output_b(0x3F ); // - işareti   
               delay_ms(2);
        
               } 
      }

Recep METE

Hocam gösterdiğiniz şekilde program çok güzel çalıştı.Çok teşekkür ederim.Ancak  şöyle bir sorun var.Rakamlar hızlı bir şekilde gelip gidiyor.Sabit olarak durmuyor.Bu sorunun çözümü için önerileriniz neler olabilir acaba.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

Kabil ATICI

Devre üstünde mi Isis üstünde mi?
Isis üstünde ise; direnç gibi elemanları analog değil de dijital olarak ata. (Edit Companent'deki Model type:)

ambar7

Recep METE

Alıntı yapılan: ambar7 - 01 Ocak 2014, 22:39:37
Devre üstünde mi Isis üstünde mi?
Isis üstünde ise; direnç gibi elemanları analog değil de dijital olarak ata. (Edit Companent'deki Model type:)



Hocam maalesef düzelmiyor.Başka çaresi yok mu acaba?
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

Kabil ATICI

fuse bölümüne kontrol et.
20MHz kristal yazmışsın ama XT ile işlem yaptırmaya çalışıyorsun?
ambar7

Recep METE

Arkadaşlar çalışan simülasyonda eksi sıcaklığın  göstergesi sürekli yanıp sönüyor.Sabit durmuyor.Program üzerinde çok denemeler yaptım ama düzeltemedim.Bu sorunu çözmemde yardımlarınızı bekliyorum.


http://youtu.be/kjK_pXhQ5Yk
%100 %100 Ekle İptal 
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

xoom

En güncel kodlarını mesajlarına ekleyerek yardım istemelisin. Yoksa onun neden yanıp söndüğünü tahminde bulunabilir. Kodları eklemeyi unutma.

Recep METE

#38
Alıntı yapılan: xoom - 04 Ocak 2014, 17:56:34
En güncel kodlarını mesajlarına ekleyerek yardım istemelisin. Yoksa onun neden yanıp söndüğünü tahminde bulunabilir. Kodları eklemeyi unutma.

Hocam size özel mesajla güncel kodları göndermiştim.Herhalde ulaşmadı size.

mesaj birleştirme:: 04 Ocak 2014, 19:10:30

Arkadaşlar güncel kdları gönderiyorum

                
#include <16f877.h> 
#fuses XT,NOWDT,NOPROTECT 
#use delay (clock=20000000)                             
char display1_onlar,display1_birler;  
const int display_digit[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,};  // ortak anotlu için   
int i;
int16 okunansicaklik;
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);

   }      
   
 
#include <ds18b20.c> 
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)                
   {
   
   okunansicaklik = ds1820_read();  //Sıcaklık bilgisi okunuyor ve çevriliyor

   if(okunansicaklik==85)
   okunansicaklik=0;

      for(i=0;i<=10;i++) {
       display1_birler=okunansicaklik%10;
       display1_onlar=(okunansicaklik/10)% 10;
 
if (bit_test(okunansicaklik,11))  //12.bit kontrol ediliyor.
  
 { 
okunansicaklik= ~okunansicaklik+ 1 ; // Tümleyeni alınıyor.
   
 
 
output_d(0x02);
output_b(0x3f);  
delay_ms(2);

   } 
   
      }}

      }



Arkadaşlar buda ds18b20 değiştirilmiş kütüphanesi




#define ONE_WIRE_PIN PIN_a3  // Burası istenilen pin seçilebilir.
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();sicaklik_tara();}
onewire_reset();
onewire_write(0xCC);
onewire_write(0xBE);
temp1 = onewire_read();
temp2 = onewire_read();
temp3 = make16(temp2, temp1);
result = (float) temp3 / 16.0;
for(int i=0;i<25;i++)
{sicaklik_tara();}
return(result);
}


Buda  İSİS şeması:


http://s3.dosya.tc/server15/heYN1k/7segmentds18b20.rar.html
Arkadaşlar  yardımlarınızı bekliyorum.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

Kabil ATICI

gerçek devre üzerinde denedin mi? Bilmiyorum.
Buradaki yanıp sönme isis dirençlerin analog seçilmesinden kaynaklanıyor.
Ama sen devren çalıştığı için dirençleri analog seçmişsin. (çünkü dirençleri dijital seçtiğin zaman simülasyonun çalışmıyor)
Led gösterim konusunda bazen sıkıntı yapabiliyor. Bu da gerçek zamanlı simülasyon konusundan isis yükün bilgisayarın kaldıramamasından kaynaklanıyor. (sarı renkli uyarı işareti) (elemanların analog seçilmesi simülasyonu yavaşlatıyor)
Bilemiyorum denemek lazım belki gerçek devre üzerinde çalışabilir.
ambar7

selimkoc

Programda mantıksal hatalar var.

Öncelikle algoritma çıkartılmalı. Program çözümü böyle olmaz. Arkadaşların yardımı ve verdiği linkler incelenmemiş. Hala havanda su dövüyoruz.

Algoritma mantığı;

1- Sıcaklığı oku (LBS ve MSB byte cinsinden).
2- LSB ve MSB'yi int cinsinden yani 2 byte olarak birleştir.
3- İşaret bitini kontrol et(16-bitlik bilginin 15. biti yani en değerlikli biti)
4. Eğer işaret - ise yani 15.bit 1 ise 2'ye tümleyenini al. ve bir bayrak kaldır.
5. Display digitlerine kod yüklerken bayrak kalkık ise eksi değerini yani sadece g segmentini kodla.

Yine incelemen için linkler veriyorum. Ama incele lütfen...

http://elektrokod.wordpress.com/2014/01/03/7-segment-sayici-counter-0-99/

http://elektrokod.wordpress.com/2013/12/31/7-segment-sayici-0-9/

http://elektrokod.wordpress.com/2013/12/28/negatif-sicaklik-gosterebilen-lcd-termometre/