اطلاعیه

Collapse
No announcement yet.

طریقه استفاده از کانتر

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

    طریقه استفاده از کانتر

    سلام. جان من دیگه اینو جواب بدین هر چی سوال پرسیدم تا حالا هیچکی جواب نداد انگار هیچ بنی بشری به این مشکلات تا حالا برنخورده :eek:
    من سیگنال حاصل از شفت را وصل کردم به پایه T1 که تعداد TCNT1 رو بدست بیارم
    تو تایمر 2 هم زمان یک ثانیه رو ایجاد میکنم
    مثلا 4 مگ کلاکم باشه میشه 245 (تقسیم بر 64 )
    ولی درست جواب نمیده چرا؟؟؟؟؟؟؟؟
    [interrupt [TIM1_OVF] void timer1_ovf_isr(void)
    {
    TCNT1++;
    i1++;

    }
    ////////////////////////////////////////////////////////////////////////////////
    interrupt [TIM2_OVF] void timer2_ovf_isr(void)
    { count++;
    if (count== 245)
    {

    count= 0;
    TCNT1=0;
    }
    }
    تو main هم دارم
    TCCR2=0x04;
    TCNT2=0x00;
    OCR2=0x00;
    TCCR1A=0x00;
    TCCR1B=0x07;
    ..........
    TIMSK=0x44;
    #asm("sei&quot

    یه مشکل دیگه هم که دارم نمیدونم باید مقدار1 TCNT رو تو همون تابع اینتراپت 2 بخونم یا تو MAIN
    جان من جواب بدین :cry2:

    #2
    پاسخ : طریقه استفاده از کانتر

    سلام من از برنامه شما سر در نیاوردم ولی اگر هدفتون به دست آوردن تعداد شمارش کانتر 1 در 1 ثانیه است روشی رو که میگم آزمایش کنید احتمالا جواب میده.
    در وقفه تایمر 2 (وقفه 1 ثانیه ای) مقدار TCNT1 رو بخوانید و در یک متغیر سراسری (مثلا A) بریزید (مقدار شمارش شده در 1 ثانیه). سپس مقدار 0 را در TCNT1 بریزید. حال می توانید از متغییر سراسری A در تابع main برنامه استفاده کنید. این متغیر هر 1 ثانیه به 1 ثانیه، به روز می شود. فقط اولین مقداری که از TCNT1 می خوانید اشتباه است و دفعات بعدی درست است.
    نیازی به وقفه TCNT1 هم نیست.

    دیدگاه


      #3
      پاسخ : طریقه استفاده از کانتر

      نوشته اصلی توسط aed
      سلام من از برنامه شما سر در نیاوردم ولی اگر هدفتون به دست آوردن تعداد شمارش کانتر 1 در 1 ثانیه است روشی رو که میگم آزمایش کنید احتمالا جواب میده.
      در وقفه تایمر 2 (وقفه 1 ثانیه ای) مقدار TCNT1 رو بخوانید و در یک متغیر سراسری (مثلا A) بریزید (مقدار شمارش شده در 1 ثانیه). سپس مقدار 0 را در TCNT1 بریزید. حال می توانید از متغییر سراسری A در تابع main برنامه استفاده کنید. این متغیر هر 1 ثانیه به 1 ثانیه، به روز می شود. فقط اولین مقداری که از TCNT1 می خوانید اشتباه است و دفعات بعدی درست است.
      نیازی به وقفه TCNT1 هم نیست.
      من زمانو واسه یه ثانیه تنظیم کردم ولی خیلی دیرتر نشون میده بعد ببخشید چرا اولین مقدار tcnt1 غلطه؟

      دیدگاه


        #4
        پاسخ : طریقه استفاده از کانتر

        تایمر دو را در حالت Asynchron تنظیم کنید. کلاک تایمر رو تقسیم بر 128 قرار دهید و یک کریستال 32.768 کیلوهرتزی به پایه های TOSC1 , TOSC2 وصل کنید (اگر میکروکنترلر شما این قابلیت را دارد مثل مگا 8 و مگا 16 و مگا 32 و مگا 128). در این صورت تایمر در هر یک ثانیه سرریز میشود و اگر وقفه OVF تایمر 2 فعال باشد، یک وقفه در هر ثانیه روی می دهد.
        ممکن است اولین شمارش تایمر در ظرف مدت یک ثانیه نباشد (یعنی لحظه شروع شمارش با لحظه شروع محاسبه زمان 1 ثانیه برابر نباشد). اما در دفعات بعد چون کانتر را صفر کرده اید و دقیقا یک ثانیه بعد آن را می خوانید و سپس صفر می کنید، شمارش صحیح است.

        دیدگاه


          #5
          پاسخ : طریقه استفاده از کانتر

          نوشته اصلی توسط aed
          تایمر دو را در حالت Asynchron تنظیم کنید. کلاک تایمر رو تقسیم بر 128 قرار دهید و یک کریستال 32.768 کیلوهرتزی به پایه های TOSC1 , TOSC2 وصل کنید (اگر میکروکنترلر شما این قابلیت را دارد مثل مگا 8 و مگا 16 و مگا 32 و مگا 128). در این صورت تایمر در هر یک ثانیه سرریز میشود و اگر وقفه OVF تایمر 2 فعال باشد، یک وقفه در هر ثانیه روی می دهد.
          ممکن است اولین شمارش تایمر در ظرف مدت یک ثانیه نباشد (یعنی لحظه شروع شمارش با لحظه شروع محاسبه زمان 1 ثانیه برابر نباشد). اما در دفعات بعد چون کانتر را صفر کرده اید و دقیقا یک ثانیه بعد آن را می خوانید و سپس صفر می کنید، شمارش صحیح است.
          این کارم کردم ولی بازم عددی که میده به عنوان فرکانس خیلی اختلاف داره با مقدار واقعیش :cry2:

          دیدگاه


            #6
            پاسخ : طریقه استفاده از کانتر

            نوشته اصلی توسط sara789
            این کارم کردم ولی بازم عددی که میده به عنوان فرکانس خیلی اختلاف داره با مقدار واقعیش :cry2:
            با پروتئوس شبیه سازی می کنید یا عملی می بندید مدار رو؟
            در صورت حالت اول، لطفا فایل پروژه کدویژن+پروتئوس(فشردش کنید لطفا) رو قرار بدید تا بررسی بشه
            اونچيزي که در دانشگاه ياد ميگيريد، "الفبايي" هست براي نوشتن يک "رمان" !!

            دیدگاه

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