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.
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.
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)
[email protected]
[email protected]
www.ledpiksel.com
Aytaç Dürgen
544 924 28 87
TARSUS MERSİN
MikroC Dersleri 13 Proje dosyaları;
Şifre-Pass: 320volt.com
Yayım tarihi: 2013/06/21 Etiketler: kılavuz ders, mikroc dersleri, ow protokolü
Hocam çok teşekkürler çok faydalı bilgiler veriyorsunuz.
ben teşekkür ederim iyi çalışmalar
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.
Hocam Allah razı olsun bu yaz PIC pogramlamaya başlayacğım faydalı yazılarınız için çok teşekkür ederim
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.
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