Elektronik Devreler Projeler Elektronik ve biraz daha fazlası İletişim - Araçlar - Dikkat - Topluluk
Elektronik / Elektronik Kaynakları/

MikroC Dersleri 13

Sponsorlu Bağlantılar

Merhaba elektronik Severler..

Çooook uzun zamandır ders yazmıyordum nihayet iki satır yazma fırsatım oldu. Ama bana kızmayın değerli öğrencilerim meslektaşlarım,hocalarım,üstatlarım…Ders yazmayışımın sebebi dersleri bıraktığımdan değil vatani görevimi ircaa etmek için askere gittiğimden dolayı mecburi oldu biraz. Asker öncesi sonrası derken 7 ay olmuş ders yazmayalı ama nihayet tekrar başladım derslere. Umarım faydalanacağınız bilgiler bulabilirsiniz.

Bir önceki dersimizde programcılık deneyimlerimiz arasına Pic ile analog işlemler işlemeyi, kullanım algoritmasını ve ilgili değimlerini ve programsal kullanımını ve örnek uygulamamızı gerçekleştirdik.

Bu dersimizde PIC ile OW protokolünün kullanımını öğreneceğiz. Ve bunu örnek bir proje ile pekiştireceğiz.

Burada bahsedilen protokol OW harfleri ONE WİRE yani tek kablo iletişimi kelimelerinin baş harflerinden oluşuyor. Bu protokol ile iki denetleyiciyi toplamda 1 kablo ile haberleştirmek mümkündür.(gnd Hattı denetleyiciler iki ayrı modülde ise haricen bağlanmalıdır.)yine bu yöntemle çok popüler olan sıcaklık sensoru DS18B20 de bu protokol ile kontrol edilebilecektir yada Akbil olarak herkesin bildiği İ buton yine OW ile kullanılabilmekte.

Bu protokolde bir pin hem giriş hemde çıkış olarak kullanılır. Örneğin PIC ile diğer PICe veri yazılacaksa yazan PIC inpini Çıkışa kurulmuştur ve verileri seri olarak yazar.

Karşıdaki PIC veriyi alır ve örneğin veriyi aldıktan sonra tamam anlamında veri göndereceği var sayılırsa bu durumda ilk veri gönderen PIC OW pini giriş yapılmış olmadır ki verileri alabilsin.

Yani oluşturulacak olan yaz fonksiyonunda pin yönlendirmesi çıkış yapılmalıdır. Okuma fonksiyonunda ise pin yönlendirmesi giriş yapılmalıdır.

Burada bahsi geçen yönlendirmeler TRISA.B0=0; ,ise b0 çıkış TRISA.B0=1; ise b0 giriş şeklindeki tanımlamadır.

Dersimize başlamadan önce alışkanlık olan işimize yarayabilecek birkaç kısa bilgi verdikten sonra dersimize geçelim.

• Devrelerimizi küçültüp smd malzeme kullanmaya ne dersiniz smd direnç smd transistör ve tabiî ki SMD PİC. Ama SMD PİC için devre üzerinde programlama gerekir. Bu durumda ICSP (in circuit serial programing) bilmemiz gerekiyor.

• Diğer smd komponetler sadece yüzeyden lehimleme yapara diğer her şey bildiğiniz gibi. Aşağıda PİCler için ICSP bağlantı uçları var o uçlar PİC programlayıcınızın ICSP uçlarına bağlanacak devre kurulduktan sonra program PİC e devre üzerinde yollanacak bu kadar basit.

icsp-connections

icsp-ornek

Yukarıdaki devreler ICSP kullandığımız devrelerden örneklerdir.

Bu bilgilerin faydalı olmasını diliyorum ve dersimize geçiyorum.

OW protokolü iki ayrı denetleyicinin bir bilgisayarın ve denetleyicinin ,bir sensörün bir denetleyicinin birbiri ile tek hat üzerinden haberleşmesine olanak sağlayan bir zaman protokolüdür.

Bu protokol kullanılarak 16 kbps ye kadar veri hızında iletişim yapılabilir ve ek donanımın elemanları ile 300m ye kadar uzağa veriler iletilebilir.(Ben denemedim en fazla 10Mtden kullandım)ucuz maliyetli ve kolay kullanımı vardır.

Burada bahsedeceğim bu zaman protokolünün içeriğinden çok MikroC kullanımına yöneliktir.

Genel hatları ile protokol master slave olarak haberleştirilecek iki birim arası bağlantı kurulur. Yöneten konumdaki birim bir süre OW hattını şaseye çeker ve karşıyı komut gönderimi için hazırlar alıcı kısım komut işleme işine ise son kez hattın bir süre şaseye çekilmesini bekler ve arasındaki darbeler sayısal veri olarak işleme alınır. Ve emir veren konumundaki birim veriyi yazdıktan sonra OW hattını Tris ayarlamasını girişe yönlendirir ve artık okuma moduna geçer. Ki bu OW protokolü her zaman karşıya bir emir gönderip o emirin neticesini birim içerisine almaktan ibarettir.

Bir sıcaklık sensörüne sıcaklığı ölç komutunu yollarsnız o komuttan sonra sensör sıcaklığı ölçer ve bir komut daha verirsiniz ölçtüğün sıcaklığı dijitale çevir diye . o sıcaklığı sayısal yapar ve ilgili emir komutundan sonra sayısal veriyi(sıcaklık – değer , ondalık basamağı) gönderir. Olayı aslında kısaca özetliyor.

MikroC de üç farklı kullanımı vardır.

Ow_Reset
Ow_Read
Ow_Write

unsigned short Ow_Reset(unsigned short *port, unsigned short pin); Protokolü

Ow_Reset(&PORTE, 2); Kullanımı. PortE pin2 yi OW için resetle.

unsigned short Ow_Read(unsigned short *port, unsigned short pin);

unsigned short tmp;

tmp = Ow_Read(&PORTE, 2); PortE 2 den okuduğun veriyi tmp e yazar.

void Ow_Write(unsigned short *port, unsigned short pin, unsigned short par);
Ow_Write(&PORTE, 2, 0xCC);

Fonksiyonlarda dikkat edilecek husus unsigned short par ve unsigned short tmp;değişkenleridir. Bu fonksiyonlar bir seferde sadece short uzunluğuda yani 1 byte veri okunabilir veya yazılabilir. Bu sebeple tanımlamalarda bu değişken tipini kullanmalısınız.

Bu iletişim ile bir picten diğer pice veri yazılabilir okunabilir. Uygulamalarınızda kullanmanız gerekebilir öyleki butunlarla birkaç cihazı kontrol edeceğimizi var sayalım onbeş cihaz olsun 15 butonlu bir sistem mi tasarlayalım ve veriyi onbeş hat ile mi yollayalım yokda bir lcd ekran koyup menü oluşturup sadece 2 yada 3 butonla karşı tarafa menüye uygun kon yollayalım Toplamda 15 yada 150 kod hemde tek hattan e o zaman neden bu protokolü kullanmayalım .

Basit bir protokol olduğu için örnek program veriyorum sanıyorum daha da anlaşılacaktır. Aşağıda bir sera otomasyonu için yaptığım ortalama sıcaklık kontolörünün yazılımını sadece 1 sensör okuma haliyle sizlerle paylaşıyorum.

Değişik yazılım yöntemleriyle onlarca sensör okunup işleme tabi tutulabilir.

Tüm program açıklamalı olduğu için Mikro C de incelemenizi öneririm. Sıcaklık bilgisi 74hc595 entegreleri ile göstergelerde görüntülenir. Çeşitli yöntemlerle devasa boyutlarda göstergeler yapılabilir. (Devre şeması ekte mevcuttur.)

Alttaki yazılım olduğu gibi düzenlendiğinde 3 sensör bilgisi alması gerektiğinden sıcaklığı üçe bölerek gösterir o sebeple ilgili yazılım düzeltmelerinin ardından tek sensöle ortma sıcaklık göstergesi yaılabilir. Buradaki amaç OW kütüphanesinin örneklendirilmesidir ve bu sebeple proje uygulama olarak sunulmamıştır.

İnceleyen arkadaşların bir iki değişiklik ile 3 sensörüde okuyacak yazılımıda tek sensörüde okuyacak yazılımıda hatta sıcakık termostatı olabilecek yazılımı dahi çok kolay düzenleyebilirler. EKTE proje dosyasını ve uygulama TAM SÜRÜM HEXi devre simulasyonu mevcuttur.

MikroC Dersleri 13 Proje dosyaları: mikroc-dersleri-13.rar

Kolay gelsin iyi çalışmalar.
İlgili sorularınıza cevap vermeye çalışacağım.


// *****************************************************************
// PROJE Adı                : 3x18B20 Ortalamasını 7Seg displayda Gösterir
// PROJE Açıklaması         : DS18B20 64Bit DT
// PROJE Yazarı        : Aytaç DÜRGEN

//Proje Denetleyicisi       :16F628A
//Kristal                   :İç kristal 4MHZ
//BU PROJE 3 Ayrı noktanın ısısını alır Ortalamasını Bulur Küsürlerini+1Derece Yukarı Yuvarlar  7Segment Dispde Görüntüler.
/*Sıcaklık Ölçümü için DS18B20 64 Bit Digital Sensor okunmuştur. Gerekli Kodlamalar Açıklanmıştır
Bu uygulama Sera İçi Bilgiledirmesinde kullanılacağından -Sıcaklıkta tersinir işlemler Göz ardı edilerek Hazırlanmıştır
30 derecenim üzeri sıcaklıklarda Fan çalışacak 25derece sıcaklık sağlanıncaya kadar Histerisiz eğrisince çalışması sağlanmıştır.
Fan kontrolü Lojik Seviyede çıkış  olup Transistör aracılığı ile Röle Sürülmüştür.
Röle ilede Fan motorunun kapasitesine Göre bontaktör yada daha güçlü röle Kullanılmalıdır.

*/
// *****************************************************************
//------------------------------------------------------------------
unsigned char sayi_tablosu[11]={63,6,91,79,102,109,125,7,127,111,64} ;
//------------------------------------------------------------------
const unsigned short TEMP_RESOLUTION = 12;


unsigned int dongu,t0sayac=0,sure_sayac=0;
unsigned short onlar,birler,ara_deger,eksi=0;

//------------------------------------------------------------------
unsigned short ara_sicaklik_topla=0,ortalama=0,default_temp_bekle=0,yuvarla,yuvarlama_test;
unsigned int ara_sicaklik1,ara_sicaklik2,ara_sicaklik3;
//------------------------------------------------------------------
//------------------------------------------------------------------

//Port ve Pinlere takma etiket veriliyor Programın anlaşılırlığının Yüksek olması İçin Etiketeme Kullanıldı
#define ds1302          PORTA
#define ds1302_tris     TRISA
#define rst_pin         B2
#define clk_pin         B1
#define data_pin        B0
#define clock           PORTB.F1  //
#define latch           PORTB.F2  //
#define ds1             PORTB.F0  //
#define mod             PORTA.B5 //
#define artir           PORTA.B7 //
#define azalt           PORTA.B6  //



void spi (unsigned char bilgi)
{
     unsigned char j;
     unsigned char temp=0;
     temp = bilgi;
     j=8;
     while (j>0)
     {
        if (temp.F7==0) ds1 = 0;
        else            ds1 = 1;
        temp = temp<<1;
        clock = 1;
        clock  = 0;
        j--;
        }
}
/*sicaklik1 ölç*/


void sicaklik_1() {  //sicaklik okuma ve 595e yazma Alt programı
const unsigned short  RES_SHIFT = TEMP_RESOLUTION - 8;

unsigned int sicaklik_deger,ds_bilgi1,temp1;

    //--- Sıcakluk okunması için ds18b20 Gerekli Ayarları KURULUYOR
    Ow_Reset(&PORTA, 4);                         // Tek kablolu iletişimi Resetle
    Ow_Write(&PORTA, 4, 0xCC);                   // ROM adresine ULAŞIM KOMUTU**bakınız DS18b20 Datasheet
    Ow_Write(&PORTA, 4, 0x44);                   // Sıcaklığı Dijitale dönüşüm Emir Komutu Yazılır
    Delay_us(120);
    Ow_Reset(&PORTA, 4);
    Ow_Write(&PORTA, 4, 0xCC);                   // ROM adresine ULAŞIM KOMUTU**bakınız DS18b20 Datasheet
    Ow_Write(&PORTA, 4, 0xBE);                   // Durum Tablosu okuma komutu**bakınız DS18b20 Datasheet
    temp1 =  Ow_Read(&PORTA, 4);                 // Durum Tablosu sıcaklık bilgisi okunuyor ilk 8 bit
    temp1 = (Ow_Read(&PORTA, 4) << 8) + temp1;  // Durum Tablosu sıcaklık bilgisi okunuyor ikinci 8 bit
    ds_bilgi1 = temp1;

if (ds_bilgi1 & 0x8000) {
ds_bilgi1 = ~ds_bilgi1 + 1; // eksi sıcaklık kontrol ediliyor
eksi=1;
}
else {;eksi=0;}

ara_sicaklik1 = ds_bilgi1 >> RES_SHIFT;



}

/*********************************************************************************************************/
/*********************************************************************************************************/
/*Elde edilen Ortalama Spi yaz fonksiyonuna  Ort değişkeni ile parametre olarak girdirilip Seri iletişim Yöntemi fonksiyonu SPİ()
kullanılarak 8Bit seri Giriş Paralel Çıkış Kaydedicisi 74HC 595 üzerine yollanır.
segmentlere uygun Sayı değerleri kodlaması  unsigned char sayi_tablosu[11]={63,6,91,79,102,109,125,7,127,111,64} ;
Tanımlaması ile yukarıda yapılmış olup Buna Uygun  bağlantıda display oluşturulmuştur.
*/

void spi_yaz(unsigned short ort){

onlar = (ort/10)%10;             // ONLAR BASAMAĞI
birler =  ort%10 ;                // BİRLER BASAMAĞI


// bilgiler spi(Serilal Prepheral İnterface(SERİ YOL İLETİŞİM)) ile 74HC595e yazılıyor
 spi(57);   //C işareti
 spi(99);   //derece İşareti
 spi(sayi_tablosu[birler]);

 if(onlar!=0){spi(sayi_tablosu[onlar]);}
 else  spi(0);

latch = 1;  // 74HC595 Has adlandırılan Çıkış aktifleme anlamını taşıyan etikete LATCH denmiştir
latch = 0;

}









//------------------------------------------------------------------

//------------------------------------------------------------------


//------------------------------------------------------------------
/*KESME ALT PROGRAMI Başlangıçta DS18B20 sensörlerinin varsayılan sıcaklığı 85 Derece olduğu için Fanın çalışmasını Engellemek amacı ile 
TİMER0 Kesmesi kullanılmış olup Burada Süre senkronizasyonu sağalanmıştır */
//------------------------------------------------------------------
void interrupt(){
if(INTCON.T0IF){
t0sayac++;
if(t0sayac==4){
sure_sayac++;
if(sure_sayac==15){
default_temp_bekle=1;
sure_sayac=0;
}

t0sayac=0;
}

}
INTCON.T0IF=0;
TMR0=41;
}





void temel_ayarlar()
{
CMCON=0X07;
TRISB=0x00;
PORTB=0;
TRISA.B3=0;
TRISA.B7=1;
TRISA.B6=1;
TRISA.B5=1;
PORTA=0;
INTCON.GIE=1;
INTCON.T0IE=1;
OPTION_REG=0x07;
TMR0=42;







}
//------------------------------------------------------------------

//------------------------------------------------------------------
void main()
{
    temel_ayarlar();

    for(;;)
    {


if(t0sayac=1){
ortalama=0;
ara_sicaklik_topla=0;;

sicaklik_1();  // 1.Sıcaklık Ölçülüyor
delay_us(120);                        // 1.DS18B20 Normal Moda Geçmesi için Üretici tarafından Öngörülen 120Mikro Saniye bekleniyor
sicaklik_2();  // 2.Sıcaklık Ölçülüyor
delay_us(120);                         // 2.DS18B20 Normal Moda Geçmesi için Üretici tarafından Öngörülen 120Mikro Saniye bekleniyor
sicaklik_3();   // 3.Sıcaklık Ölçülüyor
delay_us(120);                          // 3.DS18B20 Normal Moda Geçmesi için Üretici tarafından Öngörülen 120Mikro Saniye bekleniyor
ara_sicaklik_topla=ara_sicaklik1+ara_sicaklik2+ara_sicaklik3; // Sayı ORTALAMA =sayı1+sayı2+.......+Sayı  n  matematiksel İşlemi uygulanıyor

onlar = (ara_sicaklik_topla/10)%10;             // ONLAR BASAMAĞI
birler =  ara_sicaklik_topla%10 ;                // BİRLER BASAMAĞI
yuvarla= onlar+ birler;
yuvarlama_test=yuvarla%3;

if(yuvarlama_test==1) ara_sicaklik_topla = ara_sicaklik_topla+2;
if(yuvarlama_test==2) ara_sicaklik_topla = ara_sicaklik_topla+1;
ortalama=ara_sicaklik_topla/3;
delay_us(100);

spi_yaz(ortalama);
delay_ms(3000);   }
if(default_temp_bekle){
if(ortalama>=30)PORTA.RA3=1;    //Bu kısım sıcaklık 30dan yüksek olduğunda soğutucu fanı çalıştıracak
if(ortalama<25)PORTA.RA3=0;     //Bu kısım sıcaklık 25den aşağı  olduğunda soğutucu fanı durduracak.
default_temp_bekle=0;
sure_sayac=0;

}

//Bu kısım TMR0 sayacı içeisindeki suresayıcısı 20 den büyük 30dan küçük iken dereceyi gosterir





    }


}


http://www.facebook.com/#!/umutelektroniktarsus(aytacdurgen)
aytacdurgen@gmail.com
tarsusled@gmail.com
www.ledpiksel.com

Aytaç Dürgen
544 924 28 87

TARSUS MERSİN

  • davut naci kaya

    Hocam çok teşekkürler çok faydalı bilgiler veriyorsunuz.

  • aytac dürgen

    ben teşekkür ederim iyi çalışmalar

  • Fatih ASLAN

    Karışık bir anlatım olmuş sayın Aytaç bey.DS18B20 çok fazla özelliği olan bir sensördür.En azından CRC hesaplaması yapılmasını , Alarm kurulumlarını veya kendi OW hattımızı nasıl yazabiliriz ? bunlara deyinmenizi beklerdim.

  • ahmet orhan tartılacı

    Hocam Allah razı olsun bu yaz PIC pogramlamaya başlayacğım faydalı yazılarınız için çok teşekkür ederim

  • aytac dürgen

    Dersteki örnek yazılım ds18b20 ile yapılmış ve her yerde bulamayacağınız şekilde açıklamalı olarak yazılmış bir programdır. Dersisn konusu Mikro C one wire Kütüphanesinin kullanılmasına ilişkin hazırlanmıştır.
    Dediğiniz gibi 18b20 çok nitelikli bir sensördür ve bir ders anlatmaya yetmez diye düşünüyorum.

    Bu dersleri işten fırsat buldukça toparlıyorum yazıyorum eğer bir iki satır yazar yolarsanız yazıya ekleme fırsatımız olur ve konu genişlemiş olur.
    İlginize teşekkür ederim.

  • kemal

    hocam guzel bi calisma olmus ama sanirim bir kismi eksik olmus.

    Programi microc de calistirdigim zaman sicaklik_2() ve sicaklik_3() tanitilmamis.

    sicaklik_2(); // 2.Sıcaklık Ölçülüyor
    delay_us(120); // 2.DS18B20 Normal Moda Geçmesi için Üretici tarafından Öngörülen 120Mikro Saniye bekleniyor
    sicaklik_3(); // 3.Sıcaklık Ölçülüyor
    delay_us(120);

    Kolay gelsin tesekkurler