[Из песочницы] Предел минимального Hello Word на AVR составляет 0 бит
Кто-нибудь напишет программу мигания светодиодом еще короче?
Тогда я посчитал, что это просто невозможно, но сейчас я смог это сделать.
Наверное, стоит сказать, что мой способ написать такую прошивку несколько нестандартный, потому что по факту прошивки нет, есть только форма оформления пустого *.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 битов.
А теперь моя очередь говорить: «Кто напишет программу мигания светодиодом короче?»
Комментарии (6)
27 октября 2016 в 19:48
+2↑
↓
Это читерство ;). Фьюз биты — тоже биты и влияют на функционирование контроллера. Это как если бы вы вызвали готовую подпрограмму мигания светодиодом из ПЗУ одной строчкой, вместо нескольких в основном коде.27 октября 2016 в 19:54
0↑
↓
Так же можно и сказать про предыдущий «рекорд», что вызывать спец.функцию для смены состояния порта это читерство. Если есть возможность, то почему ей не воспользоваться?
27 октября 2016 в 19:53
+2↑
↓
С вами автор первой статьи. Я рад, что сподвиг коллег на соревнование такого масштаба, что аукается уже второй год как.Hello World — это программа, реализующая максимально наглядный «первый раз» в данной среде обитания программиста.
Для восприятия вашего приветствия потребуется осциллограф, либо динамик + здоровый слух (не все слышат 16 кГц).
Более того, тут требуется программировать FUSE, а это чревато окирпичиванием контроллера. Я бы на «первый раз» проделывать такое постеснялся.
Тем не менее, я дополню свой старый пост вашим решением. Спасибо!
27 октября 2016 в 19:56
+1↑
↓
Это вам спасибо! Я не стал искать первоисточник этой гонки, поставил ссылку лишь на запомнившийся мне.
27 октября 2016 в 20:05
+1↑
↓
Можно настроить контроллер фьюзами на внешнее тактирование и подать несколько герц. Тогда мигание светодиода будет видно визуально.27 октября 2016 в 20:05
+1↑
↓
Можно, но это уже будет не то.