Программирование 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 для создания шестнадцатеричного файла.

export compiled binary

Затем я использую Atmel Studio для загрузки шестнадцатеричного файла в ATmega4809.

Когда я это делаю, программа запускается и загорается индикатор.

Однако я никогда не вижу, чтобы светодиод выключался (мигал).

Вы знаете, почему это может быть правдой?

Вещи, Которые я Пробовал

  1. Я попытался увеличить значение задержки, чтобы посмотреть, установлен ли внутренний кристалл по-другому и отличается ли время или что-то в этом роде.
  2. Я установил внутренний кристалл на разные значения (в диапазоне от 1 МГц до 20 МГц) и не увидел никакой разницы.
  3. Я подумал, что это может быть просто не зацикливание, поэтому я пробовал разные вещи, чтобы понять, правда это или нет.
  4. Я поместил весь код в функцию setup (), чтобы посмотреть, будет ли она работать по-другому-этого не произошло, она по-прежнему просто включала индикатор , но никогда не выключала.
  5. Я попытался включить светодиод в настройке () и выключить в цикле (), чтобы убедиться, что оба они хотя бы один раз запущены, и они работают.

ПРИМЕЧАНИЕ: Я знаю, что шестнадцатеричный файл загружается правильно, потому что, когда я изменяю программу и загружаю разные (включаю/выключаю индикатор), код, похоже, либо включает, либо выключает индикатор. Я также проверил код с помощью Atmel Studio-считал память чипа в файл и делал различия.

, 👍2

Обсуждение

для какой платы вы компилируете в 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


1 ответ


1

Из-за замечательного вопроса, заданного @Juraj, я подумал о том, как отображаются контакты (и что я, вероятно, неправильно думал об этом отображении).

Я поискал и нашел следующую диаграмму:

nano every pin map

Обратите внимание, что D7 сопоставлен с PA1

Я переключил код на использование цифрового вывода 7 (индикатор const байт = 7;) Затем я переключил светодиод в цепи, которую нужно подключить (с соответствующим резистором), на PA1, который на самом деле является выводом 34 (на выводе ATmega4809 40).

Вернувшись в Arduino IDE, я переключил плату на Nano Every (который также использует ATmega4809).

Arduino IDE - Nano Every board

Я скомпилировал код. Затем я экспортировал шестнадцатеричный файл и загрузил его на 40-контактный ATmega4809 с помощью Atmel Studio.

С Загрузчиком Или Без Него

Не Сработало: С Загрузчиком

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

Сработало: Без Загрузчика

Затем я попытался загрузить шестнадцатеричный файл, который не содержит загрузчика, и индикатор начал мигать, как и ожидалось.

Решено! Все из-за замечательного вопроса, который заставил меня задуматься лучше. Спасибо, вот очень быстрое видео этого в действии (youtube).

,