اطلاعیه

Collapse
No announcement yet.

آموزش winavr و avrlib

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

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

    با سلام
    فرق 8*9600 و 8UL*9600 چی هست و برای چه منظور استفاده میشه.یا به جای 8000000 از 8UL استفاده میشه ولی در عمل اگر 8UL در 2 ضرب بشه و نتیجه چاپ بشه 16000000 نمیشه.

    دیدگاه


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

      فرض اولیه در انجام محاسبات بر اساس مقادیر ثابت اینه که محاسبات برای بزرگترین نوعی انجام میشه که در اون عبارت قید شده باشه. یعنی اگه من بیام 9600 و 8 رو در هم ضرب کنم در یک سیستم 16 بیتی چون این دو عدد 16 بیتی هستن کلیه محاسبات 16 بیتی حساب میشه و نتیجه هم 16 بیت اش در نظر گرفته میشه. حاصل ریاضی ضرب این دو عدد در هم 55200 هست که اگر به علامتدار بودن اعداد بطور پیش فرض توجه کنیم؛ حاصل میشه منفی 22431 که همون 55200 بصورت غیر علامتدار هست. برای پرهیز از این مشکل در این حالت باید به نوعی به کامپایلر اطلاع داد که از یک نوع با دقت بالاتر استفاده بشه. پسوند U در اینجا مشخص میکنه که یکی از اعداد unsigned هست پس باید در صورتی که اعداد همگی مثبت باشند نتیجه هم بصورت غیر علامتدار یعنی عدد 55200 در نظر گرفته بشه. البته این مورد نبایستی در مورد 8000000 مصداق داشته باشه ولی برای خواناتر بودن میشه پسوند UL رو استفاده کرد که میشه گفت بفرم unsigned long محاسبه انجام بشه. تا رنج عددی نتیجه محاسبات تا 4 میلیارد بالا بره.

      دیدگاه


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

        کسی توابع I2C برای avr که بدون استفاده از TWI یعنی از دو پین غیر از SDA , SCL سخت افزاری باشه رو داره؟ میخوام مثل کدویژن که هر دو پین رو روی یک پورت میتونیم برای I2C استفاده کنیم ، بتونم استفاده کنم.

        دیدگاه


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

          نوشته اصلی توسط امیر . م
          کسی توابع I2C برای avr که بدون استفاده از TWI یعنی از دو پین غیر از SDA , SCL سخت افزاری باشه رو داره؟ میخوام مثل کدویژن که هر دو پین رو روی یک پورت میتونیم برای I2C استفاده کنیم ، بتونم استفاده کنم.
          از کتابخانه SCCB در لینک زیر می توانید برای ارتباط نرم افزاری I2C استفاده کنید:

          http://www.egochina.cc/datasheet/ATm...670_REV4.1.rar
          اوژن: به معنای افکننده و شکست دهنده است
          دانایی، توانایی است-Knowledge is POWER
          برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
          وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
          قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
          اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
          ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

          دیدگاه


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

            لینک خرابه !
            یه سری تابع پیدا کردم . با at24c256 کار کردم و مشکلی تو خوندن و نوشتن نبود.
            اما با ds1307 مشکل دارم. اصلا سر در نمیارم. من سرعت clock رو هم آوردم پایین . کلا روتین init این آس سی 5 خط بیشتر نیست . اماinit نمیکنه.
            از کد هم مطمئن هستم چون از توابع کدویژن استفاده کردم.

            کد:
            void rtc_init(unsigned char rs,unsigned char sqwe,unsigned char out)
            {
            rs&=3;
            if (sqwe) rs|=0x10;
            if (out) rs|=0x80;
            i2c_start();
            i2c_write(0xd0);
            i2c_write(7);
            i2c_write(rs);
            i2c_stop();
            }
            که من خلاصش کردم و مقدار rs رو صفر گرفتم.
            اما هیچ ack نمیگیره.
            این کدی هست که استفاده میکنم . با avrstudio 5.0 هست.
            http://www.mediafire.com/?pnwsc6fb7a23jzt

            دیدگاه


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

              مشکل rtc , i2c حل شد.
              حالا یه سری سوالات فنی تخصصی ضربتی ! که به صورت ابهام و شبهه تو ذهنم هست.

              آقا من یه mega128 دارم با یه رم خارجی 64 کیلو.
              با avr studio هم کار میکنم.
              من میخوام یه بافر داشته باشم با حجم 52 کیلو ، اما نمیزاره بیشتر از 32 کیلو سایز بدم. چکار کنم؟
              آیا در بخش configuration option -> memory settings با توجه به رم خارجی 64 کیلو لازم هست چیزی تعریف کنم ؟ اگر لازم هست به چه نحوی نوشته بشه . آدرس شروع باید 0x1000 باشه یا 0x801000 ?
              مقدار stack رو چجوری میشه تعیین کرد ؟ بخش "Specify Initial Stack Address" دقیقا به چه معناست؟ اگر به معنای آدرس شروع stack هست ، پس آدرش انتهای stack کجاست؟ آدرس شروع رم دیتا کجاست؟
              کی و کجا باید از کلمه کلیدی volatile استفاده کنیم ؟
              آیا پیشنهاد میکنید که برای دسته بندی متغیرها از struct استفاده کنیم یا اینکه کمتر استفاده بشه بهتره؟
              وقتی یک تابع اجراش تموم میشه و به آخرش میرسه اما ظاهرا ret درست اجرا نمیشه و برنامه همونجا میمونه ، این دلیلش ممکنه از stack و یا بهتر بگم stack overflow هست؟
              .
              .
              .
              آخیــــــــــــــــــــش ، سوالام تموم شد تقریبا !

              دیدگاه


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

                1- اگر آدرس رم خارجی ات از 0x1100 به بالا شروع میشه که مشکلی نیست. ولی در هنگام تعریف اینجوری بنویس:

                52000U
                چون عددی که قید میکنی بفرم یک عدد 16 بیتی در نظر گرفته میشه که ماکزیممش میشه 32767!

                آدرس شروع استک معمولا آخرین بایت رم داخلی هست. و آدرس شروع رم دیتا از اولین بایت رم داخلی. اگر استک در رم خارجی بیفته دیگه با WinAVR مشکل پیدا میکنی. اگر استک مصرفی (که به سمت آدرس کمتر رشد پیدا میکنه) با دیتا هات (که به سمت آدرس بالاتر رشد پیدا میکنه) قاطی بشه برنامه ات (دیتا یا استک) خراب میشه. و این میشه اسمش stack overflow.

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

                جایی که یک متغیری در یک روال استفاده میشه ولی در جای دیگه ای مثل یک تسک دوم با استفاده از یک RTOS یا در یک وقفه مقدار میگیره باید حتما volatile معرفی بشه.

                آره ممکنه.

                دیدگاه


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

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

                  در ضمن زدم 52000U یا 42000U خطا داد گفت :
                  ../error: size of array 'Buffer' is too large

                  دیدگاه


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

                    اینو امتحان کن: (من تا بحال با پشن های کامپایلر ور نرفتم):
                    unsigned char *buffer = (unsigned char *)0x1100

                    دیدگاه


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

                      سلام.
                      داشتم کتابخونه spi میگشتم که تو avrlib پیدا کردم و از روی خوش شانسی دیدم ارسال داده 16 بیت هم داره.
                      ولی هر کاری کردم تو پروتئوس راه اندازی نشد این هم برنامه :

                      کد:
                      #include <avr/io.h>
                      #include "spi.c"
                      int main(){
                        spiInit();
                        
                        while(1)
                        {
                         spiSendByte(20);
                        }
                      }
                      مشکل از برنامه هست یا.....

                      دیدگاه


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

                        سلام.
                        با استفاده از کتابخونه avrlib مشکل ارسال حل شد.(با برنامه ای که از آقای حمید رستمی گرفتم)
                        حالا یه مشکل دیگه!!
                        چطور میتونم یه متن رو دریافت کنم؟
                        یا چند تا عدد مثل ساعت رو ارسال کنم؟؟
                        راستی موقع ارسال متن هم تو پروتئوس درست نشون نمیده!!

                        دیدگاه


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

                          یک برنامه را که با کدویژن نوشته بودم و 80% حافظه را اشغال کرده بود(با استفاده از اپتیمایز کدویژن) به کدهای مربوط به winavr تبدیل کردم اما حجم برنامه 10kb شد حتی از سطح اپتیمایز 0s استفاده کردم اما حجم برنامه خیلی زیادتر از حافظه مگا 8 است ایا راه حلی تو winavri هست یا باید از خیرش بگذرم و از کدویژن استفاده کنم؟

                          دیدگاه


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

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

                            دیدگاه


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

                              نوشته اصلی توسط M3R
                              سلام.
                              با استفاده از کتابخونه avrlib مشکل ارسال حل شد.(با برنامه ای که از آقای حمید رستمی گرفتم)
                              حالا یه مشکل دیگه!!
                              چطور میتونم یه متن رو دریافت کنم؟
                              یا چند تا عدد مثل ساعت رو ارسال کنم؟؟
                              راستی موقع ارسال متن هم تو پروتئوس درست نشون نمیده!!
                              سلام.
                              مننظورم از این سوال پروتکل usart هست نه spi!!!!

                              دیدگاه


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

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

                                دیدگاه

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