|
PIC 16F877 ile analog girişten okunulan bilgiyi sıcaklık değerinde alıp kullanıcıya sunacağımız bir çalışma.
Visual C# makalelerinde ( Seri Haberleşme 1 ve Seri Haberleşme 2 ) buna ilşkin bir ara yüz hazırlamıştık. Şimdi ise PIC ile ilgili olan yazılımı yapmaya çalışıcaz.
Bu projede PIC 16F877 kullandım. Çünkü projemizin amacı analog girişten bir değer okumak ve buna ilişkin bilgileri PC'ye gönderip almak. Bunun için 16F877 uygun bir seçim sanıyorum.
Amaç : LM35 sıcaklık sensörü ile ölçülen ortam sıcaklığı PIC'in analog bacağından ölçülerek PC'ye gönderilecektir.
Devrenin Şekli :  Kullanılan malzeme listesi : 1 Adet LM35XX Sıcaklık Sensörü 1 Adet PIC 16F877(A) 1 Adet MAX232 veya HIN232 Modeli Yonga ve 4 Adet 1uF Kond. 1 Adet RS232 9 Pinli Seri İletişim Kablosu 1 Adet 4MHz Kristal Osilatör ve 2 Adet 22pF Kondansatör 1 Adet 4,7K lık Direnç
Programı PIC C Lite ile yazarak kendi derleyicisini kullanacağız. Devrede LM35XX PIC in 2 numaralı bacağına(RA0/AN0) bağlanmıştır. Bu baçaktan okunan sayısal değer 10 bit üzerinden alınmaktadır. Bu sayısal değeri yazacağımız hesaplama ile sıcaklık değerine dönüştürüp RB0 bacağından MAX232'ye oradanda PC ye gönderilecektir. Tabi bu değer sonra tekrar RS232 seri iletim formatında gönderilecektir. MAX232'nin çıkışı 9 bacaklı RS232'nin 2 numaralı bacağına (TX) bağlanmıştır. Bu bacak veri göndermek için kullanılır.
Programı yazmadan önce bir sıra belirleyelim ve yazılımımız sade bir şekilde aksın. Önce gerekli kütüphanelerimizi ekleyelim. Ardından ana program döngüsü içerisinde değişkenlerimizi ve bacak tanımlamalarını yapalım. Son olarakta hesaplamaları yaparak verimizi PC ye gönderelim.
Program : #include<pic.h> #include<stdio.h> #include<serial.c> // Seri iletişim için ekleyin #include<delay.c> // Gecikme oluşturmak için ekleyin void gecikme(void) // Bir saniyelik bir gecikme { unsigned char j; for(j=0;j<4;j++)DelayMs(250); } main(void) { const float sabit=5000/1024; float ADRES_H, ADRES_L, Voltaj, mVolt ; unsigned char pcye_gonder[]=" "; unsigned int sicaklik_degeri; TRISB=0; TRISA=1; ADCON1=0X8E; // Burada RA0 bacağından analog okuma yapacağımızı bilriyoruz ADCON0=0X41; // Henüz okumaya başlamamasını istiyorum gecikme(); // Gecikme alt döngüsününe gidiyorum. for(;;) // Sonsuz döngüye giriyorum { ADCON0=0x45; // Analog okumaya başlatıyorum while((ADCON0&4)!=0); // Eğer ADCON0'ın 4. biti 1 oldu ise işlet ADRES_H=ADRESH; ADRES_L=ADRESL; VOLTAJ=256*ADRES_H+ADRES_L; mVolt=VOLTAJ*sabit; sicaklik_degeri=(int)(mVolt/10); // Tam sayıya çevriliyor sprintf(pcye_gonder,"%d",sicaklik_degeri); // Değerimiz pcye_gonder dizimize alınıyor printf("%s",pcye_gonder); // Buradanda seri bir şekilde bütün karakterler ard arda RB0 bacağından gönderiliyor gecikme(); }} Programımız bu kadar. İşleyişine tekrar değinecek olursak eğer; LM35XX ortam sıcaklığını RA0 dan pic'e verir. PIC 10 bit üzerinden ( Analog okuma ile ilgili makalelerimde bu bilgilere ulaşabilirsiniz ) analog değeri okur. ADCON1 ve ADCON0 değerlerini ayarlarken ilk 8 biti ADRESH, 2biti ise ADRESL ye aktarmasını söyledik. Daha sonra analog okumayı başlatarak (ADCOM0=0x45) okumanın bitmasini bekledik. Bunu bir while döngüsü icerisinde ADCON0 ın 4.bitini kontrol ederek yaptık. Okuma bittiği zaman ADRESH ve ADRESL'den değerlerimizi alarak bu dijital değeri sıcaklık verisine dönüştürdük. İşlemimiz bittikten sonra değerlerimizi bir dizi değişkene aldık. Burdaki amaç, seri haberleşme bit değerler üzerinden yapıldığı için her değeri ard arda haberleşme modunda gönderiyoruz. Yani her değerin ASCII değerlilikleri gönderiliyor ve PC dende o değer alınarak string veya diğer değişkenlerle işleniyor. Bu konu ile ilgili olarak yazacaklarım bu kadar fakat başka örnekler ve yöntemlerle yine bu konu üzerinde duracağım. Anlaşılmayan bir konu üzerinde rahatlıkla mail atabilirsiniz. Daima söylediğim gibi hiç kimse mükemmel ve süper değildir. Her şey paylaşmakla bir değer kazanız.... |