ايران ويج

نسخه‌ی کامل: Watch dog
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2
سلام
من قبلا با کدویزارد واچ داگ  رو فعال کرده بودم و مشکلی نداشتم
شما دقیقا چه مشکلی دارید و ازکجا مطمئن هستیدکه کار نمیکنه؟
(۲۱-آبان-۱۳۹۷, ۲۰:۱۴:۴۷)hadikh73 نوشته است: [ -> ]سلام
من قبلا با کدویزارد واچ داگ  رو فعال کرده بودم و مشکلی نداشتم
شما دقیقا چه مشکلی دارید و ازکجا مطمئن هستیدکه کار نمیکنه؟

سلام
در یک برنامه نسبتا بزرگتر نیاز به فعال سازی واچ داگ دارم .چون با کدویژن کار می کنم می خواستم با آن واچ داگ رو فعال کنم .اما هر گار می کنم فعال نمیشه با ویزارد و حتی فیوز بیت فعال نشد در همه موارد از نرم افزار پروگرام میکروی ، خزاما استفاده می کنم .الان آن قسمت که مربوط به واچ داگ است می گذارم .
#include <mega8.h>
#include <stdlib.h>
#include <delay.h>
#include <stdio.h>

#define led1 PORTB.3   // 1 ON
#define led2 PORTB.2   // 1 ON
#define led3 PORTB.1   // 1 ON
unsigned int msec,mc;
unsigned int sec1; 
unsigned int min1;

 void time()
 {
   sec1++;
    if(sec1 > 59)
    { 
     mc++;
     min1++;
     sec1=0;
    }
  }
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
 TCNT0=0xC2;
   msec++;
   if(msec>999)
    {
     msec=0;
     time();
    }

}

void wdt_reset()  //-------------WDT REset
 { 
  #asm("wdr")
 }       
 void wdt_off()    //--------------WDT Off
 {
  #asm("wdr")
  WDTCR|=(1<<WDCE) | (1<<WDE);
  WDTCR=0x07;  
 }
 void wdt_on()    //---------------WDT ON
  {
   WDTCR =0x0f;   
  }  
 void flasher(int x,int y,int led_t)
 {
   int g;
   for(g=0;g<x;g++)
   {   
    switch(led_t)
     {
      case 1:
        led1 = 1;
        break;
      case 2:
        led2 = 1;
        break;
      case 3:
        led3 = 1;
        break;       
     }
      delay_ms(y);
      switch(led_t)
     {
      case 1:
        led1 = 0;
        break;
      case 2:
        led2 = 0;
        break;
      case 3:
        led3 = 0;
        break;       
     }
     delay_ms(y);
   }
  }      
void main(void)
{
// Declare your local variables here
PORTB=0x00;
DDRB=0x0E;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x03;
TCNT0=0xC2;

TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

MCUCR=0x00;

TIMSK=0x01;

UCSRB=0x00;

ACSR=0x80;
SFIOR=0x00;

ADCSRA=0x00;

SPCR=0x00;

TWCR=0x00;
#pragma optsize-
WDTCR=0x1F;
WDTCR=0x0F;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Global enable interrupts
#asm("sei")
 flasher(2,100,1);
 flasher(2,100,2);  
 flasher(2,100,3);
while (1)
   {
     wdt_on();
     msec=0;
    while(mc < 3000)
     {  
          
       flasher(2,100,1); 
       delay_ms(200);
        
      } 
      delay_ms(1000);     
      wdt_off();
   }
}
این برنامه با ویزارد واچ داگ رو فعال می کنه .اشکال اینه که واچ داگ اصلن کار نمی کنه یعنی ری ست میکرو رو فعال نمی کنه.
اینم همان برنامه با روش فعال سازی نرم افزاری
#include <mega8.h>
#include <stdlib.h>
#include <delay.h>
#include <stdio.h>


#define led1 PORTB.3   // 1 ON
#define led2 PORTB.2   // 1 ON
#define led3 PORTB.1   // 1 ON

unsigned int msec,mc;
unsigned int sec1; 
unsigned int min1;

 void time()
 {
   sec1++;
    if(sec1 > 59)
    { 
     min1++;
     sec1=0;
    }
  }
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
 TCNT0=0xC2;
   msec++;   
    mc++;
   if(msec>999)
    {
     msec=0;
     time();
    }
}
void wdt_on(void)
 {  
  WDTCR = 0x1f;
  WDTCR =0x0f;
  }
void wdt_off(void)
 {
  #asm ("wdr")
   WDTCR = 0x1f;
   WDTCR = 0x00;
 }


 void flasher(int x,int y,int led_t)
 {
   int g;
   for(g=0;g<x;g++)
   {   
    switch(led_t)
     {
      case 1:
        led1 = 1;
        break;
      case 2:
        led2 = 1;
        break;
      case 3:
        led3 = 1;
        break;       
     }
      delay_ms(y);
      switch(led_t)
     {
      case 1:
        led1 = 0;
        break;
      case 2:
        led2 = 0;
        break;
      case 3:
        led3 = 0;
        break;       
     }
     delay_ms(y);
   }
  }      
void main(void)
{
// Declare your local variables here
PORTB=0x00;
DDRB=0x0E;
TCCR0=0x03;
TCNT0=0xC2;

TIMSK=0x01;
//SREG |= 0b10000000;
#asm("sei")
#asm("wdr")
    
 flasher(2,100,1);
 flasher(2,100,2);  
 flasher(2,100,3);
while (1)
   {  
      #asm("wdr")
      wdt_on();
      mc=0;
    while(mc <3000)
     {  
       flasher(2,100,1); 
     }  
     // WDTCR=0x1F;
     // WDTCR=0x00;
      delay_ms(2000);     
   }
}
سلام همان برنامه با Bascom که بخوبی کار میکنه :
$regfile = "m8def.dat"
 $crystal = 4000000
'Config Watchdog = 2048

Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output

Led1 Alias Portb.1
Led2 Alias Portb.2
Led3 Alias Portb.3
 Enable Interrupts

Dim B As Byte


 Led1 = 1
 Waitus 1
 Led1 = 0
 Waitus 1

 Led2 = 1
 Waitus 1
 Led2 = 0
 Waitus 1
 Led3 = 1
 Waitus 1
 Led3 = 0
 Waitus 1

 Set Led1
 Set Led2
 Set Led3
 Waitus 1
 Reset Led1
 Reset Led2
 Reset Led3
 Waitus 1
'Config Watchdog = 2048
Wdtcr = &H1F
Wdtcr = &H07
Do
 Wdtcr = &H0F
 For B = 0 To 1
  Led1 = 1
  Waitus 1
  Led1 = 0
  Waitus 1
 Next B
Wdtcr = &H1F
Wdtcr = &H07
Loop

سلام به همه 
تصور میکنم علتشو پیدا کردم .همین برنامه c رو در MikroC_pro For avr نوشتم کار کرد گمان میکنم چون میکرو ویژن کرک شده هست دستورات مربوط به واچ داگ رو کمپایل نمی کنه! 008
صفحه‌ها: 1 2