Аппаратная скорость последовательной передачи данных несовместима между 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? Если да, то какие значения предохранителей мне нужно установить для этого оборудования?
@Boyfinn, 👍2
1 ответ
Лучший ответ:
В необработанном чипе 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
- Как работать с нетрадиционными скоростями передачи данных UART
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Как навсегда изменить скорость передачи данных ESP8266 (12e)?
- В чем разница между библиотеками Software Serial? Какая из них совместима с Arduino Nano?
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- Погрузить ATmega328 в очень глубокий сон и послушать последовательный порт?
- Отправка последовательных данных в прерывании
- Самая низкая мощность, возможная в Arduino
Я попробовал оба способа, и они сработали. Я также попробовал MicrochipStudio с AVRISP MK2 и скопировал настройки предохранителей из выходных данных AVRDUDE по вашему первому совету, и это тоже сработало. Спасибо !, @Boyfinn