Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

WDT ve SLEEP

Başlatan HEXF2, 19 Ekim 2005, 09:07:55

HEXF2

Beyler ben bir devre üzerinde çalışıyorum ve sorun yaşadığım olay şöyle;
Programı CCS C ve ASM karışık olarak yazıyorum.Yapmak istediğim program ilk başladığında PIC'in uykuya yatması ve belirli aralıklarla uyanıp benim belirlediğim pinlerin durumlarını kontrol etmesi.Eğer pinlerde bir değişiklik varsa WDT 'yi geçici olarak kapatıp işlemlerini yapması ve işi bittiğinde WDT'yi aktif edip tekrar uyuması.Bu CCS ile yazdığımda ve setup_wdt(WDT_2304MS) yazdığımda resetleme işlemi 2 saniyede değil çok daha kısa sürede oluyor.Bunu asm kodlarını inceleyerek anladım CCS C program kodlarını 0.RAM bölgesini kullanarak yazıyor.Yani WDT'yi kurarken OPTION yazmacını kuracağına(1.bankın en başı) TMR0  yazmacını kuruyor.(Bank 0'ın en başı)üstelik ben #asm #endasm ile OPTION yazmacını kurmaya kalksam OPTION'a yükleyeceğim değeri TMR0'a yüklüyor.

Bir diğer sorun ise sleep() komutunu yazdığımda programın orda durmuyor oluşu.sleep komutu sonrasına bir komut yazdığımda o komut PIC'in uyanmasını beklemeden çalışıyor.Bu kısıma kadar anlattıklarımı sün birde asm ile yazdım PIC'i uyandırnmak için WDT kullanamayacağımı anladım sleep komutunu yazdıktan sonra program duruyor.WDT reset attığında sleep hemen sonraki komutu işliyor.Ama reset olayı olduğunda RAM'imdeki tüm değerler kayboluyor.Yardımlarınızı bekliyorum arkadaşlar.Dediğim olayı nasıl yapabilirim.Birde WDT ile SLEEP komutlarını reset işlemi yaptırmadan nasıl yaparım.Yada başka bir alternatifiniz var mı??

HEXF2

Ya burda bana gıcık mı kapılıyor???? Ne zaman bişey sorsam kimse cevap yazmıyor ya  :cry:

eelektro

Alıntı yapılan: "HEXF2"Ya burda bana gıcık mı kapılıyor???? Ne zaman bişey sorsam kimse cevap yazmıyor ya  :cry:

arkadaşım burada eminim kimse kimseye gıcık değildir keşke bilgim yetsede sana yardım edebilsem fakat şu an bordu takipçiyim

çalışmalarında başarılar
╠ ▒▒ ▒ ▒ ▒ ▒▒▒ ▒ ▒ ▒ ▒ ▒▒▒▒ ▒ ▒  ▒▒ ╠

arslan74

Merhaba,

Seni kızdırmadan senin sorunun gelelim.

Watchdog(WDT) senin anlayacağın gibi Türkçesi bekçi köpek dir. Bunun asıl kullanım amacı progam kitlemelerinde sisteme reset atıb işlemçiyi yeniden başlatmak.

O yüzden senin amacına hitap etmiyor bu özellik. işlemciyi uyku moduna soktunmu onu uyku modundan cıkarmanın birçok yolu var.

1.ci yol hariçi interrupları devreye sokabilirsin. mesela RB4-RB7 arasında 4 pin interrupt on pin change özelliği var. Yani sen işlemciyi uyku moduna soktup RB change interruptunu aktif hale getirirsen eğer, Uyku moduna RB4-RB7 pinlerin girişlerinde bir değişiklik olursa işlemci hemen uykumadundan cıkar. Bu pinlere buton bağladığında işlemci her basışta calışır. Tuşa basılmadığı takdirde uyku moduna gecirirsin.

2. Timerleri devreye sokabilirsin. Timerin her interruptunda uyku modundan cıkar. Burda Timer süreleini ayarlayarak istediğin sürelerde işlemciyi devreye sokabilirsin.

Aslında sadece bu interruplar değil bütün interruplar ile uyku modundan cıkabilirsin. Uyku modunda cıkma özeliği cok esnektir.

Çalışmalarında başarılar,

Hasan ARSLAN

HEXF2

Yalnız yukardaki soruma cevap olmadı ben CCS 'de sorun yaşıyorum birde TIMER ile nasıl kullanıcaz sleep komutu çalışınca clock duruyor???

arslan74

Alıntı YapTIMER ile nasıl kullanıcaz sleep komutu çalışınca clock duruyor???

Eğer senin dediğin gibi clock dursaydı o zaman WDT da hiç bir zaman devreye girmezdi? Cünkü başlandıçta Timer0 cıkışı olarak WDT olarak ayarliyoruz. Sonucta timer0 calıştığına göre durması söz konusu olmaz. Eğer durursa o zaman işlemcide iş yapamaz dı.

HEXF2

Hocam WDT kendi iç osilatörünü kullanır bence yazdıklarınızı bir daha gözden geçirin hem ben CCS de yaşadığım sorunları anlattım kşmse cevap yazmadı bunkla ilgili

arslan74

Alıntı YapHocam WDT kendi iç osilatörünü kullanır bence yazdıklarınızı bir daha gözden geçirin hem ben CCS de yaşadığım sorunları anlattım kşmse cevap yazmadı bunkla ilgili

Evet dostum sen haklısın WDT kendi iç oslitatörünü kullanır. Ben bazı şeyleri karıştırmışım. Tekrar eski bilgilerimi gözden gecirdim.

Sonuç, Timer0'in bir önbölücüsü var bunu ya timer0'a veya WDT un önbölücüsü olarak secebiliyorsun. Normal WDT ortalama 18ms de devriye girer ve sisteme Reset atar ama önbölücü devreye sokarak tetikleme süresini 2.3 saniyenin üstüne cıkartabilirsin. Eğer WDT aktif yapar ve sleep komutunu devreye sokarsan Kristal durur ama iç RC osliatör calıştır.
WDT devreye girdiğinde program kaldığı yerden devam eder.
Ama şuna dikkat et. Başka int. devreye sokmuşsan örneğin timer0'i program interrupta gecebilir.

O yüzden sleep komutunda gecmeden önce GIE kapat.

WDT haricinde eğer 16F877 kullaniyorsan timer1 asenkron mod ayarlarsan, yani harici bir osilatör bağlarsan oda seni sleep komutundan uyandırır.

Umarım senin soruna cevab olmuştur.

Eğer olmadı diyorsan;o zaman ne istediğini, biraz daha anlaşılır yazmanı rica edeceğim.

Calışmalarında başarılar.

Hasan ARSLAN

CaFFeiNe

#include <16F628.h>
#fuses WDT,INTRC_IO, PUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD
#use delay(clock=4000000)

main()
{
   setup_wdt(WDT_2304MS);
   output_high(PIN_B0);
   delay_ms(50);
   output_low(PIN_B0);
}


bu şekilde dene ~2sn de bir ledin flaş yaptığını göreceksin (gerçek devreyi kurarsan) yani WDT çalışıyor ama proteusta denedim orada olmadı çok hızlı yanıp sönüyor F628 in özelliklerinden Watchdog time periodu 2304m yapsam bile 2sn de bir yanıp sönmüyor (zaten proteusa bu gibi nedenlerden gıcıklığım var:))


Alıntı yapılan: "HEXF2"Ya burda bana gıcık mı kapılıyor???? Ne zaman bişey sorsam kimse cevap yazmıyor ya  :cry:

biraz sakin olalım arkadaşlar mesajı yazdıktan 2-3 saat sonra böyle bir sitem gereksiz değilmi cevap hemende gelebilir birkaç gündede gelebilir hiçte gelmeyebilir

neyse

HEXF2

Hoca ne sitemi yaa ama şundan emin olmak istiyorum WDT devreye girip sleep komutu çalışınca ve 2.3 saniye sonra PIC resetleniyor.Fakat önceden değişkenler kayboluyor.İkincisi WDT'den reset gelince program en baştan mı başlıyor yoksa sleep ten sonraki komuttan mı devam ediyor

CaFFeiNe

#include <16F628.h>
#fuses   WDT,INTRC_IO, PUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD
#use     delay(clock=4000000)

int x = 20;
int y = 100;
int z = 250;

void main()
{
   setup_wdt(WDT_2304MS);
   output_high(PIN_B0);
   delay_ms(x);
   output_low(PIN_B0);
   sleep();
   output_high(PIN_B0);
   delay_ms(y);
   output_low(PIN_B0);
   sleep();
   output_high(PIN_B0);
   delay_ms(z);
   output_low(PIN_B0);
}


yukarıdaki kodda ilk önce led 20ms sonra 100ms sonra 250ms flaş yapıyor yani WDT ile uyandığında sleep() komutundan sonraki komuttan çalışmaya devam ediyor flaş süreleri sabit yerine değişkenlere yüklendi böylece uyanma durumunda registerların silinmediğinide anlıyoruz
programın sonunda bir sleep komutu daha var ama onu assembler kısmında görebilirsin eğer derleyicinin otomatik olarak o sleep komutunu koymasını istemiyorsan programın başına #build(nosleep) direktifini yazabilirsin

HEXF2

Anladım hoca yalnız en başta yazdığım sorunlara ne diyecekseniz CCS ile alakalı tek page kullanıyor sanki C içine gömdüğüm ASM kodları sapıtıyor bu yüzden

CaFFeiNe

Alıntı yapılan: "HEXF2"Bu CCS ile yazdığımda ve setup_wdt(WDT_2304MS) yazdığımda resetleme işlemi 2 saniyede değil çok daha kısa sürede oluyor.



benim gönderdiğim kodu yukarıdaki devreyi board üzerine kurup denersen 2.3 saniyede bir ledin sırayla 20,100,250ms yandığını göreceksin yani setup_wdt(WDT_2304MS) komutu çalışıyor

Alıntı yapılan: "HEXF2"Bir diğer sorun ise sleep() komutunu yazdığımda programın orda durmuyor oluşu.sleep komutu sonrasına bir komut yazdığımda o komut PIC'in uyanmasını beklemeden çalışıyor.

gönderdiğim kodda sleep() komutu pic i uykuya sokmasa ledler dediğim gibi 2.3sn arayla flaş yapmaz

Alıntı yapılan: "HEXF2"Ama reset olayı olduğunda RAM'imdeki tüm değerler kayboluyor.

gönderdiğim kodda dikkat edersen flaş süreleri x,z,y gibi değişkenlerde saklanıyor ve WDT ile uyandığında RAM silinmediği için flaş sürelerinde bir bozulma olmuyor.

kodunu gönderirsen problemi daha iyi anlayabiliriz

HEXF2

Hoca çok sağol fakat bu CCS in tek page çalışmasına ne diyeceksin yani ben #asm #endasm arası komutlarda bank 1'deki bir yazmaca yazdığımda 1'e değil 0.bankta karşılık gelen yere yazıyor

CaFFeiNe

asm de bankıda kendin seçeceksin haliyle