Неправильная передача 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]

Отправлено: 0xAA (0b10101010) --> Получено: 0xB4 (0b10110100) Отправлено: 0xAA (0b10101010) --> Получено: 0xB4 (0b10110100)

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

Отправлено: 0x81 (0b10000001) --> Получено: 0xA1 (0b10100001) Отправлено: 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 секунда
}

, 👍2

Обсуждение

у вас нет подключенных оснований, @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


1 ответ


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

2

Вы передаёте 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