LM35 ile Dijital Termometre Uygulaması

Yayınlandı: 13 Kasım 2012 / Projeler
Etiketler:, , , , ,

Mikrodenetleyicilerde bulunan en önemli özelliklerden birisi Analog to Digital Convertor (Analog dijital dönüştürücü-ADC) birimidir. Bu birim işlemci dışındaki herhangi bir analog voltaj seviyesini mikroişlemciye algılatmamızı sağlar. Şimdi ADC biriminden bahsetmeyeceğim. Çünkü bu birimden PIC notlarımızda detaylıca bahsetmiştik. Şimdi ADC birimini kullanarak LM35 isimli sıcaklık sensörümüzün çıkış bilgisini okuyup LCD ekranda gösteren bir proje yapacağız. LM35 datasheetine buradan ulaşabileceğiniz, sıcaklık değişimlerine, çıkışından derece başına 10mV değişiklik gösteren bir sensördür.  Bu sensörün datasheetinden görüleceği üzere değişik bağlantı varyasyonları ile −55° ‘den  +150°C’ye kadar sıcaklık ölçümü gerçekleştirilebilir. Bizim kuracağımız devre 0-150 derece arasında ölçüm yapabilecektir. LM35 3 uçlu bir elemandır ve TO92-100 kılıfında bulunmaktadır yaygın olarak. Bu kılıf yapısındaki LM35’in karşıdan yazılı tarafına bakıldığında 1. bacağı V+, 2. bacağı Out, 3. bacağı ise GND’dir. Bu projede yaygın olarak kullanılan bir mikrodenetleyici olan 16F877A’yı kullanacağım. Diğer mikrodenetleyicileri kullanan arkadaşlar da kullanacakları işlemcilerin datasheetlerine  bakarak gerekli ayarlamaları yapabilirler.  Lafı fazla uzatmadan devre şemasına bir göz atalım;

Büyütmek için tıklayın…

Bu şekilde bir bağlantı sağlanarak LM35’den sıcaklık bilgisi okunup LCD ekranda gösterilebilir. Tabi ADC işlemleri için stabil ve iyi filtre edilmiş bir güç kaynağına ihtiyaç vardır. Güçteki dalgalanmalar ölçüm hassasiyetini olumsuz yönde etkileyecektir.  Bu projede kullandığımız koda (MikroC Pro ile yazılmıştır.) gelecek olursak:

sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;

sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;

int okunan=0,ort,top;
float milivolt,sicaklik=0;
char i=0,txt[15];

void kurulum()
{
ADC_Init();
ADCON1=0b10001110;//Sağa dayalı sonuç, AN0 analog, diğerleri dijital.
}

void main()
{
kurulum();
Lcd_Init();
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,3,"Mikrodunya!");
delay_ms(2000);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(2,3,"Mikrodunya!");

while(1)
{
for(i=0;i<20;i++) // 20 Kez okunan değer toplanıyor
{
okunan=ADC_Read(0); //ADC'nin 0. kanalından okuma yapılıyor.
top+=okunan;
delay_ms(5);
}
ort=top/20; //Toplanan değer 20'ye bölünerek ortalama alınmış olunuyor.
top=0;   //Bir sonraki ölçüm için toplam sıfırlanıyor.
milivolt=ort*4.8828125; // ölçülen değeri milivolta çevirmek için ortalama değer 5V/1024 değeri nin 1000 ile çarpılmasından çıkan katsayı ile çarpılıyor.
sicaklik=milivolt/10; // Sicaklik LM35 her 10 mV 'da 1 derece arttığı için milivolt değeri 10'a bölünerek hesağlanıyor.
FloatToStr(sicaklik,txt); //Sıcaklık LCD'de gösterilmek için Stringe dönüştürülüyor.
lcd_out(1,1,"Sicaklik="); // LCD'nin 1. satır 1.sütunundan itibaren "Sicaklik=" yqzisi yazdırılıyor.
Lcd_Chr(1,10,txt[0]); // Stringe dönüştürülen sicaklik değeri LCD'de karakter karakter gösteriliyor.
Lcd_Chr_CP(txt[1]);
Lcd_Chr_CP(txt[2]);
Lcd_Chr_CP(txt[3]);
Lcd_Chr_CP(txt[4]);
Lcd_Chr_CP('C');

}
}

Bu arada programda bir hata var. Bakalım kim bulacak?

Kodlarla ilgili anlaşılmayan yerleri aşağıdan bana iletebilirsiniz.
Bu proje ile ilgili dosyaları buradan indirebilirsiniz.
İyi çalışmalar..

yorum
  1. Fatih ASLAN dedi ki:

    Hocam teşekkürler.Lakin Txt diye sanırım bir dizi tanımlanıyor fakat herhangi bir porta eşitlenmiyor sanırım.nedeni nedir ?

    • mikrodunya dedi ki:

      txt isimli dizi floattostr dönüşümünden elde edilecek stringin saklanacağı dizidir. string ifadeler hafızada karakter dizisi olarak kaydedilirler.

    • salih dedi ki:

      bu kodlara ihtiyacım var ama mikroc dililni bilmiyorum bna doğru kodları atarmısınız elektronik öğrencisiyim performans ödevim 1sınıftayım

  2. Alp dedi ki:

    hocam ellerine sağlık güzel olmuş.

  3. Onur dedi ki:

    Güzel anlatım, teşekkürler.

  4. Murat dedi ki:

    Merhaba bir sorum olacaktı.
    -55\150C arası ölçüm yapabilmek için tek kaynak bağlantı şekli tam olarak nasıl yapılmalı acaba? Datasheet ve elimdeki kitaptan da baktığım kadarıyla 2 farklı -55 \ 150 C bağlantı şekli var.
    1.si
    LM35 GND pin’İne 2 adet seri 1n914 diyot baglanıp – çıkış
    Vout pin’ine 18k %10 tölerans’lı direnç baglayıp GND’ye baglanmış ve Vout direnç arasından + cıkış alınmış
    2.si ise
    +Vs besleme, GND şase ye ve Vout’a bir direnç baglanmış direnç ile vout arasından çıkış alınmış ve direnç’in diger ucuna -Vs güç kaynagı baglanmış ve buradaki R1 direnç’i için R1=-Vs/50uA formülü verilmiş.
    Nasıl bir baglantı almalıyım tam algılayamadım yardımcı olabilirmisiniz acaba?

    • mikrodunya dedi ki:

      İki bağlantıyı da kullanabilirsiniz. Fakat PIC ile – voltaj okunmayacağı için – kaynaklı bağlantıyı kullanmayınız.

      • Murat dedi ki:

        Dediğiniz gibi bende 2. baglantı şeklini uyguladım. Simetrik kullandım güç kaynagını ve direnç’i hesapladım, çıkış bilgileri dogru gözüküyor resmi upload ettim bir göz gezdirirseniz sevinirim, teşekkürler.

      • Onur dedi ki:

        Ayrıca bir der tanımlamalarda şöyle yapılıyor genelde, mesela, U1, U2 ve U3 aynı değere sahipse U1=U2=U3=+4V. Sizin yazdığınız gibi U1-U2-U3 = +4V olursa U1, U2, U3 ün birbirlerinden aritmetik olarak çıkarım sonucu kalanın +4V olduğu anlaşılıyor.

  5. mikrodunya dedi ki:

    Bağlantı yanlış hocam. 1 numaralı uç + ,2 numaralı uç çıkış, 3 numaralı uç – olacak.

    • Murat dedi ki:

      Sorunu çözdüm, teşekkür ederim yardımlar için…Onur hocam haklısın bir an aceleyle acıklama ekleyim derken aklıma gelmedi,hatalı bir yazım haklısınız,uyarınız için teşekkürler.

      • Onur dedi ki:

        Sorunu çözdüğüne sevindim arkadaşım. Yanlız blogların amacı, yöneticinin yaptığı gibi ders anlatmak, sorunlar yaşayanların sorunlarına çözüm bulabilmek ile birlikte sorunu çözenlerin de nasıl çözdüklerine dair bilgi aktarmasını sağlamaktır. E hani nasıl çözdün ? 🙂

  6. Murat dedi ki:

    Haklısınız 🙂 Blog sahibi hocamında uyarısı gibi baglantım yanlışmış. Ben kendi kitabımda olduğu gibi baglıyordum.Oradaki şema’da sanırım proteus’un eski sürümü kullanılıyor.Isis kısmında LM35 daha farklı bir kılıfta.Bende ona uygun şekilde bagladım kullandıgım versiyonda en son sürümü. Baglantıları düzelttince sorunda çözüldü. Sorun yaşayan arkadaşlar olursa bir faydam olsun benim de. Baglantı şekillerini upload ettim,umarım faydası dokunur.
    Not olarak datasheet’te belirtilmiş zaten ama ön bir bilgi vereyim. Resimki en sagdaki simetrik beslemedeki 180k’lık direnç’i R= -Vs/50uA’den elde ediyoruz. Besleme voltajını değiştirilse direnç’in değeride değiştirilmeli.

    • mikrodunya dedi ki:

      Yalnız hocam eğer bağlantıyı ilk şekildeki gibi diyotlar ile yapacaksanız, Benim burada anlattığım ADC kütüphanesi ile okuyamazsınız. Çünkü bu şekilde okuma yapmak için ölçüm yapılacak noktada – referans ucu diyotun anodudur, ve bunu mikrodenetlleyiciye – referans ucu olarak tanımlamak gerekir. Fakat MikroC’nin ADC_read() komutu sadece dahili referans voltajlarını kullanır. O yüzden kendi ADC kütüphanenizi oluşturmanız gerekir.

  7. musa dedi ki:

    önek hazır bir uygulama paylaşırsanız çok makbule geçer hocam.(açık kaynak kodlu)

  8. Murat dedi ki:

    Merhaba hocam. SHT1X serisi hakkında bilgi vermeniz mümkünmüdür acaba?

    • mikrodunya dedi ki:

      SHT serisi sensörler hem nem, hem de ısı ölçebilen sensörlerdir.
      http://www.denizelektronik.com/sht11.htm

      • Murat dedi ki:

        Derleyici olarak PIC C Compiler kullanıyorum hocam. CCS-C’nin kendi sitesinde yayınlanan kütüphaneyi kullanmayı deniyorum fakat bir kaç problem alıyorum ve en önemli sorunum;
        Nem ve sıcaklık bilgisini LCD’de değil de 6adet 7segment display’den almak istiyorum. Bildiğim kadarıyla SHT11 nem ve ısı sensörü hassas ölçümler yapabiliyor Sıcaklık -+5C Nem ise %3.2 civarında olması gerekiyor sanırım. Kullandığım 7seg. display içinse kullandığım sistem,sabit bir verinin yani misal sıcaklık bilgisinin %10 ve /10’a bölümünden birler ve onlar basamagını elde etmek. Fakat küsüratları nasıl hesaplatabilirim orada takıldım. Sizce nasıl bir yol izlemeliyim ve son olarak elinizde CCS-C derleyicisi için SHT11’in kütüphanesi varmı? Teşekkürler.

      • mikrodunya dedi ki:

        Hocam ccs c derleyicisini kullanmıyorum.
        Virgülden sonra 2 hane hesaplatmak için ilk olarak sayıyı 100 ile çarpın ve tam sayıya çevirin daha sonra basamaklarını hesaplattırın. Virgülden sonra 3 hane için 1000 ile çarpın..

  9. trcomet dedi ki:

    hocam yukardaki kodu micro c pro derleyicisine denemek icin kopyala yapıştır yaptım fakat
    ADC_Init(); 21 satırda
    Undeclared identifier ‘ADC_Init’ in expression adc_deneme.c diye hata veriyor
    bir türlü derleyemedim nerden kaynaklanıyor bulamadım ögrenmeye calışıyorum
    acamiyim yardım ederseniz sevinirim.
    selamlar

  10. trcomet dedi ki:

    hocam aktif ettim fakat yine ayni hatayı veriyor

  11. trcomet dedi ki:

    hocam iki gündür ugraşıyorum kafayı yiyecektim en son programı kaldırdım ve
    mikro e sitesinden yeni versiyonu 6.0 yükledim birde onda denedim sorunsuz derleme yaptı
    yavaş yavaş ögrenmeye calışıyorum alakanız için teşekkür ederim
    paylaşabilecegim bir şeyler oldugunda buradan paylaşmak isterim
    sorularım oldugunda sizi belki biraz rahatsız edebilirim
    tekrar teşekkürler .

  12. Fatih dedi ki:

    hocam merhaba yazdığınız yazı ışığında başladığım bitirme projemde mikroc öğrenmeye çalışıyorum. paylaşımlarınız için çok teşşekür ederim. ufak bi denem yapmak istedim ama program içinde belirlediğim a int. bi türlü yazdıramadım. yazdığım program aşaıda.

    sbit LCD_RS at RB4_bit;
    sbit LCD_EN at RB5_bit;
    sbit LCD_D4 at RB0_bit;
    sbit LCD_D5 at RB1_bit;
    sbit LCD_D6 at RB2_bit;
    sbit LCD_D7 at RB3_bit;

    sbit LCD_RS_Direction at TRISB4_bit;
    sbit LCD_EN_Direction at TRISB5_bit;
    sbit LCD_D4_Direction at TRISB0_bit;
    sbit LCD_D5_Direction at TRISB1_bit;
    sbit LCD_D6_Direction at TRISB2_bit;
    sbit LCD_D7_Direction at TRISB3_bit;
    char txt[15];
    int a=54;
    void main() {
    Lcd_Init();
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Cmd(_LCD_CURSOR_OFF);
    Lcd_Out(1,2,”FATIH BOZAT”);
    delay_ms(3000);
    Lcd_Out(2,1,”BITIRME PROJESI”);
    delay_ms(3000);
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Out(1,1,”MIKTAR PIL DEPO”);
    IntToStr(a,txt);
    Lcd_Chr(2,1,txt[0]);
    Lcd_Chr_CP(txt[1]);

    hatamı bulamıyorum hocam.. yardımcı olabilir misiniz? birde bu milivolta çevirdiğiniz denklemde sanırım 5 volt 1024 olarak okunuyor.benim yapacağım devrede ben bu aralığı program içinde değiştirebilir miyim? mesala 10V 1024 olarak okunsun.yoksa bir gerilim bölücü mü yapmam gerek? malzemeleri minumuma indirmeye çalışıyorumda:)
    şimdiden çok teşekkür ederim..

    • Fatih dedi ki:

      void main() {
      int a=54;
      Lcd_Init();
      Lcd_Cmd(_LCD_CLEAR);
      Lcd_Cmd(_LCD_CURSOR_OFF);
      Lcd_Out(1,2,”FATIH BOZAT”);
      delay_ms(3000);
      Lcd_Out(2,1,”BITIRME PROJESI”);
      delay_ms(3000);
      Lcd_Cmd(_LCD_CLEAR);
      Lcd_Out(1,1,”MIKTAR PIL DEPO”);
      IntToStr(a,txt);
      Lcd_Out(2,1,txt);
      hocam bu şekilde bi değişiklik yaptım a değerini alabiliyorum bu sefer fak proteusta yaptığım simülasyando 2,1, satırından başlatamıyorum

      • Fatih dedi ki:

        hocam lcd ile sorunlarımı halletim çok teşşkkür ederim şimdiden eminim zamınımınız olunca cevap verebilceğinizden tek sorun bu adc ile ilgli olan konu yardım edbilirseniz şimden teşşekür ederim

      • mikrodunya dedi ki:

        5V’tan büyük gerilimleri ölçmek için gerilim bölücü kullanabilirsiniz.

      • Fatih dedi ki:

        teşekkürler hocam yaptığım gerilim bölücü sürekli enerji harcayacak..kaynağı minumum kullanmaya çalışıyorumda. program içimde bir ayarlama yapabilir miyim diye merak ediyordum çok teşekkür ederim

      • mikrodunya dedi ki:

        Gerilim bölücünün sürekli enerji harcayacağı doğru fakat çok düşük ve ihmal edilebilir bir miktar olabilir. Mesela kaynağınız 10V olsun. 100K + 100K’lık bir gerilim bölücünün harcayacağı değer: 10V/200K= 0.00005A * 10V= 500uW eder.

      • Fatih dedi ki:

        doğru sölüyosunuz hocam sıkıştımda bu ara kafam bulandır artık..ilginiz için çok tşkkür edrim

  13. betul dedi ki:

    Merhaba for döngüsünü 20 değilde 100 e kadar yaptım fakat herhangi bir değişiklik olmadı neden 20 kez okunmuş değer o kısmı anlamadım açıklarsanız sevinirim şimdiden teşekkürler.

    • mikrodunya dedi ki:

      100’e kadar yaptıktan sonra tekrar kaça böldünüz? Orada 20 kez okunup toplanıyor ve döngüden sonra 2’ye bölünüyor. bu şekilde ortalama alınarak daha doğru bir sonuç elde edilmiş oluyor. Bir nevi filtreleme.

  14. Murat Elbeyli dedi ki:

    Hocam pic16f877 nin datasheetinde adcon1 ve adcon0 var adcon0 ı neden ayarlamadınız?

  15. Murat Elbeyli dedi ki:

    Hocam bir de 0b10001110 bu değerin başındaki 0b neyi ifade ediyor

  16. ismailalgin dedi ki:

    ort değişkenini float tipinde tanımlamalıydık sanırım programdaki hata bu çünkü top/20 yaptığımızda int değeri döndürüyor halbuki float tanımlasak daha düzgün sonuç elde ederiz sanırım. bide char i=0 demişssiniz i yi for döngüsünde kullanacağız int tipinde tanımlasak daha iyi olurdu mikro c de denedim hata vermedi halbuki char ve string ifadelerde hata affetmez bi program ve sinir eder bol bol:) nerede hata var onuda söyler misiniz?

    • mikrodunya dedi ki:

      “ort” değişkeninin float tipinde tanımlamak bize pek birşey kazandırmaz. Çünkü ADC’den okunan verileri int tipindedir. Biz ADC’den okunan 20 sonucu toplayıp ortalamasını alarak aslında sensörden gelen 20 sonuç arasında en fazla hangi değerin geldiğini bulmaya çalışıyoruz. Yani sensörden eğer, 1020,1023,1022,1021,1023,1023,1021,1022,1022,1022,1022,1023,1021,1022, gibi değerler geliyorsa bunların ortalaması alınıp hangi sonuca daha yakın çıkıyorsa sensör değerimiz olarak onu seçmektir amaç. Sensörden gelen verinin virgüllü olmasını istemeyiz. Char tipi bir değişken 0 ile 255 arasında değer alabilmektedir. Bu sebeple “i” değişkeninin programda aldığı maksimum değer 20 olabileceğinden char tanımlamak uygundur. Short olarak da tanımlanabilirdi. Programda var olan sıkıntıya gelecek olursak problem, katsayı hesaplanırken 5V/1023 değil de 5V/1024 olarak alınmıştır. Halbuki ADC birimi 10 bitlik olduğundan alabileceği maksimum değer 1023’tür. Yani 0’dan farklı 1023 değer alabilir. Bu yüzden +Vref değerimiz olan 5V, 1024’e değil, 1023’e bölünerek adım voltajımız(çözünürlüğümüz) hesaplanmalıydı.
      Saygılar.

  17. HalilOğuz dedi ki:

    hocam benim de bir projem var. Proje basit klima projesi, oda sıcaklığı belli bir değerin altına düşünce klima devreye girecek ve temsili olarak kırmızı ışık yanacak ve istenen değere geldiğinde duracak yani ışık sönecek sonra yine aynı şekilde belli bir değerin üstüne çıkınca tekrar devreye girecek ve soğutulduğunu göstermek için mavi ışık yanacak , yani ortam her zaman belli bir değerde (mesela 22-24derece arasında) kalacak ve o değer aralığı yakalandığı zaman mavi ışık yanacak. projede ayrıca, 7segment display kullanarak oda sıcaklığı sürekli iki haneli olarak gösterilecek. Nasıl yapılabilir yardımcı olurmusunuz ?

  18. TURKIYE dedi ki:

    Gerek anlatimiz gerek insanlari kucumsemeden her soruya cevap vermeniz beni duygulandirdi yarin sinavim var isi gucu biraktim yorum yapiyorum Allah razi olsun sizden sizin gibi insanlardan.

  19. cscodes dedi ki:

    İyi günler, benim doğru sonuç alabilmem için çarpanı 3.688 yapmam gerekiyor, sizce sorun nerede olabilir? Bu arada LM35’e giden akım tam 5v.

    • mikrodunya dedi ki:

      mikrodenetleyiciye giden besleme geriliminiz kaç V?

      • cscodes dedi ki:

        Ben hobi olarak başladım yeni, board’a 5v vermesi için yaptığım devreyi saymazsak bu da ilk devrem. LM35’e ve PIC’e 4.95v gidiyor aynı 7805 çıkışından, 75 lik direnç de yerinde fakat 1uF olmadığı için kullanmadım. Multimetre ile RA0’a gelen akım multi metre 20V seçeneğinde iken 0.32volt, LCD’de gözüken derece 43derece. Bu arada yukarıdaki kod içindeki “okunan=ADC_Read(0);” for döngüsü içinde olması gerekmiyor mu? https://www.dropbox.com/s/hwns143fwodlzro/Clipboard01.png

      • mikrodunya dedi ki:

        Evet haklısınız, “okunan=ADC_Read(0);” satırının for döngüsü içerisinde olması lazım. Daha önce yazı içerisinde sormuş olduğum hatayı bulan ilk kişisiniz tebrikler.
        Gördüğüm kadarı ile LCD arka ışığını çalıştırıyorsunuz. Işığın bağlantısını kesip çalıştırır mısınız devreyi?

  20. cscodes dedi ki:

    İyi akşamlar, biraz önce denedim, hiçbir değişiklik olmadı.

  21. cscodes dedi ki:

    devrenin fotografları: https://www.dropbox.com/s/sa0rga24kw3lhdc/LM35.zip
    LM35 ve PIC’e 4.95v gidiyor, LM35 out voltajı 0.32v LCD’de gözüken derece 43c

    • mikrodunya dedi ki:

      İlk olarak, gördüğüm kadarı ile 16f877’nin bütün besleme uçlarını besleme hatlarına bağlamamışsınız. İçeriden kısa devre olsa bile siz yine de bağlantıyı yapın.
      Bir diğer husus besleme ile alakalı. 4,94 V gibi bir voltaj anormal. 7805’in çıkış voltajı 5.01V gibi bir değer olmalı. Çok büyük ihtimalle beslemenizde bir problem var.

  22. cscodes dedi ki:

    Tekrar iyi günler şimdi şurayı kontrol edince http://ww1.microchip.com/downloads/en/DeviceDoc/39582b.pdf, fark ettim ki +5v kablosunu 11. pin’e takacağıma 9. pin’e takmışım (:

    Siz de fark etmişsiniz yazmaya geldiğimde.

    9. pin’de iken çalışıyor olması ilginç ama yanlış sonuç veriyor : P

    Şimdi düzeldi derece, 4.8828125 çarpanı ile doğru yazıyor artık LCD’de, ilginiz için teşekkürler.

    Bunu çözdüğüme göre sıra şu: https://www.dropbox.com/s/aiskgonpqc8476q/rf.jpg modülü kullanmaya geldi 😛

    Sizin bu modül ile ilgili bu şekil paylaştığınız MikroC örneği mevcut ise linkini yazabilir misiniz lütfen. Elimde olan PIC’ler 877A ve 628A

    • mikrodunya dedi ki:

      Sorunu çözdüğünüze sevindim. Besleme ile ilgili bir sıkıntı olduğu açıktı zaten. Siz yine de diğer besleme uçlarını da bağlayın.
      RF ile ilgili link;
      https://mikrodunya.wordpress.com/2011/11/08/udea-nin-rf-veri-iletimi-alanindaki-kucuk-devleri-atx-34-nrx-34/

      • cscodes dedi ki:

        Teşekkürler, ona geçmeden önce bu devreye buzzer eklemeyi denedim misal 25c yi geçince ötsün diye yapacaktım, sizin kodlara ek olarak void kurulum() içine:

        TRISB.B7=0; // RB7 output yap
        PORTB=0; // temizle
        Sound_Init(&PORTB, 7); // init buzzer RB7 output
        delay_ms(100);
        //Sound_play(4000,1000); // <<<<>>> bunu koyunca çalışmıyor.

        fakat ok işaretiyle gösterdiğim Sound_play(4000,1000) satırını koyduğum zaman çalışmıyor, LCD’ye yazılar vs. de gelmiyor.
        Sound_play(4000,1000) satırını kaldırırsam normal çalışıyor LCD’de dereceyi fln gösteriyor yani.

        Sorun nerede olabilir bu sefer : )

      • mikrodunya dedi ki:

        kodunuzun tamamını göreyim. Ayrıca buzzer bağlantınızı da göreyim. Mümkünse şematik olarak.

  23. cscodes dedi ki:

    İyi akşamlar, tüm dosyalar: https://www.dropbox.com/s/027x30y9xp39vz2/LM35_buzzer.zip
    Proteus ISIS dosyası ve şemanın jpg hali de zip içinde.
    Proteus ISIS’te de çalışmıyor Sound_play(4000,1000); satırını koyunca, ama kaldırırsam orada da çalışıyor. Devre üzerinde de aynı şekilde, o satırı koyunca çalışmıyor.

  24. cscodes dedi ki:

    İyi günler hocam çok teşekkürler, bu bana saç baş yolduran.anlamsız sorun anlaşılan ne kodlarda ne devrede, sanırım crackli compiler’da sorun var. Bendeki mikroC PRO for PIC v5.61 mikroCPIC1618.exe ile cracklenen, şu torrentlerde bulunabilen sürüm. “Demo limit” kaldıran.

    Sizin verdiğiniz projeyi hiç ellemeden ISIS te çalıştırdığımda sorunsuz çalıştı, fakat hiç dokunmadan MikroC’de build yaptığımda hem ISIS te hem de devre üzerinde yine çalışmıyor. Sanırım oluşturulan HEX dosyasını compiler doğru oluşturmuyor.

    Siz de crackli mi kullanıyorsunuz?, eğer öyle ise hangi sürümü kullanıyorsunuz ve size görünen adresime mail ile göndermeniz mümkün müdür?

    Tekrar çok teşekkürler.

  25. esahin06 dedi ki:

    Hocam Merhaba

    Devreyi kart üzerinde faaliyete geçirdim fakat ekranda derece 1 derece aralıklarla sürekli değişmekte yani oda sıcaklığı 24 derece iken ekranda 24.53 – 24.80 yada 25.53 olarak sürekli değişmekte sorun neden olabilir ?

  26. ayaz006 dedi ki:

    Hocam Merhaba
    Devreyi kart üzerinde faaliyete geçirdim fakat ekranda derece 1 derece aralıklarla sürekli değişmekte yani oda sıcaklığı 24 derece iken 24.53 24.80 yada 25.53 olarak sürekli değişmekte neden olabilir?

  27. ayaz006 dedi ki:

    Güç harici olarak 5V luk adaptör ile sağlanmakta yarın ilk iş adaptörü değiştirip deneyeceğim

  28. ahmet dedi ki:

    LCD_RS hatası verıyor derleken birisi bana yardımcı olabılır mı biraz acemıyım bu konuda sımdıden teşekkür ederım.

  29. ahmet dedi ki:

    1.derlemeye calıstıgım kod sızın yukardakı kodun aynısnı kopyaladım yapıstırdım.2-Hata konusuna gelınce de hata şu sekılde – ‘;’expected but LCD_RS found alttakı de ınternal error bu ıkı hata şekılde verıyor.

  30. ahmet dedi ki:

    nerde ama bulamadım kı hem sızınkının aynısnı kopyalayıp yapıstırdım değıstırmedım hiç ve gene aynı hata yı verıyor nerde hata yapıyorum acaba 😦

  31. ahmet dedi ki:

    Kodlar aynen bu şekılde yazıyorum ve o hatayı vermeye devam ediyor.Cevaplarınızı beklıyorm.

    sbit LCD_RS at RB2_bit;
    sbit LCD_EN at RB3_bit;
    sbit LCD_D4 at RB4_bit;
    sbit LCD_D5 at RB5_bit;
    sbit LCD_D6 at RB6_bit;
    sbit LCD_D7 at RB7_bit;

    sbit LCD_RS_Direction at TRISB2_bit;
    sbit LCD_EN_Direction at TRISB3_bit;
    sbit LCD_D4_Direction at TRISB4_bit;
    sbit LCD_D5_Direction at TRISB5_bit;
    sbit LCD_D6_Direction at TRISB6_bit;
    sbit LCD_D7_Direction at TRISB7_bit;

    int okunan=0,ort,top;
    float milivolt,sicaklik=0;
    char i=0,txt[15];

    void kurulum()
    {
    ADC_Init();
    ADCON1=0b10001110;
    }

    void main()
    {
    kurulum();
    Lcd_Init();
    Lcd_Cmd(_LCD_CURSOR_OFF);
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Out(1,3,”Mikrodunya!”);
    delay_ms(2000);
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Out(2,3,”Mikrodunya!”);

    while(1)
    {
    for(i=0;i<20;i++)
    {
    okunan=ADC_Read(0);
    top+=okunan;
    delay_ms(5);
    }
    ort=top/20;
    top=0;
    milivolt=ort*4.8828125;
    sicaklik=milivolt/10;
    FloatToStr(sicaklik,txt);
    lcd_out(1,1,"Sicaklik=");
    Lcd_Chr(1,10,txt[0]);
    Lcd_Chr_CP(txt[1]);
    Lcd_Chr_CP(txt[2]);
    Lcd_Chr_CP(txt[3]);
    Lcd_Chr_CP(txt[4]);
    Lcd_Chr_CP('C');
    }
    }

  32. ahmet dedi ki:

    Anladım.O sorunu cözdüm gibi de sımdi bir sey daha sormam gerek ben bunu pıc16f887 ile calıstırmak istiyorum okuldakı hoca calısır dedi ama bır satır bır sey eklemen gerekıyor dedi.Bu konuda yarrdımcı olabılır mısınız acaba

    • Onur dedi ki:

      Yeni proje oluştururken hangi MikroDenetleyiciyi kullanacağını soruyor, oradan PIC 16F887’i seçmen gerekir.

  33. ahmet dedi ki:

    Acaba bacak bağlantılarında bır sorun cıkar mı 887 de 40 pınlı ama derlerken hata verir mi acaba

    • Onur dedi ki:

      Pin çıkışlarında sorun çıkabilmesi haricinde register ayarlarında da sorun çıkabilir. Ama önce denemen lazım, denemeden varsayımlar üzerinde tartışmak gereksiz şu aşamada.

  34. yagmur dedi ki:

    Merhaba yardimci olabilecek arkadaşlar için soruyorum bir projem var sicaklik ölçer devresi yapmam gerekli 16f877a cip sensor olarak ta ds18b20 kullanacagim simdi sanirim lm35 analog outputa sahip benim sensorum digital ve ccs c compiler kullanıyorum.nasil kendi projeme uyarlama yapabileceğimi anlamadim pek 2haftaya projeyi de tamamlamam gerekli çözüm onerilerinizi bekliyorum şimdiden tesekkur ederim

  35. ahmet dedi ki:

    pıc16f887 de bunu nasıl calıstırırım lcd sabit kısmını değıstırdım.887 lcd bagladım ama geri kalan kısmı nasıl uyarlıcam yardımcı olabılır mısınız bana

  36. busra dedi ki:

    ben yukarıdaki proje için uğraşıyprum. .ama .bir türlü çalıştıramıyorum devreyi. Bana bu devrenin tam çizimini gönderebilir misiniz. Isıste çalışıyor ama board uzerinde çalıştıramıyorum. .lütfen yardım ! Yazılımını da aynen entegreye yükledim.

  37. ahmet dedi ki:

    Su programı pic16f887 de uyarlamaya yardimci olun lütfen bana sadece lm35 den okunacak değeri lcd gösteren program lazım lcd tanıtma ve lcd gönderme işini yaptım sadece lm35 i yapamıyorum adc dönüşümü yapamadim bu konuda yardımci olursaniz çok sevinirim.

  38. busra dedi ki:

    Ben mail attım devre fotoğraflarını .

  39. ahmet dedi ki:

    sbit LCD_RS at RB4_bit;
    sbit LCD_EN at RB5_bit;
    sbit LCD_D4 at RB0_bit;
    sbit LCD_D5 at RB1_bit;
    sbit LCD_D6 at RB2_bit; // lcd pin ayarlama
    sbit LCD_D7 at RB3_bit;

    sbit LCD_RS_Direction at TRISB4_bit;
    sbit LCD_EN_Direction at TRISB5_bit;
    sbit LCD_D4_Direction at TRISB0_bit; //lcd pin ayarlama
    sbit LCD_D5_Direction at TRISB1_bit;
    sbit LCD_D6_Direction at TRISB2_bit;
    sbit LCD_D7_Direction at TRISB3_bit;

    int okunan=0,ort,top;
    float milivolt,sicaklik=0;
    char i=0,txt[15];

    BURASI BOŞ

    void main()
    {
    kurulum();
    Lcd_Init();
    Lcd_Cmd(_LCD_CURSOR_OFF);
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Out(1,3,ahmet!”);
    delay_ms(2000);
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Out(2,3,”ahmet!”);
    FloatToStr(sicaklik,txt1); // Float olan sicaklik değerini karakter tipine ceviriyor
    Lcd_Out(2,11,txt1); // txt1 karakterini 2 satır 11 sütündan başlayarak LCD ye
    // yazıyoruz.
    delay_ms(100); // 100 ms gecikme bırakıyoruz

    }
    }

    hocam yapabıldıgım bu kadar lütfen p16f887 de sunu calısrtırmama yardımcı olun cok önemli benim için ADC kısmını yapamadım belki yazdıklarımda yanlış bı yardım edersenız inanın cok sevincem.simdiden teşekkür ederim.

    • mikrodunya dedi ki:

      İsminiz yazdi mi lcd de?

    • Onur dedi ki:

      Öncelikle Lcd_Out(1,3,ahmet!”); kodunda çift tırnak koymayı unutmuşsun, onu düzelttim fakat bu kod bende de proteus ile denememe rağmen çalışmadı. Fakat 16F877A kullanarak kodu ve proteus projesini değiştirdiğimde aşağıdak kod çalıştı. 16F887 ile çalışmadığımdan sorunu tespit edemedim. 18F877A ile Çalışan kod;

      sbit LCD_RS at RB4_bit;
      sbit LCD_EN at RB5_bit;
      sbit LCD_D4 at RB0_bit;
      sbit LCD_D5 at RB1_bit;
      sbit LCD_D6 at RB2_bit;
      sbit LCD_D7 at RB3_bit;

      sbit LCD_RS_Direction at TRISB4_bit;
      sbit LCD_EN_Direction at TRISB5_bit;
      sbit LCD_D4_Direction at TRISB0_bit;
      sbit LCD_D5_Direction at TRISB1_bit;
      sbit LCD_D6_Direction at TRISB2_bit;
      sbit LCD_D7_Direction at TRISB3_bit;

      char *text1;
      void ayarlar() {
      PORTB=0;
      TRISB=0x00;
      INTCON = 0;
      Lcd_Init();
      LCD_Cmd(_LCD_CURSOR_OFF);
      LCD_Cmd(_LCD_CLEAR);
      ADCON1 = 6;
      CMCON = 0x07;
      }

      void main() {
      ayarlar();
      text1=”Ahmet”;
      Lcd_out(0,1,text1);
      }

    • mikrodunya dedi ki:

      Çalışan halini buradan indirebilirsiniz 16f887’li devrenin.

  40. ahmet dedi ki:

    Ne diyecegımı bılemıyorum ya çalıstı ya suan benı nasıl bır sıkıntımı aldınız bılemezsınız ya sizden Allah razi olsun uğrastınız ya elımden bu kadar geliyor keşke daha fazlası gelse ama cidden çok teşekkür ederim en son attıgınız ındırılen calısıyor calısmasaydı 1 senem uzuyordu okulda çok çok teşekkür ederim.Hepınızden allah razi olsun.Elımden bu kadar geliyor hepınze tekrardan teşekkür ederım.

  41. ahmet dedi ki:

    bi kaç sorum olacak sizlere
    1-Neden tam sonuc değıl de ondalıklı sonuclar cıkıyor
    2-milivolt=ort*4.8828125;
    sicaklik=milivolt/10;
    bu ıkı komudu bıraz daha acıklayabılır mısınız
    3-ve eksi dereceyı nasıl gösterebılırız

    • Onur dedi ki:

      1. sorunun cevabı diğer sorularla ilgili. Şimdi bak; analog birimler 10 bit çözünürlüğe sahip. 10 bit demek 2^10 demek yani 2 rakamını kendisiyle 10 defa çarpacaksın demek, sonuç 1024 çıkar. Demek ki analog birimin çözünürlüğü 1024 imiş. Analog giriş volt olarak 0 ile 5 V arasındadır. 0 ile 5 V arasında 1024 tane adım var demektir. Buradan hesapla her bir adımın değerini şöyle bulabilirsin. 5V = 5000 milivolt. 5000 milivolt / 1024 adım = 4.8828125 milivolt.
      2. ort değeri de devrenin düzgün sıcaklık birimi hesplaması için her 20 tane analog okumasını toplamış, çıkan değeri 20’ye bölmüş. Bu, programcının bulduğu bir sağlıklı sonuç alma formülü.

  42. sertan dedi ki:

    Teşekkürler

  43. sertan dedi ki:

    Merhabalar bende 2 kademeli dijital voltmetre yapımıni ariyorum. Micro c nin henüz cok basindayim. Yardımlarınızı bekliyorum

  44. busra dedi ki:

    Yukarıdaki yazılımı PIC16f877a ya yüklerken sizin paylaştığınız yazılımı yükledim.(Tekrar kendim yazmadan micro c de ) Herhangi bir komut eklemem gerekir miydi. En azından pull up dirençleriyle ilgili . Çünkü gerçekten bir sıkıntı var. Devre çalışmıyor Plaka üzerinde kurulduğunda.

  45. ahmet dedi ki:

    887 de termemotre de OSCCON=0b01110111; ifadesi ne işe yarıyor acaba ? bırde adc_init() komutunu acıklarsanız sevınırım

  46. ERDEM dedi ki:

    Programdaki hata nedir

  47. mikrodunya dedi ki:

    Programda var olan sıkıntıya gelecek olursak problem, katsayı hesaplanırken 5V/1023 değil de 5V/1024 olarak alınmıştır. Halbuki ADC birimi 10 bitlik olduğundan alabileceği maksimum değer 1023’tür. Yani 0’dan farklı 1023 değer alabilir. Bu yüzden +Vref değerimiz olan 5V, 1024’e değil, 1023’e bölünerek adım voltajımız(çözünürlüğümüz) hesaplanmalıydı.
    Saygılar.

  48. SEDAT dedi ki:

    MERHABA HOCAM BENİM SIKINTIM VAR BU KONUDA ÇALIŞMIYOR AYNISINI İNDİRDİM GENE AÇAMIYORUM YARDIM EDERMSİNZ ?

  49. Serhat dedi ki:

    Merhaba koddaki hatayı bulamadım yardımcı olabilir misiniz

  50. Serhat dedi ki:

    Kodu Micro Cde çalıştırdım başarılı dedi yani hata yok sorun tam olarak nedir lütfen bilgilendirin yorumlarda bulamadım

    • mikrodunya dedi ki:

      “ctrl+f” tuşlarına basıp “hata” diye aratmanız yeterliydi oysa.

      Hata adc okumasının döngü içerisinde yapılmasının gerektiğiydi.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s