در این بخش در مورد فیوز بیت ها و لاک بیت ها صحبت میکنیم که در تمامی میکروکنترلرهای AVR وجود دارند و نقش آن ها اساسیت. با تنظیم فیوز بیت ها اعمالی نظیر تنظیم کلاک میکرو، قفل کردن میکرو در برابر کپی کردن برنامه و مدیریت حافظه بوت لودر (قسمت نوزدهم) را میتوان انجام داد. فیوز بیت ها بخشی از حافظه RAM یا Flash میکروکنترلر نیستند و دسترسی به آنها تنها از طریق پروگرامر امکان پذیر است یعنی نمیتوان آنها را در داخل برنامه میکرو حین اجرا تغییر داد. از طرفی دیگر اشتباه پروگرام کردن بعضی از فیوز ها ممکن است باعث از دست رفتن میکروکنترلر شود که در ادامه شرح خواهیم داد.
دسته بندی فیوز بیت ها و لاک بیت ها
در AVR سه دسته فیوز بیت و یک دسته لاک بیت وجود دارند. فیوز بیت ها به 3 قسمت Low Fuse Bits و High Fuse Bits و Extended Fuse Bits تقسیم میشوند که هر قسمت 1 بایت هستند. یعنی هر قسمت از 8 بیت تشکیل شدهاند که در شکل زیر مشخص است.

نکته: در تصویر فوق عدد 0 به معنای پروگرام بودن یا فعال بودن فیوز است و عدد 1 به معنای غیرفعال بودن است.
فیوز های Low
این قسمت شامل فیوز بیت های CKSEL0-3، SUT0-1، BODLEVEL و BODEN میباشند (ستون اول) که اکثرا در تمامی میکروکنترلرهای AVR وجود دارند.
فیوز بیت های CKSEL0 تا CKSEL3
این فیوز بیت ها تنظیم کلاک میکروکنترلر را بر عهده دارند که در بخش 4 آموزش در مورد آنها مفصل بحث شد.
فیوز بیت های SUT0 و SUT1
این 2 فیوز بیت به همراه فیوز بیت های CKSEL0 تا CKSEL3 تنظیم میشوند. وظیفه این فیوز بیت تنظیم زمان استارت آپ یا شروع به کار میکروکنترلر است. با توجه به توضیحات بخش 4 آموزش بسته به اینکه کلاک میکرو روی کدام منبع تنظیم شده باشد، مقادیر SUT میزان تاخیر متفاوتی ایجاد میکنند.
زمان تاخیر اولیه بعد از روشن شدن میکرو | تعداد کلاک برای شروع کار میکرو | فیوز بیت SUT | منبع کلاک میکروکنترلر | فیوز بیت CKSEL |
---|---|---|---|---|
0ms | 6 | 00 | کلاک خارجی و اسیلاتور داخلی | 0000 تا 0100 |
4.1ms | 6 | 01 | کلاک خارجی و اسیلاتور داخلی | 0000 تا 0100 |
65ms | 6 | 10 | کلاک خارجی و اسیلاتور داخلی | 0000 تا 0100 |
0ms | 18 | 00 | اسیلاتور RC خارجی | 0101 تا 1000 |
4.1ms | 18 | 01 | اسیلاتور RC خارجی | 0101 تا 1000 |
65ms | 18 | 10 | اسیلاتور RC خارجی | 0101 تا 1000 |
4.1ms | 6 | 11 | اسیلاتور RC خارجی | 0101 تا 1000 |
4ms | 1000 | 00 | کریستال فرکانس پایین | 1001 |
65ms | 1000 | 01 | کریستال فرکانس پایین | 1001 |
65ms | 32000 | 10 | کریستال خارجی فرکانس پایین | 1001 |
4.1ms | 258 | 00 | کریستال خارجی | CKSEL0 = 0 |
65ms | 258 | 01 | کریستال خارجی | CKSEL0 = 0 |
0ms | 1000 | 10 | کریستال خارجی | CKSEL0 = 0 |
4.1ms | 1000 | 11 | کریستال خارجی | CKSEL0 = 0 |
65ms | 1000 | 00 | کریستال خارجی | CKSEL0 = 1 |
0ms | 16000 | 01 | کریستال خارجی | CKSEL0 = 1 |
4.1ms | 16000 | 10 | کریستال خارجی | CKSEL0 = 1 |
65ms | 16000 | 11 | کریستال خارجی | CKSEL0 = 1 |
به عنوان مثال اگر مقدار فیوزهای SUT برابر 01 و فرکانس میکرو بر روی 8 مگاهرتز داخلی تنظیم شده باشد (یعنی CKSEL = 0100)، در این صورت پس از ریست شدن میکرو یا اعمال ولتاژ به میکرو، به مدت 65 میلی ثانیه تاخیر ابتدایی ایجاد شده و پس از اتمام این زمان، میکرو بعد از 6 سیکل کلاک شروع به اجرای برنامه میکند.
فیوز بیت های BODEN و BODLEVEL
این 2 فیوز برای تعیین ریست شدن میکرو در صورت کاهش ولتاژ VCC به کار میروند. اگر بخواهیم با کاهش ولتاژ VCC میکرو ریست شود، باید فیوز بیت BODEN (Brown Out Detection) فعال گردد یعنی 0 شود. تنظیم ولتاژ آستانه توسط BODLEVEL تعیین میشود. اگر فیوز بیت BODLEVEL برابر 1 باشد، با کاهش VCC از مقدار 2.7 ولت میکروکنترلر ریست میشود و اگر 0 باشد، این مقدار 4 ولت خواهد بود.
فیوز های High
فیوزهای High شامل JTAGEN، SPIEN، CKOPT، EESAVE، BOOTSZ1، BOOTSZ0، BOOTRST و OCDEN است که در ستون دوم قرار دارند.
فیوز بیت OCDEN
با فعال کردن فیوز On Chip Debuging Enable) OCDEN) قابلیت دیباگ کردن یا اشکال زدایی کردن برنامه بر روی میکرو فعال میشود. قابلیت اشکال زدایی توسط رابط JTAG انجام خواهد شد. بنابراین اگر از پروگرامر ISP استفاده میکنید، فعال کردن این فیوز بیفایده است.
فیوز بیت JTAGEN
با فعال بودن این فیوز میتوان از رابط JTAG برای پروگرام کردن و دیباگ کردن میکرو استفاده کرد. در این صورت 4 پایه از PORTC به این رابط اختصاص دارد و نمیتوان به عنوان IO از آنها استفاده کرد. این پایهها به ترتیب TDI، TDO، TMS و TCK هستند و از پین 2 تا پین 5 میکرو را به خود اختصاص دادهاند. فیوز بیت JTAGEN در حالت پیش فرض فعال است.
فیوز بیت SPIEN
این فیوز بیت در حالت پیش فرض فعال است. اگر بخواهیم از پروگرامر ISP که یک پروگرامر سریال است استفاده کنیم، این فیوز باید فعال باشد.
فیوز بیت CKOPT
فیوز بیت Clock Option) CKOPT) اگر فعال شود، میکروکنترلر در محیط های نویزی بهتر عمل میکند. اگر از کریستال خارجی به عنوان منبع کلاک استفاده میشود، با فعال کردن این فیوز دامنه نوسانات کریستال افزایش یافته و میکرو نویزپذیری کمتری خواهد داشت.
فیوز بیت EESAVE
اگر فیوز EEPROM Save) EESAVE) پروگرام شود، موقع Erase کردن میکروکنترلر حافظه EEPROM میکرو پاک نمیشود. در حالت پیش فرض غیر فعال است و با پاک کردن حافظه Flash، حافظه EEPROM نیز پاک خواهد شد.
فیوز بیت های BOOTSZ0-1 و BOOTRST
این 3 فیوز مربوط به قسمت بوت لودر میکروکنترلر است. به طور مختصر، بوت لودر قسمتی از حافظه Flash است که میتوان برنامهای کوچک (فارغ از برنامه اصلی میکرو) بر روی آن نوشت که اجازه تغییر برنامه اصلی را میدهد. به عنوان مثال میتوان به بوت لودر آردینو اشاره کرد که توسط رابط USART میکرو را پروگرام میکند. در مورد بوت لودر در قسمت بعدی آموزش بحث خواهیم کرد.
با فعال کردن فیوز بیت BOOTRST، پس از اتصال ولتاژ به میکرو یا ریست کردن آن، میکرو به ابتدای برنامه Boot Loader پرش کرده و ابتدا برنامه بوت اجرا میشود (نه برنامه اصلی). بنابراین اگر قصد استفاده از بوت لودر را ندارید، این فیوز بیت را در حالت پیش فرض (غیر فعال) رها کنید. دو فیوز بیت دیگر یعنی BOOTSZ0 و BOOTSZ1 مقدار حافظه بوت لودر را تنظیم میکنند که به صورت زیر است.
- “00” در این حالت مقدار حافظه بوت 2048 بایت است.
- “01” در این حالت مقدار حافظه بوت 1024 بایت است.
- “10” در این حالت مقدار حافظه بوت 512 بایت است.
- “11” در این حالت مقدار حافظه بوت 256 بایت است.
به عنوان مثال اگر مقدار “00” انتخاب شود، حافظه Flash به صورت زیر تقسیم بندی خواهد شد.

نکته: اگر فیوز بیت BOOTRST غیر فعال باشد، مقادیر BOOTSZ0 و BOOTSZ1 بی اهمیت است و تمام حافظه فلش مختص برنامه اصلی خواهد بود.
فیوز بیت های توسعه یافته یا Extended Fuse
این دسته از فیوز ها در برخی از میکروکنترلر ها هستند و کاربرد آنچنانی ندارند. یک نمونه از آن ها فیوز بیت M103C است. در خانواده Atmega دو میکروکنترلر ATmega128 و Atmega103 وجود داشته که شباهتی زیاد و تفاوتی اندک با هم دارند. از این رو برای پروگرام کردن ATmega128 باید این فیوز را غیر فعال کرد و برای ATmega103 باید فعال شود.
لاک بیت ها
لاک بیت ها شامل 6 بیت هستند:
- LB1 و LB2 که برای قفل کردن میکروکنترلر در برابر خواندن یا نوشتن توسط پروگرامر خارجی (پروگرامر سریال یا موازی) تنظیم میشوند.
- BLB01 و BLB02 که مربوط به عدم دسترسی SPM و LPM به حافظه اصلی برنامه است.
- BLB11 و BLB12 که مربوط به عدم دسترسی SPM و LPM به حافظه بوت لودر است.
نکته: SPM و LPM مربوط به کار با حافظه بوت لودر است و در جلسه آینده مفصل در مورد آن بحث خواهد شد. اما به صورت مختصر، SPM یعنی نوشتن اطلاعات از بوت لودر بر روی فلش و LPM یعنی خواندن اطلاعات فلش توسط بوت لودر.
لاک بیت های LB1 و LB2
همانطور که گفتیم اگر بخواهیم از برنامه میکروکنترلر در برابر پروگرامرهای خارجی محافظت کنیم، این 2 بیت باید تنظیم شوند.
- “11” با این مقدار هیچگونه محدودیتی در خواندن یا نوشتن برنامه وجود ندارد (پیش فرض).
- “10” با این مقدار دیگر نمیتوان در حافظه فلش یا EEPROM نوشت.
- “00” با این مقدار حافظه فلش یا EEPROM نه خوانده میشوند و نه قابلیت نوشتن دارند. منظور از خوانده نشدن این است که اگر بخواهیم برنامه را بخوانیم، پروگرامر مقادیری تصادفی و اشتباه را میخواند (میکرو محافظت شده است).
نکته: با Erase کردن میکروکنترلر تمامی لاک بیت ها غیر فعال میشوند.
لاک بیت های BLB01 و BLB02
این دو بیت دسترسی SPM و LPM به حافظه اصلی برنامه را کنترل میکند.
- “11” هیچ گونه محدودیتی وجود ندارد.
- “10” SPM اجازه نوشتن در برنامه اصلی حافظه را ندارد.
- “01” LPM اجازه خواندن برنامه اصلی را ندارد.
- “00” SPM اجازه نوشتن و LPM اجازه خواندن از برنامه اصلی را ندارد.
لاک بیت های BLB11 و BLB12
این دو بیت دسترسی SPM و LPM به حافظه بوت لودر را کنترل میکند.
- “11” هیچ گونه محدودیتی وجود ندارد.
- “10” SPM اجازه نوشتن در بوت لودر را ندارد.
- “01” LPM اجازه خواندن بوت لودر را ندارد.
- “00” SPM اجازه نوشتن و LPM اجازه خواندن از بوت لودر را ندارد.
به عنوان حرف آخر، بعضی از سایت ها هستند که مقادیر فیوز ها را با توجه به موارد فوق بصورت گرافیکی و زیبا محاسبه میکنند که به عنوان مثال میتوان سایت engbedded را نام برد که با انتخاب نوع میکروکنترلر تمامی فیوز بیت های آن ظاهر شده و میتوان آنها را تنظیم کرد. اگر سوال یا ابهامی وجود دارد، کامنت کنید. خیلی زود پاسخ میدهیم …
20 پاسخ
سلام
خسته نباشید و خدا قوت
توضیحات بسیار عالی و کامل هست،منابع دیگر مختصر و ناقص توضیح دادن و از موضوع رد شدن
پیشنهادی که داشتم این هست که زمینه هایی که در موردش خیلی کار شده رو هم به مطالبتون اضافه کنید مثل:دیتا شیت خوانی یک ماژول،کتابخانه نویسی و…
با تشکر فراوان
سلام. مچکرم از لطفتون.
بله در نظر داریم در آینده مطالب کامل تر و بهتری روی سایت قرار بدیم.
سلام وقت بخیر .. یه آموزش هم بزارید جهت ویرایش کد HEX و تبدیل کردن به کد آردینو .. ممنون میشم بنده خیلی خیلی مبتدیم ولی علاقمند به این حوزه هستم ممنون میشم که یه آموزش به زبان ساده بزارید ..
سلام. امکان تبدیل فایل hex به C یا هیچ زبان دیگهای وجود ندارد.
حتی امکان ویرایش هم نداره ؟HEX
خیر. فایل hex امکان ویرایش ندارد.
عالی ممنون
با سلام
مهندس سوالی دارم،اگر فرکانس دستگاهی که با atmega8 کار میکنه بالا بره
آنوقت مشکل از سخت افزار هست یا از نرمافزار؟
ممنون
سلام. قاعدتاً باید یه سری علائم وجود داشته باشه که مطمئن بشیم فرکانس بالا رفته. بالا رفتن فرکانس یا بخاطر تغییرات در فیوزبیت اتفاق میفته یا اینکه فرکانس اعمالی به میکرو که از خارج تأمین میشده، تغییر کرده.
سلام مهندس جان خسته نباشید ممنون از مطالب بسیار خوبتون.مهندس جان اگر قفل روی میکرو گذاشت یعنی lb1 lb2 را تنظیم کرد برنامه حفاظت میشه که دیگه نتونن فایل هگز را از میکرو بخونن .
و سوال دیگه منظور از erase کردن قفلی که روی برنامه گداشتیم از بین میره
ممنون میشم راهنمایی بفرمایید
بله با پروگرام کردن lb1 و lb2 هیچ پروگرامری نمیتواند برنامه میکرو را استخراج کند. با erase کردن میکرو علاوه بر برنامه مقدار لاک بیت ها هم ریست میشود.
سلام مهندس جان فیوزبیت های اتمگا8باکریستال خارجی8مگاهرتزبه چه صورت باید باشه درprg isp
سلام مهندس
ببخشد اگر بخواهیم به میکرو کریستال خارجی ۱۶ مگ وصل کنیم چیو باید تنظیم کرد؟
سلام. باید هر ۴ فیوزبیت CKSEL رو ۱ کنید.
سلام مهندس ایسی atmega328p U دارم میخوام کریستال خارجی ۲۰مگا بهش وصل کنم برنامه پروگرامر ISP هستش کدوم فیوز بیت ها باید فعال و کدوم غیر فعال بشه.لطفا راهنمایی کنید.
درود بر شما. مقدار فیوزبیت های CKSEL رو بر روی اعداد 1111 تنظیم کنید.
سلام.میشه برای تنظیم اسیلاتور داخلی باید فیوز بیت تغیر داد.
ی گروهی چیزی داری ما هم اد کنی ممنون.
با سلام با تغییر فیوز بیت ها شما فرکانس کاری میکرو را تغییر خواهید داد. اگر تسلط کافی به فیوز بیت ها ندارید به آن ها دست نزنید! از مطالب آموزش قبلی استفاده نمایید
سلام عرض ادب
مهندس کدام لاک بیت ها باز باشن میشه برنامه رو کامل برداشت؟
ممنون میشم راهنمایی کنید
سلام وقت بخیر
برای انتخاب کریستال 8 مگاهرتز خارجی برای ATmega8a فیوزبیت های داخل progisp رو باید روی چند تنظیم کنیم؟