16f628a uyandırmak

Başlatan tekkullanim, 28 Şubat 2015, 12:15:52

tekkullanim

Arkadaşlar selam
yazılarınızı okudum ama kendi şartlarıma uygun çözüm toparlayamadım.
yeni konu açarak sizden bilgi talep ediyorum.
konu şudur; pc16f628a kullanıyorum. assembler dili ile yazıyorum. ve önceden hiç denemediğim için biraz zorlandım.
istediğim şey, bu işlemci her 30 dakikada bir uyanıp 'ben buradayım' çıkışı vermesi(RF).
timer1 için harici osilatör de koydum 32.... khz
ama wdt ile de yapılabildiğini okuyorum yazılardan.
her iki özellik te olur benim için. hangi yöntemle yapmam ve nasıl yapmam gerektiğini yazabilirseniz sevinirim. bayadır inceledim ama heralde yardımsız daha da uğraşırım.
pic, uyuduktan 20-30 dk sonra nasıl uyandırılacak? (harici giriş kesmesi kaynağı yok)
saygılar

ete

#1
Bahsetmemişsin ama sanırım işlemciyi SLEEP (UYKU) moduna sokup 30 dakika sonra kendiliğinden uyandırmayı planlıyorsun.
Data sheetlerde işlemcinin uyku moduna (Düşük Akım çekme modu) girdikten sonra  nasıl uyandırılabileceği belirtilmektedir. Uyandırma yöntemlerinin çoğunluğu harici bir kesme oluşturma temeline dayanır. Bunlar olamdan uyandırmanın tek yolu da WDT sayacını kullanmaktır. Zaten adı üzerinde bu sayac bu tür amaçlar için geliştirilmiştir.
16F628 de bu işi yapmak çok zor değil ancak istediğin süreyi yakalamak zor. Zira OPTION_REGISTERI'ne bakarsan;
3 nolu bit = 1 olur ise Bölücü WDT için çalışır. Aynı registerin 2-0 bitlerine bakarsan enbüyük bölme oranının 1/128 olduğunuda görebilirsin.
Bu durumda sistem 4 Mhz de çalışıyor ise 128x256=32.768us yada 32,76ms de bir uyandırılabilir. Hal böyle olunca her uyanmada bir sayac kullanıp yeniden uykuya sokman ve sonuçta 30 dakika dolduğunda ne yapacaksan o işi yapman gerekir.

WDT 'ı kullanabilmek için sigorta ayarlarında WDT_ON yapılmalıdır.
Program içinde kesinlikle CLRWDT komutunu kullanmaman gerekir.
Böylece sistemi SLEEP ile uykuya daldırıp her uyanışta ;
SAYAC=SAYAC+1 yapıp ve bu işlemide en azından 54.931 kere tekrarladığın zaman 30 dakikan dolmuş olacaktır.

Ete

tekkullanim

evet teşekkür ederim. eksik bilgilerimi de doğru tahmin etmişsiniz.
4mhz internal çalıştırıyorum bu işlemciyi.
clrwdt kullanmayınca işlemci reset oluyordu daha evvelki yıllarda kullandığımda.
o yüzden de 256 adımı geçen her dönü içinde clrwdt koyuyordum.
bunu kullanmazsak resetlenmeyecek mi?
diğer yeni sorum da şu, 32ms'de bir uyanıp sayaç artırıp geri bayılması da bir enerji kaybı olacak. tamamen 30dk cıvarı uyutabilecek bir yöntem var mı.
timer1 ve harici 32khz osilatör kullansam, onun süresi böyle uzun sürelere çıkabilir mi?
teşekkür ederim

ete

#3
Aslında bu konuyu çok iyi bildiğimi düşünmüyorum. Mesela maksimum süre konusunda bir hata yapmış olabilirim zira uyku modunda wdt sistem osilatöründen değilde kendi düşük frekanslı bir osilatörden puls almaktadır. Buda süreyi uzatabiliyor bildiğim kadarı ile. Zira yaptığım denemelerde hep 2 küsür saniyede bir reset alabiliyorum.
İşin temelini iyi anlamanız gerekiyor. Size wdt reseti geekiyor. Normal programlarsa ise tam tersi wdt ın reset atmaması için clrwdt komutunu kullanıp timerı sıfırlarsınız o yeniden saymaya başlar.
Bu nedenle reset lazım olan işlerde ki sleep modundan ancak bu teset ile uyanabiliyorsunuz clrwdt komutunu kullanmamanız gerekiyor.
Wdt bölme oranını maksimum değere getirip deneme yapın bence. Bakalım ne kadarlık sürede bir reset atıyor.
Daha uzun süreli nasıl yapılacağını bilemiyorum. Ancak basicde süreye bağlı sleep komutu bulunuyor.
Bir yolu varki derleyici bunu yapıyor. İncelemek gerekir. Wdt sayacı taşmaya uğradığı zaman reset konumu devreye girer. Sayaca ulaşılabilse tam taşma olmadan sıfırlarsınız bir kez daha süre uzamış olur. Buna benzer bir çözümü olmalı sanırım. Ama bu noktadan sonrası beni aşıyor maalesef.
Belkide basite bir program yazıp asm sini incelemek çözüm getirebilir size.

Ete

tekkullanim

ok çok teşekkür ederim.
sade bir anlatımla fikir verdiniz bana.
bu yöne odaklanacağım.
saygılar iyi çalışmalar.

burctankal

Gerçi harici kesme kaynağı yok demişsiniz ama basit bir 555 eklemek de pratik bir yöntem olabilir.

ete

#6
Uyandırma mekanizması genelde pilli devrelerde veya sistemin mümkün olan en az akımla çalışmasının gerektiği yerlerde kullanılır.
Pic'i uykuya sokup sonra onu bir 555 ile uyandırmak bu açıdan hiç de akıllıca olmaz. Zira 555 devreden epeyce akım çekecektir. Onu yapacağıma pici uykuya sokmadan çalıştırrım daha iyi değilmi?
Yaptığım denemelerde gördümki işlemci aksine bir komut koymadınız ise değişken değerlerini sıfırlamıyor ama gidip baştan başlıyor. Buraya bir komut dizisi yerleştirerek resetleri saymak se sonuçta istenen değere ulaşıldığında programı bir başka yere göndermek mümkün.
Mesela;
Başlangıç etiketin (yada adresi) den önce ,
IF KES=0 GOTO BASLA
KES=KES+1
IF KES<200 THEN SLEEP
GOTO ISLEM_TAMAM

gibi bir kaç satır yazarsanız, program ilk defa çalıştığında BASLA satırına ulaşır orada gerekeni yaptıktan KES=1 yapılır ve sonra uykuya girer.
WDT reset atınca  KES=KES+1 saymaya başlar ve yeniden uykuya girer. KES=200 oluncada hem uykudan uyanmış hemde ISLEM_TAMAM etiketine gitmiş olursunuz.

Aynı şeyleri ASM de yazmak zor olmasa gerek.
Yapılması gereken tek şey; OPTION Registerinden Bölücünün WDT için olduğunu belirlemek. Bölme oranını 1/128 (maksimum değer) yapmak ve Sigorta ayarlarında WDT_ON yapmak. Hepsi bu. Tabiiki program içinde kesinlikle CLRWDT komutunu kullanmamak gerekiyor. BAsic Kullananlar ayrıca programın başına;
DEFINE NO_CLRWDT 1

komutunu eklemeleri gerekiyor. Bu komut derleme esnasında programa CLRWDT komutunun eklenmesini önlemektedir.

Ete

burctankal

Evet hocam 555 kullanmak yerine pic'i hiç uyutmamak daha mantıklı geldi siz bahsedince :)

tekkullanim

#8
selamlar
evet ete bey haklı, konulacak her komponent akım düşmanı. amaç tüm sarfiyatı kısıtlamak. o yüzden 555 veya benzeri koymadım.
wdt veya timer1 ile uyandırıp sayaç saydırıp geri uyutmak ve belli rakama ulaşınca da işlem yaptırmak tek çözüm.
wdt kullanılınca 2.3 saniyede bir uyanıyor,
timer1 ve harici osilatör kullanınca (32khz kristal ve 22pf'ler) 16 saniyede bir uyanıyor.
bana ikincisi daha uygun geldi enerji açısından. çünkü daha seyrek uyanıyor.
ama tabii kristal ve kondansatörler masraf olarak geldi olumsuz olarak.
şimdi bu harici kristal enerji çeker mi? çekiyor muhakkak ki titreşiyor, acaba ne kadar çeker. bilgi var mı bu konuda.
ölçü aletime tam güvenmemekle birlikte, devrem uykudayken 15uA çekiyor.



burctankal

Burada ben de araya girip bir şey sorabilir miyim? Madem enerji sarfiyatından bahsediyoruz, benim de hep aklımda örneğin devrenin pilini ölçmek için kullandığımız gerilim bölücü dirençlerin enerji sarfiyatları var.  Örneğin 10k ve 5.2k ile oluşturulan bir gerilim bölücü, pic onu okusa da okumasa da sürekli akım geçiriyor üzerinden.. ama ne kadar? Bu ciddi bir sarfiyat mıdır?

tekkullanim

evet. orta noktadan akım çekmesen bile, bölücü üzerinden ilgili formül kadar akım geçiyor.
bölünmüş voltajı talep ettiğinde çektiğin akım kadar ısı da ortaya çıkıyor, o da kayıp.

Powered by EzPortal