Аппаратная скорость последовательной передачи данных несовместима между Arduino nano и автономным 328P

У меня есть 328P (конкретно 328P-AUR, [ссылка]), и на схеме ниже показано, как я реализовал его на печатной плате:

Загрузка программы проходит нормально, но, думаю, проблема в источнике тактовой частоты, поскольку программы работают слишком медленно, а критичные к синхронизации протоколы, такие как аппаратный UART/Serial, передают данные со скоростью, составляющей всего 16% от заявленной. Вот программа, с помощью которой я тестирую последовательный порт:

void setup() {
  Serial.begin(9600);
}
uint8_t count = 0;
void loop() {
  Serial.print("Num:");
  Serial.println(count++);
  delay(1000);
}

Таким образом, в случае Serial.begin(9600); микроконтроллер фактически передает данные со скоростью всего 600 бод, а в случае Serial.begin(115200); фактическая скорость передачи составляет всего 7200.

В настоящее время я использую Arduino Uno с режимом программирования «Arduino как ISP», но этот метод не позволяет мне устанавливать какие-либо предохранители в 328P... У меня есть специальный программатор ICSP, работающий только в Microchip Studio, с помощью которого я мог бы попробовать это сделать, но я не уверен, какое значение предохранителя мне нужно установить для правильной работы с внешним кварцевым резонатором 16 МГц, который я подключил к 328P.

Есть ли что-то неправильное в моей конструкции, или это просто ограничение при загрузке через Arduino IDE? Если да, то какие значения предохранителей мне нужно установить для этого оборудования?

, 👍2


1 ответ


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

3

В необработанном чипе ATmega328P был запрограммирован фьюз CKDIV8 (деление на 8) для использования внутреннего генератора 8 МГц. Для изменения настроек фьюз можно использовать AVRDUDE вместе с «Arduino в качестве ISP». В качестве альтернативы можно использовать minicore https://github.com/MCUdude/MiniCore (вариант без загрузчика) для установки фьюз и последующей загрузки кода.

Ваш проект, похоже, соответствует Arduino Uno, а настройки предохранителей можно найти в файле boards.txt:

  • uno.bootloader.low_fuses=0xff
  • uno.bootloader.high_fuses=0xde
  • uno.bootloader.extended_fuses=0x05

РЕДАКТИРОВАТЬ

Приведённые выше стандартные настройки фьюзов Uno предполагают использование загрузчика объёмом 512 байт. Если же вы не используете загрузчик и всегда используете программатор ISP, то фьюз BOOTRST следует снять. Это освободит 512 байт флеш-памяти для вашей программы. Это также предотвратит непредвиденную ситуацию, если ваш скетч окажется достаточно большим и попадёт в область загрузчика в верхней части флеш-памяти. Вы можете воспользоваться этим калькулятором фьюзов для определения правильных настроек: https://eleccelerator.com/fusecalc/fusecalc.php?chip=atmega328p

,

Я попробовал оба способа, и они сработали. Я также попробовал MicrochipStudio с AVRISP MK2 и скопировал настройки предохранителей из выходных данных AVRDUDE по вашему первому совету, и это тоже сработало. Спасибо !, @Boyfinn