اطلاعیه

Collapse
No announcement yet.

آموزش winavr و avrlib

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

    #31
    پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

    داشتم تو avrlibdefs میچرخیدم که دیدم برای دسترسی بیتی به ریجستر ها یه ماکرو نوشته. اگه شیوه ی قبلی رو دوست ندارید میتونید اینجوری استفاده کنید:
    برای ست کردن یه بیت sbi(reg,bit)
    برای ریست کردن یه بیت cbi(reg,bit)
    البته این دوتا به همون عبارات قبلی تبدیل میشند. این ها به درد دوستانی میخوره که با تعریف قبل مشکل دارند.

    یه سوال:
    فرق این دوتا عبارت تو چیه؟
    asm volatile("nop&quot
    asm ("nop&quot
    [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

    دیدگاه


      #32
      پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

      می بینم که بالاخره از تنهایی در اومدم! خیلی خوبه! :applause: یاد درس شیرین زبان ماشین افتادم! ممنون. ادامه بدین. هرچی بلدین رو کنین!

      NOP مخفف No Operation Performed است. تا اونجایی که من می دونم این دستور باعث میشه در یه سیکل سیستم هیچ کاری انجام نده و شرایط قبلی رو حفظ کنه.
      volatile برای اینه که کامپایلر عمل بهینه سازی انجام نده. در بعضی موارد بهینه سازی قسمتی از کدها مشکل ایجاد می کنه. در این موردی هم که شما گفتین، انگار هدف اصلی اینه که کامپایلر جلوی ورودی و خروجی ها رو میگیره... (مطمئن نیستما. تو یه فروم دیدم...)
      اطلاعات بیشتر:
      http://stackoverflow.com/questions/246127/why-is-volatile-needed-in-c
      اگه کسی اطلاعات بیشتری داره بگه...
      https://www.linkedin.com/in/mohammadhosseini69

      http://zakhar.blog.ir

      دیدگاه


        #33
        پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

        مساله سر NOP نیست.مشکل اینه که چرا volatile ؟
        وقتی داریم با اسمبلی مینویسیم که دیگه بهینه سازی مطرح نیست.موقع کامپایل asm با asm volatile چه فرقی داره؟
        [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

        دیدگاه


          #34
          پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

          خوب حالا نوبت گیر دادنه!!

          اولا راجع به دستور کار روی بیت ها:
          وقتی از ماکروی BV برای کار روی بیت استفاده میکنیم خود کامپایلر تمامی expression ها رو تا میشه ساده تر میکنه بنابراین اگر بنویسیم:


          PORTB |= 0x01;


          یا بنویسیم


          PORTB |= BV(0);


          زمان اجرا هیچ فرقی نمیکنه و در هر صورت عبارت دوم به اولی تبدیل میشه و پس از اون تصمیم گیری میشه که آیا از sbi برای ست و ریست استفاده بشه یا از lds و sts که فرم عمومی دسترسی به حافظه هست. در هر صورت برای حالت اول یعنی مقادی ثابت و قابلیت استفاده از cbi و sbi زمان ست و ریست برابر با 2 سیکل است و با استفاده از lds و sts برابر با 5 سیکل.

          ایضا اپراتور ^ به معنای xor هستش و نه ریست کردن. البته در صورتی که یک بیت قبلا ست شده یاشه این فرم بیت رو ریست میکنه و در صورتی که قبلا ریست باشه ست اش میکنه. یعنی بیت رو مکمل میکنه.

          پس میشه گفت ما دستور کار روی بیتهارو نداریم و داریم اونها رو شبیه سازی میکنیم.


          راجع به volatile:
          تا جایی که من میدونم یعنی اینکه موردی که قید شده نبایستی توسط قواعد مرسوم تحت بهینه سازی قرار بگیره و همونجوری که هست باید استفاده بشه. مثلا اگر volatile برای یک متغیر عمومی استفاده نشه در هنگام استفاده از اون کامپایلر تا میشه دسترسی به حافظه رو برای خواندن مقدارش مینیمم میکنه. اما وقتی volatile قید میشه به ازای هر دسترسی مقدار تازه fresh از حافظه اخذ میشه.

          ضمنا اینکه راجع به stack گفتم:
          stack برای دو مورد استفاده میشه یکی ذخیره مقادیر و پاس کردن پارامتر ها و دیگری ذخیره و بازیابی آدرس های برگشت. هردوی این stack ها در winavr یکی هستن یعنی از یک حافظه استفاده میشه ولی در codevision از دو محدوده متفاوت استفاده میشه. راجع به باگ آدرس دهی حافظه خارجی برای وقفه ها که توضیح دادم. اگر دقیقتر بشیم میبینیم که میزان کمی از حافظه برای نگهداری آدرس های برگشت مورد نیازه تا میزانی که برای پاس کردن پارامتر ها استفاده میشه. در codevision به حافظه ای که برای نگهداری آدرس برگشت استفاده میشه hw-stack و به اونی که برای نگهداری متغیر های محلی و پارامتر ها استفاده میشه sw-strack گفته میشه.

          بهترین کار اینجور مواقع استفاده از کد تولید شده توسط کامپایلره. در codevision کد اسمبلی سورس ها در یک فایل asm ذخیره میشه و در winavr در یک فایل lss.

          ایضا رفرنس اصلی برای مشکل کامپایل شدن اون جدول 4 کیلو بایتی فقط atmega8 نیست. در بقیه میکرو ها چک کنید با اینکه بایستی کد jmp تولید بشه ولی کد rjmp تولید میشه. این موردیه که من قبلا با یه atmega32 داشتم. اونجا که دیگه مورد 4 کیلو بایت کد نیست که. ضمنا چک کردم حجم مثبت و منفی 2 کیلو مرد هست نه 4 کیلو ورد. که میشه 4 کیلو بایت:

          Relative jump to an address within PC-2K+1 and PC+2K (words).

          دقیقا به نقل از منوال مربوط به دستورالعمل ها.

          دیدگاه


            #35
            پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

            نوشته اصلی توسط reza_agha
            ضمنا چک کردم حجم مثبت و منفی 2 کیلو مرد هست نه 4 کیلو ورد. که میشه 4 کیلو بایت:

            Relative jump to an address within PC-2K+1 and PC+2K (words).

            دقیقا به نقل از منوال مربوط به دستورالعمل ها.
            درست است که دستور rjmp به میزان 2Kword می تواند پرش کند. اما از هر نقطه از flash می تواند به تمام فضای 4Kword در mega8 دسترسی پیدا کند. یعنی اگر در آدرس 0x0000 هم این دستور نوشته شود، می تواند به آدرس 0x0fff یعنی آخرین آدرس flash دسترسی پیدا کند و علت این امر امکان پرش در جهت منفی است. بنابراین اشکالی که در مورد یک جدول 2 کیلوبایتی بین حلقه اصلی و ابتدای برنامه ذکر کردید، برای mega8 برقرار نیست.
            برای mega32 هم در این لحظه به کدویژن دسترسی ندارم و تا فردا آن را بررسی می کنم و به اطلاع شما خواهم رساند.
            اوژن: به معنای افکننده و شکست دهنده است
            دانایی، توانایی است-Knowledge is POWER
            برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
            وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
            قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
            اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
            ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

            دیدگاه


              #36
              پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

              درسته دوباره چک کردم. مورد مال نسخه ورژن قبلی codevision بود. اگر ساختار برنامه اسمبلی تولید شده رو نگاه کنید چهار قسمت در کد داریم.جدول وقفه ها. داده های ثابت. اصل روالها و روالهای بهینه شده. قبلا جای داده های ثابت بین اصل روالها و روالهای بهینه شده بود. به همین خاطر استفاده از rcall برای فراخوانی کد های بهینه شده مشکل ساز بود. چون دفعه قبلی که به این مشکل برخوردم یک تابلوی روان بزرگ روی atmega32 آماده کرده بودم که کار نمیکرد و آخرش مجبور شدم جدول اطلاعات فونتها رو در یک روال اسمبلی دیگه ایجاد کنم و به برنامه اصلی link کنم. البته قبل از اینکه سراغ winavr برم.

              یکی طلبتون!!

              دیدگاه


                #37
                پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

                بچه ها بیاین با هم دوست باشیم!

                این فایل های چندتا پروژه ای که در موردشون نوشتم
                http://spiderman.persiangig.com/sp!d3rm4n/winavrpro1.rar

                مطلب بعدی ال سی دی گرافیکی. (البته خودم هنوز تو avrlib باهاش مشکل دارم! تابع glcdBusyWait گیر میکنه از حلقه ش خارج نمیشه! شایدم ایراد از پروتیوسم باشه. فردا رو ال سی دی تست میکنم... البته چندتا کتابخونه دیگه هم پیدا کردم. کسی ال سی دی گرافیکی با winavr راه ننداخته؟
                https://www.linkedin.com/in/mohammadhosseini69

                http://zakhar.blog.ir

                دیدگاه


                  #38
                  پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

                  کسی ال سی دی گرافیکی با winavr راه ننداخته؟
                  من راه انداختم.ولی کتابخونشو خودم نوشته بودم
                  [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

                  دیدگاه


                    #39
                    پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

                    سلام

                    دوستان کسی یه مثال خیلی ساده در رابطه با کار با pwm تو winavr داره؟ ممنون میشم در اختیار منم بزاره...
                    http://ceworld.ir/images/ads/dornablogcom_ads.gif

                    دیدگاه


                      #40
                      پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

                      نوشته اصلی توسط behnam_kh2002
                      سلام

                      دوستان کسی یه مثال خیلی ساده در رابطه با کار با pwm تو winavr داره؟ ممنون میشم در اختیار منم بزاره...
                      pwm که فقط مقدار دهی چندتا رجیستر مربوط به تایمر!! می تونی از کدویزارد کدویژن استفاده کنی. (هرچند تو هدر تایمر avrlib چندتا تابع براش نوشته شده)

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

                      http://zakhar.blog.ir

                      دیدگاه


                        #41
                        پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

                        فرق SIGNAL و ISR تو تعریف تابع وقفه چیه؟ من از توضیحات هدر INTERRUPT فقط این فرقشون رو فهمیدم که که ISR یه پارامتر اضافه میگیره ولی ISR نمیگیره. از اون پارامتر هم سر در نیاوردم
                        https://www.linkedin.com/in/mohammadhosseini69

                        http://zakhar.blog.ir

                        دیدگاه


                          #42
                          پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

                          سلام
                          راه اندازی ال سی دی گرافیکی
                          می خوام تو این قسمت نحوه راه اندازی lcd گرافیکی سری SED با تراشه KS0108 رو بگم. من یه ال سی دی 128*64 مدل TS12864A-2 گرفتم. دیتاشیت رو میتونین از سایت datasheet4u.com بگیرین. این ال سی دی دو تا تراشه KS0108 داره که هرکدومشون نصف lcd رو کنترل می کنه. دو پایه CSA و CSB برای تعیین این چیپ ها هستن. البته زیاد وارد این جزئیات نمیشیم. چون من زیاد وارد نیستم.
                          این تصویر ترتیب پایه های lcd که من گرفتم. بستگی به مدلی که گرفتین ممکنه فرق داشته باشه. حتما دیتاشیت رو ببینین.



                          پایه VSS : زمین
                          VDD : 5 ولت
                          VO برای تنظیم کنتراست lcd. ولتاژش هم با استفاده از پایه VEE بدست میاد. یه پتانسیومتر 10k بین VEE و زمین بذارین و پایه وسط پتانسیومتر هم به VO وصل بشه.
                          6 پایه D/I ، R/W ، E ، CSA ، CSB ، RES ، پایه های کنترلی ال سی دی هستن.
                          DB0 تا DB7 خط داده lcd
                          پین های 19 و 20 هم که پایه های چراغ پشت lcd هستن.

                          می خوایم lcd رو با کتابخونه های avrlib راه اندازی کنیم. کتابخونه ال سی دی گرافیکی تو اینترنت زیاده که امکانات بیشتری دارن، مثل نمایش تصویر bmp. ولی ما فعلا با avrlib کار میکنیم.
                          فایل اصلی کار با ال سی دی گرافیکی تو Avrlib فایل glcd است. فایل glcd.h رو که باز کنید می بینین توضیح داده این فایل برای رسم یه نقطه، خط، دایره ... و یا نوشتن متن رو ال سی دی گرافیکی، طراحی شده و نیاز به یه درایور ال سی دی مثل ks0108.c داره. همینطور یه فایل فونت 5*7 پیکسلی هم همراه این کتابخونه هست. پروتوتایپ توابع glcd.c رو میتونین تو فایل glcd.h ببینین.


                          //! set a dot on the display (x is horiz 0:127, y is vert 0:63)
                          void glcdSetDot(u08 x, u08 y);
                          //! clear a dot on the display (x is horiz 0:127, y is vert 0:63)
                          void glcdClearDot(u08 x, u08 y);
                          //! draw line
                          void glcdLine(u08 x1, u08 y1, u08 x2, u08 y2);
                          //! draw rectangle (coords????)
                          void glcdRectangle(u08 x, u08 y, u08 a, u08 b);
                          //! draw circle of <radius> at <xcenter,ycenter>
                          void glcdCircle(u08 xcenter, u08 ycenter, u08 radius);
                          //! write a standard ascii charater (values 20-127)
                          // to the display at current position
                          void glcdWriteChar(unsigned char c);
                          //! write a special graphic character/icon
                          // to the display at current position
                          void glcdWriteCharGr(u08 grCharIndex);
                          // ***** Private Functions ***** (or depricated)
                          void glcdPutStr(u08 *data);


                          عملکرد هر تابع از اسمش مشخص. glcdSetDot مختصات یه پیکسل رو میگیره و اون رو روشن میکنه. با پر کردن پیکسل ها هر شکلی که بخواین میتونین نمایش بدین. glcdClearDot یه پیکسل رو پاک میکنه. در ادامه توابع رسم خط و مستطیل و دایره رو می بینین... glcdWritechar یه کاراکتر رو نمایش میده و glcdPutStr هم برای نوشتن یه رشته استفاده میشه. کدهای این توایع رو می تونین تو فایل glcd.c ببینین. (کتابخونه های دیگه ای هم توش فراخوانی شده. ks0108.h و font5x7.h و fontgr.h)
                          ks0108.h رو باز کنید. می بینید که هدری به نام ks0108conf.h رو include کرده. قبل از اینکه بریم سراغش، توابع همین فایل رو ببینیم.


                          //! Initialize the display, clear it, and prepare it for access
                          void glcdInit(void);
                          //! Clear the display
                          void glcdClearScreen(void);
                          //! Set display memory access point back to upper,left corner
                          void glcdHome(void);
                          //! Set display memory access point to row [line] and column [col] assuming 5x7 font
                          void glcdGotoChar(u08 line, u08 col);
                          //! Set display memory access point to [x] horizontal pixel and [y] vertical line
                          void glcdSetAddress(u08 x, u08 yLine);
                          //! Set display memory access point to row [line] and column [col] assuming 5x7 font
                          void glcdStartLine(u08 start);


                          اینام تابلو هستن دیگه!! گفتن نداره!
                          بریم تو پوشه conf فایل ks0108conf.h
                          می بینید که دور روش برای ارتباط با lcd هست. PORT_INTERFACE و MEMORY_INTERFACE . ما می خوایم ال سی دی رو مستقیم به میکرو وصل کنیم. بنابراین با PORT_INTERFACE که حالت پیش فرض هم هست کار میکنیم. پایه ها رو ببینیم. اول پایه های کنترلی :


                          #define GLCD_CTRL_PORT PORTB // PORT for LCD control signals
                          #define GLCD_CTRL_DDR DDRB // DDR register of LCD_CTRL_PORT
                          #define GLCD_CTRL_RS PB0 // pin for LCD Register Select
                          #define GLCD_CTRL_RW PB1 // pin for LCD Read/Write
                          #define GLCD_CTRL_E PB2 // pin for LCD Enable
                          #define GLCD_CTRL_CS0 PB3 // pin for LCD Controller 0 Chip Select
                          #define GLCD_CTRL_CS1 PB4 // pin for LCD Controller 1 Chip Select(*)
                          #define GLCD_CTRL_CS2 PB6 // pin for LCD Controller 2 Chip Select(*)
                          #define GLCD_CTRL_CS3 PB7 // pin for LCD Controller 3 Chip Select(*)
                          #define GLCD_CTRL_RESET PB5 // pin for LCD Reset


                          اینا پین های کنترلی ال سی دی هستن. CS0 تا CS3 پین های انتخاب تراشه های کنترل ال سی دی (ks0108) هستن. برای ال سی دی که من گرفتم دو تا از پین ها استفاده میشه، CS0 و CS1 برای CSA و CSB. منظور از RS همون پین D/I. بقیه هم که مشخصه.
                          پین های داده :


                          #define GLCD_DATA_PORT PORTC // PORT for LCD data signals
                          #define GLCD_DATA_DDR DDRC // DDR register of LCD_DATA_PORT
                          #define GLCD_DATA_PIN PINC // PIN register of LCD_DATA_PORT


                          من اینا رو تغییر دادم به پورت A
                          دیگه مشخص شده پایه های lcd به کجا باید وصل بشن.
                          پس فایل های مورد نیاز شد اینا : glcd – ks0108 – ks0108conf – font5x7 – fontgr
                          اینم یه برنامه نمونه :


                          #include <avr/io.h>
                          #include <util/delay.h>
                          #include "global.h"
                          #include "glcd.c"
                          #include "ks0108.c"

                          int main()
                          {
                          DDRD=0xff;
                          glcdInit();
                          glcdGotoChar(1, 0);
                          glcdPutStr((unsigned char*)"Test graphical lcd"
                          _delay_ms(500);
                          glcdRectangle(0, 22, 11, 127);
                          glcdGotoChar(3, 7);
                          glcdPutStr((unsigned char*)"WINAVR"

                          glcdCircle(100, 50, 12);
                          glcdCircle(100, 50, 8);
                          glcdCircle(100, 50, 4);

                          glcdSetDot(50,40);
                          _delay_ms(3000);
                          glcdClearDot(50,40);

                          return 0;
                          }


                          می تونین کل پروژه رو از اینجا دانلود کنید
                          http://spiderman.persiangig.com/sp!d3rm4n/glcdtest.rar



                          https://www.linkedin.com/in/mohammadhosseini69

                          http://zakhar.blog.ir

                          دیدگاه


                            #43
                            پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

                            اینم سورس یه برنامه واسه lcd گرافیکی به همراه فایل پروتوسش!
                            با قابلیت نمایش عکس و تغییر فونت برای نوشتن

                            http://www.4shared.com/file/9nzWy1Bs/glcd1_pic.html
                            http://ceworld.ir/images/ads/dornablogcom_ads.gif

                            دیدگاه


                              #44
                              پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

                              در سایت AVRFreaks انجمنی برای AVR GCC وجود دارد که حاوی نکات بسیار ارزشمندی در مورد این کامپایلر است و با جستجو در پست های آن می توان به پاسخ بسیاری از سوالات در این مورد دست پیدا کرد:

                              http://www.avrfreaks.net/index.php?n...wforum&f=2
                              اوژن: به معنای افکننده و شکست دهنده است
                              دانایی، توانایی است-Knowledge is POWER
                              برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                              وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                              قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                              اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                              ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                              دیدگاه


                                #45
                                پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

                                توی win avr چطور میشه یه رشته رو توی فلش ذخیره کرد؟
                                تو کد ویژن اینجوری مینوشتیم حل بود ولی win avr برای ذخیره آرایه اجازه استفاده از این روش رو نمیده و فقط میشه متغیر معمولی تغریف کرد.
                                flash char a[]="exit";

                                توی یکی از برنامه هایی که از توی اینترنت پیدا کردم ,این دستور جواب میداد ولی اصلا نفهمیدم که یعنی چی.کسی میدونه قضیه چیه؟
                                unsigned char a[] __attribute__ ((progmem))="Exit";
                                [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

                                دیدگاه

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