اطلاعیه

Collapse
No announcement yet.

استفاده از dac_driver در atmel studio

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

    استفاده از dac_driver در atmel studio

    سلام
    در حال تغییر دادن کتابخانه dac_driver برای استفاده در Atmel Studio بودم که با مشکلاتی برخورد کردم , مشکل اول این بود که داخل dac_driver از دوتا enum استفاده شده که داخل سربرگ Atxmega64a3u موجود نبود ولی ...

    ویرایش 1 :
    کتابخانه dac_driver مربوط به AVR1301
    کتابخانه زیر با سری A و AU سازگاره و در هر دو کامپایلر Atmel Studio و IAR میشه ازش استفاده کرد
    با تشکر از راهنمایی دوستان...

    http://mitaly.persiangig.com/AVR_Lib...r.rar/download


    ویرایش 2 : داخل ASF به درایور جدیدی برخورد کردم که ورژن جدید dac هستش و این درایور دیگه مشکل درایور قبلی که با سری AU سازگار نبود رو نداره و در ابتدای درایور شرط زیر رو گذاشته:
    کد:
    #if XMEGA_AU || XMEGA_B || XMEGA_E
    # define XMEGA_DAC_VERSION_2 true
    #else
    # define XMEGA_DAC_VERSION_1 true
    #endif
    همچنین داخل درایور گفته که فاصله زمانی بین هر تبدیل فقط برای سری های قبلی (قدیمی) نیاز هست.
    کد:
    // Timing configuration is only needed for version 1 of DAC
    بعد از هماهنگ کردن این نسخه با Atmel Studio پلودش می کنم ...
    (درسته اینجا هیچ استقبالی نمی شه ولی شاید در آینده کسی نیاز داشت ، برای همین اینجا می ذارم که همه بتونم استفاده کنن )

    #2
    پاسخ : استفاده از dac_driver در atmel studio

    مطابق اطلاعات Manual، رجیستر TIMCTRL در سری AU وجود ندارد و اگر IAR در Header های خود چنین تعریفی انجام داده در تضاد با محتوای Manual و اشتباه است. برای استفاده از کتابخانه dac_driver برای سری AU می توانید ورودی های مرتبط با این رجیستر (sampleInterval و refreshInterval) و خط مربوط به مقداردهی به رجیستر TIMCTRL را در تابع DAC_DualChannel_Enable حذف کنید.
    اوژن: به معنای افکننده و شکست دهنده است
    دانایی، توانایی است-Knowledge is POWER
    برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
    وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
    قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
    اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
    ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

    دیدگاه


      #3
      پاسخ : استفاده از dac_driver در atmel studio

      با تشکر از جناب کی نژاد ,
      بله حق با شماست من با مطالعه سری A متوجه شدم که TIMCTRL براش تعریف شده ولی برای سری AU خیر ، با این تفاسیر دیگه نیازی به تعریف enum مربوط به
      DAC_CONINTVAL_enum
      و
      enum DAC_REFRESH_enum

      برنامه اصلی :
      کد:
      void DAC_DualChannel_Enable( volatile DAC_t * dac,
                    DAC_REFSEL_t convRef,
                    bool leftAdjust,
                    DAC_CONINTVAL_t sampleInterval,
                    DAC_REFRESH_t refreshInterval )
      {
      	dac->CTRLB = ( dac->CTRLB & ~DAC_CHSEL_gm ) | DAC_CHSEL_DUAL_gc;
      	dac->CTRLC = ( dac->CTRLC & ~( DAC_REFSEL_gm | DAC_LEFTADJ_bm ) ) |
      	       convRef |
      	       ( leftAdjust ? DAC_LEFTADJ_bm : 0x00 );
      	dac->TIMCTRL = (uint8_t) sampleInterval | refreshInterval;
      	dac->CTRLA |= DAC_CH1EN_bm | DAC_CH0EN_bm | DAC_ENABLE_bm;
      }
      حذف رجیستر مربوطه :

      کد:
      void DAC_DualChannel_Enable( volatile DAC_t * dac,
                    DAC_REFSEL_t convRef,
                    bool leftAdjust)
      {
      	dac->CTRLB = ( dac->CTRLB & ~DAC_CHSEL_gm ) | DAC_CHSEL_DUAL_gc;
      	dac->CTRLC = ( dac->CTRLC & ~( DAC_REFSEL_gm | DAC_LEFTADJ_bm ) ) |
      	       convRef |
      	       ( leftAdjust ? DAC_LEFTADJ_bm : 0x00 );
      	dac->CTRLA |= DAC_CH1EN_bm | DAC_CH0EN_bm | DAC_ENABLE_bm;
      }
      با توجه به اینکه رجیستر TIMCTRL در سری A مربوط به فاصله بین تبدیل و فاصله بین رفرش هر دو کانال هست می خواستم بدونم که در سری AU خود DAC این کار رو انجام می ده یا اینکه نیازی به این کار نبوده که رجیستر مربوطه حذف شده ؟
      با تشکر

      دیدگاه


        #4
        پاسخ : استفاده از dac_driver در atmel studio

        با توجه به حذف رجیستر TIMCTRL در سری AU، ظاهرا زمان بندی DAC بصورت داخلی انجام می شود و از طریق این رجیستر در دسترس نیست.
        برای نوشتن کتابخانه هم می توانید با استفاده از conditional compilation و عبارت های if# و elif# و else# کتابخانه ای بنویسید که برای همه شماره ها شامل سری های A و AU بصورت مشترک قابل استفاده باشد.
        اوژن: به معنای افکننده و شکست دهنده است
        دانایی، توانایی است-Knowledge is POWER
        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

        دیدگاه


          #5
          پاسخ : پاسخ : استفاده از dac_driver در atmel studio

          نوشته اصلی توسط طراح
          با توجه به حذف رجیستر TIMCTRL در سری AU، ظاهرا زمان بندی DAC بصورت داخلی انجام می شود و از طریق این رجیستر در دسترس نیست.
          برای نوشتن کتابخانه هم می توانید با استفاده از conditional compilation و عبارت های if# و elif# و else# کتابخانه ای بنویسید که برای همه شماره ها شامل سری های A و AU بصورت مشترک قابل استفاده باشد.
          جناب کی نژاد اگه امکانش هست یکم توضیح بدین چطوری تشخیص بدم سری A هست یا AU ؟ از رجیستر TIMCTRL میشه کمک گرفت ؟ یا از enum های مربوط به رجیستر ؟ ( DAC_CONINTVAL_enum و DAC_REFRESH_enum ) یا راه دیگری هست برای تشخیص نوع میکرو ؟
          (با conditional compilation کمی اشنایی دارم فقط نمی دونم شرط رو چی قرار بدم)
          با تشکر ...

          دیدگاه


            #6
            پاسخ : استفاده از dac_driver در atmel studio

            در Atmel Studio تست کوچکی با کد زیر انجام دادم:

            [code=c]#if defined(DACA_TIMCTRL) || defined (DACB_TIMCTRL)
            MyCode
            #else
            . . .
            #endif[/code]
            و خروجی طبق اونچه مورد انتظار بود تولید شد. یعنی با انتخاب سری A1 و A3 قسمت MyCode تولید شد و برای A1U و A3U تولید نشد. اما باید به هدر فایل های شماره های دیگر هم دقت کنید تا مثل همین مورد شما اشتباهی صورت نگرفته باشد یا اینکه شرط رو برای شماره های مورد نظر به صورت زیر بنویسید:
            [code=c]#if defined(__AVR_ATxmega128A1__) || defined(__AVR_ATxmega128A3__) || . . .[/code]
            گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

            دیدگاه


              #7
              پاسخ : استفاده از dac_driver در atmel studio

              با تشکر از کمکتون
              با نگاهی که به سایت اتمل انداختم تقریبا میشه گفت 23 مورد از خانواده Xmega دارای DAC هستن اکثرا خانواده A , AU (از خانواده E سه مورد دارای DAC بودن )
              (اگر اشتباه می کم لطفا تصحیح کنید )

              در نتیجه میشه گفت اکثرا DACA یا DACB رو دارن پس میشه کد رو به صورت زیر تغییر داد :

              در فایل .h

              کد:
              #if defined (DACB_TIMCTRL) || defined (DACA_TIMCTRL)
              
              		void DAC_DualChannel_Enable( volatile DAC_t * dac,
              		DAC_REFSEL_t convRef,
              		bool leftAdjust,
              		DAC_CONINTVAL_t sampleInterval,
              		DAC_REFRESH_t refreshInterval );
              #else
              		void DAC_DualChannel_Enable( volatile DAC_t * dac,
              		DAC_REFSEL_t convRef,
              		bool leftAdjust);
              #endif
              در فایل .c

              کد:
              #if defined (DACB_TIMCTRL) || defined (DACA_TIMCTRL)
              		void DAC_DualChannel_Enable( volatile DAC_t * dac,
              		DAC_REFSEL_t convRef,
              		bool leftAdjust,
              		DAC_CONINTVAL_t sampleInterval,
              		DAC_REFRESH_t refreshInterval )
              		{
              			dac->CTRLB = ( dac->CTRLB & ~DAC_CHSEL_gm ) | DAC_CHSEL_DUAL_gc;
              			dac->CTRLC = ( dac->CTRLC & ~( DAC_REFSEL_gm | DAC_LEFTADJ_bm ) ) |
              			convRef |
              			( leftAdjust ? DAC_LEFTADJ_bm : 0x00 );
              			dac->TIMCTRL = (uint8_t) sampleInterval | refreshInterval;
              			dac->CTRLA |= DAC_CH1EN_bm | DAC_CH0EN_bm | DAC_ENABLE_bm;
              		}
              	
              
              #else			
              
              
              	void DAC_DualChannel_Enable( volatile DAC_t * dac,
              	DAC_REFSEL_t convRef,
              	bool leftAdjust)
              	{
              		dac->CTRLB = ( dac->CTRLB & ~DAC_CHSEL_gm ) | DAC_CHSEL_DUAL_gc;
              		dac->CTRLC = ( dac->CTRLC & ~( DAC_REFSEL_gm | DAC_LEFTADJ_bm ) ) |
              		convRef |
              		( leftAdjust ? DAC_LEFTADJ_bm : 0x00 );
              		dac->CTRLA |= DAC_CH1EN_bm | DAC_CH0EN_bm | DAC_ENABLE_bm;
              	}
              
              #endif
              البته اگه بخوایم دقیق تر بنویسیم باید دیتاشیت های همه رو بخونیم که کار زمانبری میشه همین کدی که قرار دادم هم کار رو راه می اندازه ...
              با تشکر ...

              ویرایش :
              فایل مربوط به کتابخانه DAC سازگار با کامپایلر Atmel Studio و IAR و سازگار با میکرو های سری A و AU به پست اول اضافه شد .

              دیدگاه

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