اطلاعیه

Collapse
No announcement yet.

مشکل در خواندن TCNT3

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

    مشکل در خواندن TCNT3

    درود به همگی دوستان ی پروژه با ATMEGA128 نوشتم با کدویژن و از تایمر کانتر شماره 1و 3میکرو استفاده کردم وقتی مقدار رجیستر TCNT1میخوام بخونم مشکلی نیست ولی وقتی مقدار TCNT3میخوام بخونم ارور عدم شناسایی کامپایلر میده انگار TCNT3 براش تعریف نشده
    حالا چطور میتونم مقدار این رجیستر بخونم
    ​​​​
    جدیدترین ویرایش توسط Novin000; ۰۱:۱۵ ۱۴۰۲/۱۰/۲۴.

    #2
    دوستان کسی نیست ی راهنمایی بده????

    دیدگاه


      #3
      نوشته اصلی توسط Novin000 نمایش پست ها
      درود به همگی دوستان ی پروژه با ATMEGA128 نوشتم با کدویژن و از تایمر کانتر شماره 1و 3میکرو استفاده کردم وقتی مقدار رجیستر TCNT1میخوام بخونم مشکلی نیست ولی وقتی مقدار TCNT3میخوام بخونم ارور عدم شناسایی کامپایلر میده انگار TCNT3 براش تعریف نشده
      حالا چطور میتونم مقدار این رجیستر بخونم
      ​​​​
      درود،
      بنظر میرسه قبلا افراد زیادی با مشکل شما مواجه شدن:

      The core has the low and high bytes declared, but not the 16 bit uint, which e.g. the Timer1 counterpart has (TCNT1) #define TCNT3L _SFR_MEM8(0x94) #define TCNT3H _SFR_MEM8(0x95) Defining it as #de...

      دیدگاه


        #4
        سپاس فراوان ولی مشکل همچنان حل نشد
        (109): undefined symbol 'TCNT3'
        جدیدترین ویرایش توسط Novin000; ۰۰:۵۷ ۱۴۰۲/۱۰/۲۶.

        دیدگاه


          #5
          خیلی مشکل مزخرفیه کل نت زیرو رو کردم ولی چیزی پیدا نکردم????

          دیدگاه


            #6
            نوشته اصلی توسط Novin000 نمایش پست ها
            سپاس فراوان ولی مشکل همچنان حل نشد
            (109): undefined symbol 'TCNT3'
            یکبار مشکل مشابهی داشتم که بعد از درگیر شدن فراوان آخر فهمیدم بخاطر مشکل کدویژن هست.

            دیدگاه


              #7
              بله متاسفانه از باگ های کدویژن جالبه tcnt1مشکلی نداره و راحت فراخوانی میشه ولی tcnt3 ن
              عجیب بود نبود غریب بود نبود پر حرف بود نبود...

              دیدگاه


                #8
                با سلام
                این باگ کدویژن یا مشکل سخت افزاری نیست.شما برای تایمر یک بصورت مستقیم TCNT1 رو میخونید ولی برای تایمر سه باید بایت بالا و پایین TCNT3 رو بصورت جدا از هم بخونید و مقدارش رو با شیفت دادن یا ضرب عددی بدست بیارید مثه نمونه کدی که براتون مینویسم.
                unsigned char TCH,TCL;
                unsigned int tcnt3;
                T3H = TCNT3H;
                T3L = TCNT3L;​
                tcnt3 = (T3H*256)+T3L;
                مقدار بایت بالا ضرب در 256 میشه و با بایت پایین جمع میشه

                دیدگاه


                  #9
                  درود دوست عزیز
                  تمامی کد هایی ک میشد استفاده کرد رو انجام دادیم ولی مشکل اصلی آنجاست ک مقدار TCNT3L پیدا میکنه ولی مقدار TCNT3H صفر میده
                  نمونه کد هایی ک نوشتم
                  برای مثال این کد
                  uint16_t timer3_value = (TCNT3H << 8) | TCNT3L;​
                  T3=TCNT3;
                  TCNT3 =0;
                  یا
                  tcnt3 = (T3H*256)+T3L;
                  T3=TCNT3;
                  TCNT3 =0;
                  یا
                  T3= TCNT3H
                  8>>T3;
                  TCNT3 =t3+TCNT3L

                  وقتی میای TCNT3 صفر میکنی یا TCNT3H و TCNT3L صفر میکنی فقط انگار مقدار کم ارزش خونده میشه و مقدار پرارزش 0
                  ینی وقتی فرکانس تغییر میدی فقط مقدار TCNT3L درست نشون میده

                  دیدگاه


                    #10
                    نوشته اصلی توسط Novin000 نمایش پست ها
                    درود دوست عزیز
                    تمامی کد هایی ک میشد استفاده کرد رو انجام دادیم ولی مشکل اصلی آنجاست ک مقدار TCNT3L پیدا میکنه ولی مقدار TCNT3H صفر میده
                    نمونه کد هایی ک نوشتم
                    برای مثال این کد
                    uint16_t timer3_value = (TCNT3H << 8) | TCNT3L;​
                    T3=TCNT3;
                    TCNT3 =0;
                    یا
                    tcnt3 = (T3H*256)+T3L;
                    T3=TCNT3;
                    TCNT3 =0;
                    یا
                    T3= TCNT3H
                    8>>T3;
                    TCNT3 =t3+TCNT3L

                    وقتی میای TCNT3 صفر میکنی یا TCNT3H و TCNT3L صفر میکنی فقط انگار مقدار کم ارزش خونده میشه و مقدار پرارزش 0
                    ینی وقتی فرکانس تغییر میدی فقط مقدار TCNT3L درست نشون میده
                    از نظر سخت افزاری شما نمیتونید همزمان و هروقت دوست داشتین هر بایتی رو از رجیستر کانتر تایمر 3 بخونید چون فقط یه بایت وجود داره که اخرین مقدار رو به شما میده .بین رجیستر TCNT3L و TCNT3H یه رجیستر وجود داره که کاربر بهش دسترسی نداره و فقط مختص سیستم هست که بهش میگن رجیستر موقت TEMP .این رجیستر این قدرت رو به CPU میده تا بتونه به بایت بالا و پایین دسترسی داشته باشه تا بصورت همزمان TCNT رو بخونه.
                    اگه هنگام خوندن رجیستر TCNT3 مشکل دارید دو نکته مهم رو حتما انجام بدید تا رجیستر بدرستی خونده بشه.نکته اول که مهمه هنگام خوندن بایت بالا و پایین حتما اینتراپت سراسری غیرفعال بشه تا وسط خوندن دو بایت مشکل بوجود نیاد و نکته دوم بایت H اول خونده بشه بعد بایت L .فیوزبیت M103C یا COMPMODE باید فعال بشه تا TCNT3 در دسترس باشه(بخاطر مشترک بودن با MEGA103)

                    دیدگاه


                      #11
                      اگه نکاتی که گفتم مشکل شما رو حل نکرد اون قسمت از برنامه خودتون که مشکل داره و نمیتونه TCNT3H رو بخونه رو قرار بدید تا با همفکری هم حلش کنیم.ضمنا فرکانس کاری میکرو و مقدار تقسیم فرکانس تایمر باید حتما بصورتی باشه که مقدار TCNT3H روش نوشته بشه در غیر اینصورت مقدار صفر میده

                      دیدگاه

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