Межа мінімального Hello Word на AVR становить 0 біт

2 року назад я побачив запис «Межа мінімального Hello Word на AVR становить 2 байти» на Habrahabr'е користувача swap_map з подначиванием в кінці:
Хто-небудь напише програму миготіння світлодіодом ще коротше?

Тоді я вирішив, що це просто неможливо, але зараз я зміг це зробити.



Напевно, варто сказати, що мій спосіб написати таку прошивку кілька нестандартний, тому що за фактом прошивки немає, є тільки форма оформлення порожнього *.hex файлу. Вміст *.hex зчитаного з чистого (після операції chip erase мікроконтролера atmega328p виглядає наступним чином: :00000001FF. Дозволю собі використовувати зображення зі статті swap_map для наочного порівняння. Червоною рамкою обвів код, який необхідний для мого прикладу мінімального Hello word.


Запалювати я буду світлодіод на розряді 0 порти b і тільки його. Частота мерехтіння дорівнює 16 кГц, для того, щоб впевнитись у тому, що ніжка все ж дригається, зібрав наступну схему. Увага: Напруга на аноді світлодіода верхнього плеча повинно бути менше сумарного параметра Forward Voltage для даних світлодіодів, інакше вони замкнутий собою шину живлення і, напевно, згорять або сильно деградують. В моєму випадку напруга на аноді було 3.2 Ст.



Симуляцію в протеусе дана схема в вихідному варіанті (з порожньою прошивкою) не проходить, протеус скаржиться на некоректний opcode. Не біда, зберу в залозі. Зліва крокодили осцилографічних щупів, праворуч шлейф програматора USB ASP, від конденсатора і далі по макетке — інший проект.



Як же воно моргає? А моргає воно через налаштування FUSE бітів. У ATMega328p і в деяких інших мк avr є біт званий CKOUT, при виставленні якого здійснюється висновок тактової частоти на пін 0 порту b. При цьому джерело тактирования зовсім не важливий: внутрішні RC-ланцюжка, зовнішній кварц або взагалі вхідний тактовий сигнал — все це піде в порт. В якості джерела тактирования я вибрав внутрішню RC ланцюг з частотою 128 кГц з дільником на 8. Тому підсумкова частота і буде 16кГц. У підсумку фьюзы виставлені так: hf=DB, lf=13, ef=07. Червоною рамкою обведений той самий біт.


Ну і що, працює? Так, на фотографії макетної плати вище видно, що світяться обидва світлодіода, але це не дуже наочно. Підключимо мого дідуся с1-49 і подивимося стан піна 0 порту b:



Період до 60 мкс дає нам частоту трохи більше 16 кГц, але період на фото не дотягує до 60, частота виходить більше, спишу це на поважний вік і дуже давно зроблену калібрування. Можна вважати, що результат досягнутий.

Сподіваюся, дана запис змусить деяких людей хоча б побіжно переглядати можливості конфігурації використовуються МК з допомогою FUSE бітів.
А тепер моя черга говорити: «Хто напише програму миготіння світлодіодом коротше?»
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.