۲۵ آبان ۱۳۹۶

درباره نویسنده

زئوس Zeus

زئوس Zeus

زئوس هستم خدای المپ

مطالب مشابه

33 Comments

  1. 7

    س.ج.

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

    ۱- چرا داخل تابع stop_read_timer کانتر تایمر ضرب در ۲ رو به عنوان خروجی میده ولی تو read_timer تو ۲ ضرب نمیشه؟

    ۲- اگه ممکنه یه توضیح کوچیک در مورد sreg بدید. داکیومنت کامپایلر و توضیحاتش تو دیتاشیت رو خوندم اما حس میکنم کامل نفهمیدم. چرا باید برای خوندن تایمر وقفه گلوبال غیر فعال بشه و حالتوش رو جایی ذخیره کنیم و بعد از اینکه خوندن تامیر تموم شد همه چیو به حالت اول برگردونیم؟ نمیشه فقط تایمرو بخونیم؟

    ۳- کاربرد bit_shift و نحوه ی کار باهاش رو نفهمیدم. چرا مقدار دهی اولیش به این صورت هست و اینکه چرا از یه متغیر معمولی ۳۲ بیتی برای کد ریموت های استفاده نکردید و به جاش از این آره bit_shift استفاده کردید؟

    ۴- چرا توی کدی که نوشتید برای overflow تایمر فکری نکردید؟

    ۵- چرا از تایمر ۱ استفاده کردید؟ تنها دلیل استفاده از تایمر ۱ داشتن جای بیشتر برای شمارش بوده؟ چون از هیچ برتری تایمر ۱ نسبت به دوتا تایمر دیگه استفاده نکردید. اگه تنها دلیلش اینه به نظر شما میشه با تایمر ۰ و در نظر گرفتن overflow همین برنامه رو بازنویسی کرد؟

    ممنون از زحماتتون

    پاسخ
    1. 7.1
      زئوس Zeus

      زئوس Zeus

      سلام و درود خدمت شما
      1 – تابع read_timer در برنامه استفاده نشده و میتوانید از آن صرف نظر کنید ، خروجی تابع stop_read_timer هم به دلیل این که فرکانس تایمر 500 کیلو در نظر گرفته شده در 2 ضرب می شود تا بیس زمانی 1 میلی ثانیه ای تغییر نکند.
      2 – خوب SREG که رجیستر وضعیت هستش ، برای این هنگام خوندن تایمر وقفه ها رو غیر فعال میکنیم تا مقدار مورد نظر هنگام خوندن تغییر نکنه ، فرض کنید هنگام خوندن تایمر یه وقفه اتفاق بیفته که اولویت بالاتری نسبت به وقفه جاری داشته باشه ، اگر وقفه ها رو غیر فعال نکرده باشید ، عملیات خوندن متوفق میشه و رسیدگی به کار وقفه جدید در دستور کار CPU قرار میگیره بعد از بازگشت قطعا تایمر مقدار قبلی رو نخواهد داشت و مقدار مورد نظر تغییر کرده است ، برای جلوگیری از چنین اتفاق هایی این کارو انجام می دیم.
      3 – منظور شما رو درست متوجه نشدم ، برای کد ریموت ما از متغییر 32 بیتی استفاده کردیم دیگه ! کار bit_shift هم در واقع شیفت دادن یک بیت به سمت راست هست ، از روش معمول (>>) استفاده نکردیم چون توی پردازنده های 8 بیتی این عملیات بر روی متغییر های 32 بیتی خیلی زمان بر هستش
      4 – اتفاقا فکر کرده ایم 🙂 ، فرض کنید مقدار قبلی تایمر FFFD بوده باشد و 9 میلی ثانیه بعد که تایمر رو میخونیم مقدار 6 رو داراست ، حالا کافیه 6 رو منهای FFFD کنید ، زمان انتظار یعنی 9 میلی ثانیه حاصل میشه ، به همین راحتی.
      5 – بخاطر 16 بیتی بودن ، شما از هر تایمر دیگه ای یا هر روش دیگه ای که بتونید زمانی با دقت 1 میلی ثانیه ایجاد کنید ، برای برنامه فرقی نمیکنه و قابل قبول هستش.

      خواهش میکنم

      پاسخ
      1. 7.1.1

        سینا

        آهان تشکر از توضیحاتتون. 🙂🤔🤔🙂

        پاسخ
        1. 7.1.1.1
          زئوس Zeus
  2. 6

    سینا

    با عرض سلام و خسته نباشید
    من سعی کردم کد هاتون رو توی atmel studio 7 باز کنم. اما هرچی گشتم نتونستم تعریف تابع _BV رو پیدا کنم تو هدر فایل هاتون و … ممکنه راهنمایی کنید؟ آیا این تابع رو خودتون تعریف کردید یا از توابع از پیش تعریف شده ی کامپایلر هست؟

    ممنون

    پاسخ
    1. 6.1
      زئوس Zeus

      زئوس Zeus

      سلام و دورود خدمت شما دوست عزیز
      بسیار عالی ، آتمل استودیو هم از GCC استفاده میکنه ، و به راحتی میتونید کد را بر روی آن اجرا نمایید.
      _BV رو میتونید به صورت زیر تعریف کنید.
      #define _BV(x) (1 < < x)

      پاسخ
      1. 6.1.1

        س.ج.

        آهان ممنون. با موفقیت کامپایل شد و روی اتمگا ۳۲ و ۳۲۸ دیپ کار کرد. البته با کریستال داخلی که سرعتش کمتر بود تست کردم و یکم سخت تشخیص میداد کد ریموت رو. اما وقتی به ۳۲۸ کریستال ۱۶ مگ وصل کردم عالی کار کرد.

        پاسخ
        1. 6.1.1.1
          زئوس Zeus

          زئوس Zeus

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

          پاسخ
  3. 5
    سیما درزی

    علی

    سلام مجدد مهندس

    آقا تونستم تغییراتی توی برنامه بدم و بصورت دلخواهم درش بیارم. خیلی هم خوب کار می کنه با سه مدل ریموت با مقاومت اسلاتورهای مختلف استفاده کردم که براحتی همه رو تشخیص میده.

    AVRDUDE 6.3 کلا ATMega8A نداره. فعلا که با همین ATMega328p جوابای خوبی گرفتم. باز هم تشکر

    پاسخ
    1. 5.1
      Sisoog Os

      Sisoog Os

      خبر خوبی بود موفق باشید

      پاسخ
    2. 5.2
      زئوس Zeus

      زئوس Zeus

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

      پاسخ
      1. 5.2.1
        سیما درزی

        علی

        سلام و تشکر بابت پیگیری های شما.

        من پروژه رو چندین بار برای میکروهای مختلف کامپایل کردم. ولی فقط برای ATMega328 و ATMega328P جواب میده. برای بقیه میکروها پیغام خطایی میده در قسمت رجیسترهای وقفه صفر میکرو. البته این پیغام برای سری های معمولی درسته ولی برای سری های A نباید این پیغامو بده.

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

        در مورد ATMega8 من خودم بارها با AVRDUDE پروگرم کردم. ولی سری Aشو ساپورت نمی کنه. حالا این مهم نیست. چون من با نرم افزارهای دیگه میتونم میکرومو پروگرم کنم.

        اما فعلا مشکل سر کامپایل نشدن پروژه هست.

        عکس پیغام خطا : http://uupload.ir/files/2nm2_32123.png

        پاسخ
        1. 5.2.1.1
          زئوس Zeus

          زئوس Zeus

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

          EICRA=(0 < < ISC11) | (0 << ISC10) | (0 << ISC01) | (1 << ISC00); EIMSK=(0 << INT1) | (1 << INT0); EIFR=(0 << INTF1) | (1 << INTF0); PCICR=(0 << PCIE2) | (0 << PCIE1) | (0 << PCIE0);

          و مثلا توی میکروی Mega8 کدهای زیر رو


          GICR|=(0 < < INT1) | (1 << INT0); MCUCR=(0 << ISC11) | (0 << ISC10) | (0 << ISC01) | (1 << ISC00); GIFR=(0 << INTF1) | (1 << INTF0);

          پس می بینید که کلا تنظیمات متفاوت هست.
          برای وقفه هم من از Any change برای وقفه استفاده کردم ، این قبلیت توی همه خانواده های AVR وجود داره ، نگران نیاشید، در ضمن به لحاظ ساختار برنامه نویسی و رجیستری و پروتکلی سری A و سری معمولی هیچ فرقی با هم ندارند ، متاسفانه به دلیل دانش کم برخی افراد در این خصوص فکر میکنن سری A قابلیت های بیشتری داره توی این زمینه ها در صورتی که نه ، تنها تفاوت توی ولتاژ کاری و فرکانس کاری هستش ، اگر بخاطر داشته باشید قبلا سری L وجود داشت که با اومدن سری A ، اون سری توقف تولید شد ، برای توضیحات بیشتر میتونید به یوزر منوال مراجعه کنید.
          برای پرورگارامر هم همونطور که قبلا گفتم سری A و غیر A نداره ، با خیال راحت Mega8 رو انتخاب و پروگرام کنید.

          پاسخ
          1. 5.2.1.1.1

            علی

            ممنون
            ولی تا جائیکه من توی دیتاشیت ها نگاه کردم تقریبا 70 الی 80 رجیسترها هم نام هستن. حالا بیت هایی توی بعضی رجیترها کم و زیاد باشه. مثلا تایمر صفر توی همه سری های مگای AVR اسمش یکیه و یا موارد دیگه.

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

            اما اینو نمیدونستم که سری معمولی هم از مد وقفه Any Change پشتیبانی می کنه!!! فک می کردم فقط توی سری A هست. چون بسکام این قابلیت رو مثلا برای اتمگا8 نداره ولی برای اتمگا8A داره.

            ممنون از لطفتون. حالا من برم ببینم می تونم این رجیسترهارو اوکی کنم یا نه؟؟!!

          2. زئوس Zeus

            زئوس Zeus

            بله ، با توجه به اضافه شدن یا کم شدن قابلیت ها به خانواده های مختلف میکرو ، به طبع رجیستر ها هم تغییر میکنن ، حتی اسم اونها ، البته معمولا تغییر به شکلی هست که راحت میشه حدس زد رجیستر معادلش چی میتونه باشه
            من این کد رو برای مگا 8 تغییر دادم قبلا ، به خوبی هم کار میکنه ، تلاشتون رو بکنید ، حتما موفق میشید 🙂
            بیسکام رو میشناسم ولی تاحالا باهاش کار نکردم ، اگر به دیتاشیت میکرو مراجعه کنید ، خواهید دید که این قابلیت وجود داره و فرق واقعی بین سری A و غیر اون توی چه مواردی هستش 🙂

  4. 4
    سیما درزی

    علی

    ببخشید که اینجا جواب میدم. چون در انتهای جواب شما دکمه پاسخ وجود نداشت که از اون طریق جواب بدم.

    راستش من چنتا گزینه رو برای بازکردن پروژه شما امتحان کردم که از بین اونها فقط با گزینه Makefile Project With Existing Code تونستم کل پروژه رو باز کنم.

    پاسخ
    1. 4.1
      زئوس Zeus

      زئوس Zeus

      خوب دوست عزیز ، برای وارد کردن پروژه باید از Git استفاده کنید
      ابتدا از منوی File زیر منوی Import را انتخاب کنید
      در پنجره باز شده ، پوشه Git را انتخاب کنید و در آن گزینه Project From Git را انتخاب کنید و دکمه Next را بزنید.
      گزینه Clone URL را انتخاب کنید و Next را بزنید
      در پنجره باز شده قسمت URL متن زیر را پیست کنید
      https://github.com/Sisoog/4Ch_learnRemote.git
      و بعد Next و Next و Finish 🙂
      به همین سادگی

      پاسخ
      1. 4.1.1
        سیما درزی

        علی

        ممنون مهندس. بالاخره تونستم پروژه رو کامپایل کنم. جالب بود! تا حالا تحت وب برای AVR کامپایل نکرده بودم.

        آیا بعداز کامپایل فایل هگز ساخته شده میره توی Release در همون آدرس اینترنتی Git ؟

        حالا برای تغییر نوع میکروکنترلر و فرکانس کاریش و همچنین تغییر باودریت باید چیکار کنم؟

        ضمن اینکه توی برنامه ATMega8A رو ندیدم. ولی ATMega8 بود یا مثلا ATMega32A بود.

        پاسخ
        1. 4.1.1.1
          سیما درزی

          علی

          آقا فایل هگزو پیدا کردم. توی پوشه User و بعدش پوشه git قرار داره.

          فقط الان می خوام تغییرات مورد نظرمو اعمال کنم.

          1. نوع میکروکنترلر
          2. تغییر باودریت ارتباط سریال
          3. تغییر فرکانس کاری

          پاسخ
          1. 4.1.1.1.1
            زئوس Zeus

            زئوس Zeus

            خوب برای این کار باید وارد تنظیمات پروژه بشید ،
            برای تغییر نوع میکرو و فرکانس کاری ، ابتدا پوشه پروژه رو انتخاب کنید از منوی Project زیر منوی Properties رو انتخاب کنید
            از پنجره باز شده از لیست سمت چپ گزینه AVR رو باز کنید و Target Hardware رو انتخاب کنید ، نوع میکرو و فرکانس کاری رو می تونید تعیین کنید

        2. 4.1.1.2
          زئوس Zeus

          زئوس Zeus

          سلام دوست عزیز
          تبریک میگم ، بلاخره موفق شدید 🙂
          ببینید ، شما از Git کمک گرفتید که سورس ها رو دانلود کنید ، پس هر اتفاقی از پس می افته توی کامپیوتر خودتون هست
          فایل هگز ایجاد شده هم توی همون ایکلیپس پوشه Release ایجاد میشه ، میتونید با Ctr+C کپیش کنید هر جا دوست دارید پیست کنید.

          پاسخ
          1. 4.1.1.2.1
            سیما درزی

            علی

            خیلی ممنون از راهنمائی هاش شما.

            با کمک شما یاد گرفتم که چطور فرکانس میکرو و نوع میکرو رو عوض کنم. اما نکته ای که هست AVRDUDE 6.3 از ATmega8 پشتیبانی نمی کنه. چطور میشه این مشکلو حل کرد؟

            از طرفی من میخوام فرکانس کاری رو به نصف کاهش بدم. این باعث ایجاد اختلال در عملکرد تایمر نمیشه؟

            راستی می تونم تنظیمات تایمرو از کدویزارد کدویژن انجام بدم و بعد کپی کنم توی این پروژه؟ همچنین تنظیمات مربوط به باودریت پورت سریال.

          2. زئوس Zeus

            زئوس Zeus

            سلام دوست عزی
            خواهش میکنم
            AVRDUDE تقریبا همه خانواده AVR رو پشتیبانی میکنه ، کجا میخواستید تنظیم کنید که مگا هست توی لیستش نبود ؟
            خوب برای نصف کردن فرکانس هیچ مشکلی نیست ، ببینید فرکانس کاری تایمر رو جوری تغییر بدید که بیس زمانی 1 میلی ثانیه ای باشه ، یعنی فرکانس تایمر 1 مگاهرتز باشه
            بله از کدویژن میشه برای این مساله استفاده کرد ، یعنی کد ایجاد شده توسط کدویزارد رو کپی کنید توی برنامه 🙂

  5. 3
    سیما درزی

    علی

    سلام و تشکر بابت این پروژه

    من برای ایجاد تغییرات در این سورس AVR gCC 7.1 نصب کردم و Elclipse SDk 3.6 و الان می تونم پروژه رو باز کنم. اما کامپایلر فایل های هدر (سرآیند) رو نمی تونه پیدا کنه. مثلا فایل avr/interrupt.h رو نمی تونه پیدا کنه.

    باید دقیقا چیکار کنم؟ مگه فایل های سرآیند توی پوشه include نرم افزار AVR GCC نیستن؟ پس چرا نمی تونه پیداشون کنه؟

    پاسخ
    1. 3.1
      زئوس Zeus

      زئوس Zeus

      سلام دوست عزیز
      خواهش میکنم ، خوب بسیار عالی ، شما ابتدا باید پلاگین AVR-GCC را بر روی Eclipse نصب کنید و مسیر محل نصب کامپایلر را در Path سیستم وارد کنید تا Eclipse قادر به مشاهده هدر های مورد نیاز باشد
      برای آموزش نصب این این پلاگین میتوانید به آموزش نصب پلاگین AVR مراجعه کنید.
      اگر مشکلی بود – همینجا مطرح کنید

      پاسخ
      1. 3.1.1
        سیما درزی

        علی

        تشکر از پاسخ شما

        بله. میدونم. نصب کردم. Path رو هم تنظیم کردم. ولی بازم نمی شناسه. ببینید من AVR GCC 7.1 نصب کردم. بعدش Eclipse SDK 3.6 نصب کردم. پلاگین هم نصب کردم. الان من در Eclipse توی قسمت Window و در Preferences گزینه AVR دارم که زیرش AVRDude و Path هستن.

        اینا یعنی پلاگینم نصبه دیگه. حتی من رفتم و بصورت دستی Pathهارو تغییر دادم. چون قبل از نصب AVR GCC من winavr داشتم که گزینه های Path بصورت پیشفرض روی پوشه های اون ست شده بود. ولی من کلا winavr رو پاک کردم و Pathهارو روی پوشه های AVR GCC ست کردم.

        پاسخ
        1. 3.1.1.1
          زئوس Zeus

          زئوس Zeus

          سلام و درود خدمت شما دوست عزیز
          بسیار عالی – منظور من از Path ، در واقع Path موجود در Eclipse بوده است ، برای تنظیم Path در Eclipse ، ابتدا در منوی Window زیر منوی Perferences رو انتخاب کنید ، بعد مطابق این تصویر Path ها رو تعیین کنید.
          احتمالا در پک نصب کرده از AVR GCC فایل Make وجود ندارد که برای دسترسی به این فایل باید از این لینک ابزار لازم رو دانلود و نصب کنید.
          فایل مربوطه حدود 600 کیلو بایت بیشتر نیست. برای راهنمای نصب . پیکر بندی به مقاله آموزش برنامه نویسی رزبری پای قسمت چهارم زیر بخش نصب ابزار های لینوکسی مراجعه کنید.
          احتمالا بعد از این کار ها مشکلی وجود نداشته باشه ، اگر مشکلی بود ، حتما مطرح کنید.

          پاسخ
          1. 3.1.1.1.1
            سیما درزی

            علی

            مهندس بالاخره بعداز کلی تلاش تونستم کارای نصب و راه اندازی رو تموم کنم. من نسخه Eclipse SDK نصب کرده بودم یکم فرق داشت. الان Oxygen نصب کردم و تمام مراحل رو همونطوری که توی آموزش بود رفتم.

            ولی هنوزم مشکل دارم. سه تام عکس آپلود کردم.

            بعداز کامپایل هم ارور زیر میاد:
            make all
            make: *** No rule to make target ‘all’. Stop.

            لینک عکس 1 : http://uupload.ir/files/boev_1.png

            لینک عکس 2 : http://uupload.ir/files/nx0t_2.png

            لینک عکس 3 : http://uupload.ir/files/9io_3.png

          2. 3.1.1.1.2
            سیما درزی

            علی

            مهندس مشکل قبلی رو حل کردم. از منوی Project و گزینه properties نوع Builder رو گذاشتم روی AVR GNU Toolchain و درست شد.

            الان فایل های سرآیند شناخته میشن و برنامه هم هیچ اروری نداره.

            ام بازم موقع کامپایل با ارور قبلی مواجه میشم. یعنی :

            make all
            make: *** No rule to make target ‘4Ch_learnRemote’, needed by ‘all’. Stop.

          3. زئوس Zeus

            زئوس Zeus

            سلام
            بسیار عالی ، قبل از هر چیزی تبریک میگم بهتون برای تلاش و ممارستی بخرج می دید ، واقعا ستودنی است
            خوب ، فکر میکنم به گام های نهایی نزدیک و نزدیک تر شده اید ، فکر میکنم مشکل در حال حاظر از نحوه بازکردن پروژه است ، میشه توضیح دید چطور پروژه رو درون Eclipse باز کردید ؟

  6. 2

    حسینی

    با سلام
    ضمن تشکر از کد گذاشته شده.
    بنده دارم از یک چیپست دیگه بنام pt2240 استفاده میکنم که تنها تفاوت آن با ev1527 درجای syncbit است . لطفا راهنمایی بفرمائید کجای برنامه را تغییر دهم تا با کد شما بتوانم به راحتی دیتاهای دریافتی از pt2240 را تشخیص دهم ؟

    با تشکر
    حسینی

    پاسخ
    1. 2.1
      زئوس Zeus

      زئوس Zeus

      سلام دوست عزیز
      بله حق با شماست pt2240 الگوریتمی مشابه ev1527 دارد البته باید دقت شود که نسبت تایمینگ ها حفظ شده است یا خیر
      در مورد مساله syncbit که در انتهای هر فریم ارسالی ارسال میشود به نظرم نیاز به تغییر کد نیست چرا که فریم ها پشت سر هم ارسال می شود و برنامه syncbit انتهای فریم اول را در واقع شروعی برای فریم دوم فرض می کند و اگر تعداد بیت ها و زمان انها درست باشد بدون دست کاری برنامه باید قادر به دریافت کد این نوع آیسی نیز باشد.

      پاسخ
  7. بازخورد: ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه - سیسوگ - Sisoog

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

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