اطلاعیه

Collapse
No announcement yet.

مشکل با وقفه خارجی

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

    مشکل با وقفه خارجی

    سلام.ببخشید چجوری تو وقفه خارجی تایمرو روشن کنم بعد دفعه بعدی که وقفه بخوره تایمر خاموش شه و عدد تو تایمرو استفاده کنم
    با کدویژن کار میکنم نه بسکام ممنون :cry2:

    #2
    پاسخ : مشکل با وقفه خارجی

    روشن کردن تایمر از طریق سه بیت کم ارزش رجیستر کنترل تایمر انجام میشه. در واقع این سه بیت مقدار PRESCALE رو مشخص میکنن که در حالت خاموش این سه بیت برابر 000 هستن و در حالت روشن بر اساس مقدار PRESCALE مقدار دهی میشوند.
    در روتین اینتراپت اول با یک IF چک کنید که آیا تایمر روشن یا خاموشه و بعد بر اساس روشن یا خاموش بودن برنامه هر حالت رو بنویسید.
    مثلا:
    flag=TCCR0&0b00000111;
    if(!flag)
    {
    TCCR0|=1;
    }
    else
    {
    x=TCNT0;
    TCCR0&=~1;
    }

    }
    افتادگی آموز اگر طالب فیضی هرگز نخورد آب زمینی که بلند است

    دیدگاه


      #3
      پاسخ : مشکل با وقفه خارجی

      نوشته اصلی توسط abolfazl_moradpour
      روشن کردن تایمر از طریق سه بیت کم ارزش رجیستر کنترل تایمر انجام میشه. در واقع این سه بیت مقدار PRESCALE رو مشخص میکنن که در حالت خاموش این سه بیت برابر 000 هستن و در حالت روشن بر اساس مقدار PRESCALE مقدار دهی میشوند.
      در روتین اینتراپت اول با یک IF چک کنید که آیا تایمر روشن یا خاموشه و بعد بر اساس روشن یا خاموش بودن برنامه هر حالت رو بنویسید.
      مثلا:
      flag=TCCR0&0b00000111;
      if(!flag)
      {
      TCCR0|=1;
      ببخشید این جا نباید بنویسیم TCNT0++
      }
      else
      {
      x=TCNT0;
      TCCR0&=~1;
      }

      }

      دیدگاه


        #4
        پاسخ : مشکل با وقفه خارجی

        یه سوال دیگه هم داشتم میخاستم بدونم از کجا بدونیم TCNT0 بر حسب چیه ؟ثانیه هست میلی هست یا میکرو :angry:
        ممنون

        دیدگاه


          #5
          پاسخ : مشکل با وقفه خارجی

          نوشته اصلی توسط sara789
          یه سوال دیگه هم داشتم میخاستم بدونم از کجا بدونیم TCNT0 بر حسب چیه ؟ثانیه هست میلی هست یا میکرو :angry:
          ممنون
          مقدار TCNT0 از لحظه شروع در هر پالس یکی افزایش پیدا میکنه.مثلا اگر شما از کلاک 1 مگ داخلی استفاده کرده باشید و prescale هم یک باشه هر یک میکرو ثانیه TCNT0
          یکی افزایش پیدا میکنه.پس اگر TCNT0 =128 یعنی 129 میکرو ثانیه زمان برده تا از صفر بشمره تا 128.
          یا مثلا اگر کلاک 16 مگ باشه و prescale =1024 در این صورت هر 1024*(1/16) میکروثانیه یک بار TCNT0 یکی افزایش پیدا میکنه.
          افتادگی آموز اگر طالب فیضی هرگز نخورد آب زمینی که بلند است

          دیدگاه


            #6
            پاسخ : مشکل با وقفه خارجی

            نوشته اصلی توسط abolfazl_moradpour
            روشن کردن تایمر از طریق سه بیت کم ارزش رجیستر کنترل تایمر انجام میشه. در واقع این سه بیت مقدار PRESCALE رو مشخص میکنن که در حالت خاموش این سه بیت برابر 000 هستن و در حالت روشن بر اساس مقدار PRESCALE مقدار دهی میشوند.
            در روتین اینتراپت اول با یک IF چک کنید که آیا تایمر روشن یا خاموشه و بعد بر اساس روشن یا خاموش بودن برنامه هر حالت رو بنویسید.
            مثلا:
            flag=TCCR0&0b00000111;
            if(!flag)
            {
            TCCR0|=1;
            }
            else
            {
            x=TCNT0;
            TCCR0&=~1;
            }

            }
            این برنامه درست کار نمیکنه :angry:
            ما مقدار tccr0 را در main مقداردهی کردم
            بعد بیاد تو وقفه هیچ وقت flag =0 نمیشه
            که مقدار tcnt رو دربیارم

            دیدگاه


              #7
              پاسخ : مشکل با وقفه خارجی

              نوشته اصلی توسط sara789
              این برنامه درست کار نمیکنه :angry:
              ما مقدار tccr0 را در main مقداردهی کردم
              بعد بیاد تو وقفه هیچ وقت flag =0 نمیشه
              که مقدار tcnt رو دربیارم
              خوب tccr0 رو در main مقدار دهی نکن یا اگر توسط codewizard تنظیمات دیگه ای توش انجام شده با کد زیر اونو stop کن
              TCCR0&=~7
              هرچند هم اگر مقدار دهی شده باشه باز هم درست کار میکنه

              پ.ن:برنامه ای که نوشتی با فایل پروتئوسش یه جا پلود کن یه نگاه بندازم
              افتادگی آموز اگر طالب فیضی هرگز نخورد آب زمینی که بلند است

              دیدگاه


                #8
                پاسخ : مشکل با وقفه خارجی

                نوشته اصلی توسط abolfazl_moradpour
                خوب tccr0 رو در main مقدار دهی نکن یا اگر توسط codewizard تنظیمات دیگه ای توش انجام شده با کد زیر اونو stop کن
                TCCR0&=~7
                هرچند هم اگر مقدار دهی شده باشه باز هم درست کار میکنه

                پ.ن:برنامه ای که نوشتی با فایل پروتئوسش یه جا پلود کن یه نگاه بندازم
                خب من TCCR0 و کجا مقدار بدم تو اول وقفه هم بدم دفعه بعدی که باز وقفه بخورم بازم با این فرمول تایمر روشنه نه خاموش :angry:

                دیدگاه


                  #9
                  پاسخ : مشکل با وقفه خارجی

                  من این برنامه رو نوشتم تو پروتئوس هم چک کردم درست کار میکنه
                  برنامه به این صورته که تو هر لبه پایین رونده پایه int0 میکرو اینتراپت میخوره و بعد اگر تایمر روشن باشه خاموشش میکنه و اگه خاموش باشه روشنش میکنه
                  تو اینتراپت overflow تایمر هم پورت c رو toggle کردم.یکم دقیق تر برنامه رو بررسی کنید:

                  کد:
                  #include <mega32.h>
                   char x;
                   char flag;
                  // External Interrupt 0 service routine
                  interrupt [EXT_INT0] void ext_int0_isr(void)
                  {
                  flag=TCCR0&0b00000111;
                  if(!flag)
                    {
                    TCCR0|=1;
                    }
                  else
                    {
                    x=TCNT0;
                    TCCR0&=~1;
                    }
                  
                  }
                  
                  // Timer 0 overflow interrupt service routine
                  interrupt [TIM0_OVF] void timer0_ovf_isr(void)
                  {
                  PORTC^=0xff;
                  
                  }
                  void main(void)
                  {
                  DDRC=0xff;
                  // Timer/Counter 0 initialization
                  // Clock source: System Clock
                  // Clock value: Timer 0 Stopped
                  // Mode: Normal top=0xFF
                  // OC0 output: Disconnected
                  TCCR0=0x00;
                  TCNT0=0x00;
                  OCR0=0x00;
                  // External Interrupt(s) initialization
                  // INT0: On
                  // INT0 Mode: Falling Edge
                  // INT1: Off
                  // INT2: Off
                  GICR|=0x40;
                  MCUCR=0x02;
                  MCUCSR=0x00;
                  GIFR=0x40;
                  // Timer(s)/Counter(s) Interrupt(s) initialization
                  TIMSK=0x01;
                  // Global enable interrupts
                  #asm("sei")
                  
                  while (1)
                     {
                     // Place your code here
                  
                     }
                  }
                  افتادگی آموز اگر طالب فیضی هرگز نخورد آب زمینی که بلند است

                  دیدگاه


                    #10
                    پاسخ : مشکل با وقفه خارجی

                    برنامه کدویژن به همراه فایل پروتئوس

                    http://wdl.persiangig.com/pages/download/?dl=http://abolfazl504.persiangig.com/int.rar
                    افتادگی آموز اگر طالب فیضی هرگز نخورد آب زمینی که بلند است

                    دیدگاه


                      #11
                      پاسخ : مشکل با وقفه خارجی

                      نوشته اصلی توسط abolfazl_moradpour
                      برنامه کدویژن به همراه فایل پروتئوس

                      http://wdl.persiangig.com/pages/download/?dl=http://abolfazl504.persiangig.com/int.rar
                      من یک تابع السیدی پرینت یه چیزی گذاشتم تو قسمت else یعنی تیکه ای که flag=0 ه و از مقدار tcnt استفاده میکنیم ولی :cry2: هیچی رو السیدی چاپ نکرد یعنی اصلا وارد اون قسمت کد نمیشه هیچ وقت.ممنون
                      کسی راه حل دیگه ای نداره :angry:

                      دیدگاه


                        #12
                        پاسخ : مشکل با وقفه خارجی

                        نوشته اصلی توسط sara789
                        من یک تابع السیدی پرینت یه چیزی گذاشتم تو قسمت else یعنی تیکه ای که flag=0 ه و از مقدار tcnt استفاده میکنیم ولی :cry2: هیچی رو السیدی چاپ نکرد یعنی اصلا وارد اون قسمت کد نمیشه هیچ وقت.ممنون
                        کسی راه حل دیگه ای نداره :angry:
                        من مجددا پیشنهاد میکنم فایل کدویژن و پروتئوس برنامتون رو upload کنید و توضیحات کامل تری از کاری که میخواید بکنید و مشکلی که دقیقا دارید بدید تا بهتر بشه کمکتون کرد.
                        افتادگی آموز اگر طالب فیضی هرگز نخورد آب زمینی که بلند است

                        دیدگاه

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