اطلاعیه

Collapse
No announcement yet.

آموزش winavr و avrlib

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

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

    avrstudio 5 نصب کردم ، دیگه مشکلی ندارم
    ولی همچنان نمی تونم با هیپرترمینال ویندوز ارتباط برقرار کنم !
    آقا رضا ، آقای حسینی ، چرا دیگه هیچ کدوم از شماها به این تاپیک سر نمیزنه :(
    یکی یه نمونه برنامه ساده که یک حرف ارسال و یک حرف از هیپرترمینال گرفته میشه نداره بزاره :(
    هر کاری می کنم این کار نمی کنه !

    دیدگاه


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

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

      دیدگاه


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

        نوشته اصلی توسط atm8
        avrstudio 5 نصب کردم ، دیگه مشکلی ندارم
        ولی همچنان نمی تونم با هیپرترمینال ویندوز ارتباط برقرار کنم !
        آقا رضا ، آقای حسینی ، چرا دیگه هیچ کدوم از شماها به این تاپیک سر نمیزنه :(
        یکی یه نمونه برنامه ساده که یک حرف ارسال و یک حرف از هیپرترمینال گرفته میشه نداره بزاره :(
        هر کاری می کنم این کار نمی کنه !
        من یکم روم نمیشه ... :mrgreen: به خیال خودم خواستم تاپیک آموزشی باز کنم اما یه حرفایی زدم که ... اگرم برسم وقتی واسه avr بذارم باید بیام تمام پست ها رو ویرایش کنم! :mrgreen: البته پست اول هم گفتم خودم در حال یادگیری ام. (هنوز چشم و گوشم باز نشده بود)

        مشکل شما با هایپر چیه؟ (البته من با متلب کار میکنم) کلا هیچ اطلاعاتی نمیاد یا درهم میاد؟ مدار رو درست بستی؟ max232 و ...
        اون کد و کتابخونه uart هم مشکلی نداشت!
        https://www.linkedin.com/in/mohammadhosseini69

        http://zakhar.blog.ir

        دیدگاه


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

          تاپیک خیلی جالبی بود
          وگرنه همین الان با کدویژن اندر خم یک کوچه بودیم
          در مورد سخت افزارم ، همه چی درسته ، با یک فایل هگز که از یکی گرفتم همه چی درست کار می کنه
          ولی فایل خودم ! همینی که شما گذاشته بودین ! هر کرای کردم درست نشد !
          میشه یه برنامه نمونه بزارید ، خیلی ممنون

          دیدگاه


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

            آخه الان چیزی تو دست و بالم نیست که برنامه نمونه بذارم.
            شما یه برنامه ساده بنویس که یه رشته ده دوازده کارکتری بفرسته. هایپرو فعال کن ببیین چی میشه. اطلاعات نمیاد یا میاد اما اشتباه؟
            https://www.linkedin.com/in/mohammadhosseini69

            http://zakhar.blog.ir

            دیدگاه


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

              سلام به همگی.
              برای اینکه یک بافر 10 کیلویی یا بیشتر از 32 کیلو رو رو در رم خارجی قرار بدیم باید چه کارهایی رو انجام بدیم؟
              آیا نیاز به تعریف .extmem در تنظیمات هست؟ یا اینکه باید با بک linker command این کار رو انجام بدیم؟ اگر اینجوریه دستورش چیه؟.
              تفاوت .bss و .data و .extmem چیه؟
              اگر بخوایم این فضا رو در heap بگیریم چی؟
              تو بخش تنظیمات avrstudio قسمتی که مربوط به تعریف سگمنت ها هست نیاز به دستکاری داره یا کلا چه زمانی اونجا چیی اضافه میکنیم؟
              ممنون.

              دیدگاه


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

                راجع به تفاوت bss و data باید گفت که bss محدوده داده های static بدون مقدار اولیه هست. این محدوده در ابتدای اجرای برنامه قبل از شروع main با صفر پر میشه. ولی بقیه قسمت های داده های استاتیک برنامه که حاوی مقادیر اولیه مشخص شده توسط برنامه نویس هست بنام data خونده میشه.
                extmem یهنی رم خارجی.
                heap یعنی کل حافظه منهای پشته (نرم و سخت افزاری) و bss و data.
                اگر بخوایین مرتب با حافظه بازی کنین و بگیرین و بعدا آزاد کنین یا حجم مورد نیاز مشخص نباشه از heap استفاده میکنین. در صورتی که هیچ کدوم از اینا نیست؛ heap یعنی دردسر.
                اگر بافر بالاتر از حجم آدرس دهی توسط میکرو بخوایین براحتی با یک fpga قابل حله. و اگه بخوایین این بافر یک بافر حلقوی ساده باشه کد داخل میکروتون میتونه بسیار بسیار راحت تر بشه.

                بقیه شم نمیدونم.

                دیدگاه


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

                  آقا رضا !!!
                  شما مطمئن هسنید که سوال من رو خوندید؟ من فکر میکنم شما فقط به کلمات bss,data,heap,extmem و "بافر زیاد" نگاه کردین و بقیه متن رو آدم حساب نکردین :mrgreen:
                  من اگر یک بافر مثلا 10 کیلویی رو تعریف کنم کامپایلر خطا نمیده ، اما میگه فرضا تو که 4 کیلو رم داری و بافر 10 کیلویی گرفتی پس 220% از مقدار رم رو گرفتی و برنامه اجرا نمیشه.
                  منظور من این بود که چجوری باید به کامپایلر بگیم که این بافر در رم خارجی قرار داره و دقیقتر بگم ، رم خارجی رو چجوری باید بهش معرفی کنیم. نیاز به linker command هست یا اینکه در پنجره تنظیمات پروژه باید سگمنت حافظه رو تعریف کنیم . در این صورت چه آدرسی باید بهش بدیم. برای فرضا mega128 باید آدرس 0x2000 باید بدیم یا 0x802000 ؟؟؟
                  پیشاپیش از حسن توجه شما متشکرم

                  دیدگاه


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

                    حالا بیا خوبی کن! نشستی اونجا به من گیر بدی مومن؟ من چه میدونم عزیزم. من همیشه آدمی بودم مرتجع و سنتی فکر میکردم. با winavr هم این دردسر ها رو نداشتم.
                    اما خارج از شوخی؛ فکر نکنم گرفتن یک بافر بیش از حجم رم موجود مشکلی برای اجرای برنامه پیش بیاره. برنامه اجرا میشه ولی عوضی. نه که اجرا نشه. اما اگه منظور دسترسی به رم خارجی باشه خودم نقشه حافظه رو درمیارم و بعد از اون با اشاره گرها بازی میکنم. مثلا روی مگا 128 فضای حافظه خارجی از آدرس 0x1100 شروع میشه. اگر خواستم 32 کیلو بافر تعریف کنم بخاطر کوچیکی و راحتی طراحی سخت افزار جنبی میام از آدرس 0x8000 به بعد رو استفاده میکنم و توی کد هم از امکانات زبون C استفاده میکنم. اینجوری:

                    char *buffer = (char *)0x8000;

                    حالا هر جا خواستم از این بافر استفاده کنم میتونم عین یک آرایه معمولی ازش استفاده کنم. مثلا:


                    char *buffer = (char *)0x8000;


                    for(i=0; i<32768; i++)
                    buffer[i] = 0;


                    حالا اگه WinAVR خودش امکان خاصی داشته باشه دیگه نمیدونم.
                    نمیدونم بدرد خورد یا بازم راهو عوضی رفتم.

                    دیدگاه


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

                      ممنون از توضیحاتتون آقا رضا.
                      ما خیلی مخلصیم.
                      این روش شما رو فردا تست میکنم و نتیجه رو به سمع و نظر شما میرسونم .
                      آماااااااااااااااا ....
                      شما با زیرکی خاصی تو توضیحاتتون بافر رو 32 کیلو گرفتین.
                      راستی چرا winavr بافر بزرگتر از 32 کیلو رو قبول نمیکنه؟؟؟؟
                      یک سوال دیگه : چرا شما آدرس رو 0x8000 گرفتین؟ مثلا میشد 0x4000 یا 0x20000 گرفت؟ مگه 0x8000 نمیشه 32768 ؟ خوب این یعنی چییییییییی؟

                      دیدگاه


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

                        سلام.
                        چون int در winavr 16 بیتی هست. و هر عدد صحیحی اگر نوعش قید نشه و توسط پشن های کامپایلر هم به داشتن نوع خاصی اجبار نشه به صورت signed int در نظر گرفته میشه. و در این فرم ما عددی مثل 40000 نداریم.
                        اگه میخوایین این میزان بافر بگیرین میتونین از 40000U استفاده کنین. از طرف دیگه در هنگام آدرس دهی اگر رنج آدرس ها بصورت توانی از 2 باشه بعضی جاها کار راحتتر انجام میشه. وگرنه شما میتونین همون بافر رو 50000 بگیرین.
                        غیر از این مورد؛ کل فضای آدرس شما 64 کیلو بایته. یعنی بین 0x0000 و 0xFFFF هست. بنابراین عددی مثل 0x20000 نداریم!! حالا اگه بیایین قسمت ساخت سخت افزار رو در نظر بگیرین میبینین که برای داشتن یک آی سی 32 کیلو بایتی در آدرس 0x4000 مدار پیچیده تری نیازه برای فعال سازی آی سی. نسبت به آی سی که در آدرس 0x8000 باشه چون در این صورت فقط به یک NOT احتیاج هست. پایه A15 رو با یک NOT به chip select آی سی رم وصل کنین. ولی در حالت کلی حداقل یک مقایسه کننده میخوایین.

                        ضمنا این اسمش زیرکی نبود. من فقط مثال زدم.

                        دیدگاه


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

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

                          دیدگاه


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

                            سلام.
                            کار دستور ultoa( val, s, 10 ); تو برنامه زیر چیه؟؟
                            کد:
                             for(;;){
                              ultoa( val, s, 10 );
                              lcd_xy( 0, 1 );
                              lcd_blank( 10 - strlen( s ));	// insert spaces until number
                              lcd_puts( s );			// display number right adjusted
                              val++;
                             }
                            و همچنین دستور cd_blank( 10 - strlen( s )); .
                            در ضمن مقدار s تو دستور ultoa از دستور زیر میاد :
                            char s[sizeof("4294967295&quot];

                            یه سوال دیگه:
                            برای اینکه تو دستور if بخواهیم یک پایه رو چک کنیم حتما باید مقدار ریجستر pin رو در یک متغییر بریزیم و یا بدون متغیر هم میشه این کار رو انجام داد؟

                            دیدگاه


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

                              نه امیر آقا. طوری نشده که. بابام اینقده خوب ورزم داده که با این چیزا طوریم نمیشه!!!

                              جناب M3R!
                              تابع ultoa یعنی: unsigned long را به آسکی (متن) تبدیل کن.
                              مقداری که باید تبدیل بشه یعنی val رو به صورت رشته ای در s قرار بده و در مبنای عددی 10.

                              مقدار s از اون دستور نمیاد! فقط برای s به اندازه ای که بتونه برای یک unsigned long یعنی ماکزیمم عدد 0xFFFFFFFFUL یا مبنای 10 عددی 4294967295 جاداشته باشه؛ یعنی همون 10 رقم جا گرفته. البته یک بایت هم برای '\0' که میشه 11 بایت.

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

                              دیدگاه


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

                                سلام.
                                ممنون از جوابتون
                                مقدار s از اون دستور نمیاد! فقط برای s به اندازه ای که بتونه برای یک unsigned long یعنی ماکزیمم عدد 0xFFFFFFFFUL یا مبنای 10 عددی 4294967295 جاداشته باشه؛ یعنی همون 10 رقم جا گرفته. البته یک بایت هم برای '\0' که میشه 11 بایت.
                                میشه یکم بیشتر توضیح بدید

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

                                دیدگاه

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