W

Uzun Süreli Bekleme Komutu

Başlatan wishes, 15 Mart 2012, 15:19:30

wishes

merhaba. program ısı değerini sürekli okuyacak. eğer set değerinin altındaysa alarm vermesi gerekecek ama alarmı hemen vermeyecek. 4 saat bekleyecek (belki o süre içinde ulaşır, alarm vermeme gerek olmaz diye). baktı ki hala set değerine ulaşmamış, o zaman lcd'de "düşük ısı" diyecek.

kısa süreli bekleme için PAUSE komutunu kullanıyoruz ama sanırım PAUSE deyince sistemdeki bütün işler de devre dışı kalıyor. bir yandan bekleyecek, bir yandan da diğer işlerle ilgilenebilecek bir komut var mı acaba.


ALMKONTROL:                                           'açılımı ALARM KONTROL
GOSUB TEMIZLE                                        'ekranı temizleyen alt programa gider.
ALMKONT:
lcdout $fe,$80," ALARM DURUMU:"

        IF ISI<SET-4 THEN                       'ISI, set edilen değerden 4 derece düşükse
        PAUSE 1440000                           '4 saate karsılık gelen pause komutu
        ENDIF
        IF ISI<SET-4 THEN                       'ISI, set edilen değerden4 saat beklemesine rağmen 4 derece düşükse
        lcdout $fe,$94," DUSUK ISI"
        ENDIF
       
GOTO ALMKONT


bu kullanım doğru olur mu. RTC yoluyla SAAT değişkeniyle ilgili bir döngü kullanmaya niyetlendim ama üstesinden gelemedim. şöyle  bir şey yapmanın mantıgı tam olarak nedir:


ALMKONTROL:
GOSUB TEMIZLE
ALMKONT:
lcdout $fe,$80," ALARM DURUMU:"

        IF ISI<SET-4 THEN
        GOSUB BEKLE
        ENDIF
        IF ISI<SET-4 THEN
        lcdout $fe,$94," DUSUK ISI"
        ENDIF
GOTO ALMKONT

BEKLE:
        WHILE SAAT=SAAT+4
        RETURN



teşekkür ederim.

greatgonzo

Pause komutu bana göre soğuk bir komut. Sen 4 saatlik bir komut verdiğinde pic in hic abartmadan hiçbir iş yapmadan 4 saat bekleyecek. Hatta arada özellikle hiç bir iş yapmayacak. Genel olarak hatırında bulunsun yazılımında kesme kullanıyorsan onlarda yalan olacak. Uzun pause komutları yerine döngülerden faydalan. Mesele pause 1000 yerine 1000 tur dönecek 1ms lik gecikme yarat ki arada işlemcin işlem yapabilsin.

Sorununa gelince bana göre kesme ile çözülebilebilir. Timer sayacı bunun için idealdir. Bu arada ısı seviyesini nasıl ve hangi kodlarla ölçüyorsun bilmiyorum ayrıca ölçtüğün ısı ne kadar hassas (ki 4 saatten bahsettiğine göre çok kritik bir işlem değil ) bu konuda bilgi verirsen daha iyi tespit yapılabilir.

Verdiğin donelere göre şöyle bir yöntem geldi aklıma. Programın açılıp ısı kontrolünü yapar. Bahsi geçen  değer aralığındaysa problem yok. Hatta sleep komutu ile düşük güç tüketiminde uykuyada yatırabilirsin. Sonrasında belli periyodlarda mesela 1 dakikada yada 5 dakikada bir uyandırıp ısı kotrolü yaparsın. Eğer ısı bahsettiğin gibi ise o zaman 4 saat sürecek timer kesmesimi tetikler. Hatta bu arada tekrar işlemciyi uyutabilirsin. 4 saat sonra lcd deki uyarı mesajı için uyanır.

Bana göre bu daha stabil bir yazılımdır. Dikkat ettiysen tüm işlemler kesmelerle kontrol edilir yani öncelikli icra edillir. Arada kalan zamanlarda sleep ile düşük güç modunda çalışır. Heleki devren pille çalışıyorsa çok faydasını görürsün. Hatta 4 saatlik tetikleme gerçekleşince arada hala ısı değerini takip edersin. Yani  hangi bir şekilde ısı artarsa uyarıyı iptal edebilir geciktirebilirsin Diğer bir deyişle 2 işlemi  aynı anda takip edebilirsin.

Küçük bir notta şöyle düşeyim ısı ölçme işlemini yaptığın şekle göre ondada kesme oluşturabilirsin. Bu durumda pic çalışınca sadece ısı düşüklüğü bekliyecek. Seviyenin altına inince kesme olucaka sonrasını başlatacak.

wishes

ısıyı SHT11 ile ölçüyorum, o kısımda şimdilik bir sorun yok. yalnız 0.5 derece civarı bir hassasiyeti var. (keşke 0.1 derece hassasiyetle ölçebilseydi. bunun bir yolu var mı acaba) timer olayından habersizdim, incelemeye başlıyorum. teşekkür ederim. devrede pil sorunu yok, daimi kaynakla beslenecek.

RTC yoluyla WHILE SAAT=SAAT+4 gibi bir komut yazamaz mıyım. bunun muadili nasıl olacak, bu konu hakkında da bilgi verebilir misiniz.

F®T

for next döngüsü ile gecikmeleri yapabilirsin.ayrıca diğer işleride kesme rutininde yapacaksın.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete

Önce RTC nin tam olarak ne olduğunu açıklamak gerekiyor. Real Time Clock yani Gerçek Zaman Saati olarak tercüme edilecek kelimelerin baş harflerinden oluşuyor bu kelime. Adından da anlaşılacağı gibi gerçek zamanı sayan bir ayrı entegredir.
İşlemci onunla haberleşerek zaman bilgisini alır ve kullanır. Her saniye RTC den bilgi okursan san bazında saati takip edebilirsin. RTC kendi osilatörü sayesinde zamanı sayarak günleri ayları ve yılları sayar. Bir bacağından bağlayacağın pil ile elektrik kesilese bile saat doğru biçimde saymaya devam eder.

Şimdi gelelim senin işine, kolaydan zora doğru 3 şekilde 4 saatlik zamanı sayabilir ve istediğini yapabilirsin.
- En kolay yolu bir program çevriminin yaklaşık ne kadar zaman aldığını yaklaşık hesaplar ve ona biraz daha gecikme ekleyerek standart bir gecikme yaratırsın. 4 saat yaklaşık olarak 14400 sn eder. O halde sen bir çevrimi 1000 ms (yani 1 sn) olarak ayarlarsan ve ZAMAN isimli bir word değişkeni kullanırsan. İşini görebilirsin. ZAMAN=14400 olduğunda 4 saat geçmiş olacaktır. İşin bittiğinde ZAMAN=0 şeklinde değişkeni sıfırlamayı unutmaman gerekir.

- İkinci yolda ise TMR0 kesmesi kullanarak sn sayar oradan dakika ve dakikadan da saat sayabilirsin.
istediğin kadar saat geçince yine ne yapacaksan yapabilirsin.

- Son metod ise RTC kullanmak şeklindedir. RTC ye bir kere ayar verirsin aslında sana saatin ayarlı olmasıda gerekmiyor. Yalınzca saati sıfırlayıp çalıştırman kafi gelir. RTC den zaman okurken sn-dakika ve saat oalrak okur diğerlerini atlarsın. Daha sonra saat 4 olduğunda  ise ne yapman gerekiyorsa yaparsın.
DS1302 veya DS1307 data sheetlerini incele. 
Ayrıca bu forumda yer alan saat projelerini , haftalık timer projesini incelersen orada RTC kullanıldığını göreceksin. Hepsine ait programların açık kodlarıda veridiği için yalnızca oraya bakıp nasıl yapıldığını anlayabilirsin.

Ete



greatgonzo

ETE hocamız gerekli acıklmayı yapmış :-) RTC zaman hassasiyetine kesin çözüm olur ama bu işi öğrenmeye çalışıyorsan ve acelende yoksa timer kısmını çöz derim. Hem daha az parça ile daha az maliyet hemde tecrübe kazanırsın. Ayrıca timer sayacı ve kesmeleri öğrendiinde genel olarak hem yazılımlarında zamanı kontrol etmeyi hemde birden fazla işlemi aynı anda yapmayı kavrayabilirsin.

Saat projelerinde bana göre dikkat etmen gereken (-ki sende fark edeceksin :) ) işlediğin komutlarda zaman alır ve saatinde ufak sapmalara neden olur. Yani pic le saat yapmak kolaydır ama gerçekten hassas saat için iyi kod yazmalısın:-)

wishes

cevaplar için teşekkürler :)

peki bir adet DS1302 RTC ile aynı anda 2 adet PIC ile haberleşebilir miyim? 16f877 ve 16f628 olacak, her birine bağlı 2 adet LCD olacak. iki lcd'de de saat bilgileri değişmeden işlem yapabilir miyim?

ete

Bir adet RTC nin iki ayrı pic ile haberleşmesini denemedim ama protikte bir sürü sorun çıkacağı kesin.
Birisi RTC ile haberleşirken diğeri aynı komutşarı alıp karıştırma yapabilir. En azında bir birlerini etkilerler.
Bir Pic bir bacağı LOW da tutarken diğer HIGH vermeye çalışır. Bunlar olası aksaklıklar. Bu nedenle tek rtc bir pic tarafından okunur gerekirse o pic saat bilgisini diğerine seri yoldan aktarabilir çok gerekiyor ise. Ama 2 ayrı RTC yi her ikisine ayrı ayrı bağlarsan daha uygun olurdu.

Ete


Mucit23

İki Pici birbirleriyle haberleştirirsen biri okuma yapıyorken diğer pic okuma yapmaz. Buda bir seçenek olabilir
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Powered by EzPortal