اطلاعیه

Collapse
No announcement yet.

کوچ کردن از کدویژن به AtmelStudio

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

    پاسخ : کوچ کردن از کدویژن به AtmelStudio

    ادامه پست قبل:

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

    البته با یک روش میشه اینکار رو کرد و به روتین وقفه مورد نظر جامپ زد.

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

    تعریف همه چیز:

    1- زبان سی

    2- آشنایی کامل با ماشین و پردازنده ی هدف

    3- آشنایی با زبان اسمبلی و کدهای ماشین این پردازنده


    این روش رو جایی ندیدم انجام بدن و یه جورایی ابداعی :

    قطعه کد زیر را هرجا دوست داشتید که به روتین وقفه ارسال سریال جامپ بزنید ، قرار بدید:
    (یه تلفیقی از اسمبلی و سی هست)
    کد:
    	asm volatile("LDI R30,0x1E");
    	asm volatile("LDI R31,0");
    	asm volatile("ICALL");
    نکته : به دوستانی که این مطلب را میخونند توصیه میکنم تا جایی که میتونند از این کد استفاده نکنند.
    راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
    کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
    نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
    http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
    انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

    دیدگاه


      پاسخ : کوچ کردن از کدویژن به AtmelStudio

      خیلی ممنون از سید.
      یه جا رو متوجه نشدم.اگه بخواییم یه رشته رو مثلا درست وسط صفحه هایپر ترمینال و یه جای دیگه نشون داد چطوری میشه؟
      تکاور شدن جرات افزون کند.....هراس از دل مرد بیرون کند....


      تا تکاور به تن زخمی خود جان دارد....مرز اسلام در این ملک نگهبان دارد.........

      دیدگاه


        پاسخ : کوچ کردن از کدویژن به AtmelStudio

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

        البته میشه حدس زد چه جوریه ( یعنی اگر قانونی نوشته باشن اینجوریه). به جمله های زیر دقت کنید:

        برای رفتن به سطر بعد باید کد اسکی 10 فرستاده شود(بایت 0x0A را بفرستید)

        برای زدن یک اسپیس باید کد اسکی 32 فرستاده شود(بایت 0x20 را بفرستید)

        برای زدن یک tab باید کد اسکی 9 فرستاده شود(بایت 0x09 را بفرستید)


        راستی بایت 0x07 هم بفرستید ببنید چی میشه :mrgreen:

        برای ارسال بایت ها میتونید رشته را اینجوری بنویسید: (من مثلا میخوام eca.ir بره سطر بعد نوشته بشه و تهش اون بایت 0x07 هم باشه) :

        بجا رشته ی مورد نظر ، رشته ی زیر را بزارید:

        کد:
        char str[]={ 0x0A , 'e' , 'c' , 'a' , '.' , 'i' , 'r' , 0x07 , 0};
        راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
        کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
        نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
        http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
        انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

        دیدگاه


          پاسخ : کوچ کردن از کدویژن به AtmelStudio

          سلام و خسته نباشید
          میشه کد زیر رو تحلیل بفرمایید؟

          کد:
          # include < avr / interrupt .h >
          # include < util / atomic .h >
          volatile int MyValue ;
          ISR ( SomeVector_vect )
          {
          MyValue ++;
          }
          int main ( void )
          {
          SetupInterrupts () ;
          int MyValue_Local ;
          do
          {
          ATOMIC_BLOCK ( ATOMIC_RESTORESTATE )
          {
          MyValue_Local = MyValue ;
          }
          } while ( MyValue_Local == 0) // Wait for interrupt
          TurnOnLED () ;
          }
          کتابخونه Atomic.h چه کاری میکنه؟
          اصلا اگه امکانش هست یه توضیح در مورد وقفه ها بدید...من تازه Atmel Studio رو نصب کردم و قبلا با کدویژن کار میکردم به همین خاطر با تعریف وقفه ها مشکل دارم....اینکه چطور تابع وقفه رو تولید کنیم و اگه یه مثال هم باشه که عالی میشه...
          ممنون
          تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

          www.intelart.ir


          ساخت کنترلر دما PID فازی با AVR [آموزشی]

          دیدگاه


            پاسخ : کوچ کردن از کدویژن به AtmelStudio

            نوشته اصلی توسط punisher.x64
            سلام و خسته نباشید
            میشه کد زیر رو تحلیل بفرمایید؟

            کد:
            # include < avr / interrupt .h >
            # include < util / atomic .h >
            volatile int MyValue ;
            ISR ( SomeVector_vect )
            {
            MyValue ++;
            }
            int main ( void )
            {
            SetupInterrupts () ;
            int MyValue_Local ;
            do
            {
            ATOMIC_BLOCK ( ATOMIC_RESTORESTATE )
            {
            MyValue_Local = MyValue ;
            }
            } while ( MyValue_Local == 0) // Wait for interrupt
            TurnOnLED () ;
            }
            کتابخونه Atomic.h چه کاری میکنه؟
            اصلا اگه امکانش هست یه توضیح در مورد وقفه ها بدید...من تازه Atmel Studio رو نصب کردم و قبلا با کدویژن کار میکردم به همین خاطر با تعریف وقفه ها مشکل دارم....اینکه چطور تابع وقفه رو تولید کنیم و اگه یه مثال هم باشه که عالی میشه...
            ممنون
            سلام

            در رابطه با تحلیل کد بدلیل اینکه الان به کامپایلر gcc دسترسی ندارم ، نمیتونم تحلیل کاملی داشته باشم. اما...

            نگاهی میشه فهمید کد چی میگه.(راستی قبل از توضیح باید بگم فکر کنم کامپایلر به اینکلود کردن ها ایراد بگیره ، چون یک سری فاصله های اضافه داده شده ( همیشه آدرس یک فایل را باید دقیق و بدون فاصله ی اضافه نوشت) (البته شایدم نگیره، باید امتحان کرد ولی بهتره که فاصله ها حذف شوند) )

            اول بزارید در رابطه با atomic.h صحبت کنم:

            atomic از اسمش پیداست . خاصیت های اتم را داره ، اتم چه خصوصیتی داره؟
            یادتونه تو شیمی دبیرستان یک صفحه در رابطه با همین نوشته بود. درست یادم نیست ولی یادمه سه تا دانشمند را معرفی کرده بود که اولیش فکر کنم رادرفورد بود( درست یادم نمیاد ، شاید اشتباه باشه )
            یادتونه رادرفورد(یا هرکی که بود) اتم را شناخته بود و برای یک منظوری اسم اتم که یک اسم یونانی است را روش گذاشته بود.

            اتم به فارسی میشه تجزیه ناپذیر و اون زمان رادرفورد نظریه داد که اتم کوچکترین جزء مواد است و دیگه به اجزاء کوچک تر تجزیه نمیشه.

            خوب حالا چه ربطی داره به دستورات و پردازنده و کامپیوتر و...

            بزارید یک مقدار مختصر تر صحبت کنم.( فقط بگم که تو یک پردازنده خاص یک سری دستور داریم که میتونیم با اون ها به پردازنده منظورمون را برسونیم. به این دستورات میگن مجموعه دستورات یا Instruction Set پردازنده ، این دستورات خاصیتی که دارند اتمیی بودنشونه و به اجزای کوچکتر تجزیه نمیشن ( مطلب بسیار زیاده در این رابطه....)

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

            خوب میدونید به اینکار( غیرقابل تجزیه کردن) چی میگن؟ انحصار متقابل

            من تو پست 145 همین تاپیک یک توضیحاتی در این مورد دادم. ( همچنین برای وقفه و... در این پست وپستهای قبلی توضیحاتی داده شده)

            فقط بگم که تو سیستمهای تک پردازنده ای یک چیز باعث این میشه که پردازنده وسط اجرای ناحیه ی بحرانی اجرا را رها میکنه و کدهای دیگه را اجرا میکنه .

            اون چیز ، چیزی نیست جز وقفه خوردن پردازنده .

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

            خوب بزارید بریم سراغ کد:

            اول بگم این یک شبه کد است. و برای تبدیل کردن به برنامه ی قابل اجرا باید یکسری تغییر به دلخواه خودمون بدیم. مثلا جای SomeVector_vect باید آدرس وقفه ی مورد نظر خودمون را بدیم .( پست 140 را بخونید)

            یا یک تابع وجود داره به نام SetupInterrupts که باید به دلخواه خودمون درونش دستورات را تعریف کنیم که به درستی وقفه ی مورد نظرمون initialization بشه . در اینباره تو پست 143 وسط پست یک توضیحاتی داده شده.


            قسمت زیر را در کد نگاه کنید:

            کد:
            ATOMIC_BLOCK ( ATOMIC_RESTORESTATE )
            {
            MyValue_Local = MyValue ;
            }
            این تنهاجایی تو کد هست که از atomic.h استفاده شده.
            جای هیجان انگیزش اینه که دستور MyValue_Local = MyValue همون ناحیه ی بحرانی است که نمیخوایم وسطش پردازنده وقفه بخوره .

            سوال : مگه این خودش یک دستور نیست؟ چه جوری پردازنده وسط این دستور اینتراپت میخوره؟
            جواب: باید توجه شود که این یک دستور به زبان سی است و خود شامل چند دستور به زبان ماشین یا همون Instruction Set میشود. پس این دستور سی خودبه خود تجزیه ناپذیر نیست و باید خودمن یه جوری اتمیکش کنیم.
            شیوه های زیادی برای اتمی کردن ناحیه بحرانی است که یکیش مثلا غیرفعال سازی وقفه هاست( البته تو سیستمهای تک پردازنده ای مثل همین AVR )

            با کمک این هدر میتونید اینکار را کنید پس در اینجا دستور MyValue_Local = MyValue اتمیک میشه و پردازنده دیگه بین اجرای این دستور وقفه نمیخوره تا اینکه کامل اجراش کنه.

            تو AVR اکثر برنامه ها خیلی ساده هستند و اکثرا نیاز به اینکارها نداریم . این مباحث بیشتر در kernel سیستم عامل ها مطرح میشود.

            توصیه ی من خوندن پست های قبلی در این رابطه هست، اونا برا میکرو کافیه .

            راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
            کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
            نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
            http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
            انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

            دیدگاه


              پاسخ : کوچ کردن از کدویژن به AtmelStudio

              یه سوال که یه جورایی خیلی مهمه برام.
              رم خارجی رو چجوری کانفیگ میکنیم تو این کامپایلر.
              تو کدویژن که مشخصه ، تو IAR هم مشخصه ، اما اینجا اگر امکان داره منو راهنمایی کنید.
              فرض کنید میخواهیم با atmega128 یک رم 64 کیلویی رو راه اندازی کنیم.

              دیدگاه


                پاسخ : کوچ کردن از کدویژن به AtmelStudio

                نوشته اصلی توسط RubeuS
                asm volatile("LDI R30,0x1E"
                asm volatile("LDI R31,0"
                asm volatile("ICALL"
                با عرض پوزش از استاد بنده قبلا این نوع کد هارو دیدم و ازشونم استفاده کردم
                طرز کارشم اینطوریه که آدرسی روتینی که در اشاره گر Z قرار داره رو فراخوانی میگنه
                زمانی استفاده میشه که قراره به کمک اشاره گری به تابعی پرش کنیم

                اینم تکه کد معادلی در زبان سی که از کتابخونه ای کش رفتم (با تغییر) :
                کد:
                /** pointer to putc function **/
                void (*_xputc)(unsigned char);
                
                void xputc_init(void (*func)(unsigned char)) {
                  _xputc = func;
                }
                
                void xputc(unsigned char ch) {
                  _xputc(ch);
                }
                گذشت خصلت مردان است

                دیدگاه


                  پاسخ : کوچ کردن از کدویژن به AtmelStudio

                  خیلی ممنون....به قدری شیوا توضیح دادین که درجا متوجه شدم...هرچند که ممکنه به قول شما این کتایخونه به کارم نیاد ولی حداقل فهمیدم میشه این کار خیلی جالب رو رو AVR هم پیاده کرد.

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

                  فقط چند تا سوال دیگه :rolleyes: :
                  در مورد وقفه ها تو سایت کامپایلر یه سری توابع دیدم...لینک سایت : http://www.nongnu.org/avr-libc/user-...63a20af03ac744

                  1-
                  این جوری که من متوجه شدم این قطعه کد واسه وقفه هایی هست که تابعی واسشون تعریف نشده
                  کد:
                  ISR(BADISR_vect)
                  {
                    // user code here
                  }
                  اگه اینطور باشه که خیلی خوبه...میتونیم خطاهای ناخواسته مثل تقسیم بر صفر یا هر چیز دیگه ای رو مدیریت کنیم.....

                  2-
                  اگه وقفه رو اینطور تعریف کنیم باعث میشه تا بتونیم داخل وقفه یه وقفه دیگه رو اجرا کنیم :

                  کد:
                  ISR(XXX_vect, ISR_NOBLOCK)
                  {
                   ...
                  }
                  3-
                  با این کار میتونیم دو تا وقفه رو به یک جا بفرستیم

                  کد:
                  ISR(PCINT0_vect)
                  {
                   ...
                   // Code to handle the event.
                  }
                  
                  ISR(PCINT1_vect, ISR_ALIASOF(PCINT0_vect));
                  4-
                  این یکی رو نفهمیدم چیه!!
                  کد:
                  EMPTY_INTERRUPT(ADC_vect);
                  اگه میشه در موردش یکم توضیح بدین

                  راستی توابع بالایی رو درست فهمیدم؟
                  ببخشین اگه زیاد میپرسیم... :nerd:
                  تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

                  www.intelart.ir


                  ساخت کنترلر دما PID فازی با AVR [آموزشی]

                  دیدگاه


                    پاسخ : کوچ کردن از کدویژن به AtmelStudio

                    نوشته اصلی توسط امیر . م
                    یه سوال که یه جورایی خیلی مهمه برام.
                    رم خارجی رو چجوری کانفیگ میکنیم تو این کامپایلر.
                    تو کدویژن که مشخصه ، تو IAR هم مشخصه ، اما اینجا اگر امکان داره منو راهنمایی کنید.
                    فرض کنید میخواهیم با atmega128 یک رم 64 کیلویی رو راه اندازی کنیم.
                    ببنید دوست عزیز ، اگر در این رابطه نظر بنده را بخواید ، نظر من این است که خودتون بشینید راه اندازی کنید. ( شاید خیلیا با من هم عقیده نباشند و بگن کار من مثل اختراع چرخ است ولی من اعتقاد دارم اگر در پروژه ام به هر چیزی نیاز داشته باشم از اول باید خودم اون را پایه ریزی کنم و تا جایی که میتونم مصرف کننده نباشم)

                    شما برای اینکار به صفحه ی 24 به بعد دیتاشیت مگا128 مراجعه کنید . بسیار زیبا و روان همراه با تصویر توضیح داده شده ، رجیسترهایی به این منظور وجود دارند که باید تنظیم شوند . (توصیه من اینه که کلا بخش مربوط به حافظه ها مطالعه شود)
                    والله من خودم چون تاحالا نیاز نداشتم واردش نشدم ولی درآینده اگر روزی نیاز داشته باشم که از رم اضافه استفاده کنم ، حتما دیتاشیت را میخونم و متناسب با اون برنامه مینویسم.
                    ولی یه نکته بگم که استفاده از حافظه ی خارجی باعث کند شدن برنامه میشود. چون access time حافظه خارجی بیشتر است و برای اجرای دستورات زبان ماشین که مربوط به خواندن و نوشتن در حافظه هستند کلاک بیشتری نیاز است. ( مثل LD , STS , ST و... ) . اگر پشته را در حافظه ی خارجی در نظر بگیرید که حتی پرش به ساب روتین ها و وقفه ها و بازگشت از اونها هم کندتر میشوند.
                    راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                    کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                    نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                    http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
                    انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

                    دیدگاه


                      پاسخ : کوچ کردن از کدویژن به AtmelStudio

                      نوشته اصلی توسط punisher.x64
                      خیلی ممنون....به قدری شیوا توضیح دادین که درجا متوجه شدم...هرچند که ممکنه به قول شما این کتایخونه به کارم نیاد ولی حداقل فهمیدم میشه این کار خیلی جالب رو رو AVR هم پیاده کرد.

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

                      فقط چند تا سوال دیگه :rolleyes: :
                      در مورد وقفه ها تو سایت کامپایلر یه سری توابع دیدم...لینک سایت : http://www.nongnu.org/avr-libc/user-...63a20af03ac744

                      1-
                      این جوری که من متوجه شدم این قطعه کد واسه وقفه هایی هست که تابعی واسشون تعریف نشده
                      کد:
                      ISR(BADISR_vect)
                      {
                        // user code here
                      }
                      اگه اینطور باشه که خیلی خوبه...میتونیم خطاهای ناخواسته مثل تقسیم بر صفر یا هر چیز دیگه ای رو مدیریت کنیم.....

                      2-
                      اگه وقفه رو اینطور تعریف کنیم باعث میشه تا بتونیم داخل وقفه یه وقفه دیگه رو اجرا کنیم :

                      کد:
                      ISR(XXX_vect, ISR_NOBLOCK)
                      {
                       ...
                      }
                      3-
                      با این کار میتونیم دو تا وقفه رو به یک جا بفرستیم

                      کد:
                      ISR(PCINT0_vect)
                      {
                       ...
                       // Code to handle the event.
                      }
                      
                      ISR(PCINT1_vect, ISR_ALIASOF(PCINT0_vect));
                      4-
                      این یکی رو نفهمیدم چیه!!
                      کد:
                      EMPTY_INTERRUPT(ADC_vect);
                      اگه میشه در موردش یکم توضیح بدین

                      راستی توابع بالایی رو درست فهمیدم؟
                      ببخشین اگه زیاد میپرسیم... :nerd:
                      بله کاملا درسته و صحیح میفرمایید . من فقط خواستم یک توضیحات مختصری در هر مورد بدم و فقط یک سرنخی باشه که دوستان راحت تر بتوانند به تحقیقاتشون ادامه بدند.
                      در رابطه با وقفه ها من هدر interrupt.h را معرفی کردم و یک مثال بسیار ساده قرار دادم .
                      بله تنظیمات بسیار زیاد است و بهترین کار اینه که مستقیم برید اون هدر را مشاهده کنید.

                      بزارید اصلا یه سری توضیحات بدم که راحتتر باشید.

                      بعد از اینکه پردازنده وقفه میخوره یک سری رجیسترهای همه منظوره و بعضی از اطلاعات مهم مثل آدرس دستور بعدی ( آدرس بازگشت) باید در جایی سیو بشه که در این پردازنده ( پردازنده ی میکروی AVR ) محل ذخیره stack یا پشته است.
                      (راستی اون آدرس دستور بعدی در یک رجیستر اصلی پردازنده به نام (PC(Program Counter یا (IP ( Instruction Pointer قرار دارد( IP بیشتر در پردازنده های x86 اینتل مطرح میشه) )

                      خوب بعد ذخیره ی اطلاعات و تغییراتی که مربوط به معماری پردازنده است( مثلا تو avr در حالت معمول یک کار دیگه انجام میشه و اون غیرفعال کردن وقفه هاست) تازه پرش به وکتور آدرس وقفه مورد نظر صورت میگیره.( که برای هر وقفه یک آدرس منحصر به فرد است)

                      ببنید وقتی شما برای یک وقفه روتینی تعریف نمیکنید در حالت معمول در آدرس اون وقفه یک دستور پرش به آدرس صفر حافظه صورت میگیرد.
                      حالا جمله قبل رو که خوندید، حالا جمله زیر را هم درنظر بگیرید و خودتون به نتیجه برسید:
                      آدرس صفر همون آدرس وقفه ریست سخت افزاری است.

                      حالا نتیجه چی شد؟
                      آفرین . وقتی روتین برای وقفه ای در نظر گرفته نشود و اون وقفه اتفاق بیفتد ، انگار میکرو ریست میشه.


                      حالا میریم برا سوالتون:

                      این یکی رو نفهمیدم چیه!!
                      کد:
                      EMPTY_INTERRUPT(ADC_vect);
                      اگه میشه در موردش یکم توضیح بدین

                      خوب داخل فایل هدر interrupt.h دقیقا همین مثال اومده به شکل زیر:
                      کد:
                      EMPTY_INTERRUPT(ADC_vect);\endcode */
                      خوب باتوجه به جملات بالا که گفتم فقط جمله ی زیر را میگم:
                      وقتی از این تابع استفاده میکنید دیگه در آدرس وقفه ی ADC دستور پرش به آدرس صفر صورت نمیگیرد و فقط دوباره به جایی که وقفه خورده شده پرش میکنیم.
                      دقیقا مثل اینه که از ISR استفاده کنید و هیچی توش ننویسید .

                      پس کی از این تابع استفاده میکنیم؟
                      احسنت. فقط درصورتی که امکان داره وقفه ای صورت بگیره ولی ما نمیخوایم با وقفه خوردن کاری انجام بشه . (البته میشه کلا اون وقفه را به اصطلاح mask کرد و با اینکار مطمئن بشیم که دیگه اون وقفه صورت نمیگیره.)

                      -------------------------------------------------------------------
                      با دوتا نکته پست را تموم میکنم:

                      1- در صورتی که از interrupt.h استفاده میکنید ، بسیار دستتون بازه و این هدر بسیار منعطفه. به طوری که شما حتی میتونید تعیین کنید که چه کارهایی قبل از رفتن به روتین وقفه(بعد از وقفه خوردن) انجام شود یا چه رجیسترهایی سیو شود و...

                      2- این نکات که گفتم عموما مربوط به پردازنده ی میکروکنترلر AVR که یک معماری خاص برای خودش داره ، میشه.
                      من قصد داشتم تاپیکی در رابطه با طراحی یک پردازنده توسط خودمون ایجاد کنم ولی راستش اصلا فرصت نشد . اگر علاقه مندید باید کتابهای مربوط به معماری کامپیوتر را مطالعه کنید. من خودم یک پردازنده ی ساده توسط FPGA طراحی کردم که حاصل مطالعاتم در رابطه با معماری کامپیوتر بوده . اگر علاقه مندید حتما بتون توصیه میکنم در این رابطه به رفرنس های معماری کامپیوتر مراجعه کنید.


                      راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                      کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                      نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                      http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
                      انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

                      دیدگاه


                        پاسخ : کوچ کردن از کدویژن به AtmelStudio

                        با سلام
                        با اجازه جناب مرتضوی،

                        در مورد کاربرد این

                        EMPTY_INTERRUPT(ADC_vect);

                        فرض کنید که ما مثلا میکرو رو برده باشیم به یکی از مدهای کم مصرف مثلا مد Idle حالا میخواییم از این مد بعد از یه عملیاتی که دارای وقفه هست خارج بشیم یکی از این عملیات ها اتمام تبدیل آنالوگ به دیجیتال هست خوب ما داریم از آنالوگ به دیجیتال که استفاده میکنیم حالا برای اینکه از حالت sleep خارج بشیم کافیه وقفه مورد نظر فعال بشه و برای جلوگیری از تولید کد الکی توسط کامپایلر میاییم از ماکروی بالا برای تعریف روتین وقفه مورد نظر استفاده میکنیم.

                        خروجی اسمبلیش:


                        000000d2 <ADC_vect>:

                        d2: 18 95 reti

                        دیدگاه


                          پاسخ : کوچ کردن از کدویژن به AtmelStudio

                          جناب آقای مرتضوی

                          توی اون هدر و فایلی که برای راه اندازی LCD کاراکتری معرفی کردید ، یکی از بیتهای پورت برای R/W اشغال میشه.
                          فرض کنیم اصلا نخواهیم از LCD بخونیم و فقط بخواهیم روی LCD بنویسیم.
                          حالا میشه اون هدر رو طوری تغییر بدید که پین پورت برای R/w نخواد و R/W رو خودمون به شکل خارجی به GND وصل کنیم.
                          اینجوری یک پین پورت صرفه جویی میشه.
                          البته من این موضوع رو بخاطر این مطرح کردم چون قبلا تو بسکام فقط RS و E رو تعریف میکردیم و R/W مستقیما به GND وصل میشد.
                          این طوری LCD با 6 پین پورت راه میافته.

                          با تشکر از توجه شما

                          دیدگاه


                            پاسخ : کوچ کردن از کدویژن به AtmelStudio

                            نوشته اصلی توسط nanocycle
                            جناب آقای مرتضوی

                            توی اون هدر و فایلی که برای راه اندازی LCD کاراکتری معرفی کردید ، یکی از بیتهای پورت برای R/W اشغال میشه.
                            فرض کنیم اصلا نخواهیم از LCD بخونیم و فقط بخواهیم روی LCD بنویسیم.
                            حالا میشه اون هدر رو طوری تغییر بدید که پین پورت برای R/w نخواد و R/W رو خودمون به شکل خارجی به GND وصل کنیم.
                            اینجوری یک پین پورت صرفه جویی میشه.
                            البته من این موضوع رو بخاطر این مطرح کردم چون قبلا تو بسکام فقط RS و E رو تعریف میکردیم و R/W مستقیما به GND وصل میشد.
                            این طوری LCD با 6 پین پورت راه میافته.

                            با تشکر از توجه شما
                            بله من اون راه انداز را طوری نوشتم که درحالی که کار باش ساده است ، کلی باشه و بعدا هر تغییری درش به راحتی قابل انجام باشه. مثلا من یک تابع تعریف کردم که در هیچ کدام از توابع سطح بالا از آن استفاده نشده، و مربوط به همین خواندن از السیدی است.

                            بله شما میتوانید R/W را مستقیم به زمین متصل کنید. ولی شما نمیتوانید از پین مربوطه استفاده کنید.(باید تغییراتی در هدر داده شود.) در صورت استفاده از پین مربوط به R/W در میکرو ،بدون تغییر هدر، اینکار باعث خطا میشود.

                            پس در نتیجه میشه R/W السیدی را مستقیم به زمین وصل کرد ولی نمیتوان از پین آزاد شده در میکرو استفاده کرد.



                            راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                            کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                            نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                            http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
                            انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

                            دیدگاه


                              پاسخ : کوچ کردن از کدویژن به AtmelStudio

                              نوشته اصلی توسط RubeuS
                              ببنید دوست عزیز ، اگر در این رابطه نظر بنده را بخواید ، نظر من این است که خودتون بشینید راه اندازی کنید. ( شاید خیلیا با من هم عقیده نباشند و بگن کار من مثل اختراع چرخ است ولی من اعتقاد دارم اگر در پروژه ام به هر چیزی نیاز داشته باشم از اول باید خودم اون را پایه ریزی کنم و تا جایی که میتونم مصرف کننده نباشم)

                              شما برای اینکار به صفحه ی 24 به بعد دیتاشیت مگا128 مراجعه کنید . بسیار زیبا و روان همراه با تصویر توضیح داده شده ، رجیسترهایی به این منظور وجود دارند که باید تنظیم شوند . (توصیه من اینه که کلا بخش مربوط به حافظه ها مطالعه شود)
                              والله من خودم چون تاحالا نیاز نداشتم واردش نشدم ولی درآینده اگر روزی نیاز داشته باشم که از رم اضافه استفاده کنم ، حتما دیتاشیت را میخونم و متناسب با اون برنامه مینویسم.
                              ولی یه نکته بگم که استفاده از حافظه ی خارجی باعث کند شدن برنامه میشود. چون access time حافظه خارجی بیشتر است و برای اجرای دستورات زبان ماشین که مربوط به خواندن و نوشتن در حافظه هستند کلاک بیشتری نیاز است. ( مثل LD , STS , ST و... ) . اگر پشته را در حافظه ی خارجی در نظر بگیرید که حتی پرش به ساب روتین ها و وقفه ها و بازگشت از اونها هم کندتر میشوند.
                              ببخشید ولی گویا متوجه منظور من نشدید.
                              من چندین ساله که دارم با رم خارجی کار میکنم. منتها من قدیم تو کدویژن و دو سه سالی هم هست که تو IAR دارم با رم خارجی کار میکنم ، هم با mega128 و هم با xmega128a1 .
                              مشکل من راه اندازی رم خارجی نیست. مشکل من اینه که چجوری به avr studio بفهمونیم که رم خارجی داریم و مقدارش مثلا 32 کیلو یا 64 کیلو یا n کیلو هست. تنظیمات اون رو نمیدونم. مثلا تو کدویژن تو Project Configuration میریم و مقدار رم خارجی رو تعیین میکنیم. تو IAR هم علاوه بر اینکه تو تنظیمات پروژه این کار رو میکنیم ، یک تابع هم ایجاد میکنیم به نام __low_level_init و داخل اون رجیسترهای لازم رو مقدار میدیم.
                              اما تو AVR Studio نمیدونم این کار رو چجوری انجام بدم.
                              امیدوارم متوجه منظورم شده باشید سید جان. :rolleyes:

                              دیدگاه


                                پاسخ : کوچ کردن از کدویژن به AtmelStudio

                                نوشته اصلی توسط امیر . م
                                ببخشید ولی گویا متوجه منظور من نشدید.
                                من چندین ساله که دارم با رم خارجی کار میکنم. منتها من قدیم تو کدویژن و دو سه سالی هم هست که تو IAR دارم با رم خارجی کار میکنم ، هم با mega128 و هم با xmega128a1 .
                                مشکل من راه اندازی رم خارجی نیست. مشکل من اینه که چجوری به avr studio بفهمونیم که رم خارجی داریم و مقدارش مثلا 32 کیلو یا 64 کیلو یا n کیلو هست. تنظیمات اون رو نمیدونم. مثلا تو کدویژن تو Project Configuration میریم و مقدار رم خارجی رو تعیین میکنیم. تو IAR هم علاوه بر اینکه تو تنظیمات پروژه این کار رو میکنیم ، یک تابع هم ایجاد میکنیم به نام __low_level_init و داخل اون رجیسترهای لازم رو مقدار میدیم.
                                اما تو AVR Studio نمیدونم این کار رو چجوری انجام بدم.
                                امیدوارم متوجه منظورم شده باشید سید جان. :rolleyes:
                                بله متوجه شدم.

                                من عرض کردم : اصلا تاحالا چنین کاری نکردم . ولی...

                                مطمئنا ide اتمل استادیو و کامپایلر gcc در این مورد یه مقدار ضعف داره.
                                من تو نت سرچ کردم ، چیز زیادی دستگیرم نشد.
                                ولی میشه یه کارایی کرد.

                                شما برو به شاخه ی زیر:
                                project --> properties -->Toolchain ---> AVR/GNU linker --> Memory settings

                                حالا تو قسمت SRAM segment عبارت زیر را اضافه کن:
                                کد:
                                .xrammem=0x1100
                                بعد تو فایل اصلی دیفاین زیر را قرار بدید:
                                کد:
                                #define XRAM __attribute__((section (".xrammem")))
                                حالا برای تعریف یک دیتا آبجکت کلمه ی کلیدی XRAM را کنارش بزارید.

                                اینا یه جورایی من درآوردی است و امتحان نشده. امتحانش با خودتون .

                                درضمن به دیفاین های زیر در فایل هدر iom128.h توجه کنید:
                                کد:
                                /* Constants */
                                #define SPM_PAGESIZE 256
                                #define RAMEND   0x10FF   /* Last On-Chip SRAM Location */
                                #define XRAMEND  0xFFFF
                                #define E2END   0x0FFF
                                #define E2PAGESIZE 8
                                #define FLASHEND  0x1FFFF
                                تو حالت دیباگینگ و در پنجره ی memory میتوانید قسمت data XRAM را مشاهده و کنترل کنید.( برای اطلاع بیشتر به پست اول مراجعه شود)

                                اگر خودم وقت میکردم ، حتما امتحانش میکردم.

                                راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                                کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                                نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                                http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
                                انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

                                دیدگاه

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