WDT ve SLEEP

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

HEXF2

Evet kendim seçiyorum zaten bank 1'i seçiyorum o yine bank 0'a atıyor

HEXF2

@caffeine yalnız verdiğin kodları tem incelememiştim şimdi bişey farkettim tanımladığın değişkenler global değişkenler.Yani bir fonksiyona ait değiller.Ve en önemlisi başlangıç değerleri tanımlama esnasında verilmiş.WDT her reset attığında sen bu değerlerin kaybolmadığını sanıyorsun fakat her reset'de bu değerler kaybolup baştan tanımlanıyor.Ana programda bir sayaç içeriğini arttır yada bişey sakla her wdt taşmasında bu değerlerin kaybolduğunu göreceksin.Çünkü wdt sonrası program kaldığı yerden devam etmiyor sisteme reset atılıyor.Bu yüzden önceden tanımlı değişken tanımlamakla olmuyor yani birşeyler saklıyorsan yada bir olayı sayıyorsan uçup gidiyor

CaFFeiNe

Alıntı yapılan: "HEXF2"WDT her reset attığında sen bu değerlerin kaybolmadığını sanıyorsun fakat her reset'de bu değerler kaybolup baştan tanımlanıyor.Ana programda bir sayaç içeriğini arttır yada bişey sakla her wdt taşmasında bu değerlerin kaybolduğunu göreceksin.Çünkü wdt sonrası program kaldığı yerden devam etmiyor sisteme reset atılıyor.

tamam programda değerler önceden tanımlı ama dikkat edersen 2.3sn de bir sırayla 20,100,250ms flaş yapıyor yani önce 20ms lik süreyle led hızlı bir şekilde yanıp sönüyor ardından 1.sleep komutu ile uykuya yatıyor 2.3sn sonra uyanıyor 100ms süreyle yanıp sönüyor ardından 2.sleep komutu ile uyuyor 2.3sn sonra uyanıyor ve 250ms süreyle yanıp sönüyor bu yanıp sönmeleri devreyi kurup çalıştırırsan göreceksin dediğin gibi WDT reset atsa program başa döneceği için hep 20ms lik flaşlar yapar haksızmıyım?

arslan74

Merhaba,

WDT iki kullanım şekli var.

1.cisi program kilitlenmelerinde ve sapıtmalarında sisteme reset atmaktır. Burda sleep devrede olmaz ancak program yada pic bizim istediğimizin  dışında calışırsa. WDT o zaman devreye girer ve sistemi resetleyib programı baştan başlatır.

2. PIC'i sleep komutundan uyandırmak için kullanılabilir. Eğer PIC'i uyku konumuna almış isek ve WDT aktif ise. WDT devreye girdiğinde baştaki gibi sistemi resetlemez. Program sleep komutu ile olduğu yerde durmuştu. WDT ile program kaldığı yerden devam eder.

Ancak burda birşeyi hatırlatmak isterim. Eğer WDT devreye sokmuş isek normal program akışında devreye girmesini engelemek için programa CLRWDT komutlarını eklemeliyiz. Sonucta WDT bir sayici ve kendi osilatörünü kullanarak sayıyor. Sayicida taşma olduğunda ise WDT interrup'i devreye giriyor. Dolaysıyla normal program akışında WDT kendi sayacını doldurmadan sıfırlamalıyız ki programımıza reset atmasın.

O yüzden şuna dikkat ediniz;
Eğer WDT bizi sleep komutundan sonra uyandırmışsa programımız kaldığı yerden devam eder. Ancak tekrar uykuya gecme süresi WDT timerinden uzun ise ve biz CLRWDT yapmamış isek sleep komutuna geçmeden WDT tekrar devreye girer bu sefer progama reset atib sistemi baştan başlatır. Bu ayrıntıya cok dikkat ediniz.

Calışmalarınızda başarılar,

Hasan ARSLAN

CaFFeiNe

@arslan haklısın bu hiç aklıma gelmemişti belkide hexf2 arkadaşın problemi budur

@hexf2

uykudan çıktıktan sonra yapılan işlemler WDT süresinden uzun sürüyorsa (tuş basılmasını bekleyen döngüler gibi mesela) resetlenme olur bu durumda gerekli yerlere restart_wdt() komutunu ilave etmen gerekir

HEXF2

Kodlarımda uykudan çıktıktan sonra WDT'yi temizliyorum zaten.Fakat sleep komutundan sonra WDT'nin devreye giripte "programın kaldığı yerden devam ettiğini " bilmiyordum kodlarımı buna göre düzenleyeceğim bişey olursa yazarım yine