اطلاعیه

Collapse
No announcement yet.

تنظیم منابع کلاک در XMEGA

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

    #76
    پاسخ : تنظیم منابع کلاک در XMEGA

    جناب طراح
    در بخش تعریف کلاک برای ایکسمگا از طریق رجیسترهای داخلی بخش کلاک چه نیازی است که بعد از این که این عملیات انجام شد برای استفاده از توابعی مانن util/delay کلاک را دوباره تعریف کنیم یعنی
    define F-CPU 32000000
    در پست های قبلی این تاپیک دیدم که به آقای رحیمی فرموده بودین که کد بالا رو قبل از تعریف کتابخانه delay باز تعریف کنند.
    1- وقتی که برای سیستم نوع کلاک و مقدار اون داده میشه این عملیات توجیهش چی هست؟
    البته خود بنده دیدم که اگر این کار رو نکنم تایمینگ درستی در میکرو وجود نداره
    2- در تست اخیری که کلاک داخلی 32 مگاهرتز رو فعال کردم برای تابع delay که در برنامه استفاده شده بود زمان تقریبی عملکرد 4 الی 5 برابر زمان واقعی بود
    کد زیر در اتمل استودیو نوشته شده است:
    کد:
    // System Clocks initialization
    void system_clocks_init(void)
    {
    	OSC_CTRL|=OSC_RC32MEN_bm;
    	// Internal 32 MHz RC osc. calibration reference clock source: 32.768 kHz Internal Osc.
    	OSC_DFLLCTRL&= ~(OSC_RC32MCREF0_bm | OSC_RC2MCREF_bm);
    	// Enable the autocalibration of the internal 32 MHz RC oscillator
    	DFLLRC32M_CTRL|=DFLL_ENABLE_bm;
    	// Wait for the internal 32 MHz RC oscillator to stabilize
    	while ((OSC_STATUS & OSC_RC32MRDY_bm)==0);
    	// Select the system clock source: 32 MHz Internal RC Osc.
    	CCP=CCP_IOREG_gc;
      CLK_CTRL=CLK_SCLKSEL_RC32M_gc;
    	// Disable the unused oscillators: 2 MHz, external clock/crystal oscillator, PLL
    	OSC_CTRL&= ~(OSC_RC2MEN_bm | OSC_XOSCEN_bm | OSC_PLLEN_bm);
    
    }
    وقتی مطالبی رو لایک میکنید یا بازخورد میدید یعنی به نویسنده میگید که از این مطلب استفاده کرده اید و همچنان ادامه بده، یا بیشتر مطلب بزار، یا بیشتر در مباحث اینجوری شرکت کن.

    دیدگاه


      #77
      پاسخ : تنظیم منابع کلاک در XMEGA

      با اجازه جناب کی نژاد
      تعریف کلاک به این صورت به این دلیل هست که در روتین تاخیر از مقدار آن در محاسبات استفاده می شود به همین دلیل باید قبل از اینکلود کردن هدر تاخیر آنرا تعریف کنیم وگرنه توسط کامپایلر به شما هشدار داده می شود و مقداری پیشفرض برای آن تعریف می شود(به فایل هدر delay مراجعه کنید) و چون این مقدار پیشفرض با مقداری که در عمل استفاده می شود مطابقت ندارد در نتیجه محاسبات اشتباه و تاخیر ایجاد شده صحیح نخواهد بود و این ارتباطی با مقداردهی به رجیسترهای قسمت کلاک ندارد و یک عملیات نرم افزاری هست.
      گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

      دیدگاه


        #78
        پاسخ : تنظیم منابع کلاک در XMEGA

        طبق نوشته های دیتا شیت و اپلیکشن نات ها و همچنین توضیحات آقای کی نژاد
        برای اینکه منع کلاکی مورد بهره برداری قرار بگیره:
        1- با ست کردن ریجستر مربوطه enable شود و آماده استفاده گردد
        2- منبع کلاک انتخاب شود selection
        با این تعریفی که شد و نمونه کدی که قرار دادم هنوز برام مبهمه که بعد از این کارهای چه نیازی به تعریف کلاک برای cpu داریم وقتی از طریق ریجیستر داخلی نوع کلاک و منبع را مشخص کردیم؟
        با سپاس
        وقتی مطالبی رو لایک میکنید یا بازخورد میدید یعنی به نویسنده میگید که از این مطلب استفاده کرده اید و همچنان ادامه بده، یا بیشتر مطلب بزار، یا بیشتر در مباحث اینجوری شرکت کن.

        دیدگاه


          #79
          پاسخ : تنظیم منابع کلاک در XMEGA

          توجه داشته باشید که این تعریف یک دستور پیش پردازنده هست (define#) و فقط در هنگام کامپایل و آن هم فقط برای تابع تاخیر از آن استفاده می شود و هیچ ارتباطی با سخت افزار کلاک و مقدار دهی به رجیسترها ندارد. در واقع اگر از تابع تاخیر استفاده نکنید نیازی به این تعریف نیست. اما چون معمولا از تابع تاخیر استفاده می کنیم باید فرکانس کاری میکرو رو برای این تابع تعریف کنیم.




          گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

          دیدگاه


            #80
            پاسخ : تنظیم منابع کلاک در XMEGA

            سلام دوستان
            یه سوال
            چه طور میتونیم متوجه بشیم که میکرو ما داره با فرکانس 32 مگاهرتز کار میکنه و یا اینکه دو مگاهرتز؟؟؟؟

            دیدگاه


              #81
              پاسخ : تنظیم منابع کلاک در XMEGA

              - اعمال کلاک روی پین ( در منوال I/O Ports -> CLKEVOUT )
              - Toggle کردن یک پین
              - استفاده از PWM
              و . . .
              گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

              دیدگاه


                #82
                پاسخ : تنظیم منابع کلاک در XMEGA

                اگر چنانچه از Atmel Studio استفاده میکنیید به راحتی میتوانید در بخش I/O view و در زیر خانواده Clock System بعد از رفتن به محیط دیباگینگ(Alt+F5) با هر بار زدن کلید f10 /f11 می بینید که ریجستر های مربوطه چگونه ست می شن و در بخشی از کدتون که دارین کلاک سیستم را تعیین می کنید ریجیستر مربوطه مقدار می گیرد.
                مقدار 0x01 در این رجیستر به معنی فعال شدن و مورد استفاده قرار گرفتن اسیلاتور داخلی 32 مگا هرتز است.
                وقتی مطالبی رو لایک میکنید یا بازخورد میدید یعنی به نویسنده میگید که از این مطلب استفاده کرده اید و همچنان ادامه بده، یا بیشتر مطلب بزار، یا بیشتر در مباحث اینجوری شرکت کن.

                دیدگاه


                  #83
                  پاسخ : تنظیم منابع کلاک در XMEGA

                  نوشته اصلی توسط alberta
                  چه طور میتونیم متوجه بشیم که میکرو ما داره با فرکانس 32 مگاهرتز کار میکنه و یا اینکه دو مگاهرتز؟؟؟؟
                  اگر منظور شما تشخیص کلاک میکروکنترلر توسط CPU است، می توانید مقدار رجیستر CLK_CTRL را در برنامه بررسی کنید و از محتوای آن تشخیص دهید که کدامیک از منابع کلاک انتخاب شده اند.
                  اما پیرو سوال شما به مورد دیگری هم اشاره می کنم که ممکن است برای دوستان مفید باشد. فرض کنیم که با تنظیمات انجام شده، اسیلاتور خارجی به عنوان منبع کلاک انتخاب شده باشد و هدف تشخیص فرکانس آن توسط CPU باشد. در این شرایط به دلیل خارجی بودن منبع کلاک، تضمینی وجود ندارد که فرکانس آن همان مقدار مورد انتظار باشد و ممکن است این فرکانس به دلیل مشکل در سخت افزار بسیار متفاوت باشد.
                  یک روش برای اندازه گیری و تخمین فرکانس این است که کلاک یکی از تایمرها از طریق clkPER (با Prescaler مناسب) تامین شود و RTC داخلی هم با منبع کلاک داخلی فعال شود و با مقایسه مقدار تایمر (که کلاک آن از منبع خارجی تامین می شود) با RTC (که کلاک آن از اسیلاتور داخلی تامین می شود) می توان بصورت تقریبی متوسط فرکانس کلاک خارجی را تشخیص داد.
                  اوژن: به معنای افکننده و شکست دهنده است
                  دانایی، توانایی است-Knowledge is POWER
                  برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                  وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                  قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                  اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                  ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                  دیدگاه


                    #84
                    پاسخ : تنظیم منابع کلاک در XMEGA

                    سلام
                    من از بیسکام استفاده میکنم و ظاهرا توی این ورژن من نمیشه ضریب pll مشخص کرد اگه امکان داره بفرمایید رجیستری که ضریب pll مشخص میکنه چیه و با چه مقداری باید ست بسه تا بتونم فرکانس 64 داشته باشم اگه از دوستان کسی ابن کارو قبالا کرده ممنون مبشم کدشو اینجا قرار بده

                    ممنون

                    دیدگاه


                      #85
                      پاسخ : تنظیم منابع کلاک در XMEGA

                      با سلام خدمت دوستان
                      من مدتی هست در حال کار با Atxmega128A1U هستم. مشکلی که برخورد کردم مربوز ب فرکانس کاری میکرو هست.
                      همه بخش های میکرو خوب کار میکنه. مقسم های فرکانس - PLL و .....
                      مشکل اینجاس که هر فرکانسی و منبع کلاکی که انتخاب میکنم هر چی که باشه داخلی یا خارجی همه تقسیم بر ۸ میشه.
                      برای مثال : بعد از انتخاب و فعال سازی کلاک داخلی ۳۲ مگاهرتز فرکانس کاری میکرو ۴ مگاهرتز هست و این موضوع رو با صفر و یک کردن پایه پورت c بررسی میکنم. اگز ۲ مگاهرتز باشه من ۲۰۰ کیلو دارم.
                      حتی فرکانس ۱۶ مگاهرتز خارجی هم متصل کردم اما حتی بعد از تقویت با PLL باز هم تقسیم بر ۸ اون رو داشتم.
                      رجیستر های مقسم رو حتی به صورت دستی برابر ۰ قرار دادم. اما هیج تاثیری نداره.
                      کسی از دوستان با تجربه پیشنهادی داره. خیلی به مشکل برخوردم .
                      اینم تنضیمات سیستم کلاک که با کدویژن تنظیم میکنم.

                      // System Clocks initialization
                      void system_clocks_init(void)
                      {
                      unsigned char n,s;

                      // Optimize for speed
                      #pragma optsize-
                      // Save interrupts enabled/disabled state
                      s=SREG;
                      // Disable interrupts
                      #asm("cli&quot

                      // Internal 32 kHz RC oscillator initialization
                      // Enable the internal 32 kHz RC oscillator
                      OSC.CTRL|=OSC_RC32KEN_bm;
                      // Wait for the internal 32 kHz RC oscillator to stabilize
                      while ((OSC.STATUS & OSC_RC32KRDY_bm)==0);

                      // Internal 32 MHz RC oscillator initialization
                      // Enable the internal 32 MHz RC oscillator
                      OSC.CTRL|=OSC_RC32MEN_bm;

                      // System Clock prescaler A division factor: 1
                      // System Clock prescalers B & C division factors: B:1, C:1
                      // ClkPer4: 32000.000 kHz
                      // ClkPer2: 32000.000 kHz
                      // ClkPer: 32000.000 kHz
                      // ClkCPU: 32000.000 kHz
                      n=(CLK.PSCTRL & (~(CLK_PSADIV_gm | CLK_PSBCDIV1_bm | CLK_PSBCDIV0_bm))) |
                      CLK_PSADIV_1_gc | CLK_PSBCDIV_1_1_gc;
                      CCP=CCP_IOREG_gc;
                      CLK.PSCTRL=n;

                      // Internal 32 MHz RC osc. calibration reference clock source: 32.768 kHz Internal Osc.
                      OSC.DFLLCTRL=(OSC.DFLLCTRL & (~(OSC_RC32MCREF_gm | OSC_RC2MCREF_bm))) | OSC_RC32MCREF_RC32K_gc;
                      // Enable the auto-calibration of the internal 32 MHz RC oscillator
                      DFLLRC32M.CTRL|=DFLL_ENABLE_bm;

                      // Wait for the internal 32 MHz RC oscillator to stabilize
                      while ((OSC.STATUS & OSC_RC32MRDY_bm)==0);

                      // Select the system clock source: 32 MHz Internal RC Osc.
                      n=(CLK.CTRL & (~CLK_SCLKSEL_gm)) | CLK_SCLKSEL_RC32M_gc;
                      CCP=CCP_IOREG_gc;
                      CLK.CTRL=n;

                      // Disable the unused oscillators: 2 MHz, external clock/crystal oscillator, PLL
                      OSC.CTRL&= ~(OSC_RC2MEN_bm | OSC_XOSCEN_bm | OSC_PLLEN_bm);

                      // Lock the CLK.CTRL and CLK.PSCTRL registers
                      n=CLK.LOCK | CLK_LOCK_bm;
                      CCP=CCP_IOREG_gc;
                      CLK.LOCK=n;

                      // ClkPer output disabled
                      PORTCFG.CLKEVOUT&= ~(PORTCFG_CLKOUTSEL_gm | PORTCFG_CLKOUT_gm);
                      // Restore interrupts enabled/disabled state
                      SREG=s;
                      // Restore optimization for size if needed
                      #pragma optsize_default
                      }

                      دیدگاه


                        #86
                        پاسخ : پاسخ : تنظیم منابع کلاک در XMEGA

                        نوشته اصلی توسط طراح نمایش پست ها
                        اگر منظور شما تشخیص کلاک میکروکنترلر توسط CPU است، می توانید مقدار رجیستر CLK_CTRL را در برنامه بررسی کنید و از محتوای آن تشخیص دهید که کدامیک از منابع کلاک انتخاب شده اند.
                        اما پیرو سوال شما به مورد دیگری هم اشاره می کنم که ممکن است برای دوستان مفید باشد. فرض کنیم که با تنظیمات انجام شده، اسیلاتور خارجی به عنوان منبع کلاک انتخاب شده باشد و هدف تشخیص فرکانس آن توسط CPU باشد. در این شرایط به دلیل خارجی بودن منبع کلاک، تضمینی وجود ندارد که فرکانس آن همان مقدار مورد انتظار باشد و ممکن است این فرکانس به دلیل مشکل در سخت افزار بسیار متفاوت باشد.
                        یک روش برای اندازه گیری و تخمین فرکانس این است که کلاک یکی از تایمرها از طریق clkPER (با Prescaler مناسب) تامین شود و RTC داخلی هم با منبع کلاک داخلی فعال شود و با مقایسه مقدار تایمر (که کلاک آن از منبع خارجی تامین می شود) با RTC (که کلاک آن از اسیلاتور داخلی تامین می شود) می توان بصورت تقریبی متوسط فرکانس کلاک خارجی را تشخیص داد.
                        دوستان اگه میشه به سوالات بنده جواب بدید ممنون :
                        1) کلا عملکرد اسیلاتور خارجی و استفاده آن به عنوان منبع کلاک ایکسمگا را چگونه ارزیابی میکنید؟ آیا اسیلاتور ها مشکلی دارند که این همه پست گزاشته شده ولی تعداد اندکی به اسیلاتور خارجی اشاره کرده اند؟
                        2) آقای کی نژاد در یک پست گفته بودند برای کلاک 64 مگا نیازمند تغذیه 3.6 ولتی هستیم آیا با اتصال اسیلاتور خارجی می توان فرکانس های بالا تر از 50 مگا بدون افزایش ولتاژ بیشتر از 3 ولت ، میکرو را راه اندازی کرد؟ یا اینکه نه حتما میکرو هم واجب است ولتاژ بالایی داشته باشد؟
                        3) اگه اشتباه نکنم در تاپیک های راه اندازی LCD TFT برای کار با این میکرو کنترلرها ذکر شده بود که باید فرکانس میکرو بالا باشد ، می خواستم بدونم این موضوع صحت دارد یعنی بین سه فرکانس 32 مگ داخلی ، 50 خارجی یا 80 خارجی تفاوتی وجود داره ؟ از نظر عملکرد LCD
                        4) اگه قرار باشد فرکانسی معادل 40 مگا برای میکرو تهیه کنیم ایا تفاوتی دارد که یک اسیلاتور 40 مگا متصل کنیم یا 10 مگا با ضریب PLL 4 ؟ از نظر دقت عرض میکنم.

                        دیدگاه


                          #87
                          پاسخ : تنظیم منابع کلاک در XMEGA

                          نوشته اصلی توسط raptor_me نمایش پست ها
                          دوستان اگه میشه به سوالات بنده جواب بدید ممنون :
                          1) کلا عملکرد اسیلاتور خارجی و استفاده آن به عنوان منبع کلاک ایکسمگا را چگونه ارزیابی میکنید؟ آیا اسیلاتور ها مشکلی دارند که این همه پست گزاشته شده ولی تعداد اندکی به اسیلاتور خارجی اشاره کرده اند؟
                          2) آقای کی نژاد در یک پست گفته بودند برای کلاک 64 مگا نیازمند تغذیه 3.6 ولتی هستیم آیا با اتصال اسیلاتور خارجی می توان فرکانس های بالا تر از 50 مگا بدون افزایش ولتاژ بیشتر از 3 ولت ، میکرو را راه اندازی کرد؟ یا اینکه نه حتما میکرو هم واجب است ولتاژ بالایی داشته باشد؟
                          3) اگه اشتباه نکنم در تاپیک های راه اندازی LCD TFT برای کار با این میکرو کنترلرها ذکر شده بود که باید فرکانس میکرو بالا باشد ، می خواستم بدونم این موضوع صحت دارد یعنی بین سه فرکانس 32 مگ داخلی ، 50 خارجی یا 80 خارجی تفاوتی وجود داره ؟ از نظر عملکرد LCD
                          4) اگه قرار باشد فرکانسی معادل 40 مگا برای میکرو تهیه کنیم ایا تفاوتی دارد که یک اسیلاتور 40 مگا متصل کنیم یا 10 مگا با ضریب PLL 4 ؟ از نظر دقت عرض میکنم.
                          حداکثر فرکانس مجاز اسیلاتور خارجی 16MHz است و برای رسیدن به فرکانس های بیشتر باید از PLL استفاده کنید. در مورد Over Clock هم فرکانس 32MHz حداکثر فرکانسی است که شرکت سازنده، عملکرد تمام بخش ها را گارانتی می کند و در فرکانس های بالاتر ممکن است برخی بخش ها درست عمل نکنند. افزایش ولتاژ تغذیه هم که قبلا به آن اشاره شده ربطی به اسیلاتور خارجی ندارد و به جهت بالا بردن قابلیت پذیرش فرکانس بالاتر از طرف سخت افزارهای میکروکنترلر است. در مورد LCD هم هرچه کلاک CPU بالاتر باشد، زمان اجرای دستورالعمل ها کاهش می یابد و بنابراین مقداردهی به LCD در زمان کوتاه تری انجام می شود و تصویر سریع تر تشکیل می شود.
                          اوژن: به معنای افکننده و شکست دهنده است
                          دانایی، توانایی است-Knowledge is POWER
                          برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                          وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                          قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                          اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                          ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                          دیدگاه


                            #88
                            پاسخ : تنظیم منابع کلاک در XMEGA

                            تشکر آقای کی نژاد بابت پاسختون .

                            دیدگاه


                              #89
                              پاسخ : تنظیم منابع کلاک در XMEGA

                              وقت بخیر

                              تجربه ای اخیر بکار گیری اسیلاتور خارجی 8M و ;کلاک 32M و over clock 64M برای کار با tft - 7 inch داشتم که دستورات در c و iar کمپایلر رو برای دوستان میذاریم !
                              جالب بود که در over clock 64M نمایش بخوبی عمل میکرد ولی با انتخاب ضریب pll*10 که بشه 80M دیگه tft نمایش نمیداد و بهم میریخت .
                              البته کنترولر من xmega64a3u هست و کمپایلر من iar 6.4

                              کد:
                              // ========= System Clock configuration =========
                              // in date 95.08.08 this code are generated bye A.asadi
                              // Set to external 8Mhz crystal, using the PLL at *4 for 32M or *8 for over clock 64M
                              // set it to be a 2 - 9Mhz crystal with a slow start-up time.
                              
                              //OSC.XOSCCTRL =(OSC_FRQRANGE_2TO9_gc | OSC_XOSCSEL_XTAL_16KCLK_gc ) ; //have error
                              
                              OSC.XOSCCTRL =((OSC_FRQRANGE_gm|OSC_FRQRANGE_2TO9_gc) |(OSC_XOSCSEL_gm| OSC_XOSCSEL_XTAL_16KCLK_gc) ) ;
                              OSC.CTRL |= OSC_XOSCEN_bm ; // enable it
                              while( (OSC.STATUS & OSC_XOSCRDY_bm) == 0 ){} // wait until it's stable
                              
                              // The external crystal is now running and stable.
                              // (Note that it's not yet selected as the clock source)
                              // Now configure the PLL to be eXternal oscillator 4 for 32M or 8 for over clock 64 
                              OSC.PLLCTRL = OSC_PLLSRC_XOSC_gc | 8 ;  //no. is the PLL mul factor 0 ~ 31
                                  
                              // now enable the PLL...
                              OSC.CTRL |= OSC_PLLEN_bm ; // enable the PLL...
                              while( (OSC.STATUS & OSC_PLLRDY_bm) == 0 ){} // wait until it's stable
                              
                              // And now, *finally*, we can switch from the internal 2Mhz clock to the PLL
                              CCP = CCP_IOREG_gc;    // protected write follows   
                              CLK.CTRL = CLK_SCLKSEL_PLL_gc;    // The System clock is now  PLL ( 8Mhz * 8)
                              // ==============================================
                              جدیدترین ویرایش توسط taktrashe; ۱۴:۵۸ ۱۳۹۵/۰۸/۰۸.

                              دیدگاه

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