WDT Zaman Aşımından Sonra İstediğimiz Bir Alt Programı Çalıştırmak

Başlatan mokan, 14 Mart 2011, 08:12:04

mokan

Merhaba arkadaşlar,
Ben pbp'de wdt'yi kullanacağım. Ancak wdt zaman aşımı yaptığında, resetleme yapmasını değil de istediğim bir alt programa dallanmasını istiyorum.Yaptığım sistemde 405uS'de bir RB0 kesmesi olacak.Bu süre içinde kesme olmazsa yada kesme bu sürenin 2 katı kadar süre sonunda olursa programı istedğim bir alt programa dallandırmak istiyorum.Bunu wdt ile yapmamız mümkün mü? Eğer mümkünse pbp'de bunu nasıl yapacağız.İlgilenirseniz çok memnun olurum herkese iyi çalışmalar dilerim.PIC olarak 16F876 kullanacağım.Sistemde RB0,RB4-RB7 lojik değişim ve TMR0 kesmelerini kullanıyorum.

Tagli

WDT ile mümkün değil sanırım. Herşeyden önce WDT'yi 405 us'de bir taşacak şekilde ayarlayamazsın, çünkü WDT daha yavaş çalışır. Yanlış hatırlamıyorsam 18 ms idi taşma süresi. Yavaşlatılabilir ama hızlandırılamaz. İkincisi, WDT taştığında eğer uyku modundaysan uyanırsın. Uyanıksan ise reset olur, bunun uçarı kaçarı yok. Ancak, kodunun başında TO bitini kontrol ederek resetin WDT taşması sebebiyle olduğunu anlayabilir ve istediğin bir yere dallanabilirsin. Bu biti normal hali olan 1'e getirmek için CLRWDT komutunun işletilmesi gerekiyor. Ayrıca, WDT resetinden sonra register'ların bazılarının değerleri değişebilir ve buna göre önlem alman gerekebilir. Datasheet'te hangilerinin değiştiği yazıyor.

Bence WDT ile hiç uğraşma, bir timer daha kur olsun bitsin. Gerçi bu durumda dallanmayı kesme kodunun içinde yapman gerekebilir, bu da senin gereksinimlerini karşılamayabilir. Kesme içinde bir kontrol bitini değiştirip dışarıda bu bite bakmayı da deneyebilirsin.
Gökçe Tağlıoğlu

mokan

Alıntı yapılan: Tagli - 14 Mart 2011, 14:51:15
Bence WDT ile hiç uğraşma, bir timer daha kur olsun bitsin. Gerçi bu durumda dallanmayı kesme kodunun içinde yapman gerekebilir, bu da senin gereksinimlerini karşılamayabilir. Kesme içinde bir kontrol bitini değiştirip dışarıda bu bite bakmayı da deneyebilirsin.
Son dediğini biraz daha açabilir misin acaba tam anlayamadım? Zamanın illa ki 405 uS olması şart değil yani 2-3mS de kesme almazsa istediğim alt programa gidecek şekilde de olabilir program.Encoder kullandığım bir sistem var.Encoder 405uS de bir kesme verecek.Ancak encoder'ın bağlı olduğu motor çalıştığı sürece kesme süresi bundan uzun olursa sistemde bir aksaklık olduğunu algılamasını istiyorum.Asıl amacım bu.Acaba tmr0 ı kursam.Her kesme olduğunda (RB0 kesmesi) tmr0 içeriğini sıfırlasam ama atıyorum 2mS RB0 kesmesi olmadığında tmr0 kesme versin sonra istediğim programa dallanıyım.Senin demek istediğin bu mu?Bir nevi wdt ama reset yerine alt programa gidecek gibi.Acaba doğru mu anlamışım?

Tagli

Evet doğru. Ancak sorun şu ki TMR0 taştığında sen kesme koduna gitmiş olacaksın. "Dallanma yapsın" demişsin, ama kesmeye gitmek dallanma sayılmaz bence. Çıkınca kaldığın yerden devam edersin. Çıkmazsan da yığını (stack) şişirirsin. Bu yüzden kesmede sadece bir biti işaretleyip, ana döngüde de bu biti kontrol edip gereken dallanmayı yapman daha uygun olabilir. Bunu anlatmaya çalışmıştım. Ama bu yönde bir ihtiyaç olup olmadığını ancak sen belirleyebilirsin.

Alıntı yapılan: mokan - 15 Mart 2011, 02:26:50
Encoder 405uS de bir kesme verecek.
Bu kısmı da ben anlamadım. Encoder'in ne kadar sürede kesme vereceğini nasıl bilebiliyorsun? Sabit hızda mı dönüyor? Öyle ise encoder neden kullanılıyor?

Ayrıca aklında bulunsun, motorda bir sıkışma olup olmadığını çektiği akıma bakarak da anlayabilirsin.
Gökçe Tağlıoğlu

mokan

Sistemde AC motor kullanıyorum.Motor konusunda çok bir bilgim yok ama bildiğim kadarı ile akım kontrolü DC motor için uygulanan bir yöntem.Motorum 1480 dev/dak lık.Encoder'ım 100 pals/dev 'lik.Bu verilerden 2466 pals/s'ye (birim zamanda ki pals sayısı) değerine ulaşıyorum.Motor çalışmasının büyük kısmında hesaplamalarıma göre yaklaşık 405uS'de bir encoder'dan kesme alacağım(tam güçte çalışınca).Sadece çok küçük bir kısmında devir düşecek.Benim için önemli olan, en kötü ihtimal ile (bunu deneme-yanılma ile bulacağım, yaklaşık söylüyorum) 2-3mS'de bir kesme alacağım yavaş devir için.Bu süre içinde de kesme almazsa mikrodenetleyici, motorun sürdüğü sistemin sıkışma yaptığını algılayacak.Yapmaya çalıştığım bu.O yüzden WDT'yi sordum.Çünkü sistemde zaten RB0,RB4-RB7 ve TMR0'ı(sürekli değil motor sadece tek bir yönde çalışmazken kullanacağım) ve EEPROM kesmeleri kullanılacak.TMR0'ı ikinci kez(motor çalışırken) kurduğumda bazı endişelerim var.Bundan dolayı WDT'yi sordum.