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

PIC16F628 DS18B20 ile 4 Digit 7 Segment Saat Termometre

Sponsorlu Bağlantılar

PIC16F628 mikrodenetleyici üzerine kurulu DS18B20 sensörlü saat termometre projesi oldukca faydalı olacaktır detaylı anlatım yapılmış.

PIC16F628 – DS18B20

Artık sokaklarda, caddelerde sık sık görmeye başladığımız, Türk insanının kamuya hizmet vermekteki istekliliğinin belkide reklamcıların dikkat çekmekdeki yeni metodunun göstergesi, termometre ve saat uygulaması ile karşınızdayım.

Bu çalışmada 4 adet 7 segment display ile yapılmış, 4 rakamlı, 0.0625 C duyarlılığa sahip termometre ve 00-23 saat aralığında çalışan, yüksek doğruluklu dijital saat gerçekleştirilmiştir. Donanımın mikro denetleyicisi Pic16F628A’dır. Bunun nedeni, belki de artık benim klasikleşmiş cümlelerimle başlayacak ama, iç osilatöre sahip olması ve bu sayede donanım gereksinimini azaltması, düşük maliyeti ve eklemek istediğim birkaç özellik daha, Timer 1 sayacı ile harici osilatör çalıştırabilmesi ve sayabilmesi (uyku modu dahil). Bu özelliği sayesinde, harici bir saate ihtiyaç kalmamış (DS1302 gibi) sadece bağlanan 32.768KHz’lik kristal saydırılarak saat hesaplanmıştır ve bu maliyet ortadan kaldırılmıştır.

7 segmentler donanımda normalden biraz daha büyük tercih edilmiştir. 44mm’lik ortak anotlu 7segment displayler ,74HC595 Shift registerlarıyla sürülmüştür. Bu donanımın tercih edilmesinin sebebi ise, kaydedicinin çok hızlı yüklenmesi (1 tanesi 1ns) ve latch edilerek sürülen çıkışlarıdır. Bu sayede kaydedicilerin yüklendiği sırada, erkanda anlamsız karakterler görülmemekte ve ilgili karakter için gerekli 8 bit yüklendikten sonra çıkışlar latch edilerek değerler kaydedicilerin çıkışlarına aktarılmaktadır.

Saate yüksek doğrulukta denmesinin sebebi, bilindiği üzere Pic mikro denetleyicilerin timer’larında birçok sıkıntı yaşanmaktadır. Saniye gecikmesi doğru hesaplanamamaktadır. 1sn’lik delay fonksiyonu yazmak oldukça zordur. Bunun nedeni kimi zaman mikro denetleyiciden, kimi zaman yazılan koddan, kimi zamanda mikro denetleyiciye ait osilatörün kalitesizliğinden yada bahsedilen değerlerde ve duyarlılıkta çalışmamasından olabilir. Zaten adının anlamı Çevresel Arayüz Denetleyicisi (Peripheral Interface Controller) olan bir donanım malzemesine delay fonksiyonuyla, yani “İşlem Yapma”, yine “işlem yapma”, 1sn boyunca “işlem yapma” (1000 kez No Operating) demek , bu çılgın donanım açısından onur kırıcı olacaktır.

Bu çalışmada saat 32.768KHz’lik bir kristal osilatör saydırılarak gerçekleştirilmiştir. Bu sayede 1sn’lik gecikme tam olarak hesaplanmaktadır. Osilatör, harici osilatör çalıştırma yeteneğine sahip olan Pic16F628’in OSI (RB.7) ve OSO(RB.6) bacaklarına bağlanarak ve Timer1 sayacı saydırılarak gerçekleştirilmiştir. Timer1 sayacı 16bit’lik bir sayaçtır ve 0xFFFF değerinden sonra kesme yaratarak 0’lanır. Sayma esnasında sayaç denetleyicinin diğer işlemleri yapmasına engel değildir. Sayma işlemi timer 1 sayacı dolduğunda kesme yaratacaktır ve tekrar 0’lanıp saymaya devam edecektir. Bu kesme oluştuktan sonra, saniye değeri arttırılacak, dakika ve saat değerleri denetlenecektir. Kristal donanımına ek olarak osilatörün bacaklarına 2 tane 15pf’lık kapasitör bağlanarak topraklanmıştır.

32.786kHz’lik bir kristal 1 saniyede 32768 kez darbe sinyali yaratmaktadır. Bu kristal yukarıda da bahsettiğim gibi Pic 16F628’in OSI ve OSO out bacaklarına (Timer 1 sayacına) bağlanmıştır.

pic16f628-register

Pic’in içindeki T1CON register’ı, yukarıda gösterilmektedir. Bu çalışmada, T1CON registerına başlangıç konfigürasyonu için 0b00001110 değeri kaydedilmiştir. Yani clock kaynağı (Bit.1) harici osilatör, clock senkronizasyonu (Bit.2) pasif ve osilatör aktif edilmiştir (Bit.3).

pic16f628-bit1-bit3-register

Timer 1 sayacı 16 bitlik bir sayaçtır. Yani 65536’ya kadar saymakta ve bundan sonra dolmakta ve 0’lanmaktadır. Timer 1 TMR1L (ilk 8 bit) ve TMR 2 (son 8 bit) adı verilen 8 bitlik registerlardan oluşmaktadır. Timer 1 bölünmeden saydırıldığında (prescalar olmadan T1CON<5.6> <0.0>) 2 saniyede 1 kez kesme (interrupt) yaratmaktadır. TMR1H eğer 0x80 değeri ile yüklenirse (TMR1 = 0x8000 = 32768), saymaya 32768’den başlayacak ve 65536’ya 1sn’de ulaşacaktır.

pic16f628-termometre-timer

Termometre olarak Maxim firmasına ait DS18B20 tercih edilmiştir. Sistemin en pahalı elemanı budur. Tercih edilme sebebi ise, Maxim firmasının tescilli protokolü olan 1Wire Bus kullanması, 12 bit’lik ADC ile 12bit sayısal yüksek hassasiyet ve doğrulukta ölçüm yapması (0.0625 hassasiyet), ölçüm çözünürlüğünün değiştirilebilmesi, yüksek çalışma aralığı (-55C – +125C) ve basit donanım ara yüzüdür.

Saat Termometre – Sistemin çalışması

Başlangıçta çok çok beğendim pic16F628A’ya karşı moralimi bozan, sonradan basit bir hata olduğunu fark ettiğim bir olayla başlayacağım.

Sistemi tasarladıktan sonra test aşamasında ilk olarak termometre kısmını programladım. Tüm ayarlamaları gerçekleştirdim ve saat kısmını programlamaya başladım. Saat kısmını programlarken başıma ileride iyi bir tecrübe olacak bir olayla karşılaştım. Pic donanımı, içindeki yazılımla uçurmayı başardım. Programlayıcımda test esnasında tam 8 adet Pic 16F628A denedim üstelik bunlar oldukça çeşitliydi, (P16F628, P16F628 IP, P16F628 4P…), kristal seçeneklerini değiştirdim, donanımda bazı değişiklikler yaptım. Hepsinde sonuç aynı.

Denetleyiciyi ilk programlama esnasında hiçbir problem yok. Devreye bağlıyorsunuz çalışıyor. Ancak bir daha programlanmıyor. Hep aynı hata, programlıyor ve kodu doğruladıktan sonra 0x000 adresinde hata!. Microchip firmasının teknik desteğiyle, Türkiye temsilcileriyle v.b. gibi yetkili olabilecek birçok kişi ile irtibat kurdum. Sonunda çözdüm.

Hiçbiri uçmamış, sadece programlayıcıdan!. Programlayıcımı piyasada satılan basit bir JDM programlayıcı. 16F628 programlanırken, voltaj seviyelerinin düşüklüğünden ve pic’in LVP (düşük voltaj programlama) bacakları yüzünden, her zaman programlayan programlayıcım birden gitti. Eskiden nasıl programladığını halen anlayamıyorum, ancak yeni bir programlayıcıyla bu iş çözüldü.

Bu esnada, hatayı anlamak için Pic’in osilatörünü XT olarakda denedim. Bu nedenle Pic’in kristali 4Mhz XT.

32.768kHz’lik saat osilatörü OSI ve OSO bacaklarına 15pf ‘lık kapasitörlerle bağlandı. Kristal bacaklarına da 22pf’lık kapasitörler bağlanmıştır.

7Segment displayler ortak anotlu seçildi ve 4 tane 74HCT595 shift register’ı seri kullanılarak sürüldü. Bu sayede Pic üzerinden sadece 3 bacak bağlantısıyla (CLK, EN, DATA) 4 karakterde tam olarak sürülebilmiştir.

DS18B20 12bitlik çözünürlüğe göre parazit güç modunda çalıştırıldı. 12Bit çözünürlük sayesinde 0.0625C’lik hassasiyette ölçüm gerçekleştirildi. Ölçüm emrinin verilmesi, ölçümün sayısala dönüştürülmesi ve mikro denetleyiciyle haberleştirilmesi yaklaşık 1saniye sürmektedir. Bu nedenle termometrenin güncellenmesi yaklaşık 1sn’de bir sürecektir.

Sistem başlangıçta 00:00 saat değeriyle başlamaktadır. Saat değeri 5 saniye görüntülenmekte, termometre değeri 5 saniye görüntülenmekte ve Antrak yazısı 4 saniye görüntülenmektedir.

Saatin ayarlanması için devreye 2 adet düğme eklenmiştir. Bu düğmelerde Saat Seç düğmesi bu işlemler tamamlandıktan sonra kabul edilmektedir. Yani saati ayarlayabilmek için ANTRAK yazısı yazmaya başladığında düğmeye basın ve bekleyin.

pic16f628-ds18b20-ile-4-digit-7-segment-saat-termometre

Sıcaklık Ölçümü

4digit termometre ve saat çalışması gerçekleştirilmiştir. Sıcaklık ölçümü 0C-99C ve 0C – -55C değerlerinin ölçümleri 0.625’lik hassasiyetle 12 bit yapılmaktadır. Elde edilen sıcaklık değeri 00.0C formatında 1 ondalıkla yazdırılmaktadır. -0 ile -9 arasıda yine aynı formatta gösterilmektedir ancak -9C – -55C arası ise değer ve ondalık kısım -00.0 formatında yazdırılmaktadır.

Saatin Çalışması

Saat açılışta 00:00’dan başlamakta ve saydırılmaktadır. Formatı 00-23’dür. Sayma işlemi kesme kullanılarak yapılmaktadır. Bu nedenle diğer işlemler gerçekleştirilirken de sayma işlemi devam etmektedir.

Saatin ayarlanması için devreye bağlanan 2 adet düğme ile sağlanmaktadır. Bunlardan biri saat ayarlama diğeri de saydırma düğmesidir. Saati ayarlamak için çalışma esnasında saat ayar düğmesine basılı tutulur ve ilk termometre görüntülenmesinin ardından ekranda Pr– değeri görüntülenir. Bu işlemin ardından dakika bölümünün altında . işaretleri yanar. Burada dakika değerleri ayarlanabilir. Saat ayar düğmesine tekrar basıldığında saat kısmının altındaki . işaretleri yanar ve saat ayarına geçer. Saat ayarı da yapıldıktan sonra saat ayar düğmesine tekrar basıldığında yine ekranda ilgili Pr– uyarısı görüntülenir. Bunun ardından saat ve termometre normal çalışmaya devam eder. Saat ayarı gerçekleştirilirken saat yine saymaya devam eder.

Normal çalışma esnasında Saat 5sn ve Termometre 5sn sürelerle görüntülenmektedir.

Kullanılan Donanım

Mikro Denetleyici – Pic16F628A

Kullanılan mikro denetleyici Pic16F628A I/P’dir. Tercih sebebi iç osilatörünün olması ve bu sayede kart üzerinde yer kazanılması iyi bir avantajdır. USART sağlıklı bir seri port haberleşmesi gerçekleştirilebilmesini sağlıyor. Maliyet olarak ise 16serisi mikro denetleyiciler arasında en iyi fiyat/performans oranına sahip olması. I/O sayısı düşük olan elektronik devrelerde oldukça kullanışlı.

pic16f628-pin

pic16f628-bilgi

Termometre – DS18B20

Tek bacak üzerinden güç kaynağına ihtiyaç olmadan haberleşmesi I/O olarak büyük bir avantaj sağlıyor. Ayrıca oluşturulabilecek olan BUS sayesinde birden fazla sensör aynı BUS üzerinde kullanılabiliyor.

12Bit AD dönüştürücü sayesinde 0.0625C hassasiyetli ölçümleri dijital olarak gerçekleştirebiliyor. Dijital ölçüm yapabilmesi hem güvenilirliğini arttırıyor hem de devrenin esnekliğini sağlıyor. Devredeki en maliyetli entegre olması sistem maliyeti açısından kötü ancak ısı ölçümü için fiyat performans oranı diğer sistem veya entegrelere göre olarak oldukça iyi.

Termometre-DS18B20

Anahtarlama – BC237: NPN transistor. 7Segmentlerin anahtarlanması için kullanılmıştır.

Güç Kaynağı – 12VDC Adaptör: Güç kaynağından gelecek olan değer elektronik elemanlar için +5V DC olarak kabul edildi. 7Segmentlerin sürülmesi için harici güç kaynağı kullanımına olanak verildi. Bu sayede güç kaynağından gelen 5V DC’nin yetersiz olacağı displaylerde bu anahtar kullanılarak yüksek güç deki güç kaynağına geçilebiliyor.

Devreye güç kaynağı olarak 12VDC ayarlanabilir adaptör bağlanmıştır. Bu sayede 7 segmentlerin sürümü direk güç kaynağından alınmaktadır ve yüksek ışık gücü sağlanmıştır. Elektronik olan kısmın beslenmesi için de LM7805 düzenleyicisi kullanılmıştır. 7Segment’ler dışında sistemin diğer bölümünün güç tüketimi düşük olduğu için 200mA’lik bu regülatör yeterlidir.

Regülatör – LM7805: 12VDC güç kaynağından gelen değer sistemdeki elektronik elemanların sürülmesi için LM7805 kullanılmıştır. 200mA’lik bu regülatör sistemin çalışması için yeterlidir. Ancak displaylerin sürülmesi için yeterli değildir.

Display – 7Segment Common Anode: Ortak anotlu 44mm’lik 4adet 7Segment display kullanıldı.

Display-7Segment-Common-Anode

G

F

 

A

B

E

D

Gnd

C

Dot

Seri Register – 74HC595

Düşük maliyetli ve Latch Enable özelliğine sahip olan bu entegre 7 Segment displaylerin sürülmesi için kullanıldı. Tüm çıkışlar kullanıldı. Programlama esnasında a,b,c… gibi değerler düzenlenmiştir. Ayrıca 8 bit Shift register olduğu için 7 segment display ve dot’da sürülebilmiştir. Sürüm hızı yaklaşık olarak 1ns olduğu için zaman kaybı yaşanmamıştır.

Her display için 1 seri register kullanılmıştır. Seri register’lar birbirlerine seri olarak bağlanmışlardır. Ekranda 4 digit rakamın görüntülenmesi için devre 32 kez Clock darbesiyle sürülmüştür. İlgili maskeleme gerçekleştirilmiştir.

Seri-Register-74HC595

Dirençler: DS18B20’nin BUS Bağlantısı için gerekli olan direnç 4.7K Ohm’dur. Pull up dirençleri 10KOhm kullanılmıştır. Anahtarlama için gerekli olan dirençler ise 330Ohm kullanılmıştır.

Düğmeler – Push Button: 2 adet Push buton kullanılmış ve pull up devresiyle PORTB 5 ve 6’ya bağlanmıştır. Basılı konumda iken bacağa düşen voltaj 0V’a inmektedir.

Kristal – 4MHz: Mikro denetleyicinin çalışmasında başlangıçta INT RC I/O kullanılmış ancak iyi sonuçlar elde edilememiştir. Bu nedenle devreye 4Mhz’lik XT kristal osilatörü eklenmiştir.

Kristal – 32.768KHz: Saatin gerçek sayılması için piyasada saat osilatörü olarak da bilinen 32.768KHz’lik XT osilatör kullanılmıştır. Bu sayede timer tam olarak 1sn değerini saymaktadır.

Kapasitör – 15 ve 22pf: Kristallerin bacaklarının topraklanmasında kullanılmıştır. 15pf 32.768KHz’lik osilatörün, 22pF ise 4Mhz’lik osilatör bacaklarına bağlanmıştır.

Konnektöler: Devrenin güç kaynağı bağlantıları için kullanılmıştır.

Anahtar: 7Segment displaylerin güç kaynağı seçimini sağlamak için kullanılmıştır. 1.konumda iken ana güç kaynağını yani 5VDC’yi 2.konumdayken harici güç kaynağını kullanmaktadır (12VDC).

Hazırlayan: Tolga TAŞTAN (emeği geçen hazırlayan kişilere teşekkürler – yukarıda ki açıklamalar kkendisine aittir)

Saat Termometre proje dosyaları: pic16f628-ds18b20-saat-termometre.rar

  • Merak ettiğim bir şey var, bildiğim kadarıyla 16F628A’da ADC yok, peki sensörden gelen veriyi nasıl okudun?

    • İsmail

      Sensörden gelen veri analog değil sayısal.

  • Emir

    Yapıp çalıştıran varmı? Bende yapıcam, herşeyi sipariş ettim. İnşallah çalışır

  • celesket

    16F628A anlog bilgiyi okuyabilir.Örneğin comparatör ile

  • Empi

    Merhabalar pic e yeni başladım ve bu proje çok ilgimi çekti kod olarak da paylaşmanız veya göndermeniz mümkün mü acaba incelemeyi çok isterim, teşekkürler.