Программирование ATmega4809 через Atmel-ICE с шестнадцатеричным файлом из Arduino IDE - почему не работает код цикла?
Предыстория
Я программирую 40-контактный ATmega4809 (datasheet) с помощью программатора ATMEL-ICE. Я просто использую студию Atmel для загрузки шестнадцатеричного файла на чип. Я создаю шестнадцатеричный файл с помощью Arduino IDE.
Я использую очень простой примерный скетч мигания с небольшой модификацией, в котором используется другой выходной вывод для светодиода.
const byte LED = 6;
void setup() {
// инициализируйте цифровой контактный светодиод в качестве вывода.
pinMode(LED, OUTPUT);
}
// функция цикла выполняется снова и снова навсегда
void loop() {
digitalWrite(LED, HIGH); // включить светодиод (HIGH уровень напряжения)
delay(1000);
digitalWrite(LED, LOW); // выключить светодиод (LOW уровень напряжения)
delay(1000);
}
У меня есть светодиод (с резистором), подключенный к PA6 на ATmega4809.
Результат кода
Я использую экспорт скомпилированного двоичного файла в среде IDE Arduino для создания шестнадцатеричного файла.
Затем я использую Atmel Studio для загрузки шестнадцатеричного файла в ATmega4809.
Когда я это делаю, программа запускается и загорается индикатор.
Однако я никогда не вижу, чтобы светодиод выключался (мигал).
Вы знаете, почему это может быть правдой?
Вещи, Которые я Пробовал
- Я попытался увеличить значение задержки, чтобы посмотреть, установлен ли внутренний кристалл по-другому и отличается ли время или что-то в этом роде.
- Я установил внутренний кристалл на разные значения (в диапазоне от 1 МГц до 20 МГц) и не увидел никакой разницы.
- Я подумал, что это может быть просто не зацикливание, поэтому я пробовал разные вещи, чтобы понять, правда это или нет.
- Я поместил весь код в функцию
setup ()
, чтобы посмотреть, будет ли она работать по-другому-этого не произошло, она по-прежнему просто включала индикатор , но никогда не выключала. - Я попытался включить светодиод в
настройке ()
и выключить вцикле ()
, чтобы убедиться, что оба они хотя бы один раз запущены, и они работают.
ПРИМЕЧАНИЕ: Я знаю, что шестнадцатеричный файл загружается правильно, потому что, когда я изменяю программу и загружаю разные (включаю/выключаю индикатор), код, похоже, либо включает, либо выключает индикатор. Я также проверил код с помощью Atmel Studio-считал память чипа в файл и делал различия.
@raddevus, 👍2
Обсуждение1 ответ
Из-за замечательного вопроса, заданного @Juraj, я подумал о том, как отображаются контакты (и что я, вероятно, неправильно думал об этом отображении).
Я поискал и нашел следующую диаграмму:
Обратите внимание, что D7 сопоставлен с PA1
Я переключил код на использование цифрового вывода 7 (индикатор const байт = 7;
)
Затем я переключил светодиод в цепи, которую нужно подключить (с соответствующим резистором), на PA1, который на самом деле является выводом 34 (на выводе ATmega4809 40).
Вернувшись в Arduino IDE, я переключил плату на Nano Every (который также использует ATmega4809).
Я скомпилировал код. Затем я экспортировал шестнадцатеричный файл и загрузил его на 40-контактный ATmega4809 с помощью Atmel Studio.
С Загрузчиком Или Без Него
Не Сработало: С Загрузчиком
Когда я попробовал это в первый раз, я выбрал шестнадцатеричный файл, содержащий загрузчик, и он не сработал. Светодиод не мигал.
Сработало: Без Загрузчика
Затем я попытался загрузить шестнадцатеричный файл, который не содержит загрузчика, и индикатор начал мигать, как и ожидалось.
Решено! Все из-за замечательного вопроса, который заставил меня задуматься лучше. Спасибо, вот очень быстрое видео этого в действии (youtube).
- Arduino Uno: avrdude: stk500_recv(): программатор не отвечает
- В чем разница между delay() и delaymicroseconds()
- Программирование Arduino на Паскале?
- Как реализовать Arduino NANO в качестве адаптера RS-232 к USB (или нужен Arduino Mega?) Для связи с 3D принтером
- Как изменить биты предохранителей - не общаясь?
- Как сканировать сигнал HIGH на digitalRead во время основного цикла, одновременно выполняя другие задачи?
- Выход 3,3 В при установке вывода на высокий уровень
- Как подключить модуль GSM SIM800L?
для какой платы вы компилируете в Arduino IDE? как вы думаете, почему вывод 6-это PA6?, @Juraj
Я пытался не углубляться в сорняки, но я загрузил специальные платы с https://github.com/MCUdude/MegaCoreX Они поддерживают 4809. Кроме того, это хороший вопрос о PA6. Я просто заметил, что, когда я использовал контакт 7 (в IDE), я мог включить PA7, а когда я использовал контакт 6, я мог включить PA7. Но, ты прав, мне нужно присмотреться к этому поближе. Вы видите где-то что-то другое? Если да, дайте мне знать. Спасибо. Кроме того, если я создам HEX для Nano Каждый (который использует 4809), он не будет включать PA6 / PA7 с помощью 6, 7., @raddevus