kablosuz termostat

Başlatan serkan, 05 Şubat 2014, 15:13:34

serkan

Herkese selamlar;

Forumda bulunan haftalık programlanabilir kablosuz termostatı yaptım ve bazı özelliklerinden memnun kalmadım. Özellikle ısı programlanan aralıkta iken kablosuz olarak sinyal yollamıyordu ve alıcı pici ile iletişim problemi yaşıyordu.

Yine forumda bulunan ve 0.1 hassasiyetle ayarlanabilen fakat programlanamayan 16f628 ile yapılmış yazılımı 16f876a ile çalışacak şekilde ayarlayarak program üzerinde değişiklikler yaptım. program daha önceden verilen haftalık programlanabilir termostat projesi üzerinde çalışabiliyor. Benim evimde gündüz kimse olmadığı için 8-19 saatleri arasında program gündüz moduna giriyor ve gece set değerinden 2 derece daha düşüğe ayarlıyor kendini.

Ben gece ve gündüz olarak ayarladım ve saat fonksiyonunu ekledim. Programdaki kodların saat ve sensor hesap tanımlamaları ete hocaya aittir. kalan kısımları ise diğer programlardan alarak kendimde bazı özellikler ekledim.

Programda hatalar veya gereksiz tekrarlayan kodlar gözünüze çarparsa lütfen uyarırsanız sevinirim.

Yazılım ve proteus şeması ektedir. İyi çalışmalar dilerim.


Ete hocam sisteme bir göz atıp varsa hatalarımı söyleyebilir misin?


Saygılar



rambili

#1
güzel bir çalışma ellerine sağlık..

Şöyle bir eksiklik var.
1,- her hangi bir şekilde menü tuşuna basıldı ise bir süre bekleyip normal akışına dönse iyi olmaz mı..
2.- Menü içerisine Gündüz ve Gece saatleri belirtilebilir.
    Gündüz:  06:00 - 19:00
    Gece    :  19:00 - 06:00  gibi,


Bir faydam olduysa ne mutlu..
Zaman su gibidir.
Bazen deli bir ırmak, bazende durgun akar.

serkan

Alıntı yapılan: rambili - 05 Şubat 2014, 16:42:08
güzel bir çalışma ellerine sağlık..

Şöyle bir eksiklik var.
1,- her hangi bir şekilde menü tuşuna basıldı ise bir süre bekleyip normal akışına dönse iyi olmaz mı..
2.- Menü içerisine Gündüz ve Gece saatleri belirtilebilir.
    Gündüz:  06:00 - 19:00
    Gece    :  19:00 - 06:00  gibi,


Bir faydam olduysa ne mutlu..

+1

Teşekkür ederim. Faydan tabiki de oldu.  Bu beyin fırtınası. bi kaç gece uğraşır sonucu buraya eklerim.

Saygılar


gogoce

güzel çalışma tebrikler
Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

ete

Anlamadığım bir şey var,
Programda PORTB.0 kesmesi aktif halde. Kesme kısmında şunlar yazılı;
Disable         
KESME:
        IF MENU=0 THEN
        TUS=1
        ELSE
        TUS=0
        ENDIF
        RESUME
        Enable
        end

Şimdi bir mantık yürütelim.
PORTB.0 da bağlı olan Menü tuşuna basılmaz ise program KESME etiketine kesinlikle gelmez. Üstelik Menü tuşuna basılınca PortB.0=0 olması gerekir. Ancak bu konumda program Kesme etiketine gelir. Bunun için kesmenin de düşen kenarda oluşması gerekir. Bunu ayarlayan ise Option Registeridir. Ona bakalım;  OPTION_REG=%0000000
bitleri sayarsanız 8 bit yerine 7 bitlik değer verilmiş. Buda bir hata. Binary değer verdiğiniz zaman mutlaka kaç tane bit yazdınız sayınız. Eksik ise tamamlayınız. Bunu biz OPTION_REG=%00000000 sayalım. Bu durumda kenarı ayarlayan bit 6 değeri sıfır olduğu için kesme düşen kenarda oluşacak burası doğru.
Peki  neden IF MENU=0 THEN diye bir komut kullanılmış orada zaten MENU=0 olmayınca oraya gidilemeyeceğine göre anlamsız değilmi?. Şayet amaç anlık yanlışlıkla basılma durumunu test etmek ise bu komut dizisi bunu yapamaz zaten. Orada biraz gecikmeli while - wend döngüsü çalıştırıp Menü tuşuna belirli bir süre basılmışmı kontrol etmek gerekirdi.
Dikkat ederseniz kesmeden çıkışta Kesme bayarağıda sıfırlanmıyor. Buda bir eksiklik. Kesmeyi oluşturan bayrak mutlaka kesme içinden çıkmadan sıfırlanmalıdır. Ne gariptirki programın kesmeden çıkmaması gerekirken çıkabiliyor. Buda derleyicinin garipliği olsa gerek. Daha önce unuttuğum bayrak sıfırlama durumlarında program sürekli kesme etiketine gider idi bunu çok defa yaşadım. Ama bu programda anlam vermediğim şekilde program kesmeden çıkıyor ve yeniden girmiyor. Başka bir yerde sıfırlanmış olsa onuda görürdüm ama oda yok. Her neyse biz yinede kuralı işletelim ve kesme bayrağı kesmeden çıkmadan sıfırlanmalıdır diyelim.
Başka belirgin bir hata göremedim. Kusur dersen Ayar menüsünde ekranın sürekli silinip yenilenmesinden kaynaklanan göz kırpma olayı var buda düzeltilebilir. Düzeltilmeli bence. Bu şekilde hoş değil.

Ete
 

serkan

#5
Alıntı yapılan: ete - 06 Şubat 2014, 12:50:32
Anlamadığım bir şey var,
Programda PORTB.0 kesmesi aktif halde. Kesme kısmında şunlar yazılı;
Disable         
KESME:
        IF MENU=0 THEN
        TUS=1
        ELSE
        TUS=0
        ENDIF
        RESUME
        Enable
        end

Şimdi bir mantık yürütelim.
PORTB.0 da bağlı olan Menü tuşuna basılmaz ise program KESME etiketine kesinlikle gelmez. Üstelik Menü tuşuna basılınca PortB.0=0 olması gerekir. Ancak bu konumda program Kesme etiketine gelir. Bunun için kesmenin de düşen kenarda oluşması gerekir. Bunu ayarlayan ise Option Registeridir. Ona bakalım;  OPTION_REG=%0000000
bitleri sayarsanız 8 bit yerine 7 bitlik değer verilmiş. Buda bir hata. Binary değer verdiğiniz zaman mutlaka kaç tane bit yazdınız sayınız. Eksik ise tamamlayınız. Bunu biz OPTION_REG=%00000000 sayalım. Bu durumda kenarı ayarlayan bit 6 değeri sıfır olduğu için kesme düşen kenarda oluşacak burası doğru.
Peki  neden IF MENU=0 THEN diye bir komut kullanılmış orada zaten MENU=0 olmayınca oraya gidilemeyeceğine göre anlamsız değilmi?. Şayet amaç anlık yanlışlıkla basılma durumunu test etmek ise bu komut dizisi bunu yapamaz zaten. Orada biraz gecikmeli while - wend döngüsü çalıştırıp Menü tuşuna belirli bir süre basılmışmı kontrol etmek gerekirdi.
Dikkat ederseniz kesmeden çıkışta Kesme bayarağıda sıfırlanmıyor. Buda bir eksiklik. Kesmeyi oluşturan bayrak mutlaka kesme içinden çıkmadan sıfırlanmalıdır. Ne gariptirki programın kesmeden çıkmaması gerekirken çıkabiliyor. Buda derleyicinin garipliği olsa gerek. Daha önce unuttuğum bayrak sıfırlama durumlarında program sürekli kesme etiketine gider idi bunu çok defa yaşadım. Ama bu programda anlam vermediğim şekilde program kesmeden çıkıyor ve yeniden girmiyor. Başka bir yerde sıfırlanmış olsa onuda görürdüm ama oda yok. Her neyse biz yinede kuralı işletelim ve kesme bayrağı kesmeden çıkmadan sıfırlanmalıdır diyelim.
Başka belirgin bir hata göremedim. Kusur dersen Ayar menüsünde ekranın sürekli silinip yenilenmesinden kaynaklanan göz kırpma olayı var buda düzeltilebilir. Düzeltilmeli bence. Bu şekilde hoş değil.

Ete


Abi hakikaten mantığa vurduğunda saçma geliyor kulağa, acaba yazan arkadaş TUS değişkenini sıfırlamak için mi o komutu yazdıki? Aslında o kısım alıntı programın orjinalinde kesme bayrağı sıfırlanıyordu fakat ne hikmetse ben o kesme bayrağını sıfırlama komutunu silmişim işin enteresan kısmı da dediğin gibi program kesmeden çıkıyor.

Şu option registerini ve adc iptalini vs vs biraz daha piclerin özelliklerini öğrenmem gerek. Program yazmayı öğrenmekten çok daha önemli olduğunu gördüm. Bunun içinde çeşitli kategorilerde iyi yazılmış programları kurcalamam gerekirse silip kendim yazmaya çalışmam gerekecek.

pbpnin ise LCD komutları üzerinde az çok deneyimim oldu.

Şu anda programı daha sistemli bir şekilde düzenliycem. Elime kağıt kalemi aldım değişkenleri vs not alıyorum. MCS ekranında bi oraya git bi buraya git bazen bazı şeyler atlanabiliyor. Gece gündüz ayrı set edilebilecek şekilde düzenlemeye çalışıcam programı.

Bu işe ancak gece 22:30 civarı kızım uyuyunca zaman ayırabiliyorum çok vaktim olmuyor o yüzden. Takıldığım nokta olursa değerli fikirlerini esirgememen beni mutlu eder.

Saygılarımla

serkan

Ete hocam burda nerde hata yapıyorum?

Çıldırtacak beni, stack overflow hatası alıyorum. Programı elli kere değiştirdim. Tüm gosubları takip ettim, tüm goto lara baktım ama sorunu düzeltemedim.


şu haliyle rutin çalışıyor ne zaman portb.0 'ı 0 a çeksem program hata veriyor. WDT pici resetliyor. onu düzeltiyorum bu seferde bi kaç saniye ieçrisinde 4-5 bin adet stack overflow hatası alıyorum.

Denemediğim şekil kalmadı, en son bu haliyle hala hata alıyorum. İşin içinden çıkamadım bi göz atabilir misin?

Saygılar

ete

Hata-1;
Menü Tuşuna basılınca Program kesmeye gidiyor orada TUS=1 yapılıp dönüyor. Sende TUS=1 ise şuraya git diyorsun.
Peki TUS=1 olması durumunu kullandıktan sonra TUS=0 yapman gerekmezmi? Hemde ilk TUS=1 ise dediğinyerde TUS=1 ise önce TUS=0 yapıp sonra gideceği yere yollaman uygun olur.

Hata-2:
Kesme'den çıkarken Önce ENABLE sonra RESUME demişsin.  Halbuki Önce RESUME sonra ENABLE demen gerekirdi. STack hatası bundan meydana geliyor.

Başka bir şey göremedim.

Ete


serkan

#8
Abi harikasın sorunu hallettim : )))

ayrıca programa gece başlangıç ve gece bitiş menüsünü de ekledim. Ekte vericinin hexi ve pbp dosyası mevcut. isis şeması ve alıcının pbp dosyası ile hexi birinci mesajdaki eklentiden alınabilir.


D&R dan sipariş ettiğim kitabım da elime ulaştı. Picleri daha iyi anlamam lazımki yazılımda başarısızlığa uğramayalım.

Saygılarımla

serkan

#9
Bazı değişiklikler yapıldı;

- LCD arka plan ışığı gündüz sönecek gece moduna girdiğinde yanacak
- Ayar menüsünde gece sıcaklık set değeri hesaplanırken 2.satırda gündüz set değeri görünüyordu, düzeltildi


- Ete hocam menüde herhangi bir yerde x saniye işlem yapılmazsa program ana döngüye nasıl döndürülür??

ete

O yerdeki program döngüsünde bir sayaç çalıştırırsın. Sayaç değeri her seferde bir artırılır. İşlem yapılan yerlerin hepsinde sayacı sıfırlarsın.
Sayac değeri =xxx olunca Goto Ana döngü (yada Gosub ile gelmiş isen RETURN) ile ana döngüye dönülür

Ete

serkan

Sağolasın abi,

bende bu şekilde düşünmüştüm fakat for, next kullanmak doğru mu değil mi senin ağzından duymak daha bi anlamlı : ))

MS_59

#12
serkan

bazı eksik ve fazlalıklar var
1,DEFINE ADC_BITS     8           'A/D çevirim sonucu kaç bit olacak
   DEFINE ADC_CLOCK  3           'Clock kaynağı (3=rc)
   DEFINE ADC_SAMPLEUS  100
   bu satırlar fazlalık

2,değişkenleri tanımladıktan sonra içeriklerini sıfırla sen yapmışsın ama ortada biryerde (bu şekilde çalışırmı bilmiyorum)
3,ekranın rw pini işlemciye bağlı fakat hiçbir yerde pin low'a çekilmemiş bunu pcb'de gnd'ye bağlasanda olur
4,TRISA 6bit tanımlı bunu 8 yap
5,basla satırından önce açılış gecikmesi ver 200ms -300ms ve LCD'yi sil
6,RTC 'de 1. gün pazardır  dikkat ettiysen bugün pazartesi ama ekranda salı yazıyor
7, birde hassasiyet 2.0 dan büyükse neden sürekli eeproma yazılıyor
8,eepromu sürekli okumak yerine basla satırından önce birkere okuman daha mantıklı olur ve ayar etiketleri arasında sürekli eeproma kayıt etmektense bütün ayarları yapıp en sonunda kaydedip çıkmak daha mantıklı

birde derece ayarlarken herseferinde saat menüsüne giriyor saat için ayrı bir menü koyarsan daha kullanışlı  olur.
ben kendi termostatımda şöyle yapmıştım 2sn asagı tuşuna basılı tutulursa saat ayar menüsüne giriyor
mehmet

serkan

Alıntı yapılan: proteus - 10 Şubat 2014, 18:25:05
serkan

bazı eksik ve fazlalıklar var
1,DEFINE ADC_BITS     8           'A/D çevirim sonucu kaç bit olacak
   DEFINE ADC_CLOCK  3           'Clock kaynağı (3=rc)
   DEFINE ADC_SAMPLEUS  100
   bu satırlar fazlalık

2,değişkenleri tanımladıktan sonra içeriklerini sıfırla sen yapmışsın ama ortada biryerde (bu şekilde çalışırmı bilmiyorum)
3,ekranın rw pini işlemciye bağlı fakat hiçbir yerde pin low'a çekilmemiş bunu pcb'de gnd'ye bağlasanda olur
4,TRISA 6bit tanımlı bunu 8 yap
5,basla satırından önce açılış gecikmesi ver 200ms -300ms ve LCD'yi sil
6,RTC 'de 1. gün pazardır  dikkat ettiysen bugün pazartesi ama ekranda salı yazıyor
7, birde hassasiyet 2.0 dan büyükse neden sürekli eeproma yazılıyor
8,eepromu sürekli okumak yerine basla satırından önce birkere okuman daha mantıklı olur ve ayar etiketleri arasında sürekli eeproma kayıt etmektense bütün ayarları yapıp en sonunda kaydedip çıkmak daha mantıklı

birde derece ayarlarken herseferinde saat menüsüne giriyor saat için ayrı bir menü koyarsan daha kullanışlı  olur.
ben kendi termostatımda şöyle yapmıştım 2sn asagı tuşuna basılı tutulursa saat ayar menüsüne giriyor

Tesekkur ederim. Tek tek ilgilenecegim. Sayenizde stabil hale gelene kadar iyilestirmeye devam

serkan

#14
Son değişiklikler;

- gereksiz define komutları çıkartıldı
- değişkenler tanımlandıktan sonra baslangıçtan önce sıfırlanmaları sağlandı
- açılış gecikmesi verildi ve lcd silindi
- 1.gün pazar tanımlanarak sensörün doğru gün tanımlaması sağlandı
- hassasiyet 2 den büyükken eeproma yazılması kaldırıldı(Bunu da neden böyle yaptıysam artık)
- eeprom baslangıçta okundu ve tüm kayıtlar kaydet etiketine toplandı

lcdnin rw bacağını lowa çektiğim zaman anlayamadığım bir şekilde portc.7 de low a geçiyordu dolayısıyla yukarı butonu sürekli basılıymış gibi işlem görüyordu o yüzden yazılımsal olarak low'a çekmeden direk donanımdan 0'a çekildi

yazılımın ve hexin son hali ektedir. üst msjlardaki eklentiler silindi.

Saygılar

Powered by EzPortal