Вопросы по 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); // Небольшая задержка
}
}
Вот шаги, которые я выполнил,
Я скомпилировал приведенный выше код в
main.hex, используяavr-gccиavr-objcopy.Я подключил свой Arduino UNO Rev3 и загрузил на плату скетч
Примеры -> 11. Arduino ISP.Я отсоединил плату Uno и подключил все провода по этой схеме,

На этом этапе Arduino подключен к моему DIP-микроконтроллеру ATMega8U на макетной плате, и его можно программировать через SPI.
Затем я попытался загрузить свой файл
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, выполнив следующие шаги:
- Добавьте
https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.jsonвФайл -> Настройки -> Дополнительные менеджеры досок - Установите платы MiniCore из
Board Manager. - Я использовал точно такую же схему и скетч, как и в предыдущей попытке с
avrdude. - Я выбрал
Инструменты -> Платы -> Minicore -> ATMega8в Arduino IDE. Порт —/dev/ttyACM0. - Я выбрал
Инструменты -> Программатор -> Arduino в качестве провайдера. - Затем я нажал на
Инструменты -> Записать загрузчик, но в выводе 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
У меня два вопроса,
- Я делаю что-то неправильно или пропускаю какой-то шаг?
- Как загрузить скомпилированный мной код 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
чтобы записать скомпилированный шестнадцатеричный файл.
У меня есть еще несколько вопросов, поэтому я еще не закрыл этот вопрос.
@Ayush, 👍0
Обсуждение1 ответ
Лучший ответ:
Я решил эту проблему. Прежде чем продолжить, вам нужно будет скомпилировать код в шестнадцатеричный файл.
Включите подробный вывод для
compiledиuploadв разделеFiles -> Preferences. Это позволит вам увидеть точные команды, выполняемые Arduino IDE.Моя плата Arduino Uno Rev3 работает под управлением
Примеры -> 11. Скетч Arduino ISP, который я загрузил на нее ранее, используя обычный процесс загрузки скетча.Я получил следующие два вызова avrdude CLI в
OuputArduino 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.Обратите внимание, что при записи флэш-памяти я заменил загрузчик своим скомпилированным шестнадцатеричным файлом.
Я подключил плату ATMega8 к Arduino, соединив выводы SPI (MISO, MOSI и SCK) ATMega8 с цифровыми выводами (11, 12, 13) платы Uno Rev3. Цифровой вывод 10 подключен к RESET на моей плате ATmega8. Это та же конфигурация, которую вы использовали для прошивки загрузчика на ATMega8 из Arduino IDE.
Я выполнил две команды выше последовательно, и это сработало. Светодиод замигал.
- Digispark Atinny85 не распознан (проблема с загрузчиком)
- Как записать загрузчик в Arduino Uno без использования другого Arduino
- Как компилятор/ассемблер работает с загрузчиком?
- Печать string and integer LCD
- Не удается снова загрузиться после смены платы
- Как добавить гистерезис к пороговым значениям?
- Почему мои часы реального времени показывают неверное время с моего ПК?
- Ожидаемый инициализатор?
Использовали ли вы конденсатор при сбросе (или иным образом отключали сброс) на 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