Lm35 ısı sensörü kullanımı

Başlatan Mucit23, 22 Kasım 2010, 12:41:45

Mucit23

Merhaba arkadaşlar.
Arkadaşlar kendim multiplex sistemli bir saat ve termometre yapmaya çalışıyorum. Saat kısmında sorun yok fakat ısı ölçerken sorun yaşıyorum. Bu arada ısı sensörü olarakda lm35 kullanmayı düşünüyorum. Daha önce bu sensörle hiç çalışmadım tecrübe olur bana. Devrede şöyle bir sorun var adc ile sensörde okuma yapamıyorum. Yani yapıyorum fakat displaylerde 00 derece gösteriyor herzaman. Adc ölçümünde kullandığım kodlar aşağıdaki gibi yine forumda başka bir arkadaştan aldım.
ADCIN 0,HAM
IF ADCON0.2=1 THEN basla
ISI=(5*HAM)-(5*HAM/64)-(5*HAM/128)
ISI=ISI/10

Kodlarda bi sorun yok gibi çünkü başka bi devrede sadece 2x16lcd ve 16f877 ile ölçüm yapıp ekranda rahatlıkla gösterebiliyorum. Sorun gözükmüyor. Ama benim kullandığım devrede çalıştıramadım. Ayrıca saat devresinde ısı değerine kendim bir değer veriyorum (örnek ISI=23 gibi) ekranda gösteriyor. Ama kendisi ölçtüğü zaman ekranda 00 derece gibi bir değer gösteriyor. Acaba nerede sorun olabilir anlayamadım ben çeştli kodlarla denedim yine aynı şekilde
yazdığım deneme programı aşağıdaki gibidir. (programın bazı bölümleri Ete hocanın kodlarıdır.)
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2010 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 20.11.2010                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
DEFINE OSC 4

@ DEVICE pic16F873
@ DEVICE pic16F873, WDT_on
@ DEVICE pic16F873, PWRT_ON
@ DEVICE pic16F873, PROTECT_OFF
@ DEVICE pic16F873, XT_OSC

TRISA=%00000001
TRISB=%00000111
TRISC=%00000000
PORTA=0:PORTB=0:PORTC=0

ADCON1=%10001110
OPTION_REG=%10000100
INTCON=%10100000
TMR0=99
ON INTERRUPT GoTo KESME 

RTC_RST     var     PORTB.2
RTC_CLK     var     PORTB.1
RTC_DTA     var     PORTB.0
SH_CLK      VAR     PORTB.4
SH_DTA      VAR     PORTB.3
SH_KLT      VAR     PORTB.5

SYMBOL DIG0=PORTC.0
SYMBOL DIG1=PORTC.1
SYMBOL DIG2=PORTC.2
SYMBOL DIG3=PORTC.3
SYMBOL DIG4=PORTC.4
SYMBOL DIG5=PORTC.5
SYMBOL LED =PORTB.7

SYMBOL YUKARI=PORTA.1
SYMBOL ASAGI=PORTA.2

HAM         VAR	WORD        ' Sensör HAM okuma değeri
ISI         VAR WORD
ZAM         VAR WORD
EKRAN_ZAM VAR BYTE
EKRAN_ISI VAR BYTE
SN      VAR  BYTE
DAK     VAR  BYTE
SAAT    VAR  BYTE
GUN     VAR  BYTE
AY      VAR  BYTE
YIL     VAR  BYTE
HAFTA   VAR  BYTE
MEM     VAR  BYTE
ONLAR   VAR  BYTE
BIRLER  VAR  BYTE
SAYAC   VAR  BYTE
SAYI    VAR  BYTE
SIRA    VAR  BYTE
Z       VAR  BYTE
Y       VAR  BYTE
SUM     VAR  BYTE
SNY     VAR  BIT
ESN     VAR  BYTE
AKTAR1  VAR  BYTE
AKTAR2  VAR  BYTE
AKTAR3  VAR  BYTE
AKTAR4  VAR  BYTE
AKTAR5  VAR  BYTE
AKTAR6  VAR  BYTE
SNY=0
EKRAN_ZAM=10
EKRAN_ISI=5
SUM=EKRAN_ISI+EKRAN_ZAM
HIGH LED
GOSUB EKRAN0
GOSUB SENSOR_OKU
GOSUB ZAMAN_OKU
ESN=SN

BASLA:
GOSUB ZAMAN_OKU
IF SAYAC=80 THEN LOW LED

      IF Y=SUM THEN Y=0
      IF Y>(EKRAN_ZAM) AND Y<SUM THEN
       IF Y=(EKRAN_ZAM+1) THEN GOSUB SENSOR_OKU
       SNY=1
       GOSUB EKRAN1
      ENDIF
      IF ESN=SN THEN ATLA
      Y=Y+1 : ESN=SN : SAYAC=0
      IF Y<=EKRAN_ZAM THEN 
        HIGH LED
        SNY=0
        GOSUB EKRAN0
      ENDIF 
ATLA:


GOTO BASLA

AL:    LOOKUP Z,[63,6,91,79,102,109,125,7,127,111,99,57,64],SAYI :RETURN 

EKRAN0:
Z=SN   DIG 0:GOSUB AL :AKTAR1= SAYI
Z=SN   DIG 1:GOSUB AL :AKTAR2= SAYI
Z=dak  DIG 0:GOSUB AL :AKTAR3= SAYI  
Z=dak  DIG 1:GOSUB AL :AKTAR4= SAYI   
Z=SAAT DIG 0:GOSUB AL :AKTAR5= SAYI
Z=SAAT DIG 1:GOSUB AL :AKTAR6= SAYI
RETURN

EKRAN1:
Z=11:GOSUB AL:AKTAR1=SAYI
Z=10:GOSUB AL:AKTAR2=SAYI
Z=ISI DIG 0:GOSUB AL:AKTAR3=SAYI
Z=ISI DIG 1:GOSUB AL:AKTAR4=SAYI
AKTAR5=0
AKTAR6=0
RETURN

SENSOR_OKU:
ADCIN 0,HAM
IF ADCON0.2=1 THEN SENSOR_OKU
ISI=(5*HAM)-(5*HAM/64)-(5*HAM/128)
ISI=ISI/10
RETURN 

ZAMAN_OKU:
    high RTC_RST:OUTPUT RTC_DTA
shiftout RTC_DTA, RTC_CLK, 0, [$BF]:INPUT RTC_DTA
SHIFTIN RTC_DTA, RTC_CLK, 1, [SN, DAK, SAAT,GUN , AY, HAFTA, YIL, MEM]  'OKU
         MEM=SN:GOSUB CEVIR:SN=SAYI
         MEM=DAK:GOSUB CEVIR:DAK=SAYI
         MEM=SAAT:GOSUB CEVIR:SAAT=SAYI
         MEM=GUN:GOSUB CEVIR:GUN=SAYI
         MEM=AY:GOSUB CEVIR:AY=SAYI
         MEM=YIL:GOSUB CEVIR:YIL=SAYI
         MEM=HAFTA:GOSUB CEVIR:HAFTA=SAYI
     low RTC_RST 
  return
ZAMAN_YAZ:
         MEM=sn:gosub TERSCEVIR:sn=SAYI
         MEM=DAK:gosub TERSCEVIR:DAK=SAYI
         MEM=SAAT:gosub TERSCEVIR:SAAT=SAYI
         MEM=GUN:gosub TERSCEVIR:GUN=SAYI
         MEM=AY:gosub TERSCEVIR:AY=SAYI
         MEM=YIL:gosub TERSCEVIR:YIL=SAYI
         MEM=HAFTA:GOSUB TERSCEVIR:HAFTA=SAYI
    high  RTC_RST
SHIFTOUT RTC_DTA, RTC_CLK, 0, [$8E, 0]    'WRT Protek açıldı
     low RTC_RST:PAUSEUS 10 
    high RTC_RST          
SHIFTOUT RTC_DTA, RTC_CLK, 0, [$BE, SN, DAK, SAAT,GUN , AY, HAFTA, YIL, 128]  'YAZ
     low RTC_RST
 PAUSEUS 10
  return
CEVIR:
         ONLAR=MEM & %01110000
         ONLAR=ONLAR>>4
         BIRLER=MEM & %00001111
         SAYI=ONLAR*10+BIRLER
  return
TERSCEVIR:
         ONLAR=MEM DIG 1
         ONLAR=ONLAR<<4
         BIRLER=MEM DIG 0
         SAYI=ONLAR+BIRLER
  return


DISABLE
KESME: 
          SIRA=SIRA+1
       IF SIRA>5 then 
          SIRA=0
       ENDIF
SAYAC=SAYAC+1
''''''''''''''''''''''''''''       
  IF SIRA=0 then
  DIG5=0
  pauseus 1
  SHIFTOUT SH_DTA,SH_CLK,1,[AKTAR1]
  DIG0=1
  SH_KLT=1:PAUSEUS 1:SH_KLT=0
  ENDIF                        
       
  IF SIRA=1 THEN
  DIG0=0
  pauseus 1
  SHIFTOUT SH_DTA,SH_CLK,1,[AKTAR2]
  DIG1=1
  SH_KLT=1:PAUSEUS 1:SH_KLT=0
  ENDIF 
  
  IF SIRA=2 THEN
  DIG1=0
  pauseus 1
  SHIFTOUT SH_DTA,SH_CLK,1,[AKTAR3]
  DIG2=1
  SH_KLT=1:PAUSEUS 1:SH_KLT=0
  ENDIF
  
  IF SIRA=3 THEN     
  DIG2=0
  pauseus 1
  SHIFTOUT SH_DTA,SH_CLK,1,[AKTAR4]
  DIG3=1
  SH_KLT=1:PAUSEUS 1:SH_KLT=0
  ENDIF
  
  IF SIRA=4 THEN     
  DIG3=0
  pauseus 1
  SHIFTOUT SH_DTA,SH_CLK,1,[AKTAR5]
  DIG4=1
  SH_KLT=1:PAUSEUS 1:SH_KLT=0
  ENDIF
  
  IF SIRA=5 THEN     
  DIG4=0
  pauseus 1
  SHIFTOUT SH_DTA,SH_CLK,1,[AKTAR6]
  DIG5=1
  SH_KLT=1:PAUSEUS 1:SH_KLT=0
  ENDIF
''''''''''''''''''''''''''''''  
TMR0=99
INTCON.2=0        
 RESUME
 ENABLE         

Devre şeması

[IMG]http://img222.imageshack.us/img222/3999/adszvwg.png[/img]

Uploaded with ImageShack.us

Aşağıda devre şemasını ve kaynak kodlarını veriyorum. Yardımcı olursanız sevinirim arkadaşlar
http://hotfile.com/dl/84190999/cc7c560/saat_mutli.rar.html

Mucit23

Arkadaşlar hala sorunu çözemedim. Birçok ısı hesaplama formülleri denedim ama sorun hesaplamadan kaynaklanmıyor. Çünkü aynı kodları lcd ekranlı lm 35 ile yaptığım ısı göstergesinde deniyorum çalışıyor. Fakat Nedense bu saat devresinde çalışmıyor. Acaba adcon registerinindemi sorun var orayımı yanlış ayarladım. Başka nerede sorun olabilir bilemiyorum. Bu konuda yardımcı olursanız sevinirim.

justice_for_all

#2
lm35 sensor hesaplamasini nasil yaptin arkadasim bilgi verirmisin...

- simdi arkadasim ben basic pek bilmem ama sunu soylemeliyim ADCON0 registerini belirlememissin..
- ikincisi ADCIN adc okuma komutu ise ilk once ADCON0 registerinin ikinci bitini 1 yapin daha sonra  IF ADCON0.2=1 THEN basla boyle yapin   daha sonra ADCIN 0,HAM bu satiri kullanin...

yani ilk once ADCON0 registerinin GO bitini manuel olarak 1 yapmaniz gerek sonra GO biti 0 olana kadar beklemelisiniz daha sonra ADC degerini okuyabilirsiniz yoksa yalnis degerler verebilir...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

F.T

arkadaşım simülasyonda 7 segmentlerde rakamlar oluşmuyor.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Mucit23

Alıntı Yaplm35 sensor hesaplamasini nasil yaptin arkadasim bilgi verirmisin...

Cevabınız için teşekkürler arkadaşlar. ısı ölçme kodlarını yukarıda vermişim yanlız kodlar bana ait değil forumda başka birisinin kodları
Kodların çalıştığına eminim çünkü başka bi lm 35 ve lc ekran ile yapılmış ısı göstergesinde çalışıyor. Benim devrede bir türlü çalıştıramadım. sorunun nerede olduğunu anlayamadım. Programda ısı değişkenine kendim bir değer veriyorum verdiğim değeri ekranda gösteriyor.

Alıntı Yaparkadaşım simülasyonda 7 segmentlerde rakamlar oluşmuyor.
Rakamlar oluşmuyor derken tam olarak anlayamadım. Nasıl oluşmuyor.

justice_for_all

bende basic compiler olmadigi icin deneyemiyorum yukarida yazdiklarimi denermisiniz...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Mucit23

Dediklerini uyguladım fakat değişen bişey olmadı. Isı ölçmek için aşağıdaki komutu kullnıyorum aslında senin demek istediğini ben yapmıştım pek bi kar etmiyor.
SENSOR_OKU:
ADCIN 0,HAM
IF ADCON0.2=1 THEN SENSOR_OKU
ISI=(5*HAM)-(5*HAM/64)-(5*HAM/128)
ISI=ISI/10RETURN

justice_for_all

Demek istedigim su sekildeydi arkadasim...

ayrica ADCON0 registeri tanimlanmamis mesela senin hangi analog bacagi kullanacagin,ADC hizi,ADC enable bile kullanilmamis yani ADC calismiyor bile...

SENSOR_OKU:
	ADCON0.2=1
OKU:
	IF ADCON0.2=1 THEN OKU
	ADCIN 0,HAM
	ISI=(5*HAM)-(5*HAM/64)-(5*HAM/128)
	ISI=ISI/10
	RETURN
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Mucit23

Haklısın arkadaşım şimdi sorunum çözüldü adc çalışmıyormuş. Dediğin gibi adc configürasyon ayarlarını yapmamışım çok çok teşekkür ederim sana. Aslında bu devrede ilk başta lm35 yerine ds18b20 kullanıyordum. nedense ds18b20 den okuma işlemi yapılınca simülasyon çok yavaşlıyordu ekranda titreme oluyordu bu hiç hoşuma gitmiyordu bu yüzden birazda lm35 ile çalışayım dedim çok teşekkür ederim ilgin ve alakan için

erdemefe

mucit kardeş sorunu çözdüğüne sevindim güzel bir proje çıkıyor ortaya fakat neden 74hc595 tpic6b595 gibi shiftregisterlar yada max7219 gibi özel display sürücü entegreler varken tarama yöntemini kullandığını merak ettim. simulasyonda bir sorun görünmüyor ama gerçekte devreyi kurunca titreme sorunu yaratacaktır ben 4 displayli bir devre yapmıştım 20mhzde çalışmama rağmen tarama hissediliyordu 6 displayde dahada fazla olacağını düşünüyorum

Mucit23

Evet haklısın erdem abi Simülasyonda iyi çalışıyor.Gerçekte ne olur kestiremiyorum. Dediğin gibi tireme olabilir. Aslında Şu max7219u bi türlü anlayamadım. Nasıl çalışıyor. Max7219 8 adet display sürebiliyor.Max7219 a nasıl bilgi gönderiliyor. Datasheedini inceledim fakat fazla bişey anlayamadım. Elinde max7219 kullanımı açıklayan örnek kod varsa paylaşırsanız. Benim için çok iyi olur. Birde şöyle bişey var erdem abi, ben devreyi tamamiyle smd olarak yapmayı düşünüyorum. Yani kartı çok küçük yapıcam. Display olarak 25 mm den daha büyük kullanmam herhalde. Şimdilik devreye tarihde ekledim. Yani 10 sn saati, 5 saniye tarihi ve yine 5 sn yede sıcaklığı gösteriyor.