اطلاعیه

Collapse
No announcement yet.

مشکل در سرعت IO در AT91SAM9x512

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

    مشکل در سرعت IO در AT91SAM9x512

    سلام

    من در حال کار با برد AT91SAM9x-512 با نرم افزار IAR می باشم. من میخوام با PIO ها با سرعت حداقل 10MHz کار کنم ولی متاسفانه با داشتن برنامه زیر سرعت toggle در پورت زیر 1MHz است.

    void main()
    {
    unsigned char test2=0;
    // Initialize main oscillator
    //---------------------------
    AT91C_BASE_PMC->PMC_MOR = BOARD_OSCOUNT | AT91C_CKGR_MOSCEN;
    while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));

    // Initialize PLLA at 200MHz (198.656)
    AT91C_BASE_PMC->PMC_PLLAR = BOARD_CKGR_PLLA
    | BOARD_PLLACOUNT
    | BOARD_MULA
    | BOARD_DIVA;
    while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKA));

    // Initialize PLLB for USB usage (if not already locked)
    // if (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKB))
    {
    AT91C_BASE_PMC->PMC_PLLBR = BOARD_USBDIV
    | BOARD_CKGR_PLLB
    | BOARD_PLLBCOUNT
    | BOARD_MULB
    | BOARD_DIVB;
    while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKB));
    }

    // Wait for the master clock if it was already initialized
    while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));

    // Switch to fast clock
    //---------------------
    // Switch to main oscillator + prescaler
    AT91C_BASE_PMC->PMC_MCKR = BOARD_PRESCALER;
    while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));

    // Switch to PLL + prescaler
    AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLLA_CLK;
    while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));

    ///-------PIO Configuration

    AT91C_BASE_PIOC->PIO_OER = 1 << AT91C_PIO_PC30;
    AT91C_BASE_PIOC->PIO_PER = 1 << AT91C_PIO_PC30;
    AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOC;

    while(1)
    {
    if(test2 == 0)
    {
    AT91C_BASE_PIOC->PIO_SODR = AT91C_PIO_PC30;
    test2 = 1;
    }
    else if(test2 == 1)
    {
    AT91C_BASE_PIOC->PIO_CODR = AT91C_PIO_PC30;
    test2 = 0;
    }
    }


    موضوعی که هست اینه که من برنامه مربوط به NAND FLASH همراه برد را که روی چیپ میریزم روی بعضی از پایه های NANAFLAS (که در این شرایط در مد peripheral است] از طرف پروسسور پالس 40M ایجاد میشه در حالی که در مد IO سرعت خیلی پائین تره.
    حدس من اینه که سرعت باس APB در این نوع پروسسور که بیشتر کاربرد نصب ویندوز داره کم هست . نظر دوستان دیگه چیه؟

    #2
    پاسخ : مشکل در سرعت IO در AT91SAM9x512

    با سلام

    این قسمت که به زبان ماشین ترجمه می شود:

    while(1)
    {
    if(test2 == 0)
    {
    AT91C_BASE_PIOC->PIO_SODR = AT91C_PIO_PC30;
    test2 = 1;
    }
    else if(test2 == 1)
    {
    AT91C_BASE_PIOC->PIO_CODR = AT91C_PIO_PC30;
    test2 = 0;
    }
    }

    حدود 25 تا 50 سایکل برای اجرا نیاز دارد،
    در فرکانس مستر 50 مگاهرتز ، هر سایکل هم در حدود 20 نانو ثانیه زمان نیاز دارد.
    در نتیجه، فرکانس پایه به 1 مگاهرتز محدود می شود.

    ضمنا اینطوری صحیح است.

    while(1)
    {
    if(test2 == 0)
    {
    AT91C_BASE_PIOC->PIO_SODR = 1 << AT91C_PIO_PC30;
    test2 = 1;
    }
    else if(test2 == 1)
    {
    AT91C_BASE_PIOC->PIO_CODR = 1 << AT91C_PIO_PC30;
    test2 = 0;
    }
    }

    و با این کد مقداری سریعتر می شود:

    for( ; ; )
    {
    AT91C_BASE_PIOC->PIO_SODR = 1 << AT91C_PIO_PC30;
    AT91C_BASE_PIOC->PIO_CODR = 1 << AT91C_PIO_PC30;
    }

    که حدود 3 مگاهرتز فرکانس می دهد.

    و اگر دسترسی مستقیم به پایه را فعال نموده باشید، شاید این سریعترین باشد:

    for( ; ; )
    {
    AT91C_BASE_PIOC->PIO_ODSR = 1 << AT91C_PIO_PC30;
    AT91C_BASE_PIOC->PIO_ODSR = ~( 1 << AT91C_PIO_PC30 ) ;
    }

    ،

    در این خانواده از اتمل، باس APB سرعتی مانند فوق پیدا می کند و سریعتر از این نمی شود.

    با سپاس
    گشتی در لاله زار
    http://www.eca.ir/forum2/index.php?topic=76138.0

    http://www.eca.ir/forum2/index.php?topic=76141

    دیدگاه


      #3
      پاسخ : مشکل در سرعت IO در AT91SAM9x512

      سلام

      ممنون از پاسخ شما.

      مشکل من چیز دیگه ایه. من یه پروژه نسبتا جامع دارم با این پروسسور انجام میدم و اول کار در واقع برای زمان بندی از تایمر استفاده کردم. ولی با توجه به اینکه به اون چیزی که میخواستم نرسیدم، تصمیم گرفتم یه برنامه ساده را تست کنم که الان تو پست اول گذاشته بودم. من عملا همه تیکه های برنامه را حذف کردم و فقط میخواستم ببینم که اگر تو main یک پین را toggle کنم به چه سرعتی میرسم که با یه موضوع باور نکردنی روبرو شدم و اون هم فرکانس زیر یک مگا در خروجیه. بر همین اساس من اول به این شک کردم که نکنه pllA که فرکانس پروسسور و mck را فراهم میکنه درست تنظیم نشده و اومدم یک تایمر را با تنظیم اینکه فرکانس ورودیش 10M باشه طوری Config کردم که با فرکانس مثلا 10k وارد روتین وقفه بشم و در روتین وقفه با toggle کردن یک پین این فرکانس را با اسکوپ در خروجی پایه دیدم. در کمال ناباوری با بالا بردن سرعت وقفه تایمر به بالای 200-300 کیلوهرتز عملا دیدم که تایمر نمیتونه با سرعت بالاتر وقفه بخوره. به همین دلیل گفتم نکنه باس Apb مشکلی داره چون عملا این نوع پروسسور بیشتر برای نصب سیستم عامل هست و نیاز داره که سرعت USB Host، Ethernet و حافظه های جانبیش قوی باشه که هست و شاید مثل یک pc نیازی به سرعت بالا در باس APB نداره. البته من یه زمان بندی دقیق 3 مگاهرتز با یک تایمر نیاز دارم ولی همین تایمر روی باس APB قرار داره. چکارش کنم؟

      دیدگاه


        #4
        پاسخ : مشکل در سرعت IO در AT91SAM9x512

        با سلام

        از یکی از تایمرها با کلاک ورودی MCK/2 استفاده فرمایید.
        در مود کار WAVEFORM در صفحات 395 تا 405 از DOC6120 توضیحات این بخش قرار دارد.

        MCK را برای 48 مگاهرتز تنظیم فرمایید.


        ضمنا سرویس اینتراپت تعدادی سایکل برای ورود به سرویس و خروج نیاز دارد،
        لذا سرویس اینتراپتها در پروژه های شلوغ به کمتر از 10000 تا در ثانیه می رسد.(که به چند اینتراپت متفاوت رسیدگی کند)

        به طور کلی این پردازنده ، سرعت عالی ندارد.( به 3 برابری ATMEGA128-20MHZ نمی رسد)

        اگر پروژه شلوغ و پر حجم دارید، مستقیما بروید سراغ LPC1768 - یا STM32F407VGT6 که یک برد آن در بالای سایت برای فروش تبلیغ شده.

        من ، چند د ه هزار خط کد برای AT89C51RD2-60MHZ و ATMEGA128-20MHZ و AT91SAM9x256-48MHZ نوشته ام،

        نسبت سرعتها به 8051 اولی : 1 - 1.5 - 4 می باشد.

        انتظار می رود که LPC1768-100MHZ به نسبت 10 برسد.

        و STM32F407VGT6-168MHZ به نسبت 15 برسد.

        با سپاس
        گشتی در لاله زار
        http://www.eca.ir/forum2/index.php?topic=76138.0

        http://www.eca.ir/forum2/index.php?topic=76141

        دیدگاه


          #5
          پاسخ : مشکل در سرعت IO در AT91SAM9x512

          سلام

          باز هم ممنون از جواب سریعتون

          من خودم از سال 1384 با 8051، ATmega128 و Xmega128A1 بیشتر از 10 تا پروژه میکرو با حجم هر کدوم نزدیک به 128k نوشته بودم و هیچوقت اینجوری به مشکل برخورد نکرده بودم.

          اتفاقا من انواع و اقسام تست هایی که میشد را تست کردم. من هدفم بطور کلی نقل و انتقال داده بین پروسسور و FPGA از با رابط موازی 8 بیتیه و کلا نمیتونم از PWM استفاده کنم. ولی امروز برای اینکه ببینم واقعا مشکل چیه دو تا کار کردم.

          1- بطور همزمان دو تا تایمر 0 و 1 را فعال کردم تا با فرکانس 400K اینتراپت بخورن و تو هر کدام یه پین را ست کردم که با فرکانس 1/10 یعنی 40k،
          toggle بشه(تا اگر احیانا مشکل تو IO هاست نیازی نباشه با سرعت بلا کار کنن). جالب اینکه وقفه تایمر صفر این فرکانس را فراهم میکنه در هر حالیکه وقفه تایمر یک حداکثر با فعال کردن گزینه بهینه سازی نرم افزار برای سرعت به 111K میرسه(بدون بهینه سازی حدود 40K میشه)یعنی باس سرعت لازم را برای وقفه تایمر صفر که اولویت بالاتری داره فراهم میکنه و برای تایمر یک نه. این در شرایطی هست که این دو تا تایمر وقتی هر کدام بصورت تکی فعال بودن هر دو به 400K میرسن(البته اگر بخوایم سرعت همین تک تایمرها را از 500k بالاتر ببریم سرعت ورود به وقفه نمیتونه بالاتر بره و ورود به وقفه نامنظم میشه). با این تست من مجددا مشکلی که قبلا راجع بهش با هم صحبت کردیم را دیدم: اینکه این باس به ما اجازه نمیده که با سرعتی بیش از 500k باهاش کار کنیم که تقریبا میشه گفت که خیلی مسخره و باورنکردنیه.

          2- من اومدم یه PWM را هم تست کردم تا ببیبنم اتصال مستقیم تایمر به خروجی در نهایت چه سرعتی را میده که اگر همون منطق باس را در نظر بگیریم نباید قاعدتا معجزه ای بشه. ولی من طبق برنامه زیر عمل کردم(که مشابه برنامه اتمل هست)

          AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKDIS;
          // Enable peripheral clock
          AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_TC1;
          AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA;
          AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOC;

          AT91C_BASE_PIOA->PIO_ASR=(1<< AT91C_PA27_TIOA1) ;
          AT91C_BASE_PIOA->PIO_PDR = (1<< AT91C_PA27_TIOA1) ;


          AT91C_BASE_PIOC->PIO_ASR= (1<< AT91C_PC7_TIOB1) ;
          AT91C_BASE_PIOC->PIO_PDR = (1<<AT91C_PC7_TIOB1);
          tcclks = 3;
          // Set mode
          AT91C_BASE_TC1->TC_CMR = AT91C_TC_ASWTRG_TOGGLE | AT91C_TC_ACPA_TOGGLE | AT91C_TC_ACPC_TOGGLE |
          AT91C_TC_BSWTRG_TOGGLE | AT91C_TC_BCPB_TOGGLE | AT91C_TC_BCPC_TOGGLE |
          AT91C_TC_WAVE | AT91C_TC_WAVESEL_UP_AUTO | tcclks;

          // Clear status register
          AT91C_BASE_TC1->TC_SR;


          AT91C_BASE_TC1->TC_RC = 0x80E8; // timerFreq / desiredFreq
          AT91C_BASE_TC1->TC_RB = 0x4074; // timerFreq / desiredFreq
          AT91C_BASE_TC1->TC_RA = 0x26AC; // timerFreq / desiredFreq

          AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;

          حالا اینجا یه مشکل جالبتر پیش اومده، من روی دیباگرم میبینم که بیت MTIOA داره یک و صفر میشه که به معنی اینه که تایمر داره پین مورد نظر را یک و صفر میکنه ولی من تو خروجی با اسکوپ چیزی نمیبینم. پایه همش high مونده. برنامه بالا مشکلی داره؟



          بطور کلی من نمیدونم حس میکنم یه چیزی مشکل داره ولی نمیدونم چیه؟ این چیزایی که من میبینم غیر عادیه

          دیدگاه


            #6
            پاسخ : مشکل در سرعت IO در AT91SAM9x512

            با سلام

            1- با این حجم از فعالیت و تجربه، حتما توصیه بر این است که به LPC1768 - یا STM32F407VGT6 حرکت کنید
            و وقت را برای کار با این پردازنده صرف نکنید.( حداقل اینکه از AT91SAM3 که از نوع جدیدتر و cortex-m3 است استفاده کنید )

            2- اگر برنامه را با keil نوشتید، با سیمولاتور خودش می توانید رفتار پایه پورت را را ببینید. و تایمینگ ها در آن دقیق هستند.

            با سپاس
            گشتی در لاله زار
            http://www.eca.ir/forum2/index.php?topic=76138.0

            http://www.eca.ir/forum2/index.php?topic=76141

            دیدگاه


              #7
              پاسخ : مشکل در سرعت IO در AT91SAM9x512

              سلام

              من یه برد STM32F407VGT6 -discovery گرفتم و میخوام همان مسئله قبلی را اینجا تست کنم. چند موضوع جالب اینجا وجود داره

              1- وقتی فقط یه پایه را در main برنامه toggle کنی به سرعت 33MHz در خروجی میرسی که بسیار جالب توجه هست.

              2- من دو تا وقفه خارجی را فعال کردم و به ورودی هرکدوم پالس 2MHz دادم و تو هرکدام از دو تا وقفه یک پالس روی خروجی ایجاد کردم و در واقع تونستم با سرعت 2MHz از پالس ورودی منظم بخونم و روی دو تا خروجی همزمان با سرعت 2MHz بنویسم. این در مقایسه با سرعت افتضاح اون اتمل خوب خیلی عالیه. البته اگر در دو تا پروسسور بلوک دیاگرام ها را مقایسه کنید کاملا مشخص میشه که از نظر باس STM بسیار بسیار بهینه تر و قویتر عمل کرده.

              مشکل اینجاست که گزینه اول کاملا مبتنی بر دیتاشیت است(البته پایین تر از دیتاشیت است به خاطر اینکه برنامه با C نوشته شده). ولی من انتظار داشتم که بتونم حداقل 4 تا 5 ورودی را با این سرعت بخونم و حدود 20 تا خروجی را نیز با همین سرعت روش داده بذارم و همزمان یک تایمر یک مگاهرتز هم داشته باشم که نشد چرا؟

              البته اگر از PWM استفاده کنم میتونم گزینه دوم را با یک خروجی 6MHz روی PWM داشته باشم ولی به دردم نمیخوره؟

              من اصلا دارم به بن بست میرسم که اگر من بخوام یه الگوریتم را با سرعت بالای 20MIPS اجرا کنم و در کنارش بتونم با 30 تا IO با سرعت 2MHz کار کنم، چه گزینه هایی برای انتخاب دارم؟

              دیدگاه

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