lm 35 ile termometre ?

Başlatan yesilxx, 01 Ekim 2008, 19:21:08

yesilxx

LM 35 ve 16F628 ile nasıl termometre yapılabilir ? yani lm 35 ten nasıl veriyi okuyup lcd ekranda ısıyı gösterebiliriz? pic basic uygulamalara baktım ama genelinde dallasın dijital ısı okuyan sensorları kullanılmış konuyla ilgili açıklama yada uygun örnekler varmıdır acaba bi örnek buldum ama çalıştıramadım, başalangıç etiketinden sonra işlemlerin hiçbiri ekranda gözükmüyor

'***********Seri İletişim Dosyası***********

Include "MODEDEFS.BAS"

CMCON=7

'***********LCD Tanımlamaları***********

DEFINE LCD_DREG      PORTB   
DEFINE LCD_DBIT         4      
DEFINE LCD_EREG      PORTB   
DEFINE LCD_EBIT        1         
DEFINE LCD_RWREG    PORTB   
DEFINE LCD_RWBIT        2      
DEFINE LCD_RSREG   PORTB   
DEFINE LCD_RSBIT      3            
DEFINE LCD_BITS         4      
DEFINE LCD_LINES      2      

'***********Özel Karakter Tanımlamaları
LCDOUT $FE,$40, 6, 9, 9, 6, 0, 0, 0, 0 'Derece İşareti
LCDOUT $FE,$48, 4, 14, 4, 4, 4, 4,14,0 'İ Harfi
LCDOUT $FE,$50, 14, 17, 16, 16,16,17,14,4 'Ç Harfi
LCDOUT $FE,$58, 14, 17, 16, 14,1, 17,14,4 'Ş Harfi

'***********Port Ayarları***********

TrisA=0
TrisB=0

PortA=0
PortB=0  

'***********Sensör Tanımlamaları***********

Comm_Pin1   VAR   PortA.0
Comm_Pin2   var PortA.1
Busy        VAR BIT
HAM         VAR   WORD
ISI         VAR WORD
SIGN        VAR BYTE
SIGN_BITI   VAR HAM.Bit11
NEGAT_ISI   CON 1
TEMP        VAR BYTE
Float       VAR WORD

'***********LCD yi Kullanıma Hazır Hale Getir***********

LOW PORTB.2 'RW bacağı ekrana yazmaya imkan vermek için LOW yapıldı.

lcdout $FE,1
PAUSE 200   ' LCD nin kullanıma hazır hale gelebilmesi için gerekli süre
lcdout $FE,1

LCDOUT $FE,$80,"**TERMOMETRE**"                
LCDOUT $FE,$C0, "*TERMOMETRE*"
pause 2000
lcdout $FE,1  

'***********Program Başlangıcı***********

Basla:


   gosub sensoroku1
   gosub SENSOROKU2
   
Goto Basla

'***********1. Sensörü Oku***********

SENSOROKU1:
         
          OWOUT   Comm_Pin1, 1, [$CC, $44]' ISI değerini oku
Bekle1:
          OWIN    Comm_Pin1, 4, [Busy]    ' Busy değerini oku
          IF      Busy = 0 THEN Bekle1  ' hala meşgulmü? , evet ise goto Bekle..!
          OWOUT   Comm_Pin1, 1, [$CC, $BE]' scratchpad memory oku
          OWIN    Comm_Pin1, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
          GOSUB   Hesapla1
          RETURN
   
Hesapla1:                 ' Ham değerden Santigrat derece hesabı
   Sign  = "+"
   IF SIGN_BITI = NEGAT_ISI THEN
      Sign   = "-"  
      temp=($ffff-ham+1)*625
      ISI  = DIV32 10
      GOTO GEC1  
   endif
   TEMP = 625 * (HAM+1)        '
   ISI = DIV32 10          ' Div32 hassas derece hesabı için 32 bit bölme yapıyoruz.
GEC1:
   FLOAT = (ISI //1000)/100
   ISI=(ISI/1000)-1
   
   
   lcdout $FE,$80,1,2,"ER",1,": ",Sign,DEC ISI,".",DEC1 (Float),0,"C " '2. satırda ısı
   if ISI=65535 then
       
       lcdout $FE,$80,"                "
       lcdout $FE,$80,"1. SENSORU TAKIN"
   
   endif
   
   RETURN

'***********2. Sensörü Oku***********

SENSOROKU2:
         
          OWOUT   Comm_Pin2, 1, [$CC, $44]' ISI değerini oku
Bekle2:
          OWIN    Comm_Pin2, 4, [Busy]    ' Busy değerini oku
          IF      Busy = 0 THEN Bekle2  ' hala meşgulmü? , evet ise goto Bekle..!
          OWOUT   Comm_Pin2, 1, [$CC, $BE]' scratchpad memory oku
          OWIN    Comm_Pin2, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
          GOSUB   Hesapla2
          RETURN
   
Hesapla2:                 ' Ham değerden Santigrat derece hesabı
   Sign  = "+"
   IF SIGN_BITI = NEGAT_ISI THEN
      Sign   = "-"  
      temp=($ffff-ham+1)*625
      ISI  = DIV32 10
      GOTO GEC2  
   endif
   TEMP = 625 * (HAM+1)        '
   ISI = DIV32 10          ' Div32 hassas derece hesabı için 32 bit bölme yapıyoruz.
GEC2:
   FLOAT = (ISI //1000)/100
   ISI=(ISI/1000)-1
   
   
   lcdout $FE,$C0,"DI",3,"ARI: ",Sign,DEC ISI,".",DEC1 (Float),0,"C " '2. satırda ısı
   
   if ISI=65535 then
       
     
       lcdout $FE,$C0,"                "
       lcdout $FE,$C0,"2. SENSORU TAKIN"
   
   endif
   
   RETURN





End

M_B

LM35 ısıya gore voltaj verır.
Bunu da pic icinde bulunan ADC kısmı ıle yapabilirsin.
16f628 de ADC gırısı yok.
ornek  
12f675 ve 16f877  bunlarda mevcut.

Forumuda arama yaparsan bu konuda cok ornek bulursun.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

yesilxx

bu örnek verdiğim programın açıklamasında 16f628 ile yapıldığı yazıyor fakat ben hexi 16f628 yazdım ama çalıştıramadım

hatmeto

sensör LM35 değil DS18B20 dir. LM35 çıkışına bir A/D çevirici koyman gerekiyor.
Bir admin ataasözü derki: "biliyorsan paylaş mod yapsınlar. bilmiyorsan sus banlamasınlar"

yesilxx

cevaplarınız için teşekkür ederim o zaman lm ile termometre yapabilmem için ya 16f877 almam lazım yada 628 ile çalışmama devam etmem için dijital bi sensor almam gerekecek ds 18b20 sanırım

Maxim

Alıntı yapılan: "yesilxx"cevaplarınız için teşekkür ederim o zaman lm ile termometre yapabilmem için ya 16f877 almam lazım yada 628 ile çalışmama devam etmem için dijital bi sensor almam gerekecek ds 18b20 sanırım

evet,
arkadaşlarında dediği gibi size ,
LM35 li termometre için analog girişi olan bir pic lazım ,
16F877A ,16F876A ,16F88 gibi, yada 12F675 gibi

onurksp

sa öncelikle eğer 877a ve ccs c ile yapmak istersen ve acil ise yardım edebilirim.ama amacın adc falan öğrenmek ise
şöyleki lm 35 sıcaklık basına 10 mv gerilim üreten bir sensör.basit kullanımında +2 ile 155 derece arası sıcaklık ölçebilirsin.bu ölçümde 0 v 2 derece olur ve 1.5 v a kadar çıkış verir.hesap kolaylığı için 2 derece ihmal edilirse(uygulamaya bağlı bazen 0.1 derece bile ihmal edilemz) 10 mv u 1 derece say ve ona göre adc ni kur ve deneme ni öyle yap.basit kullanımı pot mantığındadır.hazır halini koyardım ama uğrasıp yaparsan daha iyi anlarsın çok uzattım lafı kusura bakmayın hayırlı bayramlar...

yesilxx

evet arkadaşlar niyetim adc öğrenmek onun için pek acelem yok, adc ve kesme işleri çok karışık geldi bana açıklamaları okuyorum ama yinede işin işinden çıktığım ve pek anlayabildiğimi söyliyemiyorum, basit uygulamalarla anlamaya çalışacağım inşallah,sizin tecrübelerinize göre bu iki olayı en kolay yoldan nasıl öğrenebilirim 1 ADC 2 kesmeler ve timer kullanımları, IF then for next, port açmaları lcd çalıştırmayı,  bazı şeyleri yapabilmeyi gerçekleştirdim ama dediğim gibi bu adc kesme ve timer olayları çok karışık gözüküyor gözüme ve pic basic ile çalışıyorum, benim için en basit yol şu an için pic basic, yardımlarınız içinde hepinize teşekür ediyorum

onurksp

ETE hocamızın ders notlarında 5. bölüm adc ve 2 güzel örnek var.ben suan C kullanıyuorum ama gecen sene ete hocamızn ders notlarından faydalanmıştım bu sitede bulabilirsin onları.

yesilxx

evet o ders notlarını indirdim onlardan ve bir tane kitap aldım orhan altınbaşak ın onlardan takip etmeye çelışıyorum, orhan altınbaşakın kitabtaki tanımları daha karışık geldi, ete hocanın derlerinden anlamaya çalışıyorum

onurksp

kardeş bi tavsiye eğer c programlama mantığı varsa CCS C ile programanı öneririm.Serdar Çiçek'in kitabı var gayet güzel anlatmış ben o kitabı takip ediyorum şu an sanada tevsiye ederim.

yesilxx

c ile ilgili bi kitap var elimde ama bana karışık geldi pbp kitabını yaklaşık iki aydır okuyorum bayağı alıştım gibi artık uygulamalarla pekiştirmeye çalışıyorum tekrar bırakıp c ye geçmek kafamı çok daha karıştıracaktır