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 минут я не получил никакого ответа. Затем я попытался открыть последовательный монитор, который показывает новое состояние, не равное старому.

Я не уверен, что пошло не так в моем кодировании? Как я могу отладить эту проблему?

, 👍1

Обсуждение

Я никогда не добивался успеха в проекте интернет-провайдера. 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


1 ответ


8

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