اطلاعیه

Collapse
No announcement yet.

راه اندازی ADC با استفاده از ASF

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

    راه اندازی ADC با استفاده از ASF

    با سلام
    جستجویی در این بخش انجام دادم و پست مشابهی پیدا نکردم اگه موضوع تکراری هست دوستان راهنمایی کنن پست رو در جای مناسبی قرار بدم.
    --
    من از ATXMEGA32A4U استفاده میکنم، به جهت اینکه کد پروژه زیاد شده بود و احساس کردم ممکنه مشکلاتی در خصوص وقفه ها و پرچم ها و ... پیش بیاد ترجیح دادم از ASF اتمل استفاده کنم و میخوام ADC رو با توابع ASF راه اندازی کنم. کدم رو تکمیل کردم ولی یه مشکل اساسی دارم و اون اینکه کدم با IAR کامپایل نمیشه و خطا های زیادی داره. ظاهرا ASF بیشتر برای برد هایی آموزشی ای هست که خود اتمل بیرون داده و برای پروژه هایی خارج از این مجموعه به راحتی قابل استفاده نیست.
    کد کامل ASF رو از لینک زیر دانلود کردم
    http://www.atmel.com/tools/AVRSOFTWAREFRAMEWORK.aspx
    نسخه آخر ASF هست. ولی خطاهای زیادی هنگام کامپایل ایجاد میشه، ظاهرا برخی از این خطا ها برای بروز نبودن هدر های IAR هست که خود اتمل راهنمایی کرده که این هدرها باید بروز بشن ولی فولدری که آدرس داده در آخرین ورژن ASF وجود نداره. این یه مشکل.
    مشکل دیگه اینکه ظاهرا باگ ها زیادی وجود داره مثلا موقع کامپایل، رهنمون هایی وجود داره مثل if# که مثلا گفته اگر XMEGA_AU تعریف شده یه کد خاصی رو اضافه کن. ولی کامپایلر IAR با اینکه نوع میکرو من دقیقا از همین نوع هست اون رو تعریف شده نمیشناسه.(که این ممکنه به دلیل بروز نبودن هدر های IAR باشه)
    مشکل دیگه اینکه در یکی از کتابخونه ها از farflash__ آ‌استفاده شده در صورتی که این ویژگی برای میکروهایی با حافظه بیش از 64 کیلو بایت تعریف شده و با اینکه من میکرو ام رو 32A4u یعنی با حافظه 32 کیلو بایت تعریف میکنم باز این بخش از کد کامپایل میشه و به کامپایلر هم خطای تنظیمات رو میگیره یعنی میکرو ی انتخاب شده این قابلیت رو نداره.

    خلاصه اینکه حدود 2 هفته هست من مشغول کامپایل کردن کدم هستم ولی هنوز موفق نشدم باگ ها رو برطرف کنم.
    کسی از دوستان در این زمینه تجربیه ای داره؟
    با سپاس فراوان
    شأن انسان در ايمان و هجرت و جهاد است و هجرت، مقدمهآ‌ي جهاد فيآ‌سبيلآ‌الله.
    هجرت، هجرت از سنگينيآ‌هاست و جاذبهآ‌هايي كه تو را به خاك ميآ‌چسباند.
    چكمهآ‌هايت را بپوش، رهآ‌توشهآ‌ات را بردار و هجرت كن.

    #2
    پاسخ : راه اندازی ADC با استفاده از ASF

    به دلیل کلی بودن محتوای پست شما، راهنمایی خاصی را نمی توان انجام داد. اما بطور کلی توابع و ماکروهای موجود در AVR1300 بسیار خوب عمل می کنند و اگر از محتوای آن استفاده کنید، برای جواب گرفتن از ADC بسیار مناسب است.
    اوژن: به معنای افکننده و شکست دهنده است
    دانایی، توانایی است-Knowledge is POWER
    برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
    وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
    قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
    اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
    ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

    دیدگاه


      #3
      پاسخ : راه اندازی ADC با استفاده از ASF

      سلام.
      من از کتابخونه هایی که همراه 1300 هست نتونستم استفاده کنم نواقص زیادی داشت یا شاید من بلد نبودم درست استفاده کنم.

      برخی از مشکلات حل شد به این ترتیب که avrstudio رو دانلود کردم و یه امکانی داره که توابع asf یه ماژول رو مثلا adc به صورت کامل با شرایط دلخواه به پروژه اضافه میکنه. من به کمک اون تونستم آخرین و بروزترین کتابخونه ها رو بدست بیارم و در پروژه خودم کپی کنم(نکته مهم اینه که آخرین نسخه ASF یعنی 3.4 که در سایت به صورت مستقیم برای دانلود قرار داده شده کامل نیست بلکه نسخه ای که همراه AVRStudio ارائه شده از اون کامل تر هست) برخی ایراد ها مثل ایرادی که در مورد farflash__ داشتم در کتابخونه nvm.h بر طرف شد. به این خاطر که در نسخه آخر این کتابخونه استفاده از farflash__ رو به شرط بزرگتر بودن حافظه فلش از 64 کیلو بایت در نظر گرفته و به این ترتیب کامپایلر IAR دیگه خطا نمیده.

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

      حالا یه مشکل دیگه که من فکر میکنم فراتر از بحث راه اندازی ADC هست و خوبه مطالب آموزشی ای در این زمینه منتشر بشه چون به نظرم خیلی مهم هست.
      و اون اینکه نحوه کار با ASF چطوری هست؟
      مثلا مجموعه کامل این کتابخونه که دانلود میشه چندین کتابخونه با یک اسم وجود داره مثلا OSC.h شاید 5 تا وجود داره. حتی در خود شاخه xmega هم 2 تا کتابخونه به همین نام وجود داره. این کتابخونه ها با اینکه اسمشون مثل هم هست ولی با هم تفاوت دارن. یکی از اونها تعیین کننده OSC.hآ‌ اصلی هست که باید به پروژه اضافه بشه مثلا: کتابخونه زیر osc.h عمومی هست و کتابخونه ای که به همین نام در پایین تر اومده osc.h مخصوص xmega هست.
      کد:
      #ifndef OSC_H_INCLUDED
      #define OSC_H_INCLUDED
      
      #include "parts.h"
      #include "conf_clock.h"
      
      #if SAM3S
      # include "sam3s/osc.h"
      #elif SAM3XA
      # include "sam3x/osc.h"
      #elif SAM3U
      # include "sam3u/osc.h"
      #elif SAM3N
      # include "sam3n/osc.h"
      #elif SAM4S
      # include "sam4s/osc.h"
      #elif (UC3A0 || UC3A1)
      # include "uc3a0_a1/osc.h"
      #elif UC3A3
      # include "uc3a3_a4/osc.h"
      #elif UC3B
      # include "uc3b0_b1/osc.h"
      #elif UC3C
      # include "uc3c/osc.h"
      #elif UC3D
      # include "uc3d/osc.h"
      #elif UC3L
      # include "uc3l/osc.h"
      #elif XMEGA
      # include "xmega/osc.h"
      #else
      # error Unsupported chip type
      #endif
      
      
      #ifndef __ASSEMBLY__
      
      static inline void osc_wait_ready(uint8_t id)
      {
        while (!osc_is_ready(id)) {
          /* Do nothing */
        }
      }
      
      #endif /* __ASSEMBLY__ */
      
      //@}
      
      //! @}
      
      #endif /* OSC_H_INCLUDED */


      دقیقا با همین نام osc.h کتابخونه ای مخصوص xmega هست که به صورت زیره:


      کد:
      #ifndef XMEGA_OSC_H_INCLUDED
      #define XMEGA_OSC_H_INCLUDED
      
      #include "compiler.h"
      #include "board.h"
      
      
      //! \name Oscillator identifiers
      //@{
      //! 2 MHz Internal RC Oscillator
      #define OSC_ID_RC2MHZ     OSC_RC2MEN_bm
      //! 32 MHz Internal RC Oscillator
      #define OSC_ID_RC32MHZ    OSC_RC32MEN_bm
      //! 32 KHz Internal RC Oscillator
      #define OSC_ID_RC32KHZ    OSC_RC32KEN_bm
      //! External Oscillator
      #define OSC_ID_XOSC      OSC_XOSCEN_bm
      /**
       * \brief Reference from USB Start Of Frame
       * \note This cannot be enabled or disabled, but can be used as a reference for
       * the autocalibration (DFLL).
       */
      #define OSC_ID_USBSOF     0xff
      //@}
      
      //! \name External oscillator types
      //@{
      #define XOSC_TYPE_EXTERNAL  0  //!< External clock signal
      #define XOSC_TYPE_32KHZ    2  //!< 32.768 kHz resonator on TOSC
      #define XOSC_TYPE_XTAL    3  //!< 0.4 to 16 MHz resonator on XTAL
      //@}
      
      /**
       * \def CONFIG_XOSC_32KHZ_LPM
       * \brief Define for enabling Low Power Mode for 32 kHz external oscillator.
       */
      #ifdef __DOXYGEN__
      # define CONFIG_XOSC_32KHZ_LPM
      #endif /* __DOXYGEN__ */
      
      //! \name XTAL resonator start-up cycles
      //@{
      #define XOSC_STARTUP_256   0  //!< 256 cycle start-up time
      #define XOSC_STARTUP_1024   1  //!< 1 k cycle start-up time
      #define XOSC_STARTUP_16384  2  //!< 16 k cycle start-up time
      //@}
      
      
      //! \name XTAL resonator frequency range
      //@{
      //! 0.4 to 2 MHz frequency range
      #define XOSC_RANGE_04TO2   OSC_FRQRANGE_04TO2_gc
      //! 2 to 9 MHz frequency range
      #define XOSC_RANGE_2TO9    OSC_FRQRANGE_2TO9_gc
      //! 9 to 12 MHz frequency range
      #define XOSC_RANGE_9TO12   OSC_FRQRANGE_9TO12_gc
      //! 12 to 16 MHz frequency range
      #define XOSC_RANGE_12TO16   OSC_FRQRANGE_12TO16_gc
      //@}
      
      
      // If application intends to use XOSC.
      #ifdef BOARD_XOSC_HZ
      // Get start-up config for XOSC, if not manually set.
      # ifndef CONFIG_XOSC_STARTUP
      # ifndef BOARD_XOSC_STARTUP_US
      #  error BOARD_XOSC_STARTUP_US must be configured.
      # else
      //! \internal Number of start-up cycles for the board's XOSC.
      #  define BOARD_XOSC_STARTUP_CYCLES \
          (BOARD_XOSC_HZ / 1000000 * BOARD_XOSC_STARTUP_US)
      
      #  if (BOARD_XOSC_TYPE == XOSC_TYPE_XTAL)
      #  if (BOARD_XOSC_STARTUP_CYCLES > 16384)
      #   error BOARD_XOSC_STARTUP_US is too high for current BOARD_XOSC_HZ.
      
      #  elif (BOARD_XOSC_STARTUP_CYCLES > 1024)
      #   define CONFIG_XOSC_STARTUP  XOSC_STARTUP_16384
      #   define XOSC_STARTUP_TIMEOUT  (16384*(1000000/BOARD_XOSC_HZ))
      
      #  elif (BOARD_XOSC_STARTUP_CYCLES > 256)
      #   define CONFIG_XOSC_STARTUP  XOSC_STARTUP_1024
      #   define XOSC_STARTUP_TIMEOUT  (1024*(1000000/BOARD_XOSC_HZ))
      
      #  else
      #   define CONFIG_XOSC_STARTUP  XOSC_STARTUP_256
      #   define XOSC_STARTUP_TIMEOUT  (256*(1000000/BOARD_XOSC_HZ))
      #  endif
      #  else /* BOARD_XOSC_TYPE == XOSC_TYPE_XTAL */
      #  define CONFIG_XOSC_STARTUP   0
      #  endif
      # endif /* BOARD_XOSC_STARTUP_US */
      # endif /* CONFIG_XOSC_STARTUP */
      
      // Get frequency range setting for XOSC, if not manually set.
      # ifndef CONFIG_XOSC_RANGE
      # if (BOARD_XOSC_TYPE == XOSC_TYPE_XTAL)
      #  if (BOARD_XOSC_HZ < 400000)
      #  error BOARD_XOSC_HZ is below minimum frequency of 400 kHz.
      
      #  elif (BOARD_XOSC_HZ < 2000000)
      #  define CONFIG_XOSC_RANGE  XOSC_RANGE_04TO2
      
      #  elif (BOARD_XOSC_HZ < 9000000)
      #  define CONFIG_XOSC_RANGE  XOSC_RANGE_2TO9
      
      #  elif (BOARD_XOSC_HZ < 12000000)
      #  define CONFIG_XOSC_RANGE  XOSC_RANGE_9TO12
      
      #  elif (BOARD_XOSC_HZ <= 16000000)
      #  define CONFIG_XOSC_RANGE  XOSC_RANGE_12TO16
      
      #  else
      #  error BOARD_XOSC_HZ is above maximum frequency of 16 MHz.
      #  endif
      # else /* BOARD_XOSC_TYPE == XOSC_TYPE_XTAL */
      #  define CONFIG_XOSC_RANGE   0
      # endif
      # endif /* CONFIG_XOSC_RANGE */
      #endif /* BOARD_XOSC_HZ */
      
      #ifndef __ASSEMBLY__
      
      /**
       * \internal
       * \brief Enable internal oscillator \a id
       *
       * Do not call this function directly. Use osc_enable() instead.
       */
      static inline void osc_enable_internal(uint8_t id)
      {
        irqflags_t flags;
      
        Assert(id != OSC_ID_USBSOF);
      
        flags = cpu_irq_save();
        OSC.CTRL |= id;
        cpu_irq_restore(flags);
      }
      
      #if defined(BOARD_XOSC_HZ) || defined(__DOXYGEN__)
      
      static inline void osc_enable_external(uint8_t id)
      {
        irqflags_t flags;
      
        Assert(id == OSC_ID_XOSC);
      
      #ifndef CONFIG_XOSC_32KHZ_LPM
        OSC.XOSCCTRL = BOARD_XOSC_TYPE | (CONFIG_XOSC_STARTUP << 2) |
            CONFIG_XOSC_RANGE;
      #else
        OSC.XOSCCTRL = BOARD_XOSC_TYPE | (CONFIG_XOSC_STARTUP << 2) |
            CONFIG_XOSC_RANGE | OSC_X32KLPM_bm;
      #endif /* CONFIG_XOSC_32KHZ_LPM */
      
        flags = cpu_irq_save();
        OSC.CTRL |= id;
        cpu_irq_restore(flags);
      }
      #else
      
      static inline void osc_enable_external(uint8_t id)
      {
        Assert(false); // No external oscillator on the selected board
      }
      #endif
      
      static inline void osc_disable(uint8_t id)
      {
        irqflags_t flags;
      
        Assert(id != OSC_ID_USBSOF);
      
        flags = cpu_irq_save();
        OSC.CTRL &= ~id;
        cpu_irq_restore(flags);
      }
      
      static inline void osc_enable(uint8_t id)
      {
        if (id != OSC_ID_XOSC) {
          osc_enable_internal(id);
        } else {
          osc_enable_external(id);
        }
      }
      
      static inline bool osc_is_ready(uint8_t id)
      {
        Assert(id != OSC_ID_USBSOF);
      
        return OSC.STATUS & id;
      }
      
      //! \name XMEGA-Specific Oscillator Features
      //@{
      
      static inline void osc_enable_autocalibration(uint8_t id, uint8_t ref_id)
      {
        irqflags_t flags;
      
        flags = cpu_irq_save();
        switch (id) {
        case OSC_ID_RC2MHZ:
          Assert((ref_id == OSC_ID_RC32KHZ) || (ref_id == OSC_ID_XOSC));
      
          if (ref_id == OSC_ID_XOSC) {
            OSC.DFLLCTRL |= OSC_RC2MCREF_bm;
          } else {
            OSC.DFLLCTRL &= ~(OSC_RC2MCREF_bm);
          }
          DFLLRC2M.CTRL |= DFLL_ENABLE_bm;
          break;
      
        case OSC_ID_RC32MHZ:
      #if XMEGA_AU || XMEGA_B || XMEGA_C
          Assert((ref_id == OSC_ID_RC32KHZ)
              || (ref_id == OSC_ID_XOSC)
              || (ref_id == OSC_ID_USBSOF));
      
          OSC.DFLLCTRL &= ~(OSC_RC32MCREF_gm);
      
          if (ref_id == OSC_ID_XOSC) {
            OSC.DFLLCTRL |= OSC_RC32MCREF_XOSC32K_gc;
          }
          else if (ref_id == OSC_ID_USBSOF) {
            /*
             * Calibrate 32MRC at 48MHz using USB SOF
             * 48MHz / 1kHz = 0xBB80
             */
            DFLLRC32M.COMP1 = 0x80;
            DFLLRC32M.COMP2 = 0xBB;
            OSC.DFLLCTRL |= OSC_RC32MCREF_USBSOF_gc;
          }
          else if (ref_id == OSC_ID_RC32KHZ) {
            /*
             * Calibrate 32MRC at 48MHz using USB SOF
             * 48MHz / 1kHz = 0xBB80
             */
            DFLLRC32M.COMP1 = 0x80;
            DFLLRC32M.COMP2 = 0xBB;
            osc_enable(OSC_ID_RC32KHZ);
            OSC.DFLLCTRL |= OSC_RC32MCREF_RC32K_gc;
          }
      #else
          Assert((ref_id == OSC_ID_RC32KHZ) || (ref_id == OSC_ID_XOSC));
      
          if (ref_id == OSC_ID_XOSC) {
            OSC.DFLLCTRL |= OSC_RC32MCREF_bm;
          }
          else {
            OSC.DFLLCTRL &= ~(OSC_RC32MCREF_bm);
          }
      #endif
          DFLLRC32M.CTRL |= DFLL_ENABLE_bm;
          break;
      
        default:
          Assert(false);
          break;
        }
        cpu_irq_restore(flags);
      }
      
      static inline void osc_disable_autocalibration(uint8_t id)
      {
        switch (id) {
        case OSC_ID_RC2MHZ:
          DFLLRC2M.CTRL = 0;
          break;
      
        case OSC_ID_RC32MHZ:
          DFLLRC32M.CTRL = 0;
          break;
      
        default:
          Assert(false);
          break;
        }
      }
      
      static inline void osc_user_calibration(uint8_t id, uint16_t calib)
      {
        switch (id) {
        case OSC_ID_RC2MHZ:
          DFLLRC2M.CALA=LSB(calib);
          DFLLRC2M.CALB=MSB(calib);
          break;
      
        case OSC_ID_RC32MHZ:
          DFLLRC32M.CALA=LSB(calib);
          DFLLRC32M.CALB=MSB(calib);
          break;
      
        default:
          Assert(false);
          break;
        }
      }
      //@}
      
      static inline uint32_t osc_get_rate(uint8_t id)
      {
        Assert(id != OSC_ID_USBSOF);
      
        switch (id) {
        case OSC_ID_RC2MHZ:
          return 2000000UL;
      
        case OSC_ID_RC32MHZ:
      #ifdef CONFIG_OSC_RC32_CAL
          return CONFIG_OSC_RC32_CAL;
      #else
          return 32000000UL;
      #endif
      
        case OSC_ID_RC32KHZ:
          return 32768UL;
      
      #ifdef BOARD_XOSC_HZ
        case OSC_ID_XOSC:
          return BOARD_XOSC_HZ;
      #endif
      
        default:
          Assert(false);
          return 0;
        }
      }
      
      #endif /* __ASSEMBLY__ */
      
      //! @}
      
      #endif /* XMEGA_OSC_H_INCLUDED */


      اگه دقت کنید متوجه میشید که اولی با توجه به نوع میکرو osc.h مناسب برای پروژه رو از شاخه مناسب یعنی xmega/osc.h انتخاب و به پروژه اضافه میکنه. دقت کنید داشته باشید که شاخه xmega رو خودتون باید در پروژه در شاخه ای که main برنامه وجود داره ایجاد کنید و کتابخونه های اصلی رو درش کپی کنید.

      اما مشکل من کجاست:
      در کتابخونه pll.h تابعی رو استفاده کرده به نام osc_wait_ready که این کتابخونه رو اگه دقت کنید در osc.h اولی تعریف شده . ولی زمانی که برنامه کامپایل میشه osc.h که میشناسه دومی هست که این تابع درش تعریف نشده از طرف دیگه کتابخونه pll.h هیچ include در خصوص کتابخونه osc.h درش وجود نداره. برای همین کامپایلر هم میگه که این تابع رو نمیشناسه.
      سوالم اینکه زمانی که دو کتابخونه با یک اسم به برنامه اضافه میشن چه اتفاقی میفته؟ آیا توابعی که در کتابخونه اول وجود داره توسط برنامه شناخته شده خواهند بود؟
      با این تفاسیر روش صحیحی که من بتونم این تابع رو به برنامه بشناسون چیه؟
      کل پروژه رو هم ضمیمه کردم هم توابعش قابل استفاده هست و هم با کامپایلش مشکل من رو بهتر درک خواهید کرد.
      با سپاس
      فایل های پیوست شده
      شأن انسان در ايمان و هجرت و جهاد است و هجرت، مقدمهآ‌ي جهاد فيآ‌سبيلآ‌الله.
      هجرت، هجرت از سنگينيآ‌هاست و جاذبهآ‌هايي كه تو را به خاك ميآ‌چسباند.
      چكمهآ‌هايت را بپوش، رهآ‌توشهآ‌ات را بردار و هجرت كن.

      دیدگاه


        #4
        پاسخ : راه اندازی ADC با استفاده از ASF

        بر مبنای عملکرد IAR که احتمالا در AVRStudio هم همینطور است، روال کلی برای استفاده از کتابخانه های Atmel همان روش include کردن فایل با پسوند h در فایل های لازم و add کردن فایل با پسوند c در پروژه است که بدون مشکل عمل می کند. برای شناسایی یک فایل عمل include کردن مهم است و add کردن به پروژه به تنهایی باعث شناسایی یک فایل در فایل دیگر نمی شود.
        اوژن: به معنای افکننده و شکست دهنده است
        دانایی، توانایی است-Knowledge is POWER
        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

        دیدگاه


          #5
          پاسخ : راه اندازی ADC با استفاده از ASF

          من این کد رو با استفاده از توابع ASF نوشتم. اما داده های دریافتی نا معتبر هستند. یعنی با ورودی هیچ نسبتی ندارند.
          کد:
          #define MY_ADC  ADCB
          #define MY_ADC_CH ADC_CH0
          static void adc_init(void)
          {
          	struct adc_config adc_conf;
          	struct adc_channel_config adcch_conf;
          	adc_read_configuration(&MY_ADC, &adc_conf);
          	adcch_read_configuration(&MY_ADC, MY_ADC_CH, &adcch_conf);
          	adc_set_conversion_parameters(&adc_conf, ADC_SIGN_ON, ADC_RES_8,
          	ADC_REF_VCC);
          	adc_set_conversion_trigger(&adc_conf, ADC_TRIG_MANUAL, 1, 0);
          	adc_set_clock_rate(&adc_conf, 200000UL);
          	adcch_set_input(&adcch_conf, ADCCH_POS_PIN2, ADCCH_NEG_NONE, 1);
          	adc_write_configuration(&MY_ADC, &adc_conf);
          	adcch_write_configuration(&MY_ADC, MY_ADC_CH, &adcch_conf);
          }
          
          int main(void)
          {
          	sysClock_init();
          	adc_init();
          	
          	 	
          uint16_t result;
          adc_enable(&MY_ADC);
          
          	while (1) {
          		
          		adc_start_conversion(&MY_ADC, MY_ADC_CH);
          		adc_wait_for_interrupt_flag(&MY_ADC, MY_ADC_CH);
          		result = adc_get_result(&MY_ADC, MY_ADC_CH);
          
          	}		
          	
          }
          دوستانی که با ASF تونستندADC رو راه بندازن راهنمایی کنن.
          گفت که دیوانه نهی لایق این خانه نهی

          دیدگاه

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