Вопросы по ATMega8A, включая запись моих шестнадцатеричных файлов

Я написал небольшую программу для мигания светодиодом для недавно купленного ATMega8U-DIP. Исходник здесь:

#ifndef F_CPU
#define F_CPU 16000000
#endif

#include <avr/io.h>
#include <util/delay.h>

int main(void) {

  DDRB |= (1 << PB0); // Установить PB0 как выход
  while(1) {
    PORTB ^= (1 << PB0); // Установить PB0 высокий уровень
    _delay_ms(500);       // Небольшая задержка
  }
}

Вот шаги, которые я выполнил,

  1. Я скомпилировал приведенный выше код в main.hex, используя avr-gcc и avr-objcopy.

  2. Я подключил свой Arduino UNO Rev3 и загрузил на плату скетч Примеры -> 11. Arduino ISP.

  3. Я отсоединил плату Uno и подключил все провода по этой схеме,

    На этом этапе Arduino подключен к моему DIP-микроконтроллеру ATMega8U на макетной плате, и его можно программировать через SPI.

  4. Затем я попытался загрузить свой файл main.hex, скомпилированный ранее через

avrdude -c arduino -p m8 -P /dev/ttyACM0 -b 19200 -U flash:w:main.hex

но я получаю такой ответ,

avrdude error: protocol expects OK byte 0x10 but got 0x14

avrdude error: protocol expects sync byte 0x14 but got 0x01
avrdude error: protocol expects sync byte 0x14 but got 0x10
avrdude error: initialization failed, rc=-1
        - double check the connections and try again
        - use -B to set lower ISP clock frequency, e.g. -B 125kHz
        - use -F to override this check

avrdude error: unknown response=0x12

avrdude done.  Thank you.

Еще я попробовал записать загрузчик Minicore ATMega8 на мой ATMega8 через среду Arduino IDE, выполнив следующие шаги:

  1. Добавьте https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json в Файл -> Настройки -> Дополнительные менеджеры досок
  2. Установите платы MiniCore из Board Manager.
  3. Я использовал точно такую же схему и скетч, как и в предыдущей попытке с avrdude.
  4. Я выбрал Инструменты -> Платы -> Minicore -> ATMega8 в Arduino IDE. Порт — /dev/ttyACM0.
  5. Я выбрал Инструменты -> Программатор -> Arduino в качестве провайдера.
  6. Затем я нажал на Инструменты -> Записать загрузчик, но в выводе IDE появилась эта ошибка,
Error: invalid device signature
Error: expected signature for ATmega8 is 1E 93 07
  - double check connections and try again, or use -F to carry on regardless
Failed chip erase: uploading error: exit status 1

У меня два вопроса,

  1. Я делаю что-то неправильно или пропускаю какой-то шаг?
  2. Как загрузить скомпилированный мной код AVR на мой ATMega8, установленный на макетной плате, где Arduino выступает в роли ISP?

Обновление.

Я решил две вышеуказанные задачи с помощью
avrdude -v -p atmega8 -c stk500v1 -P /dev/ttyACM0 -b 19200 -e -U lock:w:0xff:m -U efuse:w:{bootloader.extended_fuses}:m -U hfuse:w:0b11000111:m -U lfuse:w:0b10111111:m

чтобы стереть мою вспышку, а затем
avrdude -v -p atmega8 -c stk500v1 -P /dev/ttyACM0 -b 19200 -U flash:w:main.hex:i -U lock:w:0xff:m

чтобы записать скомпилированный шестнадцатеричный файл.

У меня есть еще несколько вопросов, поэтому я еще не закрыл этот вопрос.

, 👍0

Обсуждение

Использовали ли вы конденсатор при сбросе (или иным образом отключали сброс) на UNO, как указано в [этой документации](https://docs.arduino.cc/built-in-examples/arduino-isp/ArduinoISP/), где говорится: *«Для этого типа платы требуется электролитический конденсатор ёмкостью 10 мкФ, подключённый к RESET и GND...»?* Для ясности: на иллюстрации выше в качестве программатора показан Arduino Mega, но это примечание в равной степени применимо и к UNO. Если дело только в этом, то, вероятно, это можно закрыть как дубликат., @timemage

Привет, @timemage! У меня не оказалось под рукой конденсатора на 10 мкФ, но я добавил конденсатор на 100 мкФ, как описано в документации, ссылку на которую вы дали. Ошибки остались те же, так что не думаю, что проблема в этом., @Ayush

Обновление: я перепробовал все пины и теперь могу записать загрузчик через пункт «Инструменты -> Записать загрузчик». Думаю, дело было в пинах. Я всё ещё не могу сделать это через командную строку avrdude, так как не знаю, какую команду Arduino IDE выполняет для записи загрузчика во флеш-память моего ATMega8. Знаете ли вы, как загрузить написанный мной код на C в микроконтроллер ATMega8 после этапа прошивки загрузчика MiniCore ATMega8? У меня нет никаких адаптеров (FTDI, USBASP и т.д.), так что можно ли это сделать только через плату Uno Rev3? Я уже скомпилировал код ниже в main.hex., @Ayush

Если у вас есть новая информация, пожалуйста, [отредактируйте] свой вопрос, чтобы дополнить его. Комментарии для этого не предназначены и, как правило, просматриваются., @the busybee

Вы можете увидеть командную строку IDE, если включите подробный вывод в настройках., @the busybee

Что вы имеете в виду, говоря: «Знаете ли вы, как мне перенести написанный мной код C на микроконтроллер ATMega8 после этапа записи загрузчика MiniCore ATMega8?», @the busybee

Спасибо! Благодаря подробному выводу я смог решить проблему, скопировав команды IDE, которая стирала микроконтроллер, а затем записав шестнадцатеричный файл. Под «Вы знаете... этап?» я имел в виду, как запустить (вышеуказанный) код, который я скомпилировал в шестнадцатеричный? Мне нужно было просто прошить его. Не могли бы вы подсказать, как определить, нужен ли мне загрузчик? Мне кажется странным, что во многих руководствах рекомендуют записывать загрузчик, а затем использовать адаптер для прошивки написанного кода в микроконтроллер. Мне удалось заставить светодиод мигать, просто нажимая на наушники и записывая скомпилированный шестнадцатеричный файл., @Ayush

Давайте [продолжим это обсуждение в чате](https://chat.stackexchange.com/rooms/157309/discussion-between-ayush-and-the-busybee)., @Ayush

В общем случае загрузчик не нужен, всё зависит от способа взаимодействия с микроконтроллером. Но это уже совсем другой вопрос, поищите информацию на этом сайте., @the busybee

Спасибо @thebusybee!, @Ayush

Пожалуйста, ознакомьтесь с [туром], чтобы узнать, как работает этот сайт, а также прочтите раздел «[вопрос]» и другие страницы [помощи]. Вместо того, чтобы добавлять свой ответ к вопросу, напишите свой собственный ответ и отметьте его как принятый (позже). Затем, пожалуйста, публикуйте остальные вопросы отдельными сообщениями. Где это применимо, вы можете ссылаться на свои другие вопросы. Этот сайт не является форумом., @the busybee


1 ответ


Лучший ответ:

2

Я решил эту проблему. Прежде чем продолжить, вам нужно будет скомпилировать код в шестнадцатеричный файл.

  1. Включите подробный вывод для compiled и upload в разделе Files -> Preferences. Это позволит вам увидеть точные команды, выполняемые Arduino IDE.

    Моя плата Arduino Uno Rev3 работает под управлением Примеры -> 11. Скетч Arduino ISP, который я загрузил на нее ранее, используя обычный процесс загрузки скетча.

  2. Я получил следующие два вызова avrdude CLI в Ouput Arduino IDE при выполнении операции «Burn Bootloader» из Tools -> Burn Bootlaoder.

    Предупреждение: Вам нужно будет выбрать плату, на которую вы записываете загрузчик, в меню Инструменты -> Платы и выбрать Инструменты -> Программатор -> Arduino как провайдер, прежде чем нажать Записать загрузчик.

    "/home/<user>/.arduino15/packages/MiniCore/tools/avrdude/8.0-arduino.1/bin/avrdude" "-C/home/<user>/.arduino15/packages/MiniCore/tools/avrdude/8.0-arduino.1/etc/avrdude.conf" -v -patmega8 -cstk500v1 -P/dev/ttyACM0 -b19200 -e -Ulock:w:0xff:m -Uefuse:w:{bootloader.extended_fuses}:m -Uhfuse:w:0b11000111:m -Ulfuse:w:0b10111111:m

    "/home/<user>/.arduino15/packages/MiniCore/tools/avrdude/8.0-a rduino.1/bin/avrdude" "-C/home/<user>/.arduino15/packages/MiniCore/tools/avrdude/8.0-arduino.1/etc/avrdude.conf" -v -patmega8 -cstk500v1 -P/dev/ttyACM0 -b19200 "-Uflash:w:/home/ayush/.arduino15/packages/MiniCore/hardware/avr/3.0.3/bootloaders/urboot/atmega8/watchdog_1_s/autobaud/uart0_rxd0_txd1/led+b5/urboot_atmega8_pr_ee_ce.hex:i" -Ulock:w:0xff:m

    Насколько я понимаю, первая команда стирает флэш-память микроконтроллера ATMega8, а вторая — записывает данные во флэш-память. Я немного изменил приведенные выше команды, чтобы они были более читабельными.

    Стереть флэш-память: avrdude -v -p atmega8 -c stk500v1 -P /dev/ttyACM0 -b 19200 -e -U lock:w:0xff:m -U efuse:w:{bootloader.extended_fuses}:m -U hfuse:w:0b11000111:m -U lfuse:w:0b10111111:m

    Запись Flash: avrdude -v -p atmega8 -c stk500v1 -P /dev/ttyACM0 -b 19200 -U flash:w:main.hex:i -U lock:w:0xff:m.

    Обратите внимание, что при записи флэш-памяти я заменил загрузчик своим скомпилированным шестнадцатеричным файлом.

  3. Я подключил плату ATMega8 к Arduino, соединив выводы SPI (MISO, MOSI и SCK) ATMega8 с цифровыми выводами (11, 12, 13) платы Uno Rev3. Цифровой вывод 10 подключен к RESET на моей плате ATmega8. Это та же конфигурация, которую вы использовали для прошивки загрузчика на ATMega8 из Arduino IDE.

  4. Я выполнил две команды выше последовательно, и это сработало. Светодиод замигал.

,