Неправильная передача UART на ATTiny826
Сейчас я пытаюсь протестировать чрезвычайно простую схему, в которой я использую ATTiny86 для вывода произвольных значений по последовательному порту на микроконтроллер Arduino. Проблема заключается в том, что все значения, записываемые на вывод TX устройства, неверны. Я использую осциллограф для измерения этих значений, а также микроконтроллер Arduino.
Приложенные осциллограммы показывают то, что я наблюдаю при измерении линии передачи/приёма между ATTiny и Micro. По сути, значения, которые я пытаюсь отправить, передаются неправильно. Сам сигнал выглядит нормально, но двоичное представление, измеренное осциллографом и Micro, показывает одно и то же неверное значение. Ниже приведены несколько примеров:
Я никак не могу понять, почему данные так повреждаются. Я добавил дополнительные изображения, надеюсь, они помогут кому-нибудь разобраться, почему это происходит.
Отправлено: [01 02 03 A5 FF 7E] --> Получено [C1 D0 58 FA 9E]
![Отправлено: [01 02 03 A5 FF 7E] --> Получено [C1 D0 58 FA 9E]](https://i.sstatic.net/DaRBvU64.png)
Отправлено: 0xAA (0b10101010) --> Получено: 0xB4 (0b10110100)

Отправлено: 0x55 (0b01010101) --> Получено: 0x8B (0b10001011)

Отправлено: 0x81 (0b10000001) --> Получено: 0xA1 (0b10100001)

Упрощенная схема:

Код на Attiny
#include <Arduino.h>
#define LED_PIN PIN_PC3
void setup() {
// Инициализируем связь Serial1 на скорости 19200 бод (или настраиваем по мере необходимости)
Serial1.begin(19200, SERIAL_8E1);
}
void loop() {
// Массив шестнадцатеричных значений для отправки
uint8_t hexArray[] = {0x01, 0x02, 0x03, 0xA5, 0xFF, 0x7E}; // Примеры шестнадцатеричных значений
// Проходим по массиву и записываем каждое значение в Serial1
for (int i = 0; i < sizeof(hexArray); i++) {
Serial1.write(hexArray[i]); // Записываем каждое значение в Serial1
}
// Добавьте задержку, чтобы избежать переполнения Serial1
delay(1000); // задержка 1 секунда
}
1 ответ
Лучший ответ:
Вы передаёте 11 бит за передачу: 1 стартовый бит, 8 бит данных, 1 бит чётности и 1 стоповый бит. Это видно из записей и источника.
Время передачи 10 бит (от начального бита до бита чётности) легко определить по данным однобайтовой передачи. Оно составляет около 415 мкс. Таким образом, время передачи одного бита составляет около 41,5 мкс.
Время отправки 6 байтов по 11 бит каждый = 66 бит составляет около 2750 мкс. Таким образом, время передачи одного бита снова составляет около 41,5 мкс.
Обратное значение даёт нам скорость передачи данных, которая составляет примерно 24100 бит в секунду. Последовательный декодер осциллографа и UART платы Arduino ожидают стандартную скорость передачи данных, скорее всего, вы используете 19200 бит. Неудивительно, что они интерпретируют биты как другие значения, поскольку они считывают данные с линии в разное время.
Следовательно, системная частота вашего ATtiny826 не соответствует тому, что считает компилятор. Проверьте это и исправьте.
Передача не искажённая, все биты в точности такие, как и должны быть. Это просто скорость, определяемая тактовой частотой ATtiny.
Спасибо! Я настроил часы в platformio.ini, обновив строку:
board_build.f_cpu = 20000000L
Видимо, при настройке программатора Updi я указал устройству использовать внутреннюю тактовую частоту 20 МГц вместо 16 МГц. Теперь всё работает как задумано., @Patrick Voorhoeve
@PatrickVoorhoeve Частные совпадают. Идеально!, @the busybee
- В чем разница между библиотеками Software Serial? Какая из них совместима с Arduino Nano?
- Как использовать Serial.setTimeout()
- Отправить структуру через Serial
- Может ли Arduino Leonardo одновременно использовать USB-порт и последовательные контакты RX TX?
- Последовательная связь между несколькими устройствами (или ардуино)
- как отправить данные в Adafruit Bluefruit Feather (32u4) через Bluetooth?
- Адаптер USB для UART на базе CH340G - Схемы распиновки
- Arduino UART (TX/RX) multidrop 1 master 50 slaves
у вас нет подключенных оснований, @jsotola
почему вы считаете, что проблема связана с передаваемыми данными?, @jsotola
@jstola заземление подключено, так как USB и ATTiny работают от одной сети питания/земли. Даже при прямом подключении GND результат тот же. Я полагаю, что это связано с передачей данных, поскольку я получаю одни и те же неверные результаты как на Micro, так и через осциллограф. Мне удалось успешно прочитать UART-сигналы UNO и Micro через тот же осциллограф, тот же код, те же настройки, но с ATTiny это не работает., @Patrick Voorhoeve
на снимках осциллографа отображаются правильные данные... скорость передачи данных может быть слишком высокой... попробуйте снизить скорость передачи данных, @jsotola
Я пробовал понижать до 9600 и 2400, но на осциллографе и микроконтроллере всё равно отображаются одни и те же данные. Я также пробовал увеличивать до 115200 — эффект тот же., @Patrick Voorhoeve
Установить скорость передачи данных 18000? ... Я не могу сейчас запустить тест, чтобы убедиться, что это допустимое значение... Оставьте приемник на 19200, @jsotola
@jstola, Кажется, это почти сработало. Я изменил на 18000, безрезультатно, но потом на 16000, и всё заработало. Сейчас я думаю, что частота ATTiny установлена на 20 МГц, но platformIO предполагает, что используется внутренняя частота 16 МГц. Соотношение 16:20 составляет 0,8; 0,8 * 19200 = 15360, и, похоже, на этой скорости всё работает. Похоже, я на верном пути?, @Patrick Voorhoeve