ESP8266 как ISP-программа для ATmega16
Я использовал приведенную ниже программу для ESP8266 в качестве ISP для загрузки программы в ATmega16.
Программа ISP загружена в ESP8266
#include <SPI.h>
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <ESP8266AVRISP.h>
const uint8_t reset_pin = 5;
const uint16_t port = 328;
ESP8266AVRISP avrprog(port, reset_pin);
void setup() {
Serial.begin(9600);//115200
Serial.println("");
Serial.println("Arduino AVR-ISP over TCP");
avrprog.setReset(false); // пусть AVR запускается
// слушайте avrdudes
avrprog.begin();
}
void loop() {
static AVRISPState_t last_state = AVRISP_STATE_IDLE;
AVRISPState_t new_state = avrprog.update();
if (last_state != new_state) {
switch (new_state) {
case AVRISP_STATE_IDLE: {
Serial.printf("[AVRISP] now idle\r\n");
Serial.println("idle...");
// Используйте шину SPI для других целей
break;
}
case AVRISP_STATE_PENDING: {
Serial.printf("[AVRISP] connection pending\r\n");
Serial.println("pending...");
// Очистите свои другие цели и подготовьтесь к режиму программирования
break;
}
case AVRISP_STATE_ACTIVE: {
Serial.printf("[AVRISP] programming mode\r\n");
Serial.println("Active...");
// Готовность к завершению работ
break;
}
}
last_state = new_state;
}else{
Serial.println("newstate not equal to old");
}
// Обслуживать клиента
if (last_state != AVRISP_STATE_IDLE) {
avrprog.serve();
Serial.println("serve..");
}
}
Затем я сменил плату на ATmega16 и использовал программатор в качестве AVR ISP
и извлек / написал ниже простую программу blink для загрузки в ATmega16.
void setup() {
// инициализировать цифровой вывод 13 в качестве выхода.
pinMode(1, OUTPUT);
}
// функция loop работает снова и снова forever
void loop() {
digitalWrite(1, HIGH); // включите светодиод (ВЫСОКИЙ уровень напряжения)
delay(1000); // подождите секунду
Serial.println("light on");
digitalWrite(1, LOW); // выключите светодиод, сделав
delay(1000); // подождите секунду
Serial.println("light off...");
}
Попытался загрузить программу blink в ATmega16, используя ESP8266 в качестве ISP по Sketch => Загрузить с помощью программатора. Это привело к компиляции с последующей загрузкой статуса в Arduino IDE на более длительный период. Через 10 минут я не получил никакого ответа. Затем я попытался открыть последовательный монитор, который показывает новое состояние, не равное старому
.
Я не уверен, что пошло не так в моем кодировании? Как я могу отладить эту проблему?
@Simbu, 👍1
Обсуждение1 ответ
1. Загрузка скетча на ваш ESP8266
- Инструменты> Плата> выберите подходящую плату ESP8266
- Файл > Examples > ESP8266AVRISP > Arduino_Wifi_AVRISP
- Измените строки 7 и 8 в соответствии с SSID и паролем вашего Wi-Fi-маршрутизатора
- Скетч > Загрузить
- После завершения загрузки отключите ESP8266 от компьютера.
2. Создание шестнадцатеричного файла и команда upload
- Откройте скетч, который вы хотите загрузить на ATmega16
- Инструменты > Плата> ATmega16
- Файл> Настройки> Показать подробный вывод во время:> загрузить (проверить)
- Скетч > Загрузить
- Скетч будет скомпилирован, а затем загрузка завершится неудачно. Это ожидаемое поведение. Цель этого процесса - сгенерировать шестнадцатеричный файл, который будет загружен, и правильную команду загрузки.
- Прокрутите черное окно консоли в нижней части окна Arduino IDE вверх, пока не увидите строку, которая выглядит примерно так:
>
E:\Arduino\hardware\tools\avr/bin/avrdude -CE:\Arduino\hardware\tools\avr/etc/avrdude.conf -v -patmega328p -carduino -PCOM54 -b115200 -D -Uflash:w:C:\Users\per\AppData\Local\Temp\arduino_build_288143/Blink.ino.hex:i
3. Подключение ESP8266 к ATmega16
Подключите ESP8266 к плате ATmega16 следующим образом:
+----------+-----------+
| ESP8266 | ATmega16 |
+----------+-----------+
| GPIO12 | MISO |
| GPIO13 | MOSI |
| GPIO14 | SCK |
| GPIO5 | RESET |
+----------+-----------+
Вам также необходимо включить питание ATmega16. Рекомендуется использовать 3,3 В, так как это то, на чем работает ESP8266. Убедитесь, что заземление ESP8266 соединено с заземлением ATmega16.
4. Запуск ESP8266AVRISP
- Подключите USB-кабель ESP8266 обратно к компьютеру
- Инструменты > Последовательный монитор
- Выберите 115200 в меню скорость передачи в бодах в правом нижнем углу последовательного монитора
- Вы должны увидеть что-то вроде
IP-адрес: 192.168.0.100
Используйте свой avrdude: avrdude -c arduino -p -P net: 192.168.0.100: 3000 -t # или -U ...
5. Загрузка через ESP8266AVRISP
- Вторая строка, которую вы видели на последовательном мониторе на шаге 4, - это попытка скетча дать вам команду AVRDUDE, которую вам нужно запустить для загрузки на ваш ATmega16 через ESP8266AVRISP. К сожалению, в конце концов они стали немного расплывчатыми. Очевидно, они пытаются направить вас к использованию AVRDUDE в терминальном режиме с помощью опции
-t
, но также упоминают, что-U
может быть предпочтительнее. Я рекомендую последнее, так как Arduino IDE уже сгенерировалдля вас команду -U.
- Поскольку вам нужно запустить пользовательскую команду AVRDUDE для загрузки на ваш ATmega16 по сети, вы не сможете выполнить загрузку через Arduino IDE. Запустите командную строку на вашем компьютере.
- Теперь вам нужно объединить команду загрузки, сгенерированную при преднамеренной неудачной загрузке в ATmega16 на шаге 2, с командой, которая была напечатана на Serial Monitor на шаге 4. В моих примерах эта объединенная команда будет выглядеть следующим образом:
>
E:\Arduino\hardware\tools\avr/bin/avrdude -CE:\Arduino\hardware\tools\avr/etc/avrdude.conf -v -c arduino -p atmega16 -P net:192.168.0.100:3000 -Uflash:w:C:\Users\per\AppData\Local\Temp\arduino_build_288143/Blink.ino.hex:i
- Ваша команда будет похожа на мою, но путь к avrdude, avrdude.conf, IP-адрес, порт и путь к шестнадцатеричному файлу будут другими. Введите объединенную команду AVRDUDE в командной строке.
- Теперь загрузка должна пройти успешно.
Комментарии
Все вышесказанное - довольно сложный процесс. Хотя это будет значительно проще при последующих загрузках, скорее всего, это будет не так просто, как загрузка через Arduino IDE. Я бы не рекомендовал регулярно использовать ESP8266 в качестве AVR-ISP просто потому, что это то, что у вас есть под рукой. Вместо этого я настоятельно рекомендую вам просто купить дешевый (~ $ 3 USD с бесплатной доставкой из Китая) 6 pin USBasp с eBay.
Основное преимущество использования ESP8266 для этого приложения заключается в том, что это можно сделать по сети Wi-Fi, а не через традиционное USB-соединение, но сомнительно, как часто это будет действительно полезно.
Выполнил все процедуры и получил нижеприведенный результат, когда я запустил команду avrdude. ser_drain(): ошибка чтения: неверный параметр.
stk500_disable(): ошибка протокола, ожидание = 0x14, соответственно = 0x10
stk500_initialize(): (b) ошибка протокола, ожидание = 0x10, соответственно = 0x01
В моем вопросе упоминается полный список ошибок., @Simbu
Вы только что спасли мой дешевый клон Digispark-Attiny85, который я ранее испортил... ESP8266 - это все, что у меня было с собой. Это сработало отлично. Спасибо!, @dentex
- Как читать и записывать EEPROM в ESP8266
- Как сделать выводы Tx и Rx на ESP-8266-01 в выводах GPIO?
- Как навсегда изменить скорость передачи данных ESP8266 (12e)?
- Как заставить 5-вольтовое реле работать с NodeMCU
- При использовании Arduino Uno в качестве ISP: "Yikes! Invalid device signature" - плохое соединение, неверную конфигурацию или неверную версию avrdude?
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
- ESP8266 не подключается к Wi-Fi
- AT-команда не отвечает на последовательный монитор
Я никогда не добивался успеха в проекте интернет-провайдера. C:\avrdude-5.4-win > avrdude -c arduino -p m2560 -P net:192.168.178.38:328 -u -F avrdude: ser_drain(): ошибка чтения: параметр Falscher. avrdude: ser_drain(): ошибка чтения: параметр Falscher. avrdude: ser_drain(): ошибка чтения: параметр Falscher. avrdude: stk500_getparm(): (a) ошибка протокола, ожидаемая = 0x14, соответственно = 0x14 avrdude: stk500_getparm(): (a) ошибка протокола, ожидаемая = 0x14, соответственно = 0x10 avrdude: stk500_initialize(): (b) ошибка протокола, ожидание = 0x10, соответственно = 0x01 avrdude: ошибка инициализации, rc =-1 avrdude: устройство AVR инициализировано и готово к приему INSTR, @Arnold