اطلاعیه

Collapse
No announcement yet.

آموزش winavr و avrlib

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

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

    نوشته اصلی توسط hamidrx7
    سلام به همه دوستان
    لطفا اگه کسی در مورد ساخت makefile چیزی میدونه اینجا مطرح کنه
    مشکلم اینه که وقتی میخوام با avrlib کار کنم نمیتونم درست makefile و ادیت کنم و همش تو کامپایل error میده
    makefile هایی که تو خود example های avrlib هست خیلی خوب و بدون نیاز به کپی کردن همه فایل ها کنار پروژه اونها را کامپایل میکنه
    لطفا کمک کنید
    سلام
    کار خاصی نباید بکنی اگر از mfile استفاده کنید می تونید تو قسمتی که سورس فایل های سی رو نعرفی می کنید آدرس رو بدید و دیگه مشکل نداره
    اگر می تونید فایل ها رو یکی یکی داخل پوشه خود نرم افزار بذارین که خیلی بهتره منتها یه مشکلی اینجا هست اگه با pn بخواین فایل مثال مربوط به کتابخونه avrlib رو که همراهش هست compile کنید با خطا مواجه میشین علت دقیق شو نمی دونم اما اگر کلیه کتابخونه های فراخونی شده رو از *.h به *.c تغییر بدین مشکل حله ( اگه خطای برنامه مربوط به شناخت عناصری مثل پیدا نکردن مرجع تابع LCDinit()هست، در حالی که کتابخونه lcd اضافه شده باشه راه حل همینه)

    دیدگاه


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

      شاید هم راه حل بهترش این باشه که کد های avrlib رو کامپایل کنین و با ابزار مورد نیاز خودش (اگه اشتباه نکنم ar) داخل lib های winavr قرار بدین!

      دیدگاه


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

        آموزش winavr تموم شد؟ من یه سوال بپرسم تا یکم بحث دوباره راه بیافته. :agree:
        چطور میتونیم محتوای یه تابع رو با اسمبلی بنویسیم؟مثلا :
        int sum(unsigned char a,unsigned char b)
        {
        \\asm codes are here
        {
        سوال من این نیست که کد اسمبلی برای جمع کردن چیه!! مشکل اینجاست که متغییر aوb رو چطور توی ریجستر های working بیارم و اصلا از کدوم ریجستر ها میتونم استفاده کنم؟خود میکرو کدوم ها رو برمیداره و کدوم خالی؟
        از متغیر های 16 بیتی x-y-z کدومشون قابل استفاده هستند؟
        [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

        دیدگاه


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

          من یه مدته فرصت نمیکنم تو سایت فعالبت کنم. فقط میام یه سری میزنم ...
          در مورد اسمبلی باید reza_agha بگه. قرار بود نوشتن بلوک های اسمبلی رو آموزش بده ولی ادامه داده نشد...
          https://www.linkedin.com/in/mohammadhosseini69

          http://zakhar.blog.ir

          دیدگاه


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

            کس دیگه ای نیست جواب بده؟
            آقا رضا شما هم نیستید!! :cry2:
            [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

            دیدگاه


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

              nongnu.org/avr-libc/user-manual/inline__asm.html
              هیشکی بهتر از این منوال نمیتونه پاسخ پرسشتو بده!
              {خلاف قوانین - امضا ویرایش شد}

              دیدگاه


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

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

                دیدگاه


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

                  سلام
                  دیدم تایپک از رونق افتاده گفتم یه هلی بدم شاید دوباره راه افتاد.
                  اول خودم داشتم از کل موضوعات یه منبع برای خودم درست می کردم ناخداگاه یه مروری هم روی گفتگوها داشتم بعضی ها رو دیدم اشکالات هنوز برطرف نشده گفتم اینجا بگم شاید حل بشه!(شاید یکی دوسال دیگه کسی دنبال این موضوع بیاد و براش این سوالات پیش بیاد، این اتفاق برای خودم افتاد و برای موضوع ارتباط میکرو با usb به رایانه همین تایپک بغل رو نگاه کردم اما هیچ و عکس و مقاله وجود نداره و همگی پر!!!!! درضمن همه رو بشکل مشکل و راه حل نوشتم)
                  1-مشکل: پروژه رو کامپایل کنید. کامپایلر error میده ! :
                  D:\projects\winavr\avrliblcd\default/../lcd.c:330: undefined reference to `delay_us'
                  دوبار رو این خطا کلیک کنید تا نشونتون بده... یه قسمت از تابع lcdInit در فایل lcd.c یه باگ وجود داره! این دستور :
                  delay(60000); // wait 60ms
                  جلوش توضیح داده تاخیر 60 میلی ثانیه ای میخواد ایجاد کنه. تغییرش بدین به :
                  _delay_ms(60);
                  راه حل: فکر نکنم یه باگ باشه! دلیلش نیاز به تعریف کتابخونه timer هستش و اگه نمی خواین این کتابخونه رو تعریف کنید قشنگتره اینجور بشه:
                  #define delay(60000) _delay_ms(60)

                  2-مشکل: آخرش که از lcdLoadCustomChar استفاده کرده. اونایی که پارامترشون فرد، مشکل دارن و تو یه حلقه بی نهایت می افتن!! نمی دونم چرا
                  راه حل: برای من همچین خطایی نداد شایدبازم مربوط به تعریف کتابخونه باشه.(مشکل بدون حل باقی موند!)

                  3-مشکل: در برنامه a2c که نوشته شده البته دومین برنامه، اولا متغییر num جای درستی تعریف نشده و ثانیا باید از نوع volatileباشد(توضیحات کامل تو ادامه تایپک اومده و همچنین میتونید مورد اول از توضیحات سوالات متداول(FAQ) مربوط به avrlib-cرو بخونین

                  4-مشکل: این قسمت هدر timer.h رو بررسی می کنیم. در ادامه ثابت های RTC تایمر رو تعریف کرده که من نمیدونم چیه. لطفا یکی بگه RTC چیه؟
                  راه حل: فکر نکنم کار شاقی باشه. چند خط پائین تر نوشته:
                  #define TIMER2PRESCALE TIMERRTC_CLK_DIV64 ///< timer 2 prescaler default
                  یعنی می خواد از TIMER2 به عنوان یه زمان سنج دقیق استفاده کنه!! برای همین هم گذاشته RTC

                  5-مشکل: امکان داره درباره UART هم یه کمکی بکنید
                  حل: همونطور که گفتن می تونید از کتابخونه های دیگه استفاده کنید. در اینجا این مشکل رو آوردم تا درمورد یه مشکل تو این کتابخونه بنویسم.اگه از کتابخونه uart.h استفاده کنید با یه هشدار مواجه مشید:
                  uart.c warning: pointer targets in passing argument 2 of 'bufferInit' differ in signedness
                  (میگه آرگومان دوم تابع bufferInit در علامت مشکل داره) تو تابع uart متغییر uartRxData اینجوری تعریف شده:
                  static char uartRxData[UART_RX_BUFFER_SIZE];
                  و تو خود تابع bufferInit اینجوری تعریف شده(آرگومان دوم):
                  void bufferInit(cBuffer* buffer, unsigned char *start, unsigned short size)
                  که میشه یه باگ و شاید به این خاطر کتابخونه مشکل داره

                  6-مشکل: شاید بهتر باشه در اینگونه موارد اطلاعات ارسالی روی lcd بافر بشه و در زمانهای خاصی روی lcd ریخته بشه.
                  راه حل: یکم باید بیشتر توضیح داده بشه.(مشکل بدون حل باقی موند!)
                  7-مشکل: چیزی که بنظر میاد توی avrlib خیلی جاش خالی باشه یک سری ماکروی کاربردیه...
                  راه حل: لطفا توضیح کاملتر بدین این ماکروها رو کجا استفاده کنیم؟ توی avrlib که نیازی نیست حتما برای خود پروژه می گین نه؟
                  8-مشکل: فرق این دوتا عبارت تو چیه؟

                  asm volatile("nop&quot
                  asm ("nop&quot
                  راه حل : .(مشکل بدون حل باقی موند!) (البته فکر کنم یکی از دوستان با نام کاربری nanoware غیر مستقیم جواب دادن!)
                  9-مشکل: بهترین کار اینجور مواقع استفاده از کد تولید شده توسط کامپایلره. در codevision کد اسمبلی سورس ها در یک فایل asm ذخیره میشه و در winavr در یک فایل lss....
                  راه حل : سوال خودم اینه که یعنی از فایل asm برنامه اسمبلی رو که کدویژن برای آدرس خارجی تولید کرده استخراج و در یه فایلlss برای کامپایلر قرار بدیم؟؟؟

                  10-مشکل: ایضا من بجای کار با پروتئوس و این گونه نرم افزار ها با استفاده از دستورات پیش پردازشگر C برنامه را تحت windows جواب میگیرم؟؟؟
                  ماکروی PSTR رو اگه بهش درست دقت کنین میبینین که دید رو عوض میکنه نه بخش رو...
                  اینگونه استفاده کردن (بهتر بگیم با این دید) خطرناکه...
                  راه حل: دید ما که کلا هنگ کرد!!! اگه میشه بازهم واضح تر بدین!
                  11-مشکل: دو تا ویژگی دیگه ISR_NACKED و ISR_ALIASOF هم هست که من هنوز دقیقا نمیدونم چیکار میکنن...
                  راه حل: اولی رو که گفتن و لی دومی مواقعی هست که دو بردار وقفه یه کار رو انجام میدن مثلا می خای هر وقت وقفه 0 یا1 اتفاق افتاد یه پورت یک بشه(ledروشن بشه) اینجا معنی نداره دو تا تابع بنویسی میای اولی رو می نویسی و دو رو با ISR_ALIASOFبه اولی لینک میکنید اینجوری:
                  ISR(PCINT0_vect)
                  {
                  ...
                  // Code to handle the event.
                  }

                  ISR(PCINT1_vect, ISR_ALIASOF(PCINT0_vect));
                  12-مشکل: اگر سیستم از بابت حجم رم یا فلش در محدودیت شدیدی باشه باز هم استفاده از state machine یک راه حل بهینه و عالیه...
                  راه حل: ماشین حالت رو میشه یکم بیشتر توضیح بدین

                  13-مشکل: راستی این دستور آخری pragma این رو هم خوب متوجه نشدم اگه میشه این رو هم یه توضیح کامل بدین. ممنون میشم
                  راه حل: .(مشکل بدون حل باقی موند!)

                  14-مشکل آخر : هیچکی جواب نداد که چرا شبیه سازی کتابخونه های avrlib در نرم افزار پروتئوس انجام نمیگیره؟؟؟

                  دوم: برای کار با mmc دنبال کتابخونه میگردم توی avrlib هست ولی ناقصه ویه کتابخونه هم از elm chanدارم اما دقیق متوجه نشدم کسی مثل راحت تری از این کتابخونه داره یا نه؟
                  با تشکر از همگی که وقت گذاشتین تا این پائین رو خوندین!!!!!!!!

                  دیدگاه


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

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

                    4- منظور از RTC همون Real Time Clock هست. توضیح: معمولا ما در برنامه ها به دو جور زمانبندی احتیاج داریم. یکی برای زمانبندی های ریز مثلا در حد میلی ثانیه. که ممکنه در طول 10 دقیقه 100 میلی ثانیه هم پس و پیش بشه و این برای ما خیلی مهم نیست چون فقط یک تقریب زمانی خوب میخواییم. و یکی دیگه برای نگهداری زمان و ساعت که اینجا دیگه از اون تو بمیری ها نیست! باید بعد از صد سال هم یک ثانیه پس و پیش نشه. بنا براین میایم برای پرهیز از ایجاد خطا در محاسبه ثانیه ها یک کریستال 32768 هرتز استفاده میکنیم. این سرعت اولا دقیقا قابل تقسیم بر توان 15 از عدد 2 هست و از طرف دیگه مدار تایمر مربوطه جوری هست که بتونه ازش بطور auto-reset استفاده کنه تا گپ زمانی بین شروع وقفه و ریست شدن تایمر وجود نداشته باشه. (یکی از موارد ایجاد خطا در زمانبندی) با این تایمر ثانیه ها و دقیقه ها و غیره رو میسازیم و تایمر های دیگه مثلا میلی ثانیه برای زمانبندی های خیلی دقیق در طول زمانهای کوتاه. اجباری هم نیست که در ابتدای هر ثانیه بیاییم میلی ثانیه ها رو صفر کنیم چون ربطی به هم ندارند.

                    5- تطبیق این دو تعریف به خودی خود مشکلی ایجاد نمیکنه. اما شاید بهتر بود که در هنگام تعریف bufferInit آرگومان مربوطه به صورت *void تعریف میشد. چون اینجا ما با محتوای حافظه کار داریم. نه اینکه در حافظه چه نوعی از اطلاعات وجود داره. اگر باگی هست به این مورد ربطی نداره.

                    6- معمولا ارسال اطلاعات روی lcd بصورت سمکرون انجام میشه. و این یعنی صبر کردن برای آماده شدن lcd برای ارسال مجدد اطلاعات. از طرف دیگه اگر حجم اطلاعات تولیدی در واحد زمانی زیاد باشه ارسال اطلاعات به طریق دستی به lcd خیلی زمانبره. در صورتیکه میشه در یک روتین وقفه یک تایمر مثلا 1 میلی ثانیه هر بایت رو در 1 میلی ثانیه به lcd فرستاد. در این صورت شما در هنگام ساختن lcd فقط image اون رو در حافظه میسازین. یه چیزی مشابه رفرش کردن سون سگمنت ها در وقفه تایمر نسبت به ارسال اطلاعات روی یک latch در هنگام تغییر.
                    عملا در این حالت رفرش؛ شما اطلاعات رو در جایی قرار میدین تا هر موقعی که احتیاج بود به lcd ارسال بشه.

                    7- یک سری به win.h بزنین یک سری ماکرو مثل LOBYTE, HIBYTE, LOWORD, HIWORD, MAKEWORD, MAKELONG, OFFSETOF و اینجور چیزا میبینین که جاهای متفاوتی هم استفاده میشن و جاشون در avrlib خیلی خالیه. و صد البته در پروژه مربوطه یا خود کدهای avrlib استفاده میشه کرد.

                    8- volatile در لغت یعنی فرار (مثل اتر) و لطیف. یعنی جناب کامپایلر! با دستان زمختت بهش دست نزن! به نرمی باهاش برخورد کن. اگه متغیره همیشه حواست به مقدارش باشه. اگر یک دستوره (مثل اینجا) قرار نیست دخلشو بیاری و از کد حذفش کنی. (NO-OPTIMIZATION).

                    10- در هر پروژه ای ما یا با خود میکرو به عنوان یک سخت افزار کار میکنیم. یا منطق عمومی خودمون رو پیاده میکنیم. اگر فرض کنیم که سخت افزار میکرو رو بشه با نرم افزار شبیه سازی کرد کد ما ذاتا بستگی به وجود سخت افزار نهایی نداره. مثلا ADC رو میشه توی یک برنامه VB یا #C شبیه سازی کرد و مقدارش رو از طریقی به برنامه خودمون رسوند. اما در برنامه میکرو نبایستی مستقیما سراغ ADC رفت بلکه بایستی یک روتین آماده کرد که اون اطلاعات رو از ADC بگیره. حالا در حالت شبیه سازی این مقدار از برنامه VB گرفته میشه و در محیط نهایی از خود ADC.

                    ....خیلی گنده شد... بقیه اش باشه بعد.

                    دیدگاه


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

                      نه بذارین بگم بقیه اش رو. دلم سوخت براتون!!!

                      ...10- یک کامپایلر عمده کاری که انجام میده بر اساس اطلاعاتیه که ما بهش میدیم. وقتی اطلاعاتی در حافظه داریم که مثلا یک float هست (به حجم 4 بایت) اگر اومدیم و این دید رو به کامپایلر دادیم که این چهار بایتی چهار بایت هست و حتی یک عدد صحیح 4 بایتی اولین نطفه امکان ایجاد خطا رو در دل برنامه کاشته ایم. دقیقا به همین خاطر هم هست که در دات نت به اینجور کدها unsafe گفته میشه. حالا شما قراره از ماکرویی استفاده کنین که دید کامپایلر رو نسبت به داده هاتون عوض میکنه. پس هر جایی که میشه ازش استفاده نکنین!! یادتون باشه این جزء جاهاییه که باید با احتیاط باهاش برخورد کنین. چرا؟ چون خود زبان C یک زبان بسیار قدرتمند و مسلما خطرناکیه. شنیدین میگن "تیغ در کف زنگی مست...؟" سعی کنین شما اون "زنگی مست" نباشین.

                      12- فرض کنین میخواییم یک پروتکل سریال رو با این فرم پیاده سازی کنیم:


                      مسلما چند تا راه حل داریم.
                      اول: روال مرسوم. گذاشتن یک بافر روی وقفه سریال برای دریافت اطلاعات و پردازش اونها در روال اصلی برنامه یا یک تسک. که در صورت اول پاسخ زمانی پردازش اطلاعات دریافتی قابل محاسبه نیست (در محیط های real-time بایستی ماکزیمم زمان بین ایجاد یک تحریک به سیستم و تولید فیدبک مربوطه قابل تخمین باشه). و در صورت استفاده از یک task یک حافظه برای stack برای تسک مربوطه مورد نیازه. ضمنا multi-tasking بدون داشتن روالهای مدیریتی اضافه امکانپذیر نیست.
                      دوم: استفاده از ماشین وضعیت! چطوری؟ فرض کنیم کد ما اینجوریه:

                      task()
                      {
                      byte bcc;

                      for(;
                      {
                      bcc = 0;
                      if(getchar() == STX)
                      {
                      cmd = getchar();
                      size= getchar();
                      bcc ^= cmd ^ size;
                      for(i=0; i<size; i++)
                      {
                      data[i] = getchar();
                      bcc ^= data[i];
                      }
                      if( bcc == getchar() )
                      process_cmd();
                      }
                      }
                      }


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

                      مثلا مثل کد زیر:


                      int state = 0;
                      int bcc;

                      SIGNAL(SIG_UART_RXC)
                      {
                      unsigned char data = UDR;

                      if( state > 0 )
                      bcc ^= data;
                      switch( state )
                      {
                      case 0: // wait for STX
                      if( data == 0x02 ) state = 1;
                      bcc = 0;
                      break;
                      case 1: // wait for command byte
                      cmd = data;
                      state = 2;
                      break;
                      case 2: // wait for data size
                      size = data;
                      index= 0;
                      if( size == 0 ) state = 4; else state = 3;
                      break;
                      case 3: // wait for data bytes
                      data_buf[index] = data;
                      index++;
                      if( index == size ) state = 4;
                      break;
                      case 4: // wait for bcc byte
                      if( bcc == 0 )
                      {
                      // checksum error!
                      }
                      else
                      {
                      // do desired action!
                      }
                      state = 0; // idle state
                      break;
                      }
                      }


                      یک کمی تحلیلش کنین تا بعد. اما دقت کنین که این کد صبر میکنه تا اطلاعات از سریال دریافت بشن تا پردازششون کنه. اما این صبر باعث نمیشه که حافظه برای stack حروم بشه یا بدتر از اون میکرو delay داشته باشه. چون وقت میکرو حروم میشه.

                      13- در دستورات پیش پردازش یک سری از دستورات مختص کارهای عمومی هست مثل define , undef , sizeof و غیره. یک سری دیگه توسط کامپایلر به منظور توسعه پیش پردازشگر اضافه شده. برای compatibility بین تمامی پیش پردازشگرها این دستورات بایستی به فرم pragma اضافه بشن. مثلا در borland-c اگر بخواییم به یک کامپایلر اطلاع بدیم "اوهوی! به استفاده نشدن آرگومانهای ورودی تابع بعدی توجه نکن!" میشه توسط دستور زیر این مورد رو انجام داد:


                      #pragma argsused


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


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

                      دیدگاه


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

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

                        دیدگاه


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

                          چه جوریش رو بقیه دوستان زحمت میکشن میگن. (من الان خیلی عجله دارم...ببخشید). اما یادتون باشه روال وقفه جزء چیزاییه که خیلی به سخت افزار وابستگی داره و مسلما معرفی کردنش به سیستم از یک استاندارد واحد میتونه تبعیت نکنه. بنابراین انتظار نداشته باشین که اینجور چیزا بین یک کامپایلر دم دستی مثل کد ویژن و یک کامپایلر گردن کلفت مثل gcc (یا همون WinAVR خودمون در اینجا) یکی باشه.

                          دیدگاه


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

                            خوب کدهاش تو این نرم افزار گردن کلفت چیه ؟

                            دیدگاه


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

                              یک سری به اوایل همین تاپیک بزنین خودتون میبینین. مثلا وقفه سریال:


                              SIGNAL(SIG_UART_RXC)
                              {
                              }


                              در صورتی که در کد ویژن:


                              interrupt [USART_RXC] void usart_rxc_idr(void)
                              {
                              }


                              تعریف میشه.

                              دیدگاه


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

                                نوشته اصلی توسط atm8
                                خوب کدهاش تو این نرم افزار گردن کلفت چیه ؟
                                ببینید تو کد ویژن زمانی که یک وقفه رخ میداد یک تابع که نه ورودی داره نه خروجی صدا زده میشه. توی WinAVR هم به همین صورته منتها تو کدویژن شناسوندن اون تابع به صورت خودکار توسط کامپایلر انجام میشد اما تو WinAVR شما باید به صورت دستی این کار را انجام دهید. برای این کار یک تابع داره که اگه فایل کتابخونه رو باز کنید پیداش می کنید. بنده خیلی وقت پیش باهاش کار کرده بودم ولی میدونم داخل فایل کتابخونه اش هست، بگردید پیدا می کنید.
                                بگذارعشق خاصیت تو باشد نه رابطه خاص تو باکسی
                                موفقیت پیش رفتن است نه به نقطه ی پایان رسیدن
                                نلسون ماندلا

                                دیدگاه

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