صبحا مهندس مکانیک، شبا برنامه نویس علاقه مند اوپن سورس و هر نوع ساختن https://github.com/KAYT33N
قسمت ۱ : استفاده از آردینو به عنوان پروگرمر

اگر از علاقه مندان به آردینو هستید و آماده اید تا خودتون رو از محدودیت های برد و محیط برنامه نویسی آردینو رها کنید و به برنامه نویسی بدون واسطه برای میکروکنترلرها بپردازید، اولین ابزاری که برای آپلود کدهای خود بر روی میکروکنترلر نیاز دارید یک پروگرمر ISP programmer خواهد بود و اولین قدم در این مسیر تهیه این ابزار، از بازار و یا استفاده از همان برد آردینویی که در اختیار دارید به عنوان پروگرمر هستش.
در این قسمت از سری مقالات برنامه نویسی C برای AVRها، مراحل مورد نیاز برای استفاده از برد آردینویی که دارید به عنوان پروگرمر، طرز سیم کشی بین آردینو و میکروکنترلر و تفاوت بین استفاده از بوتلودر آردینو و فلش مستقیم کد رو به طور کامل بررسی میکنیم و در نهایت نکاتی درباره فیوزهای میکروکنترلر مرور میکنیم که باعث میشن نتونید تراشتون رو خراب کنید.
چرا به ISP نیاز داریم؟
برنامه نویسی داخل سیستمی (ISP:In-system programming) روشی برای برنامه نویسی میکروکنترلرها هستش برای وقتی که میکروکنترلرها در مدار قرار دارند، برای همین بهش "درون سیستمی" میگن. این روش از یک پروتکل سریال بر روی پین های SPI برای ارتباط بین پروگرمر و میکروکنترلر هدف استفاده میکنه، که باعث میشه بتونید بدون برداشتن تراشه، امضای دستگاه رو بخونید، فیوز ها رو تغییر بدید و نرم افزار جدید رو روی تراشه مورد نظر آپلود کنید.

AVRولی چرا از ISP و C بجای برنامه نویسی در محیط راحت تر آردینو استفاده میکنیم ؟
۱. بدون سربار (overhead) بوت لودر
بوتلودر آردینو علاوه بر اشغال کردن حدود ۲ کیلوبایت از حافظه محدود و ارزشمندی که روی میکروکنترلر در اختیار داریم، باعث ایجاد تاخیر در راه اندازیش هم میشود. این تاخیر و حجم اشغال شده موقع کار با C خالص و استفاده از ISP وجود ندارند و میتوانید از تمام فضای تراشه برای کدهای خود استفاده کنید.
۲. انعطاف پذیری بیشتر
آردینو در مدل های مختلفی برای خرید ارائه شده است ولی این تنوع نسبت به تنوع میکروکنترلرهای AVR خیلی چشم گیر نیست. برای مثال تراشه ATmega16 که در این سری از آن استفاده خواهیم کرد در مدل های ۲۸ و ۳۲ و ۴۰ و ۴۴ پین در دو مدل smdو dip موجود است که محیط برنامه نویسی آردینو از هیچ کدام آنها پشتیبانی نمیکند.
۳. مقرون به صرفه
هزینه خرید یک پروگرمر ساده به همراه یک میکروکنترلر Atmega328 که در آردینو استفاده میشود، باز هم نسبت به خرید آردینو مقرون به صرفه تر خواهد بود، در حالی که امکان استفاده از پروگرمر را با تراشه های مختلف و در پروژه های دیگر بدون هزینه اضافی خواهید داشت. همچنین امکان انتخاب دقیق تراشه با توجه به نیاز های پروژه خود در هنگام تولید انبوه محصول میتواند هزینه های تولید انبوه را به حداقل برساند.
استفاده از آردینو به عنوان ISP
قبل از هرکاری مطمعن شوید که مراحل مورد نیاز را انجام داده اید و وسایل مورد نیاز را تهیه کرده اید.
سری ابزار مورد نیاز برای برنامه نویسی
AVRکه در قسمت ۰ نصب کردیم.avr-gcc,make,avrdudeیک برد آردینو برای تبدیل کردن به پروگرمر (برد شما خراب نمیشود و این پروسه قابل بازگشت است)
نرم افزار آردینو
Arduino IDEیک میکروکنترلر
AVR(ما ازATmega16استفاده میکنیم)یک برد بورد و تعدادی سیم برای اتصالات
یک خازن 10μF الکترولیتی
مرحله ۱: آماده کردن آردینو

نرم افزار آردینو رو باز کنید و سپس از بخش مثال ها،
ArduinoISPرا باز کنید.
File > Examples > 11.ArduinoISP > ArduinoISPبرد خود را انتخاب کنید و فایل باز شده را بر روی آن آپلود کنید.
تمام! برد شما آماده استفاده به عنوان پروگرمر است.
مرحله ۲: غیرفعال کردن ریست خودکار آردینو

خازن 10μF الکترولیتی که تهیه کردید را بین پایه های RESET و GND روی برد آردینو قرار بدهید.
اهمیت این کار این است که برد های آردینو موقع مشغول شدن توسط نرم افزار هایی مثل
avrdudeریست میشن ولی ما داریم از این برد به عنوان پروگرمر استفاده میکنیم و برد آردینومون تمام مدت باید هشیار باشه که خازن جلوی این فرمان ریست رو میگیره.
مرحله ۳: تشخیص پایه های تراشه
برای برنامه نویسی با ISP پروگرمر نیاز به تشخیص ۴ پایه روی تراشمون داریم.
SCK, MOSI, MISO, RESET

ATmega16 pinoutبرای تشخیص این ۴ پایه، میتونید اسم تراشتون رو به همراه عبارت pinout گوگل کنید و داخل تصاویر دنبال این پایه ها بگردید.
همچنین باید ۲ تا پایه vcc, AVCC و دو پایه GND تراشتون رو هم از داخل تصویر پیدا کنید.
مرحله ۳: سیم کشی بین برد و تراشه

شماره پایه های گفته شده در این مرحله مربوط به
ATmega16هست و در صورت استفاده از تراشه ای غیر از اون میتونید از طریق مرحله قبل پایه های مربوطه رو پیدا کنید.
+5 ولت آردینو به
AVCCوVCC( پایه های ۱۰ و ۳۰)پایه منفی آردینو به
GNDها (پایه های ۱۱ و ۳۱)پایه ۱۰ آردینو
SS/Resetبه شماره ۹ تراشهRESETپایه ۱۱ آردینو
MOSIبه پایه ۶ تراشهMOSIپایه ۱۲ آردینو
MISOبه پایه 7 تراشهMISOپایه ۱۳ آٰردینو
SCKبه پایه ۸ تراشهSCK
اگر تراشه شما دسته دو هست و فیوزهای اون قبلا برای استفاده از کلاک خارجی آماده شدن، برای استفاده از اون نیاز به وصل کردن کریستال مورد نظرتون به پایه های
XTAL1وXTAL2(شماره ۱۲ و ۱۳) دارید ولی در این مرحله از آموزش برای تراشه های نو نیاز به این کار نیست و تراشه ها به صورت پیش فرض از کلاک ۱MHz داخلی استفاده میکنند.
مرحله ۵: روشن کردن
آردینو را به کامپیوتر خود متصل کنید تا هردو تراشه روشن بشوند. سپس برای اطمینان از صحت اتصالات میتوانید از قطعه کد زیر در ترمینال خود استفاده کنید و خوانده شدن صحیح امضای دستگاه به معنی درست بودن سیم کشی ها میباشد. کارمون همینجا تمومه و توی قسمت بعدی قراره اولین برناممون رو آپلود بکنیم!
avrdude -c arduino -p m16 -P /dev/ttyACM0 -b 19200 -vمقدار
m16مربوط بهatmega16هست و در صورت استفاده از مدل های دیگه باید مدل میکروکنترلر خودتون رو جایگزینش کنید.
فیوز AVR چیه و چطور تراشمون رو خراب نکنیم
فیوزها تنظیمات ثابت سخت افزاری هستند که با مقادیر خودشون مشخص میکنند که تراشمون برای مثال از چه فرکانس خارجی یا داخلی ای استفاده میکنه، رفتارش با eeprom موقع آپلود کد و تنظیمات دیگه رو تعیین میکنه.
این فیوز ها از حافظه های فلش و
eepromجدا هستند.
برای ATmega16 این فیوزها وجود دارند و میتونید از داخل دیتاشیت اون بیشتر دربارشون بخونید.
فیوز پایین (LFUSE)
وظیفه کنترل کلاک و تعیین استفاده از نوسان داخلی یا خارجی و سرعت اون رو بر عهده داره. برای مثال مقدار 0xE1 به معنی فرکانس 8MHz داخلی این مدل هستش.
فیوز بالا (HFUSE)
مقدار ۰یا۱ برای
SPIENامکان آپلود کد از طریقSPIرو فعال و غیرفعال میکنه.مقدار
BOOTSZحجم کد بوت رو مشخص میکنه. مقدار 0x00 به معنی کل حافظه فلش به عنوان بوت لودر هست.تغییر
RSTDISBLبه ۱ به معنی استفاده از پین ریست به عنوان ورودی و خروجی و عدم استفاده به عنوان پین ریست هست!تغییر
BODLEVELبرای تعیین رفتار تراشه در صورت افت ولتاژ
برای خواندن وضعیت فعلی فیوزها از روی تراشه میتوانید از فرمان زیر استفاده کنید.
avrdude -c arduino -p m16 -P /dev/ttyACM0 -b 19200 -U lfuse:r:-:h -U hfuse:r:-:h -U efuse:r:-:hبرای تنظیم کردن فیوز ها به مقادیر جدید میتوانید از کد زیر استفاده کنید
avrdude -c arduino -p m16 -P /dev/ttyACM0 -b 19200 -U lfuse:w:0xE4:mچطور تراشمون رو تبدیل به آجر نکنیم!
همیشه قبل از تغییر فیوزها، اول مقادیر فعلی اونها رو بخونید و ازشون پشتیبان بگیرید تا در صورت وجود مشکل بتونید برگردید.
از ماشین حساب های آنلاین مثل
Engbeddedمحاسبه مقادیر فیوزها برای محاسبه استفاده کنید تا جلوی اشتباهات محاسباتی رو بگیرید.به فیوز
RSTDISBLدست نزنید! تغییر مقدار اون باعث میشه که تراشتون از روش های معمولی قابل برنامه نویسی نباشه.روشن کردن
BODLEVELباعث میشه که تراشتون در صورت وجود افت ولتاژ خودش رو ریست بکنه.در صورت نیاز به تغییر فیوزها ، اونها رو یکی یکی تغییر بدید و توی هر مرحله تست کنید که آیا تراشتون سالمه یا نه.
مشکلات رایج استفاده از avrdude و ArduinoISP
حتی با اتصالات بی نقص هم ممکنه به مشکلاتی بر بخورید که اینجا مرورشون میکنیم.
avrdude: stk500_getsync(): not in sync: resp=0x00
programmer not responding
احتمالا خازن
10μFبه درستی بین پایه هایresetوgndآردینو قرار داده نشده است.
یا ممکن است که مقدار
baudrate (-b 19200)با مقدارArduinoISPمتفاوت باشد که میتوانید از داخل اسکچ مقدار درست را بررسی کنید.
avrdude: Yikes! Invalid device signature
مقدار اشتباه برای مدل تراشه در دستور
avrdudeاشتباه در سیم کشی (معمولا
misoوmosi)خاموش بودن تراشه هدف ( اتصالات مثبت و منفی را چک کنید)
avrdude: error: could not find USB device
پورت اشتباهی را در avrdude انتخاب کرده اید، برای پیدا کردن مقدار صحیح در لینوکس از lsusb و در ویندوز از Device Manager استفاده کنید تا پورت درست را پیدا و جایگزین مقدار dev/ttyACM0 در دستورات کنید.
avrdude: verification error
کد فلش شده است ولی تایید نمیشود. میتوانید سرعت ارتباط را از 19200به مثلا 9600 کاهش دهید.
rc=-1 یا no response
فیوزها رو تغییر دادید و باید از کریستالی که در فیوزها مشخص کردید استفاده کنید.
Permission denied
دسترسی کافی به avrdude داده نشده است. داخل لینوکس از sudo و در ویندوز از run as admin استفاده کنید.
سرعت آپلود کد ها کم هست
سرعت ارتباط پایین هستش و در صورت کشش و ثابت بودن ارتباط میتونید از مقادیر بالاتر مثل 115200 استفاده کنید. برای این کار، داخل اسکچ آردینو مقدار رو مشخص کنید و موقع صدا کردن avrdude از مقدار جدید استفاده کنید.
در صورت نبودن مشکل شما در لیست بالا میتونید از -v برای نمایش جزییات avrdude استفاده کنید و با استفاده از خطاهای موجود سوالتون رو مطرح کنید.
صبور باشید! بیشتر مشکلات معمولا به سیم کشی یا تنظیمات برمیگردن و وقتی که کار کنن دیگه چیزی جلودارتون نیست :)
جمع بندی و قسمت بعد
در این مقاله یاد گرفتیم که چطور از برد آردینویی که داریم به عنوان پروگرمر ISPاستفاده کنیم، به جزییاتش مثل تنظیمات و سیم کشی ها و مشکلات رایجش پرداختیم و گفتیم که فیوزها اصلا چی هستن و به چه درد میخورن.
در مقاله بعدی یاد میگیریم که پورت و رجسیتر ها چی هستن، بعدشم کد یک LED ساده چشمک زن (لذت بخش ترین کد ممکن) رو با avr-gcc کامپایل و با استفاده از avrdude اون رو روی تراشمون فلش می کنیم.
led و مقاومتاتون رو آماده کنید که قسمت بعدی مقاله قراره با جادو روشنش کنید.
باکیفیت ترین دوره آموزش برنامه نویسی چیست ؟
⭐⭐⭐⭐⭐ دوره ی آموزش دوازده قدم برنامه نویسی مهندس سام نیک زاد با کسب امتیاز بالاترین کیفیت دوره ی آموزشی بعنوان با کیفیت دوره انتخاب شده است برای مشاهده کلیک کنید
ثبت نام دوره با تخفیف از ویرگول
مطلبی دیگر از این انتشارات
از سردرگمی تا سرچ کنسول: چطور فهمیدم سئو فقط کلمه کلیدی نیست؟
مطلبی دیگر از این انتشارات
مهمترین مهارت های لازم برای پیشرفت در برنامه نویسی
مطلبی دیگر از این انتشارات
📄 مفاهیم برنامهنویسی به زبان ساده – Git