اطلاعیه

Collapse
No announcement yet.

آموزش winavr و avrlib

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

    پاسخ : آموزش winavr و avrlib

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

    دیدگاه


      پاسخ : آموزش winavr و avrlib

      متغیر عمومی همون متغیر global هست. که بیرون توابع تعریف میکنین و در data area ایجاد میشه و مقدارش تا پایان زمان اجرای برنامه حفظ میشه. یک چیزی مشابه متغیر محلی ولی static.

      برای اون کار هم اگه متغیر محلی بخوایین که مقدارش به ازای بیرون رفتن و دوباره وارد شدن به تابع از بین نره باید static اش کنین:

      static int x;

      این مثل اینه که یک متغیر عمومی تعریف کنین (در data area ایجاد بشه) ولی فقط داخل تابع قابل دسترسی باشه (محلی باشه).
      اینجوری قبل از شروع اجرای برنامه مقدارش صفر هست. (برای اولین بار)

      دیدگاه


        پاسخ : آموزش winavr و avrlib

        سلام به همگی
        یه سوال داشتم ، جریان این ماسک کردن چیه ؟
        مخصوصاً واسه میکروهای arm که میگن بصورت ماسک کردن از خروجی ها استفاده کنیم .

        دیدگاه


          پاسخ : آموزش winavr و avrlib

          سلام.
          اول اینکه یه سایت خوب برای دانلود کتابخونه های winavr پیدا کردم :
          http://download.savannah.gnu.org/releases/avr-libc/
          دوم :
          میخوام تایمر رو راه اندازی کنم چند تا سوال دارم
          چطور باید وقفه سراسری رو فعال کنم؟
          چطور وقفه تایمر رو فعال کنم؟
          چطور برنامه سرریز تلمر رو بنویسم؟ مثلا بگم وقتی سرریز شد بپر تو بر چسب فلان ؟؟
          در ضمن نمی خوام از avrlib استفاده کنم.الکی حافظه میکرو رو پر میکنه!!

          دیدگاه


            پاسخ : آموزش winavr و avrlib

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


            #define enable_interrupts() asm("sei&quot
            #define disable_interrupts() asm("cli&quot


            اینم دو تا ماکرو برای این کار. اولی برای فعال کردن و دومی برای غیر فعال کردن.

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

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

            SIGNAL(SIG_OVERFLOW1)
            {
            // place your code here
            }

            دیدگاه


              پاسخ : آموزش winavr و avrlib

              سلام.
              من برنامه تایمر رو نوشتم ولی جواب نداد!!!
              از کدویزارد کدویژن برای مقدار دهی ریجسترها استفاده کردم.
              این هم برنامم مشکلش چیه؟؟
              کد:
              #include <avr/io.h>
              #include <util/delay.h>
              #define enable_interrupts() asm("sei")
              void SIGNAL(SIG_OVERFLOW2)
              {
                PORTD=255;
              }
              int main (){
              DDRD=0XFF;
              ASSR=0x00;
              TCCR2=0x06;
              TCNT2=0x00;
              OCR2=0x00;
              while (1){
              PORTD=0;
              }}
              ممنون.

              دیدگاه


                پاسخ : آموزش winavr و avrlib

                سه مورد!
                1- من خودم تا بحال مقدار صفر رو به TCNT نسبت ندادم ببینم کار میکنه یا نه.
                2- وقفه ها رو قبل از while با استفاده از ماکرویی که تعریف کردین باید فعال کنین.
                3- این تایمر auto-reload نیست و پس از یکبار اجرا شدن وای میسه. بنابراین نهایتا حتی اگه ایرادات قبلی رو هم درست کنین میکرو یکبار و فقط یکبار روال وقفه رو اجرا میکنه و دیگر هیچ. در روتین اصلی تون هم مرتب دارین پورت رو ریست میکنین. دیدن این مقدار 0xFF روی پورت از دست logic analyzer فقط برمیاد و بس. چون یک لحظه کوتاه میاد و میره.

                دیدگاه


                  پاسخ : آموزش winavr و avrlib

                  سلام.
                  وقفه ها رو قبل از while با استفاده از ماکرویی که تعریف کردین باید فعال کنین.
                  مگه فعال نشده ؟؟ #define enable_interrupts() asm("sei&quot
                  این تایمر auto-reload نیست و پس از یکبار اجرا شدن وای میسه. بنابراین نهایتا حتی اگه ایرادات قبلی رو هم درست کنین میکرو یکبار و فقط یکبار روال وقفه رو اجرا میکنه و دیگر هیچ
                  خوب باید چه کار کنم؟
                  ممنون از اینکه پاسخ میدید.

                  دیدگاه


                    پاسخ : آموزش winavr و avrlib

                    بعد از این مثلا پاسخ! آقای طراح زحمت کشیدن و پاسخی با این مضمون برای من ارسال کردن. فکر میکنم این پاسخ بدرد شما هم بخورد. از بابت جواب مشکل دار قبلی هم عذر میخواهم.


                    در توضیح باید گفت که بعد از راه اندازی تایمر از طریق نسبت دادن 0x06 به TCCR2 ، تایمر از صفر تا 0xff شمارش خود را انجام می دهد و مجددا ریست می شود و به همین ترتیب به کار خود ادامه می دهد (در مد Normal مقدار تایمر با صفر Reload می شود). یک شدن بیت های PORTD هم به اندازه چند دستور العمل (از زمان مقداردهی به آن تا بازگشت از وقفه) طول می کشد. بنابراین برنامه مذکور پالس های متناوبی با عرض کم در خروجی پورت ایجاد می کند که فرکانس آن fclk/65536 است (با فرض mega32) و عرض high آن هم بستگی به کد تولید شده توسط کامپایلر دارد.

                    دیدگاه


                      پاسخ : آموزش winavr و avrlib

                      نوشته اصلی توسط reza_agha
                      بعد از این مثلا پاسخ! آقای طراح زحمت کشیدن و پاسخی با این مضمون برای من ارسال کردن. فکر میکنم این پاسخ بدرد شما هم بخورد. از بابت جواب مشکل دار قبلی هم عذر میخواهم.
                      خواهش میکنم بالاخره هرکسی ممکنه اشتباه کنه.
                      حالا مشکل برنامه من چیه؟؟
                      برنامه من اصلا کار نمیکنه مشکل برنامه کجا هست؟
                      راستی تو winavr مثل بیسکام چیزی به نام start timer و از اینجور چیزا وجود نداره؟؟نمیخواد تایمر رو استارت کنیم؟

                      دیدگاه


                        پاسخ : آموزش winavr و avrlib

                        سلام به همه بچه ها.
                        من یه چند سالی هست avr کار میکنم و با codevision کار میکردم و همیشه به خاطر باگ های قشنگ! و فراوونش حرص میخوردم ، اما به خاطر فشردگی کاری و کمی وقت سراغ کامپایلر دیگه ای نرفتم.
                        تا اینکه به خاطر مسایلی مجبور شدم سوییچ کنم روی xmega و دیگه کلا بیخیال cv شدم.
                        بین IAR و WINAVR شک داشتم و با دیدن این تاپیک تصمیم گرفتم WINAVR رو انتخاب کنم.
                        برای شروع یک برنامه کامل که با mmc و FAT کار میکنه رو با استفاده از توایع elmchan آماده کردم که میزارمش تو سایت.
                        این پروژه با avrstudio و میکر atmega128 نوشته شده.
                        پایه chip select رو PORTE2 گرفتم.
                        من کل این تاپیک رو خوندم و جا داره از دوستان خوب آقای حسینی عزیز و reza_agha کمال تشکر رو داشته باشم و ایشالله خدا بهشون خیر بده.
                        واقعا ممنون ازشون
                        تا چند روز دیگه ایشالله fat با xmega رو هم میزارم.

                        این هم لینک پروژه :
                        http://www.4shared.com/file/VSY5JiCb/FAT_m128.html

                        دیدگاه


                          پاسخ : آموزش winavr و avrlib

                          آقا یه سوال خیلی مهم ، آیا winavr میتونه با xmega یه حافظه RAM خارجی با حجم مثلا 512 کیلو بایت رو آدرس بده ؟
                          دقیقتر بگم آیا pointer بیشتر از 16 بیتی هم داره؟؟؟
                          من برای پروژه ای که دارم کار میکنم حجم رم زیادی میخوام . cv میگه من pointer بیشتر از 16 بیت ندارم !
                          اگر winavr هم این مورد رو داشته باشه نمیدونم چیکار کنم.
                          البته فکر کنم یه جا نوشته بود IAR داره !!!
                          از طرفی هم تو این چند روزی که دارم با winavr کار میکنم ازش خوشم اومده :nice:
                          یه چیز دیگه ، تو winavr کجا با ید بگیم مقدار رم خارجی چقدره ؟

                          دیدگاه


                            پاسخ : آموزش winavr و avrlib

                            "این چند وقته من هر چی تز دادم که آقای طراح یه تیر خلاص توش شلیک کردن! دیگه کم کم میترسم کامپیوترم رو هم روشن کنم!!" اما...

                            تا جایی که من میدونم (چون با XMega کار نکردم) ما هیچ وقت میزان حجم حافظه رو به میکرو اطلاع نمیدیم. تنها مورد استفاده از اون هست یا عدم استفاده. مثلا در نظر بگیرین که PC هم در فاز اولیه استارت BIOS یا فاز POST میزان حافظه رو چک میکنه و برای اطلاع نرم افزار ها در جایی قرار میده. ولی به سخت افزار اطلاع نمیده. چون نهایتا اگه شما به آدرسی دسترسی پیدا کنین که وجود خارجی نداشته باشه فقط اطلاعتتون از دست میره ولی مشکل خاصی پیش نمیاد. (شاید بعضی جاها این مشکل باشه. ولی مطمئنا برای ساختار avr نیست).

                            ضمنا شما با اشاره گر 16 بیتی هم میتونی مثلا تا 4 گیگ رو آدرس بدی. فقط نحوه آدرس دهی فرق میکنه. مثلا فرض کن حافظه به یک سری بانک های 32 کیلو بایتی یا 64 کیلو بایتی تقسیم بشه و شما توسط یک مکانیسم کمکی بانک مورد نظرت رو برای کار انتخاب کنی ولی آدرس دهی داخل اون بانک 16 بیتی باشه. مثل اینکه مثلا با مگا 32 و 3 بیت اضافه بخوای 8 تا بانک 32 کیلویی رو که میشه 256 کیلو آدرس بدی. براحتی انجام شدنیه. (مثلا با استفاده از یک مالتی پلکسر 3 به 8 مثل 138)

                            اما اینکه آیا XMEGA خودش اینکارو اتوماتیک میکنه یا نه؟ من جرات ندارم دیگه تز بدم!!

                            دیدگاه


                              پاسخ : آموزش winavr و avrlib

                              ببخشید ، اما منظور من آدرس دهی اتوماتیک بود نه دستی.
                              میکرویی مثل mega128 به این خاطر که باس آدرسش 16 بیتی هست نمیتونه بیشتر از 64 کیلو رو اتوماتیک آدرس دهی کنه. اما یک میکرو مثل xmega128A1 میتونه حتی تا 4 تا پورت رو به آدرس اختصاص بده و فضای آدرس دهیش یه 16 مگابایت برسه. البته من هنوز با رم خارجی xmega کار نکردم اما تا چند روز دیگه مجبورم روش کار کنم.

                              تو چند تا فروم خارجی دیدم ظاهرا winavr اشاره گر 16 بیتی بیشتر نداره یعنی فقط از یک زوج رجیستر برای آدرس استفاده میکنه ، اما یه برسی و تست اولیه تو IAR که زدم دیدم در صورت نیاز میاد و از 3 رجیستر برای آدرس استفاده میکنه یعنی اشاره گر 24 بیتی.

                              تو winavr چجوری باید مقدار رم خارجی رو معرفی کنیم . چون همینجوری مثلا اگر یه بافر 40 کیلویی تعریف کنیم گیر میده و بیشتر از 32 کیلو رو اجازه نمیده. حالا تنظیم میزان رم خارجی کجاشه نمیدونم !!!

                              اما تو IAR این کار براحتی انجام میشه مثلا :
                              #include <ioavr.h>
                              #include <intrinsics.h>
                              #define EXTERNAL_SRAM_START 0x3000
                              #define EXTERNAL_SRAM_SIZE 16777216
                              #define EXTERNAL_SRAM_END (0x3000 + 16777216 - 1)
                              char buf[15777215];
                              int main()
                              {
                              PORTE_DIR = 0xFF; //Set PORTE as output(LEDs DATA)
                              buf[100000]=1;
                              while(1)
                              {
                              PORTE_OUT = 0x55;
                              __delay_cycles(200000);
                              PORTE_OUT = 0xAA;
                              __delay_cycles(200000);
                              }
                              }

                              دیدگاه


                                پاسخ : آموزش winavr و avrlib

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

                                دیدگاه

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