Проблема со связью по UART

Я пытаюсь отправить что-то с atmega на свой компьютер.

Установка: Ubuntu 14.04, atmega644P-20PU, USBASP v2, TTL-to-USB pl2303

Сначала я попытался написать код на C и использовал этот код , а затем этот , и я получил тот же результат: '�' или случайные символы (в миникоме или на экране)

Затем я отказался от C и загрузил простую программу для Arduino:

void setup()
{
   Serial.begin(9600);
}
void loop()
{
   delay(500);
   Serial.write('t');
}

(при запуске arduino я ставил кварц 16МГц. В остальных случаях ставил 20МГц. Так же устанавливал F_CPU соответственно в коде.)

Во всех случаях светодиод R (прием) pl2303 мигает в нужные моменты (в зависимости от установленной в коде задержки).

Также я использовал CuteCom для просмотра того, что я получаю от последовательного порта, и вместо «�», в зависимости от используемого кода, который я получаю "\0x00\0x80\0x80"(для кода Arduino) или в других случаях "\0x80\0x00\0x80".

Я использую RX0 и TX0 (контакты 14 и 15). RX0 подключен к TX pl2303 и RX pl2303 к TX0 микроконтроллера.

Я также замкнул RX и TX на pl2303 и попытался отправить данные через него, и я получаю обратно то, что отправляю.

Скорость передачи данных pl2303 составляет 9600 бод.

$stty -F /dev/ttyUSB1

скорость 9600 бод; строка = 0;

мин = 60; время = 1;

ignbrk -brkint -icrnl -imaxbel

-opost -onlcr

-isig -icanon -iexten -echo -echoe -echok -echoctl -echoke

Во всех случаях я использовал 8N1.

Надеюсь, я был достаточно конкретным и последовательным.

(обычно я пытаюсь найти ответы и решения, но теперь я потерялся)

У вас есть осциллограф, который вы можете использовать для захвата сигнала? Кроме того, что вы получите, если отправите данные с компьютера?
't' выглядит как 0001011101на линии 0x80, как 0000000011и 0x00, как 0000000001почти наверняка, у вас слишком высокая скорость передачи данных на принимающей стороне.
Я мог бы начать работать с осциллографом. Я покажу результаты, если я это сделаю. Я не пытался отправить с ПК на микроконтроллер, но постараюсь отобразить результаты как можно скорее.
@Jasen Отличное наблюдение. Но я до сих пор не понимаю, что еще я мог бы установить. порт стоит на 9600, cutecom на 9600, mcu тоже на 9600, с соответствующим кристаллом. Я не могу добавить принтскрин об этом, потому что у меня недостаточно «очков репутации».
установите для cutecom скорость 1200 бод и посмотрите, что произойдет.
@Jasen боже мой, это работает.
@Джасен, пожалуйста, объясни мне это
где-то у вас есть делитель 8x на часах UART. Я недостаточно знаю ардуино, чтобы догадаться, где что-то пошло не так.
@Jasen, ты сказал 1200, потому что я получил 3 символа вместо одного, а разделил 9600 на 2 ^ 3 и получил 1200? Я до сих пор не понимаю, почему это нужно было сделать, и сначала это не сработало.
@Jasen Спасибо * 8. Вы не представляете, как я боролся с этим.
Нет, 8, потому что все символы имеют 8 нулей в начале провода.

Ответы (2)

't' выглядит как 000101110в строке 0x80 000000001и 0x00 000000000(включая начальный бит игнорирование стопового бита), почти наверняка у вас слишком высокая скорость передачи данных на принимающей стороне.

учитывая, что вы видите 0 нулей и 1, это, вероятно, установлено в 8 раз быстрее, поэтому попробуйте 1200 бод в cutecom и найдите возможную причину того, что делитель скорости передачи в arduino установлен в 8 раз выше.

Как упоминалось выше, у вас в фьюзах все еще запрограммирован фьюз CKDIV8.

Вы можете временно избавиться от этого, установив настройку 1x праскалера в программном обеспечении.

CLKPR = (1 << CLKPCE); // Enable change of CLKPS bits
CLKPR = 0x00; // Set prescaler to 1

Или просто установите правильные фьюзы с отключенной full swing crystal oscillatorнастройкой CKDIV8 и CKSEL.

Это моя настройка для мега 328p:

мега 328p полноповоротный кристалл

большое спасибо. Я вроде новичок в кодировании avr. Есть ли причина, по которой я хотел бы использовать этот прескалер?
Предварительный делитель часов обычно используется для создания нестандартных часов из внутреннего генератора (например, маломощный и недорогой подчиненный модуль smbus на частоте 2/4 МГц). Переключить его на лету было бы очень сложно для новичков (например, _delay_ms() компилируется статически для определенного F_CPU).
понятно. Я написал вам и письмо на вашу электронную почту от github. Я надеюсь, что вы все еще используете его. Мне очень любопытно, что вы думаете по этому поводу (систему чата можно найти здесь :()