Что происходит при включении Arduino и сколько времени все это занимает?

Вот что, по моему мнению, происходит и сколько времени это занимает (FIXME означает, что я не знаю). Я бы хотел в конечном итоге получить твердое максимальное время для всего, если это возможно.

  • При включении питания входные заглушки на 328P начинают заряжаться, а Vcc на 328P повышается.

  • С момента его первого включения внутреннее оборудование 328P поддерживает внутреннюю линию сброса на низком уровне.

  • Vcc до 328P превышает пороговое значение напряжения сброса при включении питания V_pot, которое имеет максимальное значение 1,6 В (см. ATmega328P_datasheet_revision_DS40002061A.pdf Таблица 29-11). Для батареи 9 В с типичным внутренним сопротивлением 2 Ом постоянная времени при ~ 100 мкФ входной емкости на Arduino равна RC = (2 * 0,0001) = 0,0002 с. Обычно это происходит довольно быстро, но обратите внимание, что если к Arduino Vcc или Vin подключены дополнительные нагрузки , это может занять больше времени.

  • Начинает работать таймер сброса на 328P. Когда он истечет, внутренняя строка сброса будет освобождена. Как долго будет работать этот таймер, зависит от настроек предохранителя. Для настроек предохранителя Arduino по умолчанию таймер будет работать около 65 мс. Для варианта Arduino 3,3 В типичное время будет немного больше (~ 69 мс). См. ATmega328P_datasheet_revision_DS40002061A.pdf Таблица 29-11 Глава 9 для получения подробной информации.

  • Линия PD7 микросхемы ATMEGA16U2 на Arduino удерживает линию внешнего сброса на низком уровне после момента времени, в который выполняется внутренний сброс, что приводит к тому, что бит EXTRF регистра MCUSR на 328P 328P заканчивается установленным (что указывает на внешний сброс). FIXME: действительно ли это работает так (держите его на низком уровне дольше)? FIXME: Как долго именно?

  • Внешний сброс выполняется ATMEGA16U2

  • Загрузчик на 328P начинает выполняться

  • Загрузчик проверяет MCUSR и обнаруживает, что EXTRF установлен, но WDRF MCUSR не установлен. Поэтому он быстро мигает встроенным светодиодом несколько раз и пытается загрузить новую программу по последовательной линии. Этот процесс занимает в общей сложности около 1,6 секунды.

  • Попытка загрузки завершается таймаутом сторожевого таймера и последующим сбросом сторожевого таймера. Бит EXTRF MCUSR остается установленным (он является липким и очищается только при сбросе питания или явной записи 0). Время: довольно быстро

  • Загрузчик начинает выполняться (снова). Время: довольно быстро

  • Загрузчик проверяет MCUSR и обнаруживает, что оба бита EXTRF и WDRF MCUSR установлены. Он интерпретирует это как означающее, что загрузчик только что был выполнен и завершен из-за тайм-аута сторожевого тайм-аута, т. Е. Он решает, что попытка загрузки уже была предпринята. Поэтому он очищает флаг WDRF (поскольку считает, что, вероятно, установил его сам) и переходит к началу флэш-памяти приложения вместо попытки загрузки. Время: довольно быстро

  • Весь установочный код, необходимый для предоставления среде C вашего main() программа требует запуска. Это включает в себя, например, копирование начальных значений глобальных переменных из флэш-памяти в оперативную память и т.д. Время: FIXME?

  • main() начинает выполнение.

, 👍2

Обсуждение

Почему бы не измерить это самостоятельно, для вашей конкретной установки?, @StarCat

Я сделал экран, который может включать управляемый arduino только время от времени (так что он может работать годами от батареи). Он также поддерживает пробуждение из-за активности линии сигнала пользователя (для этой схемы он использует собственный Vcc от регулятора низкого Iq) и передает этот сигнал на управляемый arduino после его безопасного включения. Меня интересует наихудшее время с момента срабатывания одного из этих сигналов до момента включения arduino и запуска пользовательского кода, который может видеть распространяемый сигнал, в том числе в случаях, когда пользователь отключает сброс EN на управляемом Arduino и перепрограммирует предохранители для быстрого увеличения мощности., @Britton Kerin

Есть ли какие-либо причины, по которым вы должны использовать Arduino для этого?, @StarCat

16u2 не удерживает вывод "reset" на низком уровне. Пока микросхема все еще находится в стадии предварительного запуска, все выходные контакты имеют высокое значение Z. при его запуске [установите вывод "сброс" на ВЫСОКИЙ (подтягивание), а затем на OUTPUT](https://github.com/arduino/ArduinoCore-avr/blob/master/firmwares/atmegaxxu2/arduino-usbserial/Arduino-usbserial.c#L154-L155). Таким образом, вывод никогда не будет НИЗКИМ. Это Хай-Зет, затем подтягивайся ВЫСОКО, затем ВЫСОКО. Кроме того, вывод "сброс" подключен не напрямую к сбросу 328p, а через конденсатор 100 Нф., @Gerben

Если линия от 16u2 этого не делает, как MCUSR EXTIF включается при включении питания? Загрузчик всегда запускается и пытается загрузить, так что он каким-то образом настраивается. Но я думал, что обычное включение 328P приводит к установке PORF, но не EXTIF. Я поискал фактический код, который есть на 16u2, но не нашел его., @Britton Kerin


1 ответ


1

Это то, что гораздо проще измерить, чем пытаться рассчитать.

Вот Arduino Uno R2 с простым скетчем, который просто включает D2. Зеленый - это питание (7 В к гнезду ствола), а желтый - D2.

Как вы можете видеть, требуется 1,544 секунды (согласно разрешению моего осциллографа, которое в этих временных масштабах не так уж велико), прежде чем D2 будет выведен на высокий уровень.

Скетч прост:

void setup() {
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);
}

void loop() {
}
,

Это согласуется с тем, что я измерил с помощью timer1 на моем контроллере (~ 1.520 на самом деле без настройки среды Arduino, из чего бы это ни состояло). Так что это правильный номер для стандартного arduino со стандартным optiboot (во всяком случае, на момент написания этой статьи). Все равно было бы неплохо узнать некоторые конкретные цифры, хотя и для случаев, когда выполняются очевидные взломы arduino. Я предполагаю, что настройка среды C (и Arduino wiring) - это большая оставшаяся неизвестной проблема., @Britton Kerin