اطلاعیه

Collapse
No announcement yet.

آموزش winavr و avrlib

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

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

    من کی گفتم winavr نمیتونه؟
    اصلا winavr و iar فعلا کامپایلر های xmega در دسترس ما هستند
    دیدم نمیتونم یادش بگیرم رفتم سراغ IAR

    دیدگاه


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

      نوشته اصلی توسط reza_agha
      ... ادامه اش....

      یه چیز خیلی خیلی خیلی خیلی خیلی .... مهم هم فراموش نشه!

      هر تحریکی (صفحه کلید. یک سیگنال. دریافت یک بایت از سریال و غیره) یک زمان مفید برای چک کردن داره. فرض کنیم کیپد. کاربر هر چقدر هم که تند و تیز باشه نمیتونه بیش از 5 تا 10 کاراکتر در ثانیه تایپ کنه و زمان فشار دادنش هم حتما حداقل 50 میلی ثانیه طول میکشه. پس زمان چک کردن کیپد میتونه بین 1 تا 20 میلی ثانیه باشه. بیش از این وقت تلف کردنه.

      مثال دیگه! فرض کنیم از وقفه سریال استفاده نکنیم. سرعت خطمون هم 9600 باشه. یعنی حداکثر هر 1.2 میلی ثانیه یک بایت دریافت میشه (حد نهایی سرعت خط) پس اگه هر 20 میکرو ثانیه خط رو چک کنیم که آیا دیتایی اومده یا نه 59/60 مواقع داریم وقت تلف میکنیم.

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

      "این تیکه رو دیگه مطمئنم که نه خودم و نه شما هیچ کدوم نفهمیدیم!!!"
      من اون تیکه ای که گفتین کد رو درست کنم ( برای جاهای قرمز) درست کردم و کد هم کار کرد .
      ولی هم چنان بعضی مواقع وقتی تایپ می کنم علامت "-" ( یک خط کوچیک) جای کاراکتر میفته که نمی دونم از چیه !
      و یک سوال بسیار بسیار مهم !
      شما اینجا کلی من و تنبیه غیر بدنی کردین که چرا وقت این آقای میکرو رو دارم هدر میدم !
      الان اگه من یک تایمر میزاشتم ، هر از چند گاهی این تایمره میرفت و کیپد رو خودش چک می کرد و اگر کلیدی فشار داده میشد اونو میریخت داخل متغیر .
      ولی الان من یک شرط گذاشتم و اون اینه که تا اگر یکی از پایه های P0 الی P3 صفر نشدن به تابع مربوط به کی پد نره و کی پد رو چک نکنه !
      تو این کار کیپد وقتی کلیدی فشار داده بشه چک میشه ولی تو کار شما هر از چند گاهی بسته به تایمر هی کلید رو چک می کنه
      برنامه شما بیشتر وقت میکرو رو تلف می کنه یا مال من ؟
      مگر اینکه من اینبار هم با تحلیل بسیار پیشرفته خودم ترکونده باشم .

      دیدگاه


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

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

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

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

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

        این روال دقیقا همون روالیه که در سیستم عامل های مرسوم روی PC استفاده میشه. درسته که خیلی از کارهایی که روی PC انجام میشه بنظر بیخودی میاد ولی کسی اینا رو بخاطر بیخودی بنظر اومدنشون حذف نمیکنه چون شالوده هایی رو ایجاد میکنن که میشه کد مطمئن تری نوشت.

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

        دیدگاه


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

          کسی نگفت من چجوری باید با WinAVR کار کنم؟
          در مورد این یه مقدار توضیح بدید

          دیدگاه


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

            نوشته اصلی توسط شهریار رجب زاده
            کسی نگفت من چجوری باید با WinAVR کار کنم؟
            در مورد این یه مقدار توضیح بدید
            با اجازه اساتید GCC ،
            تو پستهای اول توضیح داده شده ، ولی محض احتیاط یک بار هم من میگم
            اول winavr رو نصب می کنین و بعد هم AVR Studio رو
            نکته مهم اینه که فکر کنم AVR Studio بعد از نسخه 4 که gcc رو ساپورت می کنه !
            یعنی شما باید هر 2 نرم افزار آخرین نسخه رو داشته باشید .
            حالا AVR Studio رو باز می کنیم
            از منو گزینه Project و بعد new project رو انتخاب می کنید .

            بعد در این پنجره باید گزینه دوم AVR GCC را انتخاب کنید . سپس نام فایل و نام پوشه و ... را انتخاب و بر روی دکمه Next کلیک کنید .

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

            حالا بر روی finish کلیک کنید تا مراحل تمام بشه
            و در آخر بایستی فرکانس کاری میکروتون رو مشخص کنید . برای این کار باید وارد configuration option بشید . چند راه برای این کار وجود داره که در عکس زیر نشون داده شده

            در این صفحه بایستی فرکانس کاری میکرو به هرتز در مقابل Frequency بنوسیسد و روی دکمه ok کلیک کنید .


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


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


            فایل HEX شما هم در پوشه ای که انتخاب کردید درون پوشه default موجود هست .

            این تنظیمات ،آ‌کمترین تنظیمات جهت کار با نرم افزار هست . تنظیمات پیشرفته دیگه ای هم هستند که تو همین تاپیک بحث شده و یا اینکه خودتون می تونین به راحتی با کمی جست جو اونارو پیدا کنین .
            لازم به ذکره من اطلاعاتم در این زمینه کمه و اگر اشتباهی هم رخ داده من رو به بزرگی خودتون ببخشید

            دیدگاه


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

              راستی!
              من اصلا نه به کار کد ویژن اعتقادی دارم و نه ازش خوشم میاد ولی معمولا برای راحتی (بهتر بگیم: رفاه زدگی) بیشتر از کد ویزاردش استفاده میکنم تا پترن های رجیستر هاشو بگیرم و بعد میندازمش دور و کد خودم رو مینویسم.

              دیدگاه


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

                دست گل همتون درد نکنه ><
                حالا آقا رضا ، می خوام یه pwm راه بندازم برای کنترل دور موتور
                یه مطالعه دقیق کردم در موردشو کلا فهمیدم چجوریاست .
                الان میکروی atmega8 رو بستم و چون با رجیسترهای میکرو نتونستم ارتباط برقرار بکنم از شما درخواست کمک دارم
                یه توضیحی در مورد برنامه نویسی pwm بدید
                ممنون

                دیدگاه


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

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

                  دیدگاه


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

                    نوشته اصلی توسط reza_agha
                    این یکی رو شرمنده. من خودم هم با PWM کار نکردم. اطلاعاتی بطور کلی دارم ولی فکر کنم از یکی دیگه بطور اصولی بگیرین بهتر باشه.
                    دست گلتون درد نکنه
                    دیتاشیتای اتمل به شدیدترین وضع ممکن توضیحاتشون رو دادند ! به قول یکی از دوستان متن توضیحاتش بصورت اسمبلیه
                    من نوشتم و کار هم کرد . با 2 تا کلید هم سرعت موتور رو کم و زیاد کردم

                    int main()
                    {
                    int x=60;
                    PORTB=0x00;
                    DDRB=0x02;
                    TCCR1A=0x81;
                    TCCR1B=0x0B;
                    ACSR=0x80;
                    DDRD=0b0000000;
                    PORTD=0b00000011;
                    sei();
                    while(1){
                    OCR1AL=x;
                    if ((avr(PIND).P0==0)&&(x!=255)){_delay_ms(20 );while(avr(PIND).P0==0){}; x=x+5;}
                    if ((avr(PIND).P1==0)&&(x!=60)){_delay_ms(20) ; while(avr(PIND).P1==0){}; x=x-5;}
                    }
                    }



                    الان می خواستم روی lcd یک سری کاراکترهای دلخواه رو بنویسم ( فارسی )
                    یک جاییش اینارو نوشته :

                    // loads a special user-defined character into the LCD
                    // <lcdCustomCharArray> is a pointer to a ROM array containing custom characters
                    // <romCharNum> is the index of the character to load from lcdCustomCharArray
                    // <lcdCharNum> is the RAM location in the LCD (legal value: 0-7)
                    void lcdLoadCustomChar(u08* lcdCustomCharArray, u08 romCharNum, u08 lcdCharNum);


                    نتونستم استفاده بکنم ! میشه توضیح بدین ؟

                    دیدگاه


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

                      lcd های متنی مرسوم دارای یک سری 8 تایی از کاراکتر های قابل تغییر (شکلی) هستن. فقط کافیه در یک پترن 5 در 7 نقطه (5 نقطه عرض و 7 نقطه ارتفاع) پترنی رو که میخوایین در هنگام نمایش کد کاراکتر مربوطه نمایش داده بشه طراحی کنین و با این فرمانهای کذایی به lcd انتقال بدین. فقط توجه کنین: با اینکه ما فقط 8 کاراکتر قابل تعریف داریم ولی در دیتاشیت به 16 کاراکتر اشاره شده (کد 0 تا 15). شما مخیر هستین کاراکتر صفر یا کاراکتر 8 رو تعریف کنین. جفتش یک شکله. (حدس میزنم بخاطر اینه که اگه خواستین کاراکتری مثلا 9 به عنوان tab استفاده بشه 1 رو تعریف کنین و در چاپ امکان استفاده از کد 9 به همراه شکل 1 رو داشته باشین.)
                      پارامتر ها:
                      1- lcdCustomCharArray آدرس اولین بایت پترن کذایی در فلش. (آخه کدوم آدم عاقلی داده های ثابت رو میذاره توی RAM؟)
                      2- برای راحتی کار اولا در avrlib هر کاراکتر 8 بایت داده داره. (یک بایت اضافه حروم کرده فقط برای محاسبه راحتتر آدرس پترن کاراکتر). ثانیا شما میتونین چندین و چند کاراکتر رو تعریف کنین تا هر کدوم رو که خواستین در هر زمانی در lcd دانلود کنین. پارامتر romCharNum اندیس این لیسته.
                      3- پارامتر lcdCharNum هم مقداری بین 0 تا 7 داره. همون 8 تای قابل تعریف.

                      دیدگاه


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

                        نوشته اصلی توسط reza_agha
                        lcd های متنی مرسوم دارای یک سری 8 تایی از کاراکتر های قابل تغییر (شکلی) هستن. فقط کافیه در یک پترن 5 در 7 نقطه (5 نقطه عرض و 7 نقطه ارتفاع) پترنی رو که میخوایین در هنگام نمایش کد کاراکتر مربوطه نمایش داده بشه طراحی کنین و با این فرمانهای کذایی به lcd انتقال بدین. فقط توجه کنین: با اینکه ما فقط 8 کاراکتر قابل تعریف داریم ولی در دیتاشیت به 16 کاراکتر اشاره شده (کد 0 تا 15). شما مخیر هستین کاراکتر صفر یا کاراکتر 8 رو تعریف کنین. جفتش یک شکله. (حدس میزنم بخاطر اینه که اگه خواستین کاراکتری مثلا 9 به عنوان tab استفاده بشه 1 رو تعریف کنین و در چاپ امکان استفاده از کد 9 به همراه شکل 1 رو داشته باشین.)
                        پارامتر ها:
                        1- lcdCustomCharArray آدرس اولین بایت پترن کذایی در فلش. (آخه کدوم آدم عاقلی داده های ثابت رو میذاره توی RAM؟)
                        2- برای راحتی کار اولا در avrlib هر کاراکتر 8 بایت داده داره. (یک بایت اضافه حروم کرده فقط برای محاسبه راحتتر آدرس پترن کاراکتر). ثانیا شما میتونین چندین و چند کاراکتر رو تعریف کنین تا هر کدوم رو که خواستین در هر زمانی در lcd دانلود کنین. پارامتر romCharNum اندیس این لیسته.
                        3- پارامتر lcdCharNum هم مقداری بین 0 تا 7 داره. همون 8 تای قابل تعریف.
                        آقا رضا میشه یه مثالی بزنین !
                        باز مخ ما هنگ کرد :(

                        دیدگاه


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

                          تنها نیستین. من خودم وقتی یه چیزی رو تو هوا برام میگن این حالی میشم. ولی بذارین یه قسمت از دیتا شیت که نه. راهنمای این lcd ها رو براتون بذارم. (مسخره هست! هنوز یاد نگرفتم فایل پ کنم!)




                          عکس اول لیست کاراکتر های موجود در lcd ها رو نشون میده. اگه دقت کنین میبینین که هیچ کاراکتری بیش از یک مستطیل 7 سطری و 5 ستونی جا نمیگیره.
                          عکس دوم نشون میده چطوری میتونین یک شکل رو تعریف کنین. هر سطر یک بیت پترن میشه که فقط 5 بیت پایینیش استفاده میشه. این پترن ها در هر سطر به معادل عددیش تبدیل میشه و تحویل lcd میشه. اما ما اینجا 7 بایت داریم. در avrlib برای اینکه بتونه آدرس یک پترن کاراکتر رو در لیستی از این اشکال راحتتر حساب کنه یه بایت اضافی ته هر 7 بایت میذاره که استفاده ای نداره و فقط باعث میشه نقاشی هر کاراکتر 8 بایت جا بگیره (عوض اینکه ضرب در 8 کنه؛ سه شیفت به چپ میده).

                          حالا چرا میشه مثلا 40 کاراکتر داشت ولی 8 کاراکتر بیشتر جا نیست؟ شما میتونین کاراکتری رو که روی صفحه در حال نمایش دادن رو مرتب بازسازی (تعریف) کنین تا با استفاده از یک کاراکتر انیمیشن ایجاد کنین.

                          دیدگاه


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

                            آقا رضا متوجه شدم که چجوری میشه !
                            منظورم از مثال ، مثال برنامه ای بود .
                            الان تو کد نویسی چجور به کار ببرم ! موفق نشدم تو برنامه استفاده بکنم
                            میشه با یک مثال ، نشون دادن یک سمیبول تو lcd نشون بدین ؟
                            به قول خودمون عملی نشون بدین

                            دیدگاه


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

                              راسیتش الان خیلی سرم شلوغه! واقعا شرمنده. اما اگه یک سری به سورس avrlib بزنین کلی چیزا دستگیرتون میشه. مثلا lcd.c

                              دیدگاه


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

                                سر زدیم ! متأسفانه سردرگم تر شدیم !
                                اگر میشه شما یا دوستان هر موقع وقت کردید یه مثال از این کتابخونه lcd برای ساخت فونت دلخواه بزنین

                                دیدگاه

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