اطلاعیه

Collapse
No announcement yet.

حل تمام مشکلات atmega128a

Collapse
این موضوع برجسته شده است.
X
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    حل تمام مشکلات atmega128a

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

    بریم سراغ بررسی atmega128a:
    1- اولین و مهم ترین و مشکل ساز ترین و بدترین و و و ... تنظیمات فیوزبیت این بدجنسه: دو تا فیوز بیت!!!
    اول این رو بخونین: (http://picpars.com/302/%D9%81%DB%8C%...%8C-atmega128/)
    >> فیوز بیت : m103c
    این فیوزبیت باید باید باید غیر فعال باشه. اگه غیر فعال نکنین بعدش که کد رو روش می ریزین و اجرا می کنین قیافتون اینجوری میشه >> بعد میکرو رو مقصر می دونین و >> در حالی که میکرو >> بی تقصیره
    >> فیوزبیت : watch dog timer
    اینم برای خودش یه کرمیه که همون اول فعاله. باید غیر فعالش کنین تا هی برنامتون رو از اول نکنه. دیدی گفتم میکرو بی گناهه

    2- پروگرام کردن این بیچاره:
    همیشه بهترین آموزگار این avr ها دیتاشیتشونه. برای پرو گرام کردنشون >>>

    نوشته اصلی توسط lachini نمایش پست ها
    پین های کانکتور SPI را مطابق راهنمای زیر وصل کنید :
    نوشته اصلی توسط lachini نمایش پست ها

    پین PE.0 یا همون پایه شماره 2 میکرو را به MOSI پروگرامر
    پین RESET یا همون پایه شماره 20 میکرو را به RST پروگرامر
    پین PB.1 یا همون پایه شماره 11 میکرو را به SCK پروگرامر
    پین PE.1 یا همون پایه شماره 3 میکرو را به MISO پروگرامر
    پین های GROUND میکرو را به GND پروگرامر
    پین VCC میکروبه VCC پروگرامر
    تموم شد و خلاص
    نه هنوز مونده >>>
    1- تغذیه رو مطمئن باشین که وصل کردین یا نه
    2- کریستال رو مطمئن باشین روی خارجیه یا داخلی (اگه خارجیه طبیعتا باید براش کریستال بذارین)(هرچی نزدیک به میکرو باشه خیلی بهتره (نویز کمتر میشه)
    3- از درست وصل کردن پایه ها مطمئن باشین

    اما در مورد پایه pen باید بگم مود program enable هستش که بهتره توسط مقاومتی (ترجیحا 10 کیلو اهم) پول آپ بشه (به مثبت وصل بشه) (کلا کار خاصی نمی کنه (پس چرا گذاشتن؟؟؟))
    (تو متن دیتاشیت یه جوری توضیح داده که انگار این پایه می تونه به جای پایه ی ریست به کار گرفته بشه)(برای پروگرامینگ)



    3- درست تنظیم کردن پشته های سخت افزاری که atmega آدرس ها رو گم نکنه (بیشتر از این نمی تونم توضیح بدم که با دوستان باشه بعدا اصلاح کنم)
    نوشته اصلی توسط ژوپیتر نمایش پست ها
    من این موضوع رو تو کامپایلرهای مختلفی دیدم، چند نکته هست که حتما به درد میخوره:
    نوشته اصلی توسط ژوپیتر نمایش پست ها
    1- در َAVR چون Data Stack, Return Stack و Heap همه در رم هستند و AVR هم قربونش برم MMU نداره، باید خیلی مواضب در استفاده از توابع malloc و توابع مشابه باشید تا Memory leakage نداشته باشید.

    2- فانکشن کالها باید از نظر نوشتاری نزدیک به هم باشند، چون پارسرها متاسفانه Function listing انجام نمیدن و چون Jump در اسمبلی محدودیت داره از نظر نوشتاری، فانکشنهایی که همدیگرو کال میکنن باید نزدیک به هم باشن( وقتی 200 کیلوبایت شد کدتون منظورم رو کاملا متوجه میشید)

    3-Handle کردن درست اینتراپتها، چون AVR در وقفه ها خاصیت Nested Interrupt نداره و همزمان نمیتونه دو و یا بیشتر وقفه رو اجرا کنه، هنگ میکنه چون Program counter و Return Stackش به هم میریزه، وقتی از دو یا چند پورت سریال استفاده کنید و روی وکتور هاشون کد بنویسید متوجه میشید که پس از مدتی با تداخل وقفه ها هنگ میکنه و راه حلش چیزی نیست جز غیر فعال کرد دیگر وقفه ها در همون وقفه ای که اتفاق افتاده و باز فعال کردنشون بعد از انجام دستورات.

    4-مطمئن باشید که با استفاده 30% ی هیچ اتفاقی برای 128 نمیفته، من با 120 کیلو کد و 4 کیلو بوتلودر هم روش جواب گرفتم وبعدش رفتم سراغ 2561، Watchdog رو فعال کنید و بعد از Reset علتش رو از رجیستر مربوطش بخونید. اگر بازم ریست نشد ایراد از کامپایلره و میکرو یه جایی تو Op-Code ها داره دور خودش میچرخه و به نظر شما هنگ کرده در حالی که داره کد حاصل از کامپایلر رو اجرا میکنه(بنده خدا).

    5- اصلا و ابدا از فانکشن کالهای Recursive استفاده نکنید، در استفاده از لیست پیوندی حتما خود پوینترها رو هم علاوه بر free برابر null قرار دهید.
    اگر از آرایه استفاده میکنید حتما Index Counter آرایه رو unsigned در نظر بگیرید که منفی نشه. حتما متغیرها رو اول کار Initialize کنید.

    بازم نکته هست.....اووووه......از کول افتادم
    در ضمن اگه برای کدتون Debugger بنویسید که خط به خط پیغام مثلا تو پورت سریال بده، راحت میفهمید که کجای کار ایراد داره.

    موفق باشید.
    نوشته اصلی توسط saeiddiod نمایش پست ها
    در مورد فانکشن کالها ما محدودیت نداریم.شما بسته به کدهایی که از نظر ادرس دسترسی با هم فرق دارن پرشهای بدون شرط رو انتخاب میکنید.برای دسترسی به فضای فلش یک بایت-دو بایت و بیشتر شما بایداز پرشهای انشعابی متفاوت استفاده کنید.برای مثال اگه میکروکنترلر دارای حافظه کمتر از 64کیلو بود از دستور IJMP و اگر بیشتر از 64 کیلو بود از دستور EJMP استفاده میکنیم.البته این دستورات شامل همه سری های AVR نیست
    4- پورت های f و g: نمیشه به صورت بیتی بهشون دستور بدی. یعنی به جای اینکه بنویسی:
    کد PHP:
    portf.1 
    باید بنویسی:
    کد PHP:
    portf 0b01000000 
    البته ممکنه ide ای که شما باهاش کار می کنین این امکان رو فراهم کنه

    2- بقیه اش دیگه عمومی میشه:

    1- تغذیه: اگه بهش غذا ندین که نمی تونه کار کنه.تازه بهتره غذاتون خیلی شور نباشه چون مغزش قاطی می کنه
    یعنی ولتاژ 3 تا 5 ولت رگوله شده (رگوله شده = هرچی کم نمک تر بهتر) به مقدار 500 الی 1 آمپر (مال وقتیه که خیلی از پایه هاش جریان می کشین. در ضمن یادتون باشه بیشتر از 20 میلی آمپر (در حد یه led) ازش جریان نکشین که باید فاتحه اش رو بخونین. (20 میلی آمپر احتیاطیه. ولی تا 40 میلی آمپر هم میده)
    2- کریستال: وقتی فیوز بیت رو روی خارجی تنظیم می کنی طبیعتا باید براش یه کریستال بذاری دیگه ( چقدر مورد داشتیم تو این موضوع) (اینا دیگه خیلی پیش پا افتیده شده و نباید باعث مشکل باشه)
    3- pcb: دقت بکنین توی این طراحی ها. بر اساس اصول بسازین هیچ چیش نمیشه
    https://s19.picofile.com/file/843326...Noise.pdf.html اینو بخونین تا مشکل خاصی نداشته باشین

    خب بریم سراغ تایپیک هایی که برای این بحث زده شده که کمم نیستن
    1- ارور در پروگرم کردن اتمگا 128 (eca.ir) پروگرام کردن
    2- مشکل با میکرو 128 (eca.ir) تغذیه ، فیوز بیت ، سخت افزار پورت های f و g
    3- حافظه فلش مگا 128 (eca.ir) تنظیم پشته های سخت افزاری
    4- مشکل پورت G اتمگا 128(فوری) (eca.ir) سخت افزار پورت های f و g
    5- مشکل با 128 (eca.ir) تنظیم پشته های سخت افزاری
    6- درست عمل نکردن برنامه روی atmega 128 (eca.ir) پروگرام کردن ، فیوز بیت ، pcb
    7- مشکل بد با پروگرام کردن مگا 128 (eca.ir) پروگرام کردن ، فیوزبیت ، تنظیم پشته های سخت افزاری
    8- ATMega 128 A auمشکل شناسایی و پروگرام (eca.ir) پروگرام کردن
    9- کم آوردن مگا 128 با بیسکام (eca.ir) تنظیم پشته های سخت افزاری ، برنامه نویسی نامناسب
    10- مشکل عجیب با مگا 128 (eca.ir) فیوز بیت
    11- پروگرم کردن Atmega128 با پروگرم هاتل؟ (eca.ir) پروگرام کردن
    12- مشکل همیشگی من با ATMEGA 128 (eca.ir) پروگرام کردن ، فیوز بیت ، تغذیه
    13- یک مشکل با مگا 128 (eca.ir) فیوز بیت
    14- مشکل در پروگرامه mega 128 (eca.ir) پروگرام کردن
    15- مگا 128 فقل شده (eca.ir) پروگرام کردن ، فیوز بیت ، کریستال
    16- آموزش اتصال Atmega 128 به پروگرامر (eca.ir) pcb ، تغذیه
    17- پروگرام کردن ATMega128 (eca.ir) پروگرام کردن
    18- ATMEGA 128 را میتوان با پروگرمر STK200/300 برنامه ریزی کرد یا نه؟ (eca.ir) پروگرام کردن ، pcb ، فیوزبیت
    19- اتصال اسیلاتور 16MHz بلکه هم بیشتر به میکرو 128 (eca.ir) کریستال
    20- معنی اسم های پایه های اتمگا 128 (eca.ir) پایه ها
    21- راهنمایی برای استفاده از پورت c در اتمگاه 128 به عنوان I/O (eca.ir)
    22- اتمگا 128 و اشکال در برنامه و پروگرمر (eca.ir)

    آخیش تموم شد (امیدوارم دیگه تایپیک های تکراری زده نشن و هرچی سوال دارین فقط اینجا بپرسین ولی اگه می خواین در مورد کدتون سوال بپرسین یه تایپیک دیگه بزنین اونجا بپرسین)
    بحث اصلاح می شود ... ( دوستان کمک کنند موارد اشتباه رو درست کنم)
    ---------------------------------------------------------------------------------- تشکر از دوستان
    saeiddiod
    ----------------------------------------------------------------------------------
    هزینه = سه تا صلوات بفرستین برای ظهور امام زمان(عج) تا بیاد و ما رو از این روزای سخت کرونایی نجات بده
    جدیدترین ویرایش توسط electromohammad; ۱۰:۰۴ ۱۴۰۰/۰۲/۲۱.
    همیشه کامل توضیح بدهیم تا جواب کامل بگیریم.
    لطفا برای تشکر روی دکمه تشکر بزنید و بخاطر این پست نزنید که تایپیک شلوغ نشود
    تایپیک های من:
    حل تمام مشکلات atmega128a (eca.ir)
    آموزش کار با سایت (eca.ir)

    #2
    پاسخ : حل تمام مشکلات atmega128a

    نوشته اصلی توسط انگور نمایش پست ها
    اما در مورد پایه pen باید بگم مود program enable هستش که باید به منفی تغذیه وصل بشه (اینطور که من از دیتاشیت فهمیدم (لطفا دوستان کمک کنند تا اصلاح کنم)



    4- پورت های f و g: نمیشه به صورت بیتی بهشون دستور بدی. یعنی به جای اینکه بنویسی:
    کد PHP:
    portf.1 
    باید بنویسی:
    کد PHP:
    portf 0b01000000 
    بهتره پین PEN ازاد باشه و کاری بهش نداشته باشیم.من بدون دستکاری این پین هزار بار MEGA128-64 پروگرام کردم و مشکلی پیش نیومد چون بصورت پیشفرض پول اپ هست.
    کلا تغییر بیتها بصورت تنهایی برای راحتی کار توسط IDE های مختلف ساخته شده و شما برای تغییر باید از & و | کردن استفاده کنین.
    در مورد نقل قول اقای ژوپیتر عزیز که در مورد همزمانی اینتراپتها نوشته بودن باید بگم خدمتتون که بهتره برنامه ای داخل اینتراپت نوشته نشه و از اینتراپت فقط برای اطلاع رسانی در مورد وقوع اینتراپت استفاده بشه.نوشتن برنامه داخل اینتراپت و درخواست بصورت همزمان یا وقوع تو در تو باعث حالت همزمانی میشه.البته اینتراپتها رزرو میشن ولی قبلا که اسمبلی مینوشتم میکرو ریست میشد و احتمالا بخاطر استک ها بود ولی منظور کلی حرفم اینه داخل اینتراپت نباید برنامه نوشت.
    و یه نکته خیلی مهم برای دوستانی که هدر برد برای این میکرو میسازن اینو در نظر داشته باشن که کریستال خارجی نباید فاصله زیادی با میکرو داشته باشه چون باعث خطا هنگام پروگرام و شناخته نشدن میکرو میشه(طبق تجربه خودم).
    با سپاس از دوستان.موفق باشید

    دیدگاه


      #3
      پاسخ : حل تمام مشکلات atmega128a

      در مورد فانکشن کالها ما محدودیت نداریم.شما بسته به کدهایی که از نظر ادرس دسترسی با هم فرق دارن پرشهای بدون شرط رو انتخاب میکنید.برای دسترسی به فضای فلش یک بایت-دو بایت و بیشتر شما بایداز پرشهای انشعابی متفاوت استفاده کنید.برای مثال اگه میکروکنترلر دارای حافظه کمتر از 64کیلو بود از دستور IJMP و اگر بیشتر از 64 کیلو بود از دستور EJMP استفاده میکنیم.البته این دستورات شامل همه سری های AVR نیست
      جدیدترین ویرایش توسط saeiddiod; ۰۳:۱۲ ۱۴۰۰/۰۲/۲۱.

      دیدگاه


        #4
        پاسخ : حل تمام مشکلات atmega128a

        "3-Handle کردن درست اینتراپتها، چون AVR در وقفه ها خاصیت Nested Interrupt نداره و همزمان نمیتونه دو و یا بیشتر وقفه رو اجرا کنه، هنگ میکنه چون Program counter و Return Stackش به هم میریزه، وقتی از دو یا چند پورت سریال استفاده کنید و روی وکتور هاشون کد بنویسید متوجه میشید که پس از مدتی با تداخل وقفه ها هنگ میکنه و راه حلش چیزی نیست جز غیر فعال کرد دیگر وقفه ها در همون وقفه ای که اتفاق افتاده و باز فعال کردنشون بعد از انجام دستورات."

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

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

        خب آیا ممکنه این اتفاق بیوفته ؟؟؟
        راه کار چیه ؟؟؟

        دیدگاه


          #5
          پاسخ : حل تمام مشکلات atmega128a

          نوشته اصلی توسط farshad_1372 نمایش پست ها
          سلام دوستان
          در مورد نکته ای که در خصوص وقفه های تو در تو و هنگ کردن میکرو avr در بالا ذکر شد فرض کنیم در هنگام وقوع یک وقفه بیایم وقفه های دیگه رو غیر فعال کنیم حالا اگه قبل از غیر فعال کردن وقفه ها یه دفعه یه وقفه دیگه رخ داد !!!
          اون وقت طبق گفته ی بالا قطعا میکرو هنگ میکنه ...

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

          خب آیا ممکنه این اتفاق بیوفته ؟؟؟
          راه کار چیه ؟؟؟
          با درود
          منظور از اینتراپت تو در تو -درخواست یه اینتراپت بصورت پشت سر هم هست یعنی شما از طریق INT0 میاید یه برنامه ای رو اجرا میکنید.در حین اجرای برنامه دوباره INT0 درخواست میشه-تو این حالت دستورات داخل سابروتین هنوز کامل اجرا نشدن که شما دوباره به ادرس شروع سابروتین میرین که اینکار میتونه یه نقص تو کدنویسی باشه.
          برای مثالی که در مورد ماژول زدید=اینتراپتی که از لحاظ برداری اولویت بالاتری داره زودتر بهش رسیدگی میشه و اینتراپت بعدی رزرو میشه و در اولولیت بعدی قرار میگیره.برای مثال INT0 و تایمر بصورت همزمان درخواست اینتراپت بدن INT0 که اولویت بالاتری داره اول اجرا میشه و بعد از اون به اینتراپت تایمر رسیدگی میشه.

          غیرفعال کردن اینتراپت روش مناسبی نیست چون ممکنه تو بیشتر موارد مثه کار با پروتکلهای ارتباطی دیتا رو از دست بدین یا از وقوع یه اینتراپت مهم بی خبر بمونید.

          برای اینکه مشکلات بالا پیش نیاد بهتره داخل اینتراپت برنامه نوشته نشه و فقط ازشون برای اعلام وقوع اینتراپت استفاده بشه.
          جدیدترین ویرایش توسط saeiddiod; ۱۸:۳۳ ۱۴۰۰/۰۴/۰۲.

          دیدگاه

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