![](https://habrastorage.org/webt/jb/so/5u/jbso5uniitkxsszvnwvc2d2wk6s.png)
Предлагаемое устройство эмулирует на микроконтроллере ATmega4809 абстрактный 4-битный микроконтроллер с адресным пространством в 256 байт, который можно программировать тремя кнопками и четырьмя переключателями.
Адресное пространство поделено на 16 страниц по 16 инструкций в каждой. Длина инструкции составляет 8 бит, из которых четыре старших — команда, а четыре младших — данные:
![](https://habrastorage.org/webt/fp/gd/7o/fpgd7oa3ngcevohhweaqedyqgjk.png)
Чтобы войти в режим программирования, необходимо, удерживая кнопку 2, нажать кнопку сброса, отпустить её, за ней отпустить кнопку 2. В режиме программирования последовательный перебор инструкций в ОЗУ производится кнопкой 2. При переходе к следующей инструкции светодиоды на долю секунды показывают текущий адрес. Кнопкой 1 можно внести изменения в команду и адрес в составе текущей инструкции. При переходе к новому адресу кнопкой 2 инструкция по предыдущему адресу заносится в ППЗУ. Набрав программу, нужно нажать кнопку сброса, и произойдёт переход из режима программирования в режим выполнения программы.
Перечень команд:
0x0 — загрузить постоянное значение в порт doutB
0x1 — то же, в порт doutA
0x2 — пауза
0x3 — относительный безусловный переход назад
0x4 — загрузить постоянное значение в переменную A
0x5 — загрузить что-либо со значением переменной A
0x6 — загрузить значение чего-либо в переменную A
0x7 — произвести арифметические и логические операции с переменной A (и B)
0x8 — установить старший полубайт адреса для инструкции абсолютного безусловного перехода
0x9 — произвести абсолютный безусловный переход на заданный адрес
0xA, 0xB — действует как цикл for: каждый раз, когда команда выполняется, если переменная C (или D) больше нуля, происходит абсолютный безусловный переход на заданный адрес, затем значение переменной C (или D) уменьшается
0xC — пропустить следующую инструкцию если аргумент равен логической единице
0xD — вызвать функцию по заданному адресу
0xE — вернуться из вызванной функции
0xF — задать адрес для виртуального 4-битного ОЗУ, сохранённое по этому адресу значение можно прочитать инструкцией 0x6E и записать инструкцией 0x50.
Пример 1 — мигалка:
Адрес Инструкция Комментарий
0 1f Включить все светодиоды на порту doutA
1 28 Пауза 500 мс
2 10 Выключить все светодиоды на порту doutB
3 28 Пауза 500 мс
4 34 Относительный безусловный переход на -4 ячейки
Пример 2 — двоичный счётчик:
Адрес Инструкция Комментарий
0 5B DoutB = A
1 59 PWM1 = A
2 71 A++
3 28 Пауза 500 мс
4 34 Относительный безусловный переход на -4 ячейки
Пример 3 — мигалка с регулируемой скоростью (с подпрограммой):
Адрес Инструкция Комментарий
Основной цикл:
0 10 DoutA = 0x0
1 d5 Вызов подпрограммы myWait
2 1f DoutA = 0xf
3 d5 Вызов подпрограммы myWait
4 34 Относительный безусловный переход на -4 ячейки
Подпрограмма myWait:
5 64 A = Din
6 52 C = A
7 25 Пауза 50 мс
8 a7 for(C > 0; C--) jmp 7
9 e0 Возврат
Схема:
![](https://habrastorage.org/webt/lz/yl/rk/lzylrkjhzemuqk-0poznwdjrjfi.png)
![](https://habrastorage.org/webt/mp/ij/ls/mpijlsmybt-o7k5mgdktopy1xza.png)
![](https://habrastorage.org/webt/m8/qo/9w/m8qo9waall0uxjov3e0nhsp5oji.png)
Все необходимые для повторения файлы (плата, прошивка, и др.) — по ссылке на оригинал. Источником вдохновения для конструкции послужил близкий по возможностям немецкий тренажёр TPS.