اینجا راحت و مستقیم ترین روش برای بازیابی برنامه کامپایل و آپلود شده روی میکروکنترلر avr آردوینو و کپی آن روی یک آردوینو دیگر را بدون استفاده از programmer و ابزار تخصصی یادداشت می کنم.
بعبارتی برنامه روی flash و محتوی eeprom را از روی یک آردوینو می گیریم و روی یک برد آردوینو دیگر قرار می دهیم (کپی می کنیم).
زیرا Arduino IDE دکمه Upload دارد اما دکمه Download ندارد که برنامه روی بک برد را روی بردهای دیگر کپی کنیم !
برنامه های کامپایل شده آردوینو که دانلود و آپلود می کنیم در فرمت Intel Hex هستند.
Intel hexadecimal object file format, Intel hex format or Intellec Hex is a file format that conveys binary information in ASCII text form. It is commonly used for programming microcontrollers, EPROMs, and other types of programmable logic devices and hardware emulators. In a typical application, a compiler or assembler converts a program's source code (such as in C or assembly language) to machine code and outputs it into a HEX file.
یک مرحله پیشرفته تر از این می توانیم برنامه کامپایل شده را disassemble کنیم تا به کد اسمبلی برسیم، شما می توانید براحتی به کد اسمبلی برنامه برسید اما تبدیل آن به C (دیکامپایل) خیلی سخت تر است. بنابراین بازیابی سورس اصلی ++C برنامه آردوینو سخت است و معمولا صرفه ندارد.
A decompiler takes one from a binary to source code–or something similarly high-level that can easily be read by humans. A disassembler takes one from binary to assembler–which is much lower level and is more difficult to read for humans.
همچنین اگر روی میکروکنترلر lock bits تنظیم شده باشد این فرآیند ممکن نیست. (البته روی آردوینو بخاطر bootloaderش تنظیم lockbits کار راحتی نیست و معمولا نمی کنند.)
Lock bits are set of bits to enable or disable some special security features of a microcontroller. For example, in some cases you might want to disable the memory read functionality of the microcontroller, so that the code you have written cannot be stolen by others. The number of lock bits and their functionality is always given in the datasheet. The controller used here has three lock bits which can be set or reset depending on the feature.
در اینجا ۲ برد آردوینو اونو داریم ، یک arduino uno که بعنوان پروگرامر برای خواندن و نوشتن روی میکروکنترلر arduino uno دیگری که target است استفاده می شود.
روی برد programmer من دقیقا ISP example را آپلود کردم.
اینجا استفاده از ISP (In-System-Programmer) آردوینو توضیح داده شده است.
The Arduino ISP is an In-System-Programmer that is used to program AVR microcontrollers.
و اینجا هم توضیحات کاملتر و pinout را خواهید دید.
پین اوت اتصال دو برد arduino uno برای اینکه یکی پروگرامر دیگری باشد را در تصویر زیر مشاهده می فرمایید.
بعد از upload روی برد programmer و اتصال برد programmer و target براساس pinout ذکر شده در بالا می توانیم روی میکروکنترلر avr برد target بخوانیم و بنویسیم.
برد programmer را (که روی آن برنامه ISP را ریختید و برد تارگت براساس pinout بالا آن وصل است) با usb به کامپیوتر وصل کنید.
ابزار avrdude یک ابزار معروف برای خواندن و نوشتن روی avr است که برای انواع سیستم عامل ها نیز موجود می باشد. خودش خط فرمانی است البته.
AVRDUDE - AVR Downloader Uploader - is a program for downloading and uploading the on-chip memories of Atmel’s AVR microcontrollers.software for programming Microchip (former Atmel) AVR Microcontrollers.
روی ویندوز ابزار گرافیکی و رایگان AVRDUDESS را دارید که درحقیقت یک GUI برای همان AVRDUDE است.
ابزارهای پیشرفته تر و بهتر هم وجود دارند اما همین همه کاری که ما میخواهیم را می کند.
برای خواندن از برد target که به برد programmer متصل است ، در پنجره AVRDUDESS ابتدا از بخش programmer گزینه Arduino را انتخاب بفرمایید و سپس از port آن پورتی که روی کامپیوتر شناسایی شده است انتخاب کنید و baud rate را همین ۱۹۲۰۰ بزنید.
تنظیمات مثل تصویر بالاست.
سپس دکمه detect را بزنید تا نوع میکروکنترلر را شناسایی کند و از ارتباط و شناسایی صحیح اطمینان پیدا کنید و سپس دو دکمه read در بخش Fuses & lock bits را بزنید. دقت بفرمایید اگر موقع نوشتن fuse و لاک بیت ها را چیز دیگری بزنید ممکن است کار نکند و حتی دیگر MCU غیرقابل استفاده شود. بنابراین این مقادیر را یادداشت کنید و اگر اطمینان ندارید هنگام نوشتن تغییر ندهید.
در قسمت Flash و EEPROM با زدن دکمه ... یک فایل برای ذخیره برنامه خوانده شده انتخاب کنید، برای flash پسوند hex. و برای eeprom پسوند eep. باشد. مقدار Format هر دو را هم Intel Hex انتخاب کنید.
در هر دو هم گزینه read را در هنگام خواندن انتخاب بفرمایید.
اکنون اگر در قسمت Flash و EEPROM دکمه Go را بزنید برنامه روی flash و eeprom را خوانده و در فایلی که آدرس داده اید ذخیره می کند.
در آردوینو Flash برای ذخیره برنامه کامپایل شده ای که اجرا می کند استفاده می شود و EEPROM برای ذخیره مقدار کمی دیتا (در EEPROM داخلی uno معادل ۱ کیلوبایت!) مثل وضعیت و مقدار یک سنسور و عملگر و ... که با خاموش شدن برد از بین نمی رود، درباره انواع حافظه ها در آردوینو اینجا بیشتر بخوانید.
یک ابزار راحت (راحت ترین) برای نوشتن برنامه کامپایل شده hex روی میکروکنترلر آردوینو بدون Arduino IDE ابزار Arduino-XLoader است.
برد target را مستقیما با usb به کامپیوتر وصل کنید و خیلی راحت فایل hex فلش و نوع برد (Device) و COM Port را انتخاب کنید و دکمه Upload را بزنید. برنامه hex دانلود شده در مرحله قبل روی flash برد target ریخته می شود و نیازی به چیز دیگری نیست.
طبیعتا در AVRDUDESS آپشن ها و گزینه های بیشتری دارید.
برای نوشتن با AVRDUDESS روی برد target ابتدا آن را به برد programmer و برد programmer را با usb به کامپیوتر متصل کنید.
همان تنظیمات است فقط،
دقت کنید مقادیر Fuses & lock bits ها عینا همان باشد که در ابتدا خواندید. تیک set fuses و set lock را هم بعد از اینکه از صحیح بودن مقادیر اطمینان پیدا کردید بزنید.
در قسمت Flash و EEPROM گزینه write را انتخاب کنید و در بخش Options تیک Erase flash and EEPROM را بزنید و در نهایت دکمه !Program را بزنید.