Wdt ve Sleep

Başlatan xoom, 31 Mart 2017, 19:09:13

xoom

Arkadaşlar forumda yaptım araştırma evet 1 konuda güzel bir konuşma geçmiş ama kafama oturmadığı için bu başlık altından tekrar konuyu oluşturmak istedim. (  Forumda 2005 Yılına ait bir konu olduğu için 12 yıllık bir konuyu heyecanlandırmak istemedim)
Amacım hep sağda solda okuduğum bu iki özelliğin ne işe yaradığını ve ihtiyaç duyarsam kullanmak isteyip bilmediğimden kullanamadım şimdiye kadar.

1- Bireysel manada WDT ne işe yaradığını biliyorum. Fakat Programda nereye yazmam gerektiği konusunda kafamda en ufak fikrim yok.
setup_wdt(WDT_2304MS);

//2.3 Sn sonra reset atacak peki 2.3 sn sonra nereye ulaşmazsa reset atacak program? Ben programımım hangi satırına kaç MCU'nun kaç ms'de ulaştığını nasıl hesaplayabilirim?
7/24 çalışan bir devrem var örneğin  Seven Segment Saat - Tek işi Saati ve Sıcaklığı göstermek olan bu programa  WDT'yi nasıl ekleyebilirim?
Hangi kodun altına üstüne setup_wdt(WDT_2304MS); eklemem gerekiyor? buna nasıl karar veriyorum.


2-
Sleep();
komutu içinde merak ettiğim işlemciyi belli periyotlarda uyutup otomatik olarak uyandırmak istesem nasıl yaparım. Mesela 3 saatte bir uyansın. filanca ledi toggle yapsa vb.

Arkadaşlar çalışma mantıklarını biliyorum fakat program içerisine bu kodları entegre etmeyi bilmiyorum. o yüzden zaman ayırıp kısa 1-2 kod yazarak bir ledli devre üzerinde çalışmasını izah edebilirseniz sanırım epeyce kişinin faydasına olmuş olur.

İlgilenebilecek arkadaşlara şimdiden teşekkürler.

sadogan

#1
  setup_wdt(WDT_2304MS);Bu CCS ye özel bir komut 2304 msn karşılığı olan sayıyı , kristal freakansını belirtiğiniz değere göre hesaplayıp yüklüyor,
bu işlemi bir kez yapıyorsunuz.
Ana döngüde ise restart_wdt(); kullanarak bu süreyi her defasında yeniden başlatılıyor, böylece programda bir kitlenme olduğunda 2304 ms sonra reset atıyor.

  sleep(); kulandığınız da, bundan çıkmak için interrupt veya reset oluşması gerkiyor.


xoom



Alıntı yapılan: sadogan - 31 Mart 2017, 19:35:04
setup_wdt(WDT_2304MS);Bu CCS ye özel bir komut 2304 sn karşılıgı olan sayıyı , kristal freakansını belirtiğiniz degere göre hesaplayıp yüklüyor,
bu işlemi bir kez yapıyorsunuz.
Ana döngüde ise  restart_wdt(); kullanarak bu süreyi herdefasında yeniden başlatılıyor, böylece programda bir kitlenme olduğunda 2304 ms sonra reset atıyor.

sleep(); kulandığınızda, bundan çıkmak için interrupt veya reset oluşması gerkiyor.
restart_wdt();
kodu her dafasında WDT'yi sıfırdan başlatıyor burayaya kadar OK.
Yani program restart_wdt() koduna 2304ms içinde ulaşamazsa mı reset atacak? buda şu mu demek oluyor.
while(1)
{
restart_wdt();
....
....
...
.
.
.
.

}

yukarıdaki while döngüsünün 1 turu tamamlama süresi 2304ms geçerse MCU reset mi yer demek oluyor?








sadogan


xoom


Alıntı yapılan: sadogan - 31 Mart 2017, 19:57:55
Evet
Bu zaman çok kısa değil mi? Yani çok kalabalık bir uygulamada beklemeleri ve gecikmeleri olan bir program algoritmasında WDT kullanılamaz olmaz mı?


Yani çok profesyonel olan7 gün 24 saat çalışan bir uygulama da herhangi bir aksilik durumunda WDT mi kullanılıyor?  Yoksa programı öyle bir yazmalısınki WDT'ye ihtiyacın olmamalı mı?

tunayk

#5
Özel durumlar haricinde, işlemci veya mikrokontrolör ve bunlar ile oluşturulmuş sistemlerin dış dünyaya her daim duyarlı olması beklenir. Bu da bunların çalıştırdığı program ister PC programı, ister saat isterse de bir makinenin programı olsun, belirli bir yerde çakılıp beklemesi istenmez. Buna göre de uygun algoritma geliştirilir ve en azından birkaç ms içinde bişeyler yapması beklenir.  Bu durumda WDT yi resetler ki ben takılıp kalmadım, dönebiliyorum demiş olur.  Restlendiğinde meydana gelecek durum ise tamamen uygulamaya bağlıdır.

Örneğin bir dijital saat yaptınız ve bunda 1sn de bir ekran güncelleniyor.  Başka da bişey yapmıyorsunuz. Sizin cihaz bir motora yakın ve motor devreye girip çıkarken sizin beslemede parazit meydana geliyor ve işlemci öngörülemeyen bir pozisyonda kilitleniyor. İşte bunun gibi öngöremediğiniz durumlarda cihazınız durup kalmasın diye WDT kullanırsınız, durum oluştuktan sonra 1sn içinde sistem reset atarsa, sizin cihazın kilitlendiğinden kimsenin haberi olmaz, herşey yolunda devam eder.

Ancak çalışma durumu ile reset sonrası durum farklı ise, örneğin reset sonrası registerler sıfırlanıp  o ana kadar yapılan iş bilgilerinin kaybedildiği bir cihaz uygulaması ise doğal olarak restlenip devam etmesi yerine reset sonrası hata vermesi beklenir.

İşin doğrusu, en azından kendi kanaatim, WDT ye ihtiyaç duymayacak algoritmada yazmak ancak WDT yi de kullanmaktır.  Sonuçta hiç kimse işlemcinin bulunduğu ortamda nasıl bir duruma maruz kalacağını yüzde yüz öngöremez.  Ofise göre tertemiz bir ortamda çalışacak cihaz tasarlarsın, adam alır senin cihazını, klimanın fişinin bağlı bulunduğu prize üçlü ile takar, klima her devreye girişte başına iş açar.

sadogan

2300ms çok uzun bir zaman.
Bu süreyi aşan bir fonksiyon varsa
programi gözden geçirmen gerek.
Aslında 100ms bile uzun sayılır

RaMu

1ms bile aşırı derecede uzun bir zaman,
64MHz çalışan bir pic MCU
yaklaşık 16 bin komut işliyor o sırada.


Profesyonel bir programda
--
delay_ms(500);
..
gibi bir satır olmaması lazım,
en azından şöyle yaparsın:


>Zaman kurulmadıysa kur, zaman kuruldu bayrağını işaretle,
>zaman kurulu ise, ve 0 olmamışsa zaman değerini 1 azalt, başka işlemleri yapmaya git
>zaman 0 olduysa, bekleme tamam, Zaman kuruldu bayrağını sil, gerekli işlemi yap


Bütün programını bu şekilde yazarsan,
programın her bir kısmı, bütün işlerini, her zaman yapar durumda olur,
böyle bir programda misal bir butonun kontrolü için
buton kontrolü komutlarının olduğu satıra maksimum 5ms de geliniyor olsun,
bu program için bir WDT kurulduğunda,
eğer program buton kontrolüne 5ms de gelemez ise,
program çalışmasında bir problem var, resetlesek iyi olur diye düşünebilirsin.


Aslında çok çok daha detaylı anlatılabilecek şeyler var ama
yazmak pek mümkün değil, yazarak anlatmak zor.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

xoom


Alıntı yapılan: RaMu - 02 Nisan 2017, 17:21:13
1ms bile aşırı derecede uzun bir zaman,
64MHz çalışan bir pic MCU
yaklaşık 16 bin komut işliyor o sırada.


Profesyonel bir programda
--
delay_ms(500);
..
gibi bir satır olmaması lazım,
en azından şöyle yaparsın:


>Zaman kurulmadıysa kur, zaman kuruldu bayrağını işaretle,
>zaman kurulu ise, ve 0 olmamışsa zaman değerini 1 azalt, başka işlemleri yapmaya git
>zaman 0 olduysa, bekleme tamam, Zaman kuruldu bayrağını sil, gerekli işlemi yap


Bütün programını bu şekilde yazarsan,
programın her bir kısmı, bütün işlerini, her zaman yapar durumda olur,
böyle bir programda misal bir butonun kontrolü için
buton kontrolü komutlarının olduğu satıra maksimum 5ms de geliniyor olsun,
bu program için bir WDT kurulduğunda,
eğer program buton kontrolüne 5ms de gelemez ise,
program çalışmasında bir problem var, resetlesek iyi olur diye düşünebilirsin.


Aslında çok çok daha detaylı anlatılabilecek şeyler var ama
yazmak pek mümkün değil, yazarak anlatmak zor.
Yazdıklarınızı bir kod öbeği ile açıklamak isterseniz seve seve takipteyim.. Yeni bir şey öğrenmekten her zaman keyif almışımdır.

RaMu

Dediğim gibi yazarak anlatmak çok zor,
program yazdıkça karşınıza çıkan problemleri çözerken zaten öğrenmiş oluyorsunuz.


İncelemedim ama systick kullanarak stm32 için yazılmış programlarda
buna benzer bir tarza rastlanabilir,
yada state machine denen yapıda benzer bir örnek olabilir.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

xoom


>Zaman kurulmadıysa kur, zaman kuruldu bayrağını işaretle,
>zaman kurulu ise, ve 0 olmamışsa zaman değerini 1 azalt, başka işlemleri yapmaya git
>zaman 0 olduysa, bekleme tamam, Zaman kuruldu bayrağını sil, gerekli işlemi yap

buraya bir örnek yazarsanız yeterli.

RaMu

#11
//programın her 1 ms de bir buraya geldiği varsayılıyor,
//öyle değilse, zaman tutma işi kesme içindede yapılabilir.


if( (zaman_başlatıp_sonunda_islemi_yapılacak == TRUE)

{
if(zaman_kuruldu_bayragi == FALSE) { kurulan_zaman = 500; zaman_kuruldu_bayragi = TRUE; }

if( kurulan_zaman != 0 ) kurulan_zaman--; 

else()  { zaman_kuruldu_bayragi = FALSE; zaman_sonu_islemini_yap(); }

}

Kodumu anlamak daha kolay önceki mesajdaki akışımı,
akış daha kolay anlaşılacağı için kod yazmadım,
hatta kod yazmıştım, sonra silip yerine algoritma yazmıştım.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

dursuncemal

#12
konuyu yanlis anlamadiysan her 1 ms'yede yada herhangi bir zaman da periyodik bir zamanlamada bir is yapmak  soz konusu ise sunu oneririrm.
//programın her 1 ms de bir buraya geldiği varsayılıyor,

if( (zaman){zaman--;}else{zaman =500; zaman_sonu_islemini_yap();}//zaman =500' ü kafadan atiyorum kac ms lazimsa o zamana kurulacak.
:=

xoom


Bu başlıktan şunu anladım.. WDT ihtiyaç duymamak gerekiyor.. Sleep Duruma göre değişir ..Açıklamalar için teşekkürler..