Watchdog Yardım?

Başlatan FxDev, 05 Eylül 2009, 13:54:03

FxDev

Arkadaşlar watchdog'u software reset atmak için nasıl kullanmam gerekiyor acaba, bununla ilgili registerler hangileridir, çalıştığında ne yapar?
Örnek kod ile anlatabilir misiniz acaba?
Yardımcı olanlara şimdiden teşekkürler ;)

SpeedyX

goto $
while(1);
for(;;);


yaparsan watchdog süre sonunda resetler.

memo333

öncelikle config regden wdtyi kapatman gerekir. bu sayede wdtyi yazılımsal olarak kontrol edebilirsin. WDTCON.SWDTEN biti bu işi yapar. Ama proteusta çalışmaz aman dikkat!
Gömülü Linux Notları --> http://linuxedu.xyz/

XX_CİHAN_XX

Öncelikle Config den WDTON yapmalısın.

Daha sonra programının başında Watch dog timer in prescaler değerini OPTION reg (PSO:PS2)den ayarlamalısın.

Bu bölen aralığı senin programındaki CLRWDT komutunu kullanma sıklığına ve kitlendikten ne kadar süre sonra sistemin resetlenmesini istediğin zamana bağlı olacaktır.

Böylece aynı tmr0 sayıcısı gibi arka planda sürekli sayan bir sayıcı elde etmiş olacaksın. Ancak bu sayıcı saymayı tamamladığında sistemi resetleyen bir sayıcıdır. Dolayısıyla programın normal akışı esnasında (kitlenme yokken) sayıcıyı kurduğun bölen aralığına göre programının içinde CLRWDT komutunu kullanmalısın ki WDT sayıcısı (TMR0) saymasını bitirmeden sıfırlansın ve durduk yere programımız resetlenmesin.
Ancak kitlenmesi muhtemel döngüler içinde CLRWDT yi dikkatli bir şekilde kullanmalıyız (yada kullanmamalıyız) ki kitlenme durumunda sayıcımız sıfırlanmasın ve taşma sonucu programımız resetlenerek kitlendiği yerden kurtulsun.



WDT status registerinde 2 biti etkiler (TO ve PD bitleri)
bit 4 TO: Time-out bit
1 = After power-up, CLRWDT instruction or SLEEP instruction
0 = A WDT time-out occurred
bit 3 PD: Power-down bit
1 = After power-up or by the CLRWDT instruction
0 = By execution of the SLEEP instruction

Bu bitleri (reset vekteründe programın başında) kontrol ederek programın buraya WDT nin sebep olduğu resetle mi yoksa normal yollardan mı geldiğine karar verip ona göre işlem yapabilirsin.

Kolay gelsin,
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

hasangurlek

Alıntı yapılan: "FxDev"Bir program yazdım diyelim, fakat gürültülerden dolayı bu program kitlenebiliyor.

Bence sorunun cevabını kendiniz vermişsiniz. Eğer gürültü nedeniyle program hatalı çalışıyorsa veya kilitleniyorsa donanımda önemli bir hata vardır, bunu çözmeniz gerekir.
http://www.cyber-warrior.org, Although they like whiteness, sometimes twilight is required...  Hala evlilermi bilinmez ama kesinlikle artık uygun değiller !!!

OG

WDT açık iken, program sonsuz döngüye girerse ve döngüde CLRWDT 'ile karşılaşmıyorsa wdt reset atar, aksi halde bu döngüde sonsuza kadar döner.

Gürültüyü donanımsal olarak yok etmeye çalışıp, yok oldu kabul etmek en kolay yol. Aksi halde gürültü programı nasıl etkiledi, nasıl hata verdirdi diye hata aramak pic yazılımı açısından herhalde içinden çıkılmaz bir durum olur.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

hasangurlek

Eğer mcu e kadar gürültü bir şekilde ulaşıyorsa öncelikle bunu çözmeniz gerekir. Sonuçta sinyal tipi ne olursa olsun her mcu bir limite sahiptir.

"iki ayrı kod birden algılanmış gibi olur" dan kastın ne anlayamadım ama aynı anda birden çok kontrol yapılsa bile "SATIR SATIR KOD YÜRÜTME" mantığı nedeniyle program her halükarda bir kod dizisini işleyebilir. Nasıl ki keypad de tüm tuşlara aynı anda basılsa bile program ilk tespit ettiği girişe göre işlem yapmaya yönleniyorsa, bir tuşa basmakla birlikte bir dahili veya harici veya her iki kesme birden aynı anda meydana gelse yine öncelikle ilk tespit edilen durum işlenir, ardından diğerleri öncelik sırasına göre işlenir. Öncelik sırasını tabi yine program belirler. Yani bildiğiniz gibi eeproma datalar yazılırken aynı anda analog değerleride okuma şansımız tek mcu içindeki programda söz konusu olamaz. Keza analog sinyallerdede durum değişmez. Eğer analog sinyale etki eden bir dış kaynak söz konusu ise, sinyal aralığına göre eğer gerekliyse voltaj bölücü/katlayıcı kullanarak sinyal seviyesini mcu e göre ayarlayarak low,band,high geçirgen filtreler kullanarak bu durumu yine donanımla çözmeniz gerekir. Dolayısıyla programın iki arada bir derede kalması hiçbir durumda mümkün değildir.

Sonsuz döngüye girme olayıda ek donanımların hatasından kaynaklanabilir ki dolayısıyla buda programdaki eksiklik/mantık hatalarından ileri gelir. Eeprom, display vb. donanım hatalarını bekçi köpeğini yada başkaca bir sayaç kullanarak tespit edebilir, programın sonsuz döngü içinden çıkmasını ve hatalı donanımı resetleyip tekrar test etmeyi ve gerçekten hatalı ise devre dışı bırakmayı sağlayabilirsiniz.
http://www.cyber-warrior.org, Although they like whiteness, sometimes twilight is required...  Hala evlilermi bilinmez ama kesinlikle artık uygun değiller !!!

XX_CİHAN_XX

Alternatif bir öneri:
Eğer soft reset olmasın sadece kitlendiğim yerden kurtulayım istiyorsan timer saydırabilir ve manuel kontrol yapabilirsin. Programını CLRWDT ler ile doldurmamış olursun. Ancak bu yöntemin kullanım yeri farklı, WDT nin kullanım yeri biraz daha farklıdır. Yapmaya çalıştığın yazılıma ve amacına göre buna karar verebilirsin. Örneğin bir clock girişinden clock bekliyorsun ve clock aldıktan sonra programa devam ediyorsun (atıyorum bir aygıttan kesmesiz seri data alıyoruz) clock aralığı 4mS olsun. 10mS bekledin hala clock gelmedi demekki bit kaçırmışsın ve clock gelene kadar döngüde kısıldın kaldın. Bu gibi durumlarda sadece döngüden çıkıp programa devam etmek software resete göre daha çok tercih edilebilen bir durumdur. Bu durumda WDT kullanmak yerine 10mS sonra overflow olacak bir timer kurarsın clock sorgusuna (döngüne) o şekilde girersin ve bu döngüden ya clock gelirse yada timer overflow olunca çıkarsın bu şekilde kitlenmeyi önelemiş olursun (WDT kullanmadan).
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

hasangurlek

Yol göstermesi açısından basitçe şöyle bir mantık kurabilirsin;

MAIN{
SPI // Max 10ms
ADC // Max 200 ms
I2C // Max 5ms

/*Alt rutinlerin yukarıdaki sürelerde çalıştığını düşünelim, bu durumda
A-Alt rutinlerde Max işlem süresi ADC kodlarına ait, bu durumda 200 ms den daha fazla bir süre için WDT kurulur,
B-Her ana döngüde WDT sıfırlanır
C- Programdaki hata nedeniyle alt rutinlerde kaçırdığımız bir problem olurda ana döngüye dönemezsek WDT reset atar.*/
}

I2C{
// buraya gelmeden önce bir değişkene hangi donanımla iletişim kurulacağı atanmalı

I2C de bu donanımda daha önce hata varmı ? Hayır : Devam et / Evet : Kullanıcıya bildir ve geri dön

DEGISKEN=HATA KODU
TIMER=100US
I2C=SETUP
I2C=START
Start işlemi gerçekleştimi ? Evet, Timerı durdur ve devam et
Süre doldumu ? Evet, Hata rutinine git
.
.
.
//Diyelim data yazıldı, ACK bekleniyor
TIMER=100US
I2C=DATA GONDER
ACK alındımı ? Evet, Timerı durdur ve devam et
Süre doldumu ? Evet, Hata rutinine git

//Diyelimki ACK alınamadı ve süre doldu
}

HATA_TESPIT{
Hangi donanım ?

//Örnekte 24C64 eprom, o bölüme git
}

24C64_HATALARI{
Hata kodunu tespit et,

//I2C den ACK alınamadı
}

24C64_ACK_ALINAMADI{
//Sebepler ne olabilirse burada test edilir

I2C PORTU KAPAT
I2C PORTU AÇ
START
DATA YAZ

//VS. VS.
//Yine 24C64 problemliyse devreden çıkartılır ve kullanıcıya arıza bildirilir.
}

Yani hataların hepsi kodla çözülmelidir, programa veya donanıma güvenemiyorsak en tepede bekçi köpeği program hatalarına karşı sistemi korur. Bu arada iyi bir hata denetimi için yazılan kodlar oldukça fazla yer kaplar.
http://www.cyber-warrior.org, Although they like whiteness, sometimes twilight is required...  Hala evlilermi bilinmez ama kesinlikle artık uygun değiller !!!