Страницы

Поиск по вопросам

понедельник, 24 февраля 2020 г.

Можно ли и как программировать AVR микроконтроллер (attiny13) силами самого микроконтроллера?

#avr


Т.е. задача такая, иметь возможность с помощью кнопок, подключенных к микроконтроллеру,
запрограммировать его без перепрошивки и без написания интерпретатора (первое, что
пришло в голову - fort). Т.е. сохранить и вызвать функцию в которой используется ограниченный
набор команд, принимается один числовой параметр и возвращается один числовой параметр.
Спасибо!

Пояснение

Необходимо:


Загрузиться
Сгенерировать байткод прямо в программе
Передать ему выполнение
После окончания его работы вернуться в место вызова и получить результат.


Примером самой простой подпрограммы может быть: var + 1. 
    


Ответы

Ответ 1



Ответ ДА :) Сам не пробовал. Фрагмент статьи с хабра Самым распространенным и удобным интерфейсом для прошивки AVR является SPI (Serial Peripheral Interface). Для подключения по SPI нужно всего четыре провода, не считая земли: SCK — тактовый сигнал, синхронизирует все операции обмена данными; MOSI (Master Out Slave In) — линия данных от ведущего устройства к ведомому; MISO (Master In Slave Out) — линия данных, наоборот, от ведомого устройства к ведущему; RESET — для разрешения прошивки по SPI нужно подать логический «0» на этот вывод. Схема: кнопки от VCC на пины Reset, Mosi, Sck, после нажатия подтянуты к земле резисторами. Пин GND на землю, с пина Miso светодиод с резистором на землю. Режим программирования включается подачей «0» на ногу RESET. Но есть некоторые тонкости. Atmel рекомендует сначала выставить на выводах RESET и SCK низкий уровень, а только потом подавать на контроллер питание. Если такой возможности нет, нужно после включения питания подать «0» на SCK, а затем положительный импульс на RESET Далее нужно передать команду на собственно включение режима программирования: 10101100 01010011 xxxxxxxx xxxxxxxx Биты, обозначенные как x, могут быть любыми. Во время передачи третьего байта контроллер должен переслать обратно второй байт (01010011). Если это произошло, значит, все хорошо, команда принята, контроллер ждет дальнейших инструкций. Если ответ отличается, нужно перезагрузить МК и попробовать все сначала. Сначала необходимо загрузить данные в буфер страницы, для этого используется команда «Load Program Memory Page» 01000000 000xxxxx xxxxbbbb iiiiiiii — для загрузки младшего байта слова, и 01001000 000xxxxx xxxxbbbb iiiiiiii — для загрузки старшего. 4 младших бита 3-го байта команды bbbb — адрес слова на странице, iiiiiiii — загружаемый байт. Сначала всегда должен загружаться младший байт слова, а затем — старший байт того же слова. После того, как буфер страницы загружен, нужно выполнить команду «Write Program Memory Page» 01001100 0000000a bbbbxxxx xxxxxxxx для записи страницы непосредственно в память контроллера. Младший бит второго байта и старшие 4 бита третьего a:bbbb — пятибитный номер страницы для записи. Лучше в подробностях смотреть по ссылке. На случай необитаемого острова распечатать даташит, заламинировать, хранить с собой.

Ответ 2



Можно. Смотрите в даташите раздел Self-Programming the Flash. Но, если нет ограничений, удобнее будет взять мк с большим кол-вом памяти. Ваш "интерпретарор" проще будет вместить:) Хотя задача безусловно интересная и полезная

Ответ 3



Можно, но очень сложно. Необходимо заносить программу вручную нулями и единичками. Проще arduino nano взять или другой микроконтроллер.

Ответ 4



У ATTiny13 очень мало памяти для таких подвигов - лучше используйте МК с бОльшим объёмом памяти или внешнюю eeprom. Тогда, по сути, Вам нужно будет только читать программу по SPI или I2C из EEPROM. Транслятор будет получать например, по 2 байта, где 1-й байт - это код функции, 2-й байт - аргумент. В таком случае он будет выглядеть как набор if-else или case-switch, или массив указателей на функции. В первом и втором случаях проверяете код функции в заголовках if-else или switch и выполняете заданные в телах условных операторов куски кода. В случае массива указателей на функции просто вызываете функцию, на которую указывает элемент массива под номером, равным коду функции. Как-то так) Для ввода программы можно использовать SPI и самописный протокол типа номер_функции-аргумент.

Комментариев нет:

Отправить комментарий