[Из песочницы] Предел минимального Hello Word на AVR составляет 0 бит

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

Тогда я посчитал, что это просто невозможно, но сейчас я смог это сделать.

ff735b1b0f674e2da4f9891e89ec6dcb.jpg

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

38e2d51753d144d5a0b38b2f5efb0587.jpg

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

b5f992beb27740e9b24d7733b4c63f28.jpg

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

f64dbd8620c142af91c704ab2fb60bcc.jpg

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

1d517e5aef444962b7db203589b429c3.jpg

Ну и что, работает? Да, на фотографии макетной платы выше видно, что светятся оба светодиода, но как то это не очень наглядно. Подключим моего старичка с1–49 и посмотрим состояние пина 0 порта b:

c8bf55b33f7049108414621bb8614008.jpg

Период в 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

      Можно, но это уже будет не то.

© Habrahabr.ru