7 Segment termometrede küsüratı yazdıramıyorum

Başlatan er-da, 13 Ocak 2022, 12:12:33

er-da

merhabalar elimde olan DS1820 (18B  18s değil)senörle termometre yapmak istedim ETE hocanın termometre projesine göre proton help 1-Wire sayfalarından aldığım ds1820  okuma kodlarını yerleştirdim 16F84 kullandım
10/1 hassasiyetindeki sensörün yalnızca tam sayıları yazdırabildim .similasyonda ve gerçek devrede resimdeki hatayı da veriyor hata sırasında başka rakamlar yazdırıp kayboluyor ekteki dosyada hepsi var.simulasyonda  1820 model dosyası olmadığından 1822 kullandım alakasız değer gösteriyor ama gerçek devrede doğru.şimdiden teşekkürler

ete

Hesapladığın sıcaklık normal şartlarda sıcaklığın 100 ile çarpılmış hali.
Yani diyelimki ortam sıcaklığı 25,6 derece sen bunu 2560 olarak hesaplıyorsun.
Bu durumda sıcaklık değeri olarak elinde 2560 mevcut deyip bu örnek üzerinden ondalık işinin nasıl yapılacağını anlatayım.
Bu arada bu sensör DS18S20 ile aynı özelliklere sahip. Sİmulasyonda 18S20 yi kullanırsan doğru sonuç okuyabilirsin diye düşünüyorum

Elindeki sayı 2560 olduğuna göre; ve sen virgülden sonra tek hane ondalık gösterecek isen elindeki sayıyı önce 10 a bölmelisin. Böylece 2560 olan sayın 256 haline gelecektir. Bu aşamadan sonra
- TEMP= Dig ISI ,0:GoSub AL:ondalık=SAYI ,işleminde TEMP=6 değerini bulacaktır.
- TEMP= Dig ISI ,1:GoSub AL:birler=SAYI, işleminde TEMP=5 değerini bulacaktır.
- TEMP= Dig ISI ,2:GoSub AL:onlar=SAYI , işleminde TEMP=2 değerini bulacaktır.

Programa baktığımız da ;
ISI=(ISI/100)-4  komut satırının yanlış olduğunu elindeki sayıyı direk 100 e bölerek ondalık kısmını kaybettiğini söyleyebilirim. Bu nedenle bu satırı şu şekilde yap;
ISI=(ISI/10)  , sıcaklıktan 4 sayısını çıkartarak okunan sıcaklığı 4 derece azaltıyorsun. BUnu neden yapıyorsun bilmiyorum. Belkide okunan sıcaklık gerçek sıcaklıktan 4 derece fazla geliyordur. Neyse bunu şimdilik iptal ediyorum. Ancak şayet böyle bir şeyi illa yapmak istersen yeni formülde şöyle yapman gerekir. ISI=(ISI/4)-40

Bunları yaparsan elinde Ondalık , birler ve onlar hanelerine ait sayılar olacak. Bunları ekrana vereceksin. Ancak elinde 3 digit sayı va riken 7segment displayin 4 digit olarak çalışıyor.
En iyisi sen onu 3 digit olarak kullan. Bunun için programın hesapla kısmında kesme sonuna kadar olan kısmını yeniden düzenleyerek aşağıda veriyorum

 hesapla:
    
       ISI= (((HAM >> 1) * 100) - 25) + (((CPerD - C) * 100) / CPerD)              
      
      ISI=(ISI/10)-40 
                                                                 
        TEMP= Dig ISI ,0:GoSub AL:ONDALIK=SAYI
        TEMP= Dig ISI ,1:GoSub AL:BIRLER=SAYI 
        TEMP= Dig ISI ,2:GoSub AL:ONLAR=SAYI    

        Return    
        
    AL:
    SAYI=LookUp TEMP,[238,130,220,214,178,118,126,194,254,246]'[63,6,91,79,102,109,125,7,127,111,99,57]',SAYI    
    Return
'    Disable
    KESME:
           Context Save                         
   
    	   If SIRA=0 Then		
    	     DIGIT2= 0
    	     PORTB=ONDALIK 
    	     DIGIT4=1
    	   EndIf
    	  
    	   If SIRA=1 Then		
    	     DIGIT4= 0
    	     PORTB=BIRLER + 1 
    	     DIGIT3=1 
    	   EndIf	  
    	  
    	   If SIRA=2 Then
    	     DIGIT3=0            
             PORTB=ONLAR 
             DIGIT2=1
           EndIf
          
          SIRA=SIRA+1:If SIRA=3 Then SIRA=0				   	
       	  TMR0= 0
          INTCON.2=0    			
'          Resume		
'    	  Enable	
 Context Restore
 
  End		       

Ete

NOT: Çok merak ettim o displayin 7 segment bağlantılarını neden öyle çorba gibi yaptın.?
Anlamsız bir bağlantı şekli normalde sıralı (A pini PORTB.0 a ve snrası sırası ile bağlanıp DP pini PORTB.7 ye) bağlanır. Sen bu hatayı Lookup tablosu ile düzeltmişsin ama gerçekten çok anlamsız işin kolayı var iken zorunu yapmışsın.

er-da

çok teşekkürler hocam  çok güzel ve de kıpraşmadan çalışıyor.iyiki bu forum ve siz varsınız..

er-da

#3
Alıntı yapılan: ete - 13 Ocak 2022, 14:11:31NOT: Çok merak ettim o displayin 7 segment bağlantılarını neden öyle çorba gibi yaptın.?
Anlamsız bir bağlantı şekli normalde sıralı (A pini PORTB.0 a ve snrası sırası ile bağlanıp DP pini PORTB.7 ye) bağlanır. Sen bu hatayı Lookup tablosu ile düzeltmişsin ama gerçekten çok anlamsız işin kolayı var iken zorunu yapmışsın.

elimde önceden frekanmetre yaptığım hazır dizili pcb vardı ona göre yaptım

ete

Digitleri 1 hane sola kaydırıp son digitde derece işareti gösterebilir yada C harfi gösterebilirsin. Bu arada daha önce denemiştim derece işareti daha iyi duruyor.
Şayet denemek istersen yanlızca kesme kısmını aşağıdaki şekilde değiştirebilirsin.
Disable
KESME:
          If SIRA=0 Then		
    	     DIGIT1= 0
    	     PORTB=240 '108
    	     DIGIT4=1
    	   EndIf            
           
          If SIRA=1 Then		
    	     DIGIT4= 0
    	     PORTB=ONDALIK 
    	     DIGIT3=1
    	   EndIf
    	  
    	   If SIRA=2 Then		
    	     DIGIT3= 0
    	     PORTB=BIRLER + 1 
    	     DIGIT2=1 
    	   EndIf	  
    	  
    	   If SIRA=3 Then
    	     DIGIT2=0            
             PORTB=ONLAR 
             DIGIT1=1
           EndIf
          
          SIRA=SIRA+1:If SIRA=4 Then SIRA=0				   	
       	  TMR0= 0
          INTCON.2=0    			
          Resume		
    	  Enable	

 
  End
Ete

er-da

 değişikliği yaptım hocam  daha güzel oldu.arada bir resimdeki gibi ekran değişiyor HAM 65535 oluyor

ete

Programda REPEAT komutundan sonra yer alan DELAYms100 gecikmesini kaldır. Bu gecikme senkronu bozabilir.

Ete

er-da

yaptım.şimi yine yapıyor ama ekranda kalma süresi kısalıdı gösterip kayboluyor ufak kıpraşmalar var  proteusta  aynı gerçekte de aynı belirti var.böyle de kalabilir sakıncası yok

er-da

termometrenin kutulanmış hali. sensörü kutu dışına gelecek  şekilde  bıraktım  displayın önüne füme  plasik kullandım . ısıtılmayan odada çektim 13,5 derce. teşekkürler ETE hocam

Powered by EzPortal