اطلاعیه

Collapse
No announcement yet.

کمک: از کار افتادن تایمر در میکرو بعد از مدتی

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    کمک: از کار افتادن تایمر در میکرو بعد از مدتی

    سلام دوستان

    من یه برنامه برای atmega16 نوشتم برای ارتباط با sim900 که حلقه اصلی Main منتظر میمونه تا یک پیام از SIM900 برسه و اون را پردازش کنه.

    توی برنامه ام تایمر 16 بیتی 1 تنظیم کردم تا هر یک ثانیه یک بار وقفه ایجاد کنه و درون وقفه دستورات خوندن سیگنال و ساعت را ره SIM900 ارسال میکنم و برنامه به درستی عمل میکنه و لی بعد از چند دقیقه میبینم تایمر دیگه کار نمیکنه و برنامه از کار افتاده...

    برای تست اجرای تایمر هر بار که تایمر اجرا میشه یک کاراکتر خاصی را درون LCD تغییر میدم که از روی متوقف شدن همون میبینم که تایمر از کار افتاده.
    همچنین حلقه while(1) درون main هم دیگه دستورات را پردازش نمیکنه....


    هرکاری میکنم نمیفهمم مشکلش از کجا میتونه باشه؟؟؟؟

    دوستان کسی آمار Mega16 ها را نداره که چطور هستند؟ به نظر شما این هنگ کردن و کار نکردن از IC هم میتونه باشه؟


    تابع وقفه:

    کد:
    interrupt [TIM1_OVF] void timer1_ovf_isr(void)
    {
      static uchar timer = 1;
      static uchar rsIndex = 0;
      TCNT1H=0xD5; // - 10800
      TCNT1L=0xCF;
    
      if(Timer1Enable == false)
        return;
      
        
      if(DelayForResetLCD > 0)
      {
        DelayForResetLCD --;
        if(DelayForResetLCD == 0)
        {
          WillBeResetLCD = 1;
          SIM_ReadAT();
        }//  WillBeResetLCD = 1;
      }
      else
      {
        timer++; 
        lcd_gotoxy(12,0);
        lcd_putchar(RUNSTRING[rsIndex++]);
        if(rsIndex == 4)
          rsIndex = 0;
        
        if(timer % 20 == 0)
        {
          SIM_ReadClock();
        }  
        if(timer == 30)
        {
          SIM_ReadSignal(); 
        } 
      
        if(timer == 41)
          timer = 1;
      } 
    }
    دستوران درون وقفه از نوعی نیستند که برنامه را بلاک کنند و توابعی که درون تابع وقفه فراخوانی میشن تنها دستورات خواندن سیگنال و ساعت را با پورت سریال ارسال میکنند و منتظر دریافت پاسخ نمیمونند...

    خوندن ساعت هر بیست ثانیه اتفاق می افته و خوندن سیگنال هر چهل ثانیه یک بار که همزمان هم ارسال نمیشن..

    #2
    پاسخ : کمک: از کار افتادن تایمر در میکرو بعد از مدتی

    داخل تابع های فراخوانی شده گیر میکنه...
    .The best question deserves a better answer
    =-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=
    «پناه»می برم «به خدا»
    از عـیبی که ، «امروز» در خود می بینم، و «دیروز» «دیگران را» به خاطر، «هـمان عیـب» ملامت کرده ام.
    محتاط باشیم، در «سرزنش» و «قضاوت کردن دیگران». وقتی نه از «دیروز او» خبر داریم و نه از "فردای خودمان" .

    دیدگاه


      #3
      پاسخ : کمک: از کار افتادن تایمر در میکرو بعد از مدتی

      این توابع درون تایمر هست.. فکر نمیکنم جایی داشته باشه برای گیر کردن

      کد:
      void SIM_ReadClock()
      { 
        BusBeasy = 1;
        putsf( AT_CCLK );
        
        delay_ms(10);
        BusBeasy = 0;
      }
      
      void SIM_ReadSignal()
      {
        BusBeasy = 1;
        
        putsf( AT_CQS );
        
        delay_ms(10);
        BusBeasy = 0;
      }
      
      void SIM_ReadAT()
      {
        BusBeasy = 1;
        
        putsf( AT ); 
        
        delay_ms(10);
        BusBeasy = 0;
      }

      دیدگاه


        #4
        پاسخ : کمک: از کار افتادن تایمر در میکرو بعد از مدتی

        سلام
        پیشنهاد میکنم پیش از کشف منبع این مشکل ابتدا اون رو به نحوی که کارها در میکرو کنترلر با صحت و سلامت ادامه پیدا کنه ، ایراد رو برطرف کنید oo:
        برای اینکه وقتی میکرو به هر علتی هنک کرد در این وضعیت باقی نمونه تایمر نگهبان رو راه اندازی کینید و از عملکرد ایمنش لذت ببرید.
        در این صورت میکرو کنترلر به هر علتی که هنک کنه اگر زمان مورد نظر طی بشه خود به خود ریست میشه و کار رو از سر میگیره .

        *** برای استفاده از تایمر نگهبان باید برنامه رو به صورت استاندارد نوشته باشید و یا برنامه رو برای این کار اصلاح کنید .
        به طور مثال هرگز در یک برنامه نویسی حرفه ای از تاخیر های بیشتر از حدود ms استفاده نکینید و برای تاخیرهای بیشتر از حلقه های تکرار استفاده کنید تا در طول ایجاد مثلا یک تاخیر 3 ثانیه ای تونسته باشید چند ده بار به طور مثال یک ورودی و یا دریافت اطلاعات و یا پایان کاری رو توسط میکرو کنترلر چک کرده باشید و یا اطلاعات تایمر و متغیرها و مطالب نمایش داده شده روی نمایشگر رو به روز کنید ...
        بهتر هست در چنین مواردی برنامه به گونه ای نوشته بشه که با ریست شدن میکرو کنترلر مراحل از سر گیری و ادامه کار به درستی انجام بشه ...

        خوب حالا اگر این کارها رو انجام دادید و نتیجه نگرفتید و یا قصد دارید اول محل ایجاد اشکال رو کشف کنید بحث رو به این سمت ببریم
        موفقیت یک فرایند است نه یک اتفاق...

        ******** استفاده از گزينه تشكر نشانه اهميت و احترام شما به پيگيري شخص نظر دهنده است ********

        دیدگاه


          #5
          پاسخ : کمک: از کار افتادن تایمر در میکرو بعد از مدتی

          نوشته اصلی توسط erima نمایش پست ها
          سلام دوستان

          من یه برنامه برای atmega16 نوشتم برای ارتباط با sim900 که حلقه اصلی Main منتظر میمونه تا یک پیام از SIM900 برسه و اون را پردازش کنه.

          توی برنامه ام تایمر 16 بیتی 1 تنظیم کردم تا هر یک ثانیه یک بار وقفه ایجاد کنه و درون وقفه دستورات خوندن سیگنال و ساعت را ره SIM900 ارسال میکنم و برنامه به درستی عمل میکنه و لی بعد از چند دقیقه میبینم تایمر دیگه کار نمیکنه و برنامه از کار افتاده...

          برای تست اجرای تایمر هر بار که تایمر اجرا میشه یک کاراکتر خاصی را درون LCD تغییر میدم که از روی متوقف شدن همون میبینم که تایمر از کار افتاده.
          همچنین حلقه while(1) درون main هم دیگه دستورات را پردازش نمیکنه....


          هرکاری میکنم نمیفهمم مشکلش از کجا میتونه باشه؟؟؟؟

          دوستان کسی آمار Mega16 ها را نداره که چطور هستند؟ به نظر شما این هنگ کردن و کار نکردن از IC هم میتونه باشه؟


          تابع وقفه:

          کد:
          interrupt [TIM1_OVF] void timer1_ovf_isr(void)
          {
            static uchar timer = 1;
            static uchar rsIndex = 0;
            TCNT1H=0xD5; // - 10800
            TCNT1L=0xCF;
          
            if(Timer1Enable == false)
              return;
            
              
            if(DelayForResetLCD > 0)
            {
              DelayForResetLCD --;
              if(DelayForResetLCD == 0)
              {
                WillBeResetLCD = 1;
                SIM_ReadAT();
              }//  WillBeResetLCD = 1;
            }
            else
            {
              timer++; 
              lcd_gotoxy(12,0);
              lcd_putchar(RUNSTRING[rsIndex++]);
              if(rsIndex == 4)
                rsIndex = 0;
              
              if(timer % 20 == 0)
              {
                SIM_ReadClock();
              }  
              if(timer == 30)
              {
                SIM_ReadSignal(); 
              } 
            
              if(timer == 41)
                timer = 1;
            } 
          }
          دستوران درون وقفه از نوعی نیستند که برنامه را بلاک کنند و توابعی که درون تابع وقفه فراخوانی میشن تنها دستورات خواندن سیگنال و ساعت را با پورت سریال ارسال میکنند و منتظر دریافت پاسخ نمیمونند...

          خوندن ساعت هر بیست ثانیه اتفاق می افته و خوندن سیگنال هر چهل ثانیه یک بار که همزمان هم ارسال نمیشن..
          سلام
          این مشکلو من تو atmega128 دارم یه سریز دارم برنامه که میره توش دیگه به main اصلی بر نمیگرده توی تابع سریز هر چی باشه اجرا میشه ولی خارجش هیچی اجرا نمیشه
          کسی نمیدونه مشکل چیه ؟ یک هفته روش گیرم.

          دیدگاه

          لطفا صبر کنید...
          X