watchdog timer

Başlatan selvi, 24 Ekim 2020, 10:28:29

selvi

    16F689 işlemciyi kullandım. XC8 derleyicinde kodları yazdım. işlemciyi uyku moduna girmesi ve sonrasında watchdog timer ile uyandırmak istedim. basit bir program yazdım. led yakma programı. sigorta ayarlarında  watchdog timer kapalı iken led yanıyor. ama watchdog timer aktif olduğunda led yanmıyor.

yazdığım kodlar aşağıdaki şekildedir.
Alıntı Yap#include <xc.h>
#include "string.h"
#include<math.h>

// CONFIG
#pragma config FOSC = INTRCIO   // Oscil
#pragma config IESO = OFF       // Internal External Switchover bit (Internal External Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)lator Selection bits (INTOSCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN)
#pragma config WDTE = ON       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = ON       // MCLR Pin Function Select bit (MCLR pin function is MCLR)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF      // Brown-out Reset Selection bits (BOR disabled)
#pragma config IESO = OFF       // Internal External Switchover bit (Internal External Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)

//#define  LED_TX      RA0    //output, indication of tx
#define  LED_RX      RC4    //output, indication of rx

void port_init(void);

void main(void)
{
   uint8_t  i;
   
    OSCCON = 0X70;   // internal osc, 8M osc
    WDTCON = 0X00;  // watchdog
   
   port_init();         
   //LED_TX = 0;
   LED_RX = 0;
   
    //OPTION_REG=0x0f;
    //STATUS= 0x08;
    INTCON = 0xc0;

    while(1){
      for(i=0;i<6;i++)
      {
        LED_RX=LED_RX^1;
        delay_1ms(100);
      }
      LED_RX=0;
}
}

void port_init(void)
{
    ANSEL = 0;
    ANSELH = 0;   // AD is not used
    WPUA = 0;   // no pull up resister
    IOCA = 0;  // no io interupt
    //LED_TX=0;
    LED_RX=0;
 
   MCLR_set =INPUT;
   
}

Yaşam anlamlandırıldıkça kutsaldır....

power20

#1
watchdog açıksa, döngü içinde clrwdt kullanılmalıdır. Aksi halde süre dolduğunda watchdog tarafından resetleme yapılır. 
clrwdt eklense bile   Delay_1ms(100);   watchdog süresinden uzun ise yine resetleme yapar.

ahuramazda

software watchdog enable disable diye bir seçenek olması lazım. program uykuda değilken disable uykudayken enable edin o biti

selvi

   belirtilen şekilde tekrar denedim led yanmadı. zaten programda sadece WDT  sigorta ayarlarında ON yapmışım. program içerisinde wdt  aktifleştirmemiştim. buna rağmen ledin yanmaması sorun olarak açığa çıkıyor.
Yaşam anlamlandırıldıkça kutsaldır....

power20

#4
 Clrwdt  kullanılmazsa watchdog aktif etmek anlamsız . Çünkü  sürekli reset olacaktır. watchdog aktif etmek, zaman aşımı olduğunda pic resetlensin demektir. Herhangi sebepten program  takılmış Clrwdt yi çağıramamışsa reset olur.


selvi

ben bu programda 16f689 işlemcisinin 2 saniye uyumasını ve 8 saniye normal çalışacak şekilde bir döngü oluşturmasını istiyorum. sleep modunda çıkması için watchdog timer kullanacam. dahili osilatör kullandım. sleep modunda çıkmasını sağlamak için wdt kesmesi oluşmak zorunda mı? CLRWDT komutu kullandığında pic uyuma modunda çıkabilir mi? 
Yaşam anlamlandırıldıkça kutsaldır....

ahuramazda

Alıntı Yapsleep modunda çıkmasını sağlamak için wdt kesmesi oluşmak zorunda mı?

kesme veya reset hariç işlemciyi uykudan uyandıramazsınız

mufitsozen

Alıntı yapılan: selvi - 31 Ekim 2020, 09:51:01CLRWDT komutu kullandığında pic uyuma modunda çıkabilir mi? 

Uyuyan pic'de CLRWDT komutunu nasil isleyeceksiniz?
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

z

Watchdog kurulu iken sleep moda girersen watchdog counter tastiginda islemciyi uyandirir ve reset rutininden itibaren kosmaya baslar.

Diger wakeup modlarinda ise sleep komutunu takip eden komuttan itibaren kodlar isletilir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

selvi

wdt kesmesi oluştuğunu kontrol etmek için şöyle bir koşul yazmak istedim derleyici hata verdi.

Alıntı Yapif(!STATUSbits.PD)
{
     for(i=0;i<6;i++)
      {
        LED_RX=LED_RX^1;
        delay_1ms(100);
      }
      LED_RX=0;
   
}

bu şekilde hata veriyor.
lora_1262_slaver.c:342: error: (255) not a member of the struct/union ""
lora_1262_slaver.c:342: error: (199) logical type required
Yaşam anlamlandırıldıkça kutsaldır....

JOKERAS

if(!STATUSbits.PD) {

    for(i=0;i<6;i++)
      {
        LED_RX=LED_RX^1;
        __delay_ms(100); //Xc8'de delay Fonksiyonu böyle çağrılıyordu.
      }
      LED_RX=0;
}

Test etmek için delay'ı kaldırıp test edin.Yada yukarıdaki gibi çağırın.

selvi

Alıntı Yapdelay_1ms(100);

gecikme fonksiyonunu programda kendim hazırlamışım. bu noktada hata vermiyor.
hata  verdiği kısım status registerin kullanım biçimine dönüktür.

if(!STATUSbits.PD)   // bu tanımlamayı kabul etmiyor
Yaşam anlamlandırıldıkça kutsaldır....

JOKERAS

#13
STATUSbits. yazdığınız zaman İlgili Bitleri gösteren bir pencere açılması ve bitleri göstermesi
lazım.Register bitleri çıkmıyorsa veya Alakasız bitler çıkıyorsa Proje oluştururken
hata olmuş olabilir.Projeyi Project Properites'e sağ tıklayıp Device doğrumu kontrol edin.

Sizin yerinizde olsam XC'nin hazır Proje klasörünün altındaki Samples Embedded Sekmesini kullanarak oluştururdum.

Edit; Şu şekilde deneyin bir.

if(!STATUSbits.nPD)

selvi

bahsettiğiniz şekilde denedim. program hata vermedi.

if(!STATUSbits.nPD)
[/quote]

pic işlemcisinin 2sn uyuması ve 8 sn kadar normal çalışacak şekilde bir döngü oluşturmak istiyorum. uyuma modundan watchdog timer ile çıkması gerekiyor. bu durumda pic işlemcisinin bu tarz 10sn'de bir reset olması sorun yaratmaz mı?
Yaşam anlamlandırıldıkça kutsaldır....