اطلاعیه

Collapse
No announcement yet.

آموزش winavr و avrlib

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

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

    نوشته اصلی توسط reza_agha
    اولا یادتون رفته TCNT0 رو مقدار دهی کنین. ثانیا میشه اینکارو هم کرد:


    volatile short key;

    ISR(TIMER0_OVF_vect)
    {
    static unsigned short old_pat = 0xFFFF;
    static unsigned char dbnc;
    unsigned short pat = 0;
    unsigned char bit;

    TCNT0 = 0xE8;

    DDRB = 0xFF;
    for(bit=0x10; bit; bit<<=1)
    {
    PORTB = ~bit;
    pat = (pat << 4) | ((~PINB) & 0x0F);
    }
    if( pat != old_pat )
    {
    old_pat = pat;
    dbnc = 50;
    }
    else
    {
    if( dbnc )
    {
    dbnc--;
    if( dbnc == 0 )
    {
    switch(old_pat)
    {
    case 0x0001: key = 0; break;
    case 0x0002: key = 1; break;
    case 0x0004: key = 2; break;
    case 0x0008: key = 3; break;
    .....continue to 15
    default: key = -1; break;
    }
    }
    }
    }
    }



    main()
    {
    .....

    for(;
    {
    if( key != -1 )
    {
    PORTD = key;
    key = -1;
    }
    }
    }


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

    دیدگاه


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

      ّرنامه ای که شما دادید کامپایل یمشه ! ولی صالا کار نمی کنه ! :(

      دیدگاه


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

        عرض کردم هول هولکی بود. اگه کامپایل هم میشد من خودمم تعجب میکردم. خواستم ایده کلی رو نشون بدم.
        اولا فرض بر اینه که بایستی یک پترن از کلید ها حداقل برای 50 میلی ثانیه بدون تغییر وجود داشته باشه تا بشه به عنوان یک پترن صحیح ازش استفاده کرد. از طرف دیگه شما یک صفحه کلید 4 در 4 دارین پس در چهار بار خوندن هر دفعه 4 بیت (یا یک ستون) خونده میشه. این از بابت حلقه اول کار.
        برای stable شدن وضعیت کلید ها یک تایمر نرم افزاری با متغیر dbnc ساخته شده که در صورت تغییری در ورودی ها این تایمر ریست میشه. یعنی این متغیر تنها ئذ صورتی صفر میشه که در طول 50 میلی ثانیه وضعیت کلید ها تغییری نکنه. به محض اینکه این متغیر صفر شد (نه همیشه که صفر هست. فقط زمانی که صفر بشه) هر بیت نشوندهنده یک کلید هست. توی اون switch میشه تشخیص داد که کدوم کلید یا چه کلید هایی با هم فشار داده شده.

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

        دیدگاه


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

          دوستان اگر من یک برنامه در winavr بنویسم این نرم افزار برنامه را کامپیال میکند؟
          در winavr میشود به زبان c++ برنامه برای avr نوشت؟

          با تشکر

          دیدگاه


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

            نوشته اصلی توسط masoodhashemy
            دوستان اگر من یک برنامه در winavr بنویسم این نرم افزار برنامه را کامپیال میکند؟
            در winavr میشود به زبان c++ برنامه برای avr نوشت؟
            با تشکر
            بله این نرم افزار یک کامپایلر برای زبان های c و ++c هست

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


            #include <avr/io.h>
            #include <util/delay.h>
            #include "avrlibdefs.h"
            #include <avr/interrupt.h>
            #include "lcd.c"

            int main()
            {

            DDRB=0b11110000;
            PORTB=0b00001111;
            PORTD=0b10000000;
            DDRD=0b01111111;

            while(1){


            char *str = "Test LCD!";
            lcdInit();
            lcdPrintData(str, 9);
            _delay_ms(2000);
            lcdGotoXY(0,1);
            lcdPrintData("avr gcc", 7);
            _delay_ms(5000);
            lcdClear();
            }

            }




            دیدگاه


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

              نوشته اصلی توسط atm8
              بله این نرم افزار یک کامپایلر برای زبان های c و ++c هست

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


              #include <avr/io.h>
              #include <util/delay.h>
              #include "avrlibdefs.h"
              #include <avr/interrupt.h>
              #include "lcd.c"

              int main()
              {

              DDRB=0b11110000;
              PORTB=0b00001111;
              PORTD=0b10000000;
              DDRD=0b01111111;

              while(1){


              char *str = "Test LCD!";
              lcdInit();
              lcdPrintData(str, 9);
              _delay_ms(2000);
              lcdGotoXY(0,1);
              lcdPrintData("avr gcc", 7);
              _delay_ms(5000);
              lcdClear();
              }

              }


              سلام اگه از Avrlib استفاده میکینی زیاد فشار نیار به هیچ وجه اجرا نمیکنه؟
              اگه میخوای اجراکنی از کتابخونه کویر الکترونیک استفاده کن
              منم خیلی دنبال این موضوع بودم اما تا حالا چیزی دستگیرم نشد

              دیدگاه


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

                کد اصلی مشکل داره ؟ یا فقط با پروتئوس مشکل داره ؟

                الان من می خوام یه عدد رو با کی پد بنویسم ( یه عدد چند رقمی ) بعد تو LCD هم نمایش بدم و بعد از اون با زدن دکمه ENTER ( یکی از دکمه های می پد ) اون عدد بره داخل یه SWITCH CASE تا طبق عدد چند تا کار مختلف انجام بده .
                مثلا عدد 22 فلان کار ، 125 فلان کار و ...
                می خوام با زدن هر عدد یک کاری انجام بشه
                تو اونق سمت موندم که چجوری عدد بلند بدم به LCD اون طرف تحویل بگیرم !

                دیدگاه


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

                  سلام
                  چرا دیگه تو این تاپیک کسی چیزی یاد نمیده !
                  یک سوال اساسی بپرسم حال و هوای تاپیک برگرده ، که فکر می کنم به غیر خودم همه بلدن !
                  من با همین آموزشای این تاپیک رفتم جلو کی پد و lcd و ... الان رسیدم به جایی که می خوام مقداری که از کی پد میگیرم هم باهاش یه کارایی بکنم و هم اینکه تو lcd نشون بدم .
                  نمی دونم چرا توابعی که مینویسم همه چرندیات تحو.یل میدند !
                  چجور این int رو تو char بزارم و تو lcd نشون بدم
                  ممنون از شما

                  دیدگاه


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

                    دست گل همگی درد نکنه
                    بالاخره راش انداختم



                    int key=0;

                    int keypad(){

                    PORTF=0b11101111;
                    _delay_ms(10);
                    if (avr(PINF).P0==0){ _delay_ms(20);while(avr(PINF).P0==0){}; return 10;}//f1
                    if (avr(PINF).P1==0){ _delay_ms(20);while(avr(PINF).P1==0){}; return 3;}//3
                    if (avr(PINF).P2==0){ _delay_ms(20);while(avr(PINF).P2==0){}; return 2;}//2
                    if (avr(PINF).P3==0){ _delay_ms(20);while(avr(PINF).P3==0){}; return 1;}//1


                    PORTF=0b11011111;
                    _delay_ms(10);
                    if (avr(PINF).P0==0){ _delay_ms(10);while(avr(PINF).P0==0){}; return 11;}//f2
                    if (avr(PINF).P1==0){ _delay_ms(10);while(avr(PINF).P1==0){}; return 6;}//6
                    if (avr(PINF).P2==0){ _delay_ms(10);while(avr(PINF).P2==0){}; return 5;}//5
                    if (avr(PINF).P3==0){ _delay_ms(10);while(avr(PINF).P3==0){}; return 4;}//4

                    PORTF=0b10111111;
                    _delay_ms(10);
                    if (avr(PINF).P0==0){ _delay_ms(10);while(avr(PINF).P0==0){}; return 12;}//f3
                    if (avr(PINF).P1==0){ _delay_ms(10);while(avr(PINF).P1==0){}; return 9;}//9
                    if (avr(PINF).P2==0){ _delay_ms(10);while(avr(PINF).P2==0){}; return 8;}//8
                    if (avr(PINF).P3==0){ _delay_ms(10);while(avr(PINF).P3==0){}; return 7;}//7


                    PORTF=0b01111111;
                    _delay_ms(10);
                    if (avr(PINF).P0==0){ _delay_ms(10);while(avr(PINF).P0==0){}; return 13;}//m
                    if (avr(PINF).P1==0){ _delay_ms(10);while(avr(PINF).P1==0){}; return 14;}//enter
                    if (avr(PINF).P2==0){ _delay_ms(10);while(avr(PINF).P2==0){}; return 0;}//0
                    if (avr(PINF).P3==0){ _delay_ms(10);while(avr(PINF).P3==0){}; return 15;}//prog


                    return -1;
                    }


                    int main()
                    {

                    DDRB=0b11111111;
                    PORTB=0b00000000;
                    DDRF=0b11110000;
                    PORTF=0b00001111;
                    PORTD=0b10000000;
                    DDRD=0b01111111;
                    lcdInit();
                    int x;
                    char b[1];
                    lcdClear();
                    lcdGotoXY(0,0);
                    while(1){

                    if ((avr(PINF).P0==0)||(avr(PINF).P1==0)||(avr(PINF). P2==0)||(avr(PINF).P3==0)){

                    x=keypad();
                    if (x==13){lcdClear();
                    lcdGotoXY(0,0);}
                    else {
                    sprintf( b, "%d", x );
                    lcdPrintData(b, 1);
                    }
                    DDRF=0b11110000;
                    PORTF=0b00001111;
                    _delay_ms(50);

                    }
                    }
                    }


                    یه تیکه از کد رو قرمز کردم
                    وقتی اون DDRF و PORTF نمیزارم ، دیگه کی پد هنگ می کنه ! هر ستونی رو که اولین بار تحریک بکنیم ، دیگه فقط اون ستون از کی پد رو می خونه و بقیه غیر فعال میشند ! مگر با گذاشتن این کدها
                    و اون تأخیر ، اگر اون تأخیر رو نزارم ، هر موقع که کلیدهارو فشار میدم هر از چند گاهی یه علامت "-" بین خطوط میفته . آخه چرا باید یک خط بیف خطوط بیفته ؟
                    نمی دونم این 2 تا اتفاق چرا میفتن و چرا با این کدها این توطئه خنثی میشه و الان مثل روغن دارن کار می کنند .

                    فقط دیگه کسی چرا به این تاپیک سر نمیزنه :cry:

                    دیدگاه


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

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

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

                      2- از من میشنوین یک سری به کتابهایی با عناوینی مثل "Data Structure" و "Multi-Threading" بزنین. خیلی دیدتون رو باز میکنه. این کاری که شما در روال keypad کردین یه کمی یه جوراییه. میشه یک بافر حلقوی تعریف کرد و در این روال یا همون روال وقفه تایمر (که کیپد رو چک میکنه) کد انجام عملیات رو درون اون بافر ذخیره کرد تا هر وقت این روال صدا زده میشه فقط چک کنه که آیا عملی هست که انجام بده؟ اگر اینطوره انجامش بلده و گرنه سریعا به کارای مونده اش برگرده.

                      یادتون باشه میکروی شما قدرت آنچنانی در پردازش نداره. پس جایی که دارین delay رو صدا میکنین خیلی احتمال داره که دارین کدتون رو بصورت بد مینویسین. delay یعنی "آهای سی پی یو! وقتتو تلف کن!" ما وقتی نداریم که بخواییم تلف کنیم!
                      از طرف دیگه ممکنه روال های شما در پروتئوس جواب بده (جواب تئوری) اما در عمل زیرش بزاد. مثلا شما در این برنامه bouncing رو لحاظ نکردین. بنا بر این مجبورین با اون تاخیر 20 میلی ثانیه ای این نقیصه رو برطرف کنین. اگه روال خوندن کیپد رو با استفاده از وقفه تایمر مینوشتین دیگه این مورد احتیاجی نبود که در کد اصلی تون پیاده بشه.

                      3- مشکل عمده دیگه ای که وسط هست اینه که کد های دسترسی به سخت افزار خارجی تون جزئی از کد اصلی تونه. و این یعنی اختلاط که تفسیر شما از منطق اصلی تون رو دچار اشکال میکنه. لطف کنین برای اینجور مواقع کد دسترسی به سخت افزار رو جدای از کد اصلیتون بنویسین و مهمتر از همه اینکه این تیکه های کد که قراره چیزی رو تغییر بدن که چیز جای دیگه ای استفاده میشه؛ در انتهای مسیر اون چیز به وضعیت اولیه خودش برگرده.
                      مثلا در روال keypad شما آخرین مقداری که روی PORTF میذارین برابر هست با 0b01111111 در صورتیکه مقدار اولیه و پیش فرض این پورت طبق کد اولیه شما برابر هست با 0b00001111 و این یعنی شما در انتهای روال keypad پورت F رو در وضعیتی غیر معمول قرار دادین. در انتهای روال keypad مقدار PORTF=0b00001111; رو بذارین تا احتیاجی به اون دو مقدار دهی قرمزتون نباشه.

                      دیدگاه


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

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

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

                        نوشته اصلی توسط reza_agha
                        2- از من میشنوین یک سری به کتابهایی با عناوینی مثل "Data Structure" و "Multi-Threading" بزنین. خیلی دیدتون رو باز میکنه. این کاری که شما در روال keypad کردین یه کمی یه جوراییه. میشه یک بافر حلقوی تعریف کرد و در این روال یا همون روال وقفه تایمر (که کیپد رو چک میکنه) کد انجام عملیات رو درون اون بافر ذخیره کرد تا هر وقت این روال صدا زده میشه فقط چک کنه که آیا عملی هست که انجام بده؟ اگر اینطوره انجامش بلده و گرنه سریعا به کارای مونده اش برگرده.
                        این بافر حلقه چیه ؟
                        این کتابهایی که میگین فارسیش هم هست ؟


                        نوشته اصلی توسط reza_agha
                        از طرف دیگه ممکنه روال های شما در پروتئوس جواب بده (جواب تئوری) اما در عمل زیرش بزاد. مثلا شما در این برنامه bouncing رو لحاظ نکردین. بنا بر این مجبورین با اون تاخیر 20 میلی ثانیه ای این نقیصه رو برطرف کنین. اگه روال خوندن کیپد رو با استفاده از وقفه تایمر مینوشتین دیگه این مورد احتیاجی نبود که در کد اصلی تون پیاده بشه.
                        این bouncing مگه همین مقداری زمان برای گرفتن لرزش کلید نیست ؟
                        این وقفه تایرم هم مگه هر از چند گاهی هی این کی پد رو چک نمی کنه ؟ خوب خودش کلی کار اضافه نمیشه ؟

                        نوشته اصلی توسط reza_agha
                        3- مشکل عمده دیگه ای که وسط هست اینه که کد های دسترسی به سخت افزار خارجی تون جزئی از کد اصلی تونه. و این یعنی اختلاط که تفسیر شما از منطق اصلی تون رو دچار اشکال میکنه. لطف کنین برای اینجور مواقع کد دسترسی به سخت افزار رو جدای از کد اصلیتون بنویسین و مهمتر از همه اینکه این تیکه های کد که قراره چیزی رو تغییر بدن که چیز جای دیگه ای استفاده میشه؛ در انتهای مسیر اون چیز به وضعیت اولیه خودش برگرده.
                        مثلا در روال keypad شما آخرین مقداری که روی PORTF میذارین برابر هست با 0b01111111 در صورتیکه مقدار اولیه و پیش فرض این پورت طبق کد اولیه شما برابر هست با 0b00001111 و این یعنی شما در انتهای روال keypad پورت F رو در وضعیتی غیر معمول قرار دادین. در انتهای روال keypad مقدار PORTF=0b00001111; رو بذارین تا احتیاجی به اون دو مقدار دهی قرمزتون نباشه.
                        این تیکه آخر رو فهمیدم ،
                        فقط چجوری باید کدهای مربوط به سخت افزار رو از کد اصلی جدا بکنم ؟

                        دیدگاه


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

                          بابت سطر اول: خوب الحمدالله! پس همدردیم!

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

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

                          استفاده از وقفه سخت افزاری هم:
                          1- احتیاج به سخت افزار اضافه هست.
                          2- یک وقفه و حداقل یک پین رو اضافی مصرف میکنه.

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

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

                          در مورد کتابها! چی میشه یه کمی پز دو تا لغت انگلیسی رو بدم؟!!
                          کتاب ساختمان داده ها در C یا پاسکال یا هر زبون دیگه. و یکی هم کتابهایی که راجع به مفهومهایی مثل چند برنامه گی و multi-tasking توضیح میدن.

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

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

                          .....ادامه داره....

                          دیدگاه


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

                            ... ادامه اش....

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

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

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

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

                            "این تیکه رو دیگه مطمئنم که نه خودم و نه شما هیچ کدوم نفهمیدیم!!!"

                            دیدگاه


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

                              ببخشید یهویی میام وسط :redface:
                              این چند وقته به خاطر XMEGA مونده بودم بیام سراغ IAR یا WinAVR همینکه این تاپیک رو دیدم گفتم WinAVR هیچی دیگه باید رفت سراغ IAR الآنم با IAR شروع کردم به یه جاهایی رسیدم ولی گفتم یادگیری WinAVR هم خالی از لطف نیست
                              ولی چند تا چیز رو تا حالا نفهمیدم اونم ایناست:
                              کجای WinAVR میشه برنامه نوشت؟
                              توی WinAVR میشه به هر زبانی نوشت؟
                              آموزشی که گذاشتید خیلی پیشرفته است من که هیچی نفهمیدم فکر کنم بقیه هم که نمیان وسط یا نیازی ندارند و نمیخواهند رو کنند یا هیچی نمیفهمند آخه WinAVR خیلی قویه(البته استثنا هم بین افراد وجود داره)
                              من خیلی وقته WinAVR و AVRStudio رو نصب کردم ولی هر بار میام سراغش گیج تر میشوم
                              میشه یه آموزش در مورد کار با WinAVR بزارید؟!
                              با تشکر از اینکه به سوالام جواب میدید
                              فکر کنم پست بالا رو با تمام بی سوادیم تا حدی فهمیدم :rolleyes:

                              دیدگاه


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

                                WinAVR یه کامپایلر مبتنی بر GCC هست. یا بهتر بگیم یک نسخه پورت شده از کامپایلر GCC روی پلاتفرم AVR.
                                WinAVR کامپایلرش مهمه. یک سری ابزار هم همراهش هست ولی من یکی عادت دارم AVRStudio رو نصب کنم و GCC رو توی اون استفاده کنم. خیلی راحتتره. بعدشم کامپایلرهای GCC کامپایلر های خیلی قویی هستن. و چون multi-target هم هستن برای اغلب پروسسورها شما نیازی به یاد گرفتن کار با کامپایلر های متفاوت نیستین.
                                البته این با استفاده از یک کامپایلر تجاری مانند IAR ؛ خوب خیلی فرق میکنه.
                                ضمنا من خودم با XMEGA کار نکردم ولی ممکنه لطف کنین توضیح بدین این XMEGA جز در اضافه شدن یک دستورالعمل و امکانات جنبی و گرید سرعتی چه فرق عمده ای با AVR های دیگه داره که مجبورین برین سراغ IAR و WinAVR از پسش بر نمیاد؟
                                یادتون باشه که WinAVR پروگرامر نیست. پس پای نحوه پروگرام کردن رو وسط نکشین.

                                دیدگاه

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