Uart ошибки при передаче

  1. Неизвестный UART: теория

  2. Неизвестный UART: микросхемы

Можно с уверенностью сказать, что с момента публикации первой версии стандарта RS‑232 в мае 1960 года и по настоящее время, было написано приблизительно 109 независимых реализаций UART на всём, чём угодно. Однако, подобно «Hello world» в мире прикладного ПО, а также мигания светодиодом — «Hello world» в мире цифровой электроники (сигнализирующий об успешной настройке оборудования и среды разработки) — процесс написания UART способен проиллюстрировать особенности языка или платформы, демонстрируя применение тех или иных синтаксических конструкций для решения практических, насущных и понятных проблем.

В данном цикле статей будет рассказано про написание модуля UART на SystemVerilog, про синтез данного модуля на различных платформах и про некоторые другие аспекты применения UART в ПЛИС. Но прежде, чем писать код, поговорим про сам протокол и про особенности аппаратной части вне контекста ПЛИС.

RS-232

Представим, что у нас есть необходимость передавать данные в одну сторону по одному проводу при помощи логических уровней напряжения. Мы можем просто пустить поток бит, договорившись об одинаковой скорости передачи и приёма данных. Но принимающее устройство не будет знать, где этот поток начался, где он закончится, идёт ли он вообще, как биты распределены по байтам и так далее.

Для начала, нам потребуется заранее оговоренное состояние, которое будет считаться отсутствием передачи данных, то есть паузами между отдельными байтами. Допустим, это будет логическая единица.

Правда, без дополнительных условий будет невозможно отправить байт, состоящий из одних единиц, либо отличить последовательность 11010100 от 01010011.

Можно условиться, что к каждому передаваемому байту мы припишем дополнительный служебный бит (старт-бит), заведомо содержащий логический ноль. Тогда после паузы в передаче данных, приёмник при получении нисходящего фронта будет готов к приёму оговоренного количества бит, содержащих осмысленные данные.

Остаётся проблема: что, если будет передаваться длинная последовательность бит, содержащих нулевые значения без пауз между отдельными байтами? Тогда, рано или поздно, накопленная рассинхронизация тактовых генераторов источника и приёмника превысит половину длительности одного бита. И приёмник либо дважды прочитает один и тот же передаваемый бит, либо наоборот, пропустит один из передаваемых битов.

Нисходящий фронт старт-бита мог бы позволить синхронизироваться источнику и приёмнику каждый раз при начале передачи очередного символа, обнуляя накопившееся рассогласование. Но это возможно, только если перед старт-битом линия каждый раз будет оказываться в состоянии логической единицы. То есть если между байтами имеются хоть небольшие, но паузы. Такие обязательные паузы называются стоп-биты.

Договорившись о наличии старт-бита, стоп-битов, количестве битов данных в рамках одной передачи («символа» в терминологии UART) от старт-бита до стоп-бита и частоте следования бит можно организовать устойчивую однонаправленную передачу данных по одному проводу.

Стандарт RS-232 задаёт значение выходного напряжения логической единицы от −5 до −15 В, а логического нуля — от +5 до +15 В (именно в таком порядке). Данные уровни напряжения не поддерживаются микросхемами ПЛИС напрямую и существует несколько вариантов соединения ПЛИС с компьютером через RS‑232.

Если у компьютера предусмотрен com-порт, то соединение возможно при помощи пассивного кабеля и транслятора уровней. Зачастую трансляторы уровней для RS‑232 (к примеру, ADM3232E) изготавливают с встроенным умножителем (удвоителем) напряжения на основе переключаемых конденсаторов. Он преобразует +3,3 В в приблизительно ±6,6 В, которые используются в качестве уровней выходного сигнала на линии TX. А вход RX делают устойчивым к напряжениям вплоть до ±15 В.

Если у компьютера отсутствует встроенный com-порт, то соединение возможно при помощи внешнего преобразователя USB-RS232 (к примеру, UPort1150).

В этом случае иногда происходит некоторая путаница с разъёмами. Если разъём DB-9 на материнской плате — всегда «папа» (штыри), то разъём на оборудовании почти всегда «папа». Исключение — прецизионные источники питания компании Keithley (которую купил Tektronix). У них разъём «мама» (гнёзда). Разъём же на преобразователях USB-RS232 почти всегда, как и на материнских платах — «папа». Соответственно, он может быть подключен к Keithley непосредственно. Но для большинства оборудования дополнительно потребуется кабель «мама-мама». Разъём DB-9 предусматривает наличие стягивающих винтов. И ввиду того, что их не расположить внутри корпуса оборудования, то ими оснащается именно кабель. А на разъёмах оборудования делают гайки, куда эти винты закручиваются.

У преобразователя MOXA - гайки, у noname - винты. И у обоих в разъёме - штыри.

У преобразователя MOXA — гайки, у noname — винты. И у обоих в разъёме — штыри.

И, казалось бы, если на преобразователях USB-RS232 стоит разъём «папа» (для соединения с «мамой» кабеля, оснащённого винтами), то на нём должны быть гайки. Однако, данный элемент с вероятностью 50/50 будет также винтом! Зато к Keithley подходит идеально :) В общем, если вы решили соединять оборудование с компьютером и хотите чтобы всё собралось с первого раза, не полагайтесь на то, что «всё стандартизовано, тут не ошибёшься» и обратите внимание:

  • на разъём в оборудовании и преобразователе (штыри/гнёзда)

  • на крепления в оборудовании и преобразователе (винты/гайки)

Электронная промышленность предоставляет широкую номенклатуру мостов USB-UART. Благодаря им, при создании устройства можно использовать все аппаратные плюсы интерфейса USB и при этом сохранить относительную простоту программного обеспечения, характерную для RS-232. В дальнейшем мы будем рассматривать именно этот вариант соединения, хотя с точки зрения кода для ПЛИС, разницы между предыдущими тремя примерами нет.

Есть, правда, весьма важный момент. Сам стандарт TIA/EIA-232-F (RS-232) содержит лишь электрические характеристики и размеры разъёмов. Типичные же скорости передачи данных, количество бит данных в символе, а также наличие/отсутствие дополнительного бита контрольной суммы (бита чётности) этим стандартом не оговаривается. Иногда можно встретить утверждение, что перечисленные выше аспекты оговорены в UART («Universal Asyncronous Receiver-Transmitter»), но это общее название некоторого свода обычаев передачи данных. Этому своду не соответствует какой-либо один-единственный написанный и утверждённый стандарт.

Неким подобием стандарта может считаться структура DCB, применяемая в функции SetCommState в Windows API и предназначенная для инициализации com-порта.

Так, в описании данной структуры говорится, что в символе UART может быть 1/1,5/2 стоп-бита. Однако, стандарт «ISO/IEC 7816-3», похожий на «обычный» UART и регламентирующий обмен данными со смарт-картами, предусматривает наличие 0,5 стоп-бита. И, к примеру, микроконтроллер STM32F103 способен через конфигурационные биты «STOP» ([13:12]) регистра «USART_CR2» задать режим работы модуля UART как с этим самым половинным стоп-битом, так и с более распространёнными количествами стоп-битов. А мост FT232R не только не способен поддерживать половинный стоп-бит, но также не способен поддерживать полуторный стоп-бит: только один или два стоп-бита.

Или в описании структуры DCB говорится, что значащих бит в одном символе UART может быть от 5 до 8 штук (в это количество не входит бит чётности). А уже упомянутый мост FT232R способен работать только с 7 или 8 битами. Однако, другой похожий на UART стандарт — MDB («Multi-Drop Bus») — содержит, по сути, 9 значащих бит (8 бит данных, плюс бит режима/направления). И микроконтроллер STM32F103 способен работать как с MDB, так и с 8-битным UART.

Теперь, если мы возьмём материнскую плату или преобразователь USB-RS232, вроде «UPort 1115», мы сможем сказать «где-то там есть RS-232». Однако, если мы возьмём микросхему-мост USB-UART с уровнями на линиях RX/TX равными +3,3/0 В, сложится парадоксальная ситуация: описываемые в TIA/EIA-232-F напряжения нигде не соблюдаются, а протокол, реализуемый этим мостом не описан в самом стандарте. То есть RS-232, упоминаемый в подобном контексте, приобретает некоторые постмодернистские черты симулякра — символа, у которого нет оригинала :)

Возможно также соединить линии USB напрямую к ПЛИС и наделить ПЛИС функционалом, позволяющим ей опознаваться компьютером как USB-устройство класса CDC («Communication Device Class») — то есть как com-порт. Однако, тратить (и в весьма большом количестве!) логические элементы ПЛИС на столь обыденную задачу, реализованную в готовых микросхемах USB-UART имеет смысл только в рамках учебных задач, связанных с изучением протокола USB.

Работа над ошибками

Рассматривая аспекты, связанные с ошибками, возникающими при передаче данных через UART, можно выделить три группы:

  • нестабильности электрических параметров сигнала

  • нестабильности временных параметров сигнала

  • нарушение в логике приёма/передачи

Обсудим ряд аспектов, связанных с каждой из этих групп.

Мажорирование

Когда речь заходит про аппаратное исправление нестабильности электрических параметров, регулярно произносится слово «мажорирование». То есть многократное (обычно — троекратное) снятие показаний в пределах одного принимаемого бита и последующий выбор в качестве истинного значения принимаемого бита того, которое чаще других встретилось в ходе этих замеров.

На первый взгляд, подобный механизм может показаться «серебряной пулей», сводящей вероятность ошибок практически к нулю. Попробуем, однако, оценить количественно степень влияния мажорирования на уровень ошибок.

Немного формул

Предположим, что ошибки в ходе замеров являются независимыми друг от друга и появляются с вероятностью «p». Выпишем в таблицу все 8 возможных комбинаций 3-битного числа. Но вместо единиц в ячейках таблицы запишем вероятность ошибки в конкретном замере («p»), а вместо нулей — вероятность верного считывания («1-p»). Вероятность появления каждой комбинации будет равна произведению содержимого ячеек соответствующего столбца. Поэтому отметим те комбинации, которые всё же приведут к ошибочному считыванию бита при мажорировании, определим вероятности появления этих комбинаций и сложим их всех.

Как видно, вероятность ошибки при мажорировании будет равна:

p_{maj}=p^3+3(p^2(1-p))

Или, если раскрыть скобки и упростить выражение, то:

p_{maj}=3p^2-2p^2

Пока что влияние мажорирования может просматриваться не слишком явно. Для более чёткой картины возьмём десятичный логарифм «pmaj»:

log_{10}(3p^2-2p^3)

Преобразуем это выражение. Для начала вынесем за скобки логарифмируемого выражения квадрат «p»:

log_{10}{(p^2(3-2p))}

Затем заменим произведение логарифмируемого выражение на сумму логарифмов:

log_{10}(p^2)+log_{10}(3-2p)

С уменьшением «p», второе слагаемое (второй логарифм) достаточно быстро будет стремиться к десятичному логарифму трёх, который равен 0,477 (так, при «p» равном 10-2 (одна ошибка на сто бит) это слагаемое уже будет равно 0,474).

Иными словами, если вероятность ошибки равна:

p=10^x

…то вероятность ошибки с использованием мажорирования по трём замерам приблизительно равна:

p_{maj} \approx 10^{2x+0,477}

Здесь «x» по идее должен принимать значения от «0» до «-∞», но при приближении к нулю (то есть при приближении «p» к единице) начнут сказываться допущения. Однако уже при «x», равном «-1» (то есть одна ошибка на десять бит), приближённые значения будут отличаться от точных значений всего на 2%.

Представим, что происходит передача данных по UART с конфигурацией «старт‑бит/8 бит данных/стоп‑бит» на скорости 9600 бит/с и «p» равно 10-6. Это означает, что одна ошибка происходит в среднем один раз в две минуты (130 секунд, если точнее). Поиск причины ошибки, появление которой видится квази-случайным и происходит раз в несколько минут, является достаточно неприятным и трудозатратным занятием. Если же мы применим мажорирование, то ошибка, в теории, начнёт возникать с вероятностью 10-11,523. Или приблизительно один раз в 16,5 месяцев. Вроде бы отличный результат.

Однако, что если «p» равно 10-4 ? Что если ошибка происходит один раз в секунду (1,3 секунды, если точнее), но инженер принял решение не кропотливо настраивать различные условия захвата в цифровом осциллографе с целью выявления причин ошибки, а применить мажорирование, и оно сработало идеальным образом?

Тогда «pmaj» будет равно 10-7,523. Или приблизительно один раз в 72 минуты — как раз достаточно, чтобы в случае претензий сказать: «Ну и где? Где эта ошибка? Вот, всё же работает! А вы говорите!» и убыть в закат :)

Кроме того, предположение о том, что ошибки в различных замерах одного бита являются независимыми не совсем верно. Предположим, что ошибка при считывании очередного бита появляется из-за наводки, скачка в цепи питания, либо чего-то подобного. Если мажорирование не применяется, вероятность ошибки «p» тогда будет равна произведению вероятности возникновения помехи «pnoise» на отношение длительности помехи «tnoise» к длительности бита «T»:

p=p_{noise}\frac{t_{noise}}{T}

Одинаковую вероятность ошибки может создать как длительная, но редкая помеха, так и короткая, но часто повторяющаяся помеха. Однако, часто повторяющуюся помеху («pnoise» которой много больше, чем собственно «p») будет легче обнаружить, проанализировать и выявить её источник. А редко повторяющаяся помеха, та, от поиска которой, по идее, и должно защитить мажорирование, будет длительной помехой, способной в ряде случаев «накрыть» сразу несколько замеров.

В общем, методы коррекции ошибок, применяемые бездумно, способны как решить проблему, так и в отдельных случаях оказаться заметанием мусора под ковёр или вообще не сработать.

Оверсемплинг

Представим, к примеру, ардуиновский микроконтроллер ATmega328P. В нём битрейт модуля USART задаётся при помощи делителя «UBRR» (он записывается в регистры «UBRRnL» и «UBRRnH») и равен:

BAUD=\frac{f_{osc}}{16(UBRR-1)}

Допустим, частота fOSC равна 10 МГц, а нам требуется получить стандартные 9600 бит/с. Тогда наиболее подходящим значением UBRR будет «64». Благодаря ему удастся задать битрейт, равный 9615,4 бит/с. Погрешность в 0,16% кажется незначительной, однако она накапливается с каждым битом. И для последнего фронта в символе составит 1,44%.

Точность внутреннего RC-генератора для того же микроконтроллера ATmega328P при фиксированной температуре в 25°C и напряжении 3,0 В заявлена ±2%. Во всём диапазоне рабочих температур и напряжений заявленная точность генератора падает до крайне грубых ±14%.

Нестабильность генератора создаёт дополнительную погрешность, которая хоть и не накапливается с каждым битом, но в конце символа способна сложиться с одним и тем же знаком с погрешностью от деления частоты. При этом, суммарная погрешность передатчика может удлинить передаваемые им биты, а суммарная погрешность приёмника — укоротить считываемые им биты. То есть, по сути, погрешности сложатся по модулю.

Если считывание производится непосредственно с частотой битрейта, то рано или поздно возникнет ситуация, когда принимающее устройство зафиксирует появление старт-бита не в середине бита, а в самом его начале (сразу после появления нисходящего фронта) или же в самом конце (перед первым битом данных). Причём сколь угодно близко к фронту. И к последнему биту символа приёмник гарантированно рассогласуется с передатчиком.

Решением этой проблемы является многократное считывание логического состояния на линии RX — оверсемплинг. После первого считывания, результат которого может быть принят за старт-бит, приёмник ожидает половину битового периода и только начиная с этого момента приступает к считыванию бит через равные промежутки времени. При четырёхкратном чтении, ошибки передачи будут отсутствовать при общей временно́й погрешности, доходящей до 25%!

На этом месте может возникнуть пара вопросов:

  • Какова временная погрешность приёмопередатчиков UART в реальных устройствах?

  • Если приёмник всё равно производит многократное чтение одного и того же бита, возможно ли получаемые данные эффективно использовать также для мажорирования?

Отвечая на первый вопрос, можно обратиться к документу «Determining Clock Accuracy Requirements for UART Communications», выпущенный компанией Maxim Integrated (на текущий момент она поглощена компанией Analog Devices), который говорит следующее:

It is difficult to quantitatively assess a worst-case acceptable sampling range across a bit’s period. EIA/TIA-232-F does specify a 4% of bit-period maximum slew time for a transmission, but this is difficult to achieve for long runs at 192kbps. But for the purpose of this application note, let us define two data path scenarios. Consider a «nasty» scenario, which can only be sampled reliably within the middle 50% of the bit time. This could equate to a long capacitive RS-232 run. The «normal» scenario can be sampled within the middle 75% of the bit time.

То есть инженеры Maxim Integrated предполагают, что невозможность корректно считать значения на линии RX в течении 25% от длительности бита — это вполне нормальное явление.

Для ответа на второй вопрос представим себе, что у нас есть 8-кратный оверсемплинг и 25% общей погрешности, связанной с временными характеристиками. Два семпла окажутся в зоне 25%. Ещё на один семпл попадает «игла», которую мы пытаемся устранить при помощи мажорирования (ведь исправлять помехи имеет смысл только когда они есть, а словосочетание «есть помеха» означает, что помехи попадают по семплам). Итого мы получим 5 годных для мажорирования семплов к которым добавлено 3 гарантированно ненадёжных семпла.

Подобная конструкция не представляется такой уж надёжной. Поэтому, к примеру, в STM32F103 коррекция ошибок (мажорирование по восьмому, девятому и десятому семплам бита), дополнена механизмом сигнализация об их наличии.

То есть если три семпла, взятые посередине бита не равны все нулю или все единице, то такое значение, вообще говоря, не считается действительным.

Ошибки логики

Является ли ошибкой отсутствие стоп-бита? То есть если был передан старт-бит, затем оговоренные N бит данных, а после этого стоп-бит не появился (линия вместо стоп-бита оказалась в состоянии логического нуля)? Не всегда. Так, стандарт «ANSI E1.11», описывающий протокол обмена данными светотехнического оборудования DMX512, похожий на классический UART, использует при передаче данных аналогичное действие. При номинальной длительности бита DMX512 равной 4 мкс, переход в логический ноль и последующее удержание этого состояния в течение 92 мкс (то есть 23 нулевых бита подряд) или более, называется «break» и маркирует начало очередного пакета данных.

Однако, в общем случае, если передаваемый символ состоял не только из нулей, отсутствие стоп-бита будет, пожалуй, именно ошибкой — «framing error».

Является ли ошибкой отсутствие второго стоп-бита, если на стороне компьютера был выбран режим с двумя стоп-битами, а коммуницирующее устройство было настроено на работу с одним стоп-битом?

Пожалуй, нет. Так, в документации на ардуиновский микроконтроллер ATmega328P написано:

The Receiver and Transmitter use the same setting. Note that changing the setting of any of these bits will corrupt all ongoing communication for both the Receiver and Transmitter. An FE (Frame Error) will only be detected in cases where the first stop bit is zero.

Ещё более подчёркнуто это написано в документации на упоминавшиеся микроконтроллеры STM32F103:

2 stop bits: Sampling for 2 stop bits is done on the 8th, 9th and 10th samples of the first stop bit. If a framing error is detected during the first stop bit the framing error flag will be set. The second stop bit is not checked for framing error.

Относительно современная микросхема Super-I/O NCT6776D, реализующая UART на материнских платах, косвенно ссылается в своей документации на ставшую де-факто стандартом, классическую микросхему PC16550D:

NSER (No Stop Bit Error). This bit is set to logical 1 to indicate that the received data have no stop bit. In 16550 mode, it indicates the same condition for the data on the top of the FIFO. When the CPU reads USR, it sets this bit to logical 0.

А в документации на микросхему PC16550D написано:

If bit 2 is a logic 0, one Stop bit is generated in the transmitted data. If bit 2 is a logic 1 when a 5-bit word length is selected via bits 0 and 1, one and a half Stop bits are generated. If bit 2 is a logic 1 when either a 6-, 7-, or 8-bit word length is selected, two Stop bits are generated. The Receiver checks the first Stop bit only, regardless of the number of Stop bits selected.

Заключение

Типичная схема применения UART — это старт-бит, 8 бит данных и один-единственный стоп-бит. Типичный битрейт — 9600 бит/с (то есть длительность любого бита будет равна 104,17 мкс). В типичном случае «break frame» (большое количество нулевых бит) не применяется и будет просто ошибкой передачи. Так что базово UART относительно прост.

А упомянутые в статье особые случаи являются исключениями. О существовании которых, однако, имеет смысл знать. Также имеет смысл знать о практике применения данного протокола в индустрии. К примеру, посмотреть, какие возможности предоставляют различные микросхемы мостов USB-UART. Их детальный обзор — в другой раз.

In order to deal with these errors, you must implement a higher level logical protocol. something akin to TCP, or check the OSI stack for ideas.

basically, two important parts to start with are checksums, and timeouts. use an algorithm to compute a redundent value that represents, in a smaller form, the contents of each message. then check this in the received message. if the sums don’t match, you have possibly gotten a framing error, bit noise, etc, etc. and you’ll need to discard the message and attempt some sort of recovery, resend, NACK ( not acknlowledged )signal, etc.

also, make sure to implement timeouts in your upper level protocol. if you get some kind of framing error, your UART may never recover and begin processing again. it may be waiting for the stop bit on a frame that the sender UART thinks has already been sent, but was corrupted by noise , clock skew, etc. this will send any input code into an infinite loop. make sure that you have a sane limit as to how long your input reading should wait until deciding to abandon this message, and again, retry, NACK, abandon, etc.

Offline

Зарегистрирован: 21.03.2017

Всем привет!

Гугл не помог, самому не догнать, нужна помощь)

Отправляю строку с одной ардуины на другую. На второй, которая принимает, для теста залито:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 3); // RX, TX
String s;
void setup() {
  s = "";
  
mySerial.begin(19200);
pinMode(13, OUTPUT);
mySerial.println("Test");
}

void loop() {
 while (mySerial.available() > 0) {
    s+=mySerial.write(mySerial.read());
  }
 }

Первая трудится с таким кодом:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 2); // RX, TX
void setup()
{ 
  Serial.begin(38400);
  mySerial.begin(19200);
 }

void loop()
{
   if (Serial.available()){
       mySerial.write(Serial.read());
  } 
 }

При подключении первой к USB-COM, в терминале всё отображается корректно, а если USB-COM подключить к ардуике №2, то на выходе получаем мусор. Что ещё замечено интересного, первый символ всегда приходит верный. 

ЗЫ: Ардуина №1 — Mega328 8mHz External 3v3 (pro)

Ардуина №2 — Mega328 16mHz External 5v (nano)

Уровни согласованы, скорости проверены, идей больше нет…

Сб янв 01, 2022 19:10:15

С Новым Годом котаны!

Возникла такая проблема на двух платах. Сталкивался с ней кто-нибудь? Помогите разобраться :dont_know:

С первой платой nano на CH340 я как думал разобрался. При надавливании платы около разъема ошибки, то уменьшались, то увеличивались.

Перепаял usb-разъем и вроде все запахало. Как мне казалось. На давление уже не реагировала.

Через какое-то время пришла дорогая mega2560+esp8266 и там опять такая фигня, но в меньшей степени, да ее продавать сложнее, чем мелкую nano. да и не оч на это она велась.

Перепаял разъем, но результата это не дало. Вернулся к старой плате и опять ошибки полезли :shock:

На прием с компа все работает без ошибок у обоих плат. При снижении скорости ошибки снижаются и на 9600 пропадают.

Вообще у меня было 4 варинта:
1) мк глючит
2) uart глючит
3) разъем
4) проблема в линии линия между мк и uart

Взял внешний uart, тотже сh340 и стал тестить.

1) мк робит, все отправляет/принимает.
2, 3) подсоединил rst на gnd. тестил в ховст и в гриву. на 921600. все робит.
4) ну вот, думал все вот проблема. подсоединяюсь к ножке rx-uart и на на его подается сигнал без искажений, но на выходе в комп спамит ошибками.

на mega2560+esp8266 в esp залил скетч на передачу и все нормально робит. но, если переключится на avr+usb ошибки :shock:

если данные на uart подаются в норм вмде, то я не понимаю где копать еще. :dont_know:

Последний раз редактировалось Listian Сб янв 01, 2022 19:17:06, всего редактировалось 1 раз.

Сб янв 01, 2022 19:14:35

не надавливать

Сб янв 01, 2022 19:18:42

на них ошибки и так идут, просто надавливание увеличивает/уменьшаяет их.

как выяснилась на меге все-таки тоже есть реакция на надавливание, но не такая сильная как на на нано.

Сб янв 01, 2022 20:48:35

Нечто подобное случилось с моими Arduino Nano с CH340C (без кварца). Думал, что Nano неисправно. «Вылечил» с замена фильтровой конденсаторов вокруг микросхемы (smd 0402? или менее по размеру) — более крупние со стоимости (1 мкФ) и ясного происхождения. Сначала попробуйте с другой кабель USB->micro/mini USB.

Сб янв 01, 2022 21:11:56

Нечто подобное случилось с моими Arduino Nano с CH340C (без кварца). Думал, что Nano неисправно. «Вылечил» с замена фильтровой конденсаторов вокруг микросхемы (smd 0402? или менее по размеру) — более крупние со стоимости (1 мкФ) и ясного происхождения. Сначала попробуйте с другой кабель USB->micro/mini USB.

вокруг uart или мк?

кста да забыл уточнить. одна ch340с внутренним резонатором, а вторая с фейковым ch340 (затертая микруха) и тоже видимо с внутрянкой.

там хоть и стоит резонатор, но походу не подключен. не звонится ничего, напруги на кварце нет.

Сб янв 01, 2022 21:18:01

Вокруг CH340C — по питание и по pin 4.
Все верно, и на моей плате островок для кварцевого smd на 4 пина есть (плата «универсальная» -> и для CH340G?) но нет кварц (для CH340C), он не припаянный.

Последний раз редактировалось veso74 Сб янв 01, 2022 22:06:08, всего редактировалось 1 раз.

Сб янв 01, 2022 21:51:50

на разных плата глянул. островки где есть, где нет, как и места с кондерами для резонатора. так что если поятавить ch340g не факт, что будет стабильно работать без кондеров. наколхозивать полюбэ придется.

ок. попробую кондеры поменять.

единственно что, по даташиту на 4 ногу (3,3в) пишут 0,1мкФ нужно ставить, если ch340 от 5в работает.

можно больше ставить? он там как для внутреннего стаба.

Последний раз редактировалось Listian Вс янв 02, 2022 18:41:10, всего редактировалось 1 раз.

Сб янв 01, 2022 21:56:01

Технически особо проблем быть не должно — схемотехника то «стандартная»…
А вот с качеством монтажа приходится таки разбираться.
Практически всегда делаю входную отмывку платки и деталюшек смесью изопропила с бензином, осмтр и удаление микрошариков припоя (часто попадаются по 1-2 штуки у кромки корпусов СМДконденсаторов/резисторов)…
Наихудшее — когда имеются следы активного флюса под разъёмами — это почти всегда «снять-отмыть-установить».
Как вариант — различие драйверов для старых и новейших версий платформ.
8)
Многое и от программы на компе зависит — можно к примеру для тестов терминалом воспользоваться
https://sites.google.com/site/terminalbpp/
только версию лучше скачать «20130116 — some improvements and new features»
8)
Дополнительное замечание — источник питания…
таких «монстров» на основе mega2560+esp8266 надо от отдельного источника +5 вольт кормить с хорошим запасом по току.
Встроенные стабилизаторы там обычно весьма «слабенькие»
:roll:

Вс янв 02, 2022 01:55:33

с кондерами чет пока эффекта ноль. попробую еще.

тут еще ржачнее.

припаялся на нане к d- и d+ ch340c. питание и землю организовал сначала внеше (пины), а потом через usb-разъем пустил.

все ок! :o

значит проблема дальше. после ch340c и до разъема.

нужно будет два эксперимента еще провеcти:

1) питание и землю пустить внешне через пины, а d- и d+ через разъем.

2) опять выпаивать разъем и без него подсоединиться. но эт сложно. нужно мега аккуратно припаиваться..

Вс янв 02, 2022 03:01:54

Сделал експеримент: Рабочий модуль Arduino Nano с CH340C, при Serials.begin(57600), на 7-й секунде при обдувах феном (для волос :), степень 1) дает ошибки, не более чем 40 гр. C на ощупь пальцем. Последующая запись для коррекции скорости была невозможна (Arduino IDE записивает на 112500 бод), до охлаждения. Я не использовал эту Arduino (с CH340C). Не буду им пользоваться. Наверное за какой-то конструкции «один раз запишешь — и забудешь», без Serial. Плохой чип CH340C. Наверное с внешним модуль RX-TX (с кварц) все ОК будет. (частично пользуюсь переводчиком БГ->РУ).

Вложения
Untitled-1.jpg
(107.56 KiB) Скачиваний: 50

Вс янв 02, 2022 11:05:44

Общие правила при работе с платками у которых и прошивка и внешний обмен по usb-com каналу делается
1. учитываем начальный интервал активности бутлоадера в случае применения самодельной программы в ПК или внешнем устройстве
2. при работе с IDE обязательно запускать сразу же монитор порта иначе можно угробить бутлоадер при попытке перепрошивки
В принципе стандартные Rx/Tx удобны только для связи через usb-com с предварительно заглушенным/отключенным выводом DTR микросхемы usb-com моста (синхронизация линии reset при перепрошивке) в иных случаях пользуемся библиотекой SoftwareSerial.
8)

Вс янв 02, 2022 19:15:21

Сделал експеримент: Рабочий модуль Arduino Nano с CH340C, при Serials.begin(57600), на 7-й секунде при обдувах феном (для волос :), степень 1) дает ошибки, не более чем 40 гр. C на ощупь пальцем. Последующая запись для коррекции скорости была невозможна (Arduino IDE записивает на 112500 бод), до охлаждения. Я не использовал эту Arduino (с CH340C). Не буду им пользоваться. Наверное за какой-то конструкции «один раз запишешь — и забудешь», без Serial. Плохой чип CH340C. Наверное с внешним модуль RX-TX (с кварц) все ОК будет. (частично пользуюсь переводчиком БГ->РУ).

не мой случай точно, но интересно)

на данный момент после экспериментов с нано на ней как-то устаканилась передача, хотя еще день назад спамило ошибками через один и хватало надавливания, чтобы менять их кол-во. :dont_know:

не знаю на сколько все это. нужно будет наблюдать за этим.

вообщем, какая-то люто плавающая хрень. жаль сразу не подпаялся к d- d+.

с mega2560+esp8266 тож все не понятно. пораюсь с кондерами, лан, если будут новые данные напишу)

Вт янв 04, 2022 06:43:35

вообщем, после нескольких дней экспериментов с mega2560+esp8266 выяснилось, что какая-то проблема в помехах от usb и разъеме.

удавалась дойти даже до того, что при движении мыши еще больше спамило ошибками! :shock:

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

подсоединялся тутже к припаянным d- d+ и сигнал нормальный, подключаю usb и спам ошибок.

проблема плавающая, долго может без ошибок, а потом начинает спамить.

у меня много ардуин, esp с таким сталкивыюсь впервые. с этими двумя платами как-то сразу проблемы начались, то закачка с ошибками, то как-то сразу ошибки выявил. :dont_know:

не понятно че терь делать. кондеры пробовал толку ноль, да и какой толк от них, если и так все работает, а проблема за самим uart-ом.

Вт янв 04, 2022 09:42:00

На низкой скорости порта (9600 бод) проблем должно быть меньше. Попробуйте отключить питание по USB (и соотв. pin +5V) и использовать от внешнего (линейного) источника. Попробуйте другие USB порты.

Наденьте на кабель USB близко к модуле один или несколько ферритовых цилиндров (ферритовые защелки). Во многих случаях для радиооборудования помогает с помехами от и до платы.

Во многих случаях в линии USB есть два резистора с низким сопротивлением 22..68 Ом) как функция защиты, так и для фильтрация (LPF с собственным емкостью входа/платы).

Вт янв 04, 2022 11:47:39

Смотрим два варианта — по железу
качество монтажа, работа схем коммутации напряжения питания (от usb/внешнего источника) они для разных платок отличаются;
и по программе — там также возможны накладки посему придется делать простой тест, а не полную программу всей самоделки гонять.
:roll:

Вт янв 04, 2022 12:36:18

не понятно че терь делать. кондеры пробовал толку ноль, да и какой толк от них, если и так все работает, а проблема за самим uart-ом.

Все ваши эксперименты с CH340. Попробуйте другие чипы USB-UART.
Я давно уже использую исключительно только CP210x и FTDI FT232x. Так как с другими периодически возникали какие-то проблемы. С этими — нет.
Ни PL23xx ни CH340 не использую — повыкидывал их все.

Вт янв 04, 2022 15:28:14

К сожалению речь идет о мостике на весьма навороченной платформе
https://img.radiokot.ru/files/20529/2praysxvt3.jpg
там просто так не отделаться…
это даже не простая
https://img.radiokot.ru/files/20529/2prb12mdba.jpg
что у меня вылеживается
или ее мини-версия
https://img.radiokot.ru/files/20529/2prb2tyziu.jpg
для простой замены …. мндяаа….
:(

Powered by phpBB © phpBB Group.

phpBB Mobile / SEO by Artodia.

Добрый день.

Имеется Atmega8 подключенный к компьютеру по UART(Переходник UART-USB 100% работает, т.к (Брал у друга) Atmega8 все отлично передает без ошибок)

Atmega8 (Собрал сам) каторый работает на кварце 7,3728 МГц и 2 Конденсатора 22пФ (Все по даташиту)

Прошил фьюзы:

avrdude.exe -p m8 -c ftbb -P ft0 -B 4800 -U hfuse:w:154:m -U lfuse:w:228:m -U lock:w:63:m

После чего, залил прошивку на CodeVisionAVR:

Предварительно в настройках проекта указал частоту 7,3728 МГц

——————————————————————

#include <mega8.h>
#include <delay.h>  

void initUART()
{  
//8 бит данных, 1 стоп бит, без контроля четности
UCSRC = ( 1 << URSEL ) | ( 1 << UCSZ1 ) | ( 1 << UCSZ0 );
//разрешить прием и передачу данных
UCSRB = ( 1 << TXEN ) | ( 1 <<RXEN )|(1<<RXCIE);

UBRRH=0;
UBRRL=47; // Передача на 9600 бит/сек

}

void uart_putc( char c )
{
 //ждем окончания передачи предыдущего байта
 while( ( UCSRA & ( 1 << UDRE ) ) == 0 );
 UDR = c;
}

void main(void){

 DDRD=0b00100000;  // Просто статусный светодиод, показывающий работу МК
 PORTD=0b00100000; //

 initUART();	  
 delay_ms(500);

 PORTD=0b00000000;

 while(1)
{	  
delay_ms(500);
PORTD=0b00000000;
uart_putc('A');   // Отправка символа.

delay_ms(500);
PORTD=0b00100000;
 }
}

——————————————————————

Все перепробовал, но присылает совсем не то, другой символ по номеру 161, причем все время,

если

char i;
for(i=0;i<251;i++){
uart_putc('A');
}

Приходят символы с 150-151-152…-224-225; Что то подобное.

Что может быть? помогите пожалуйста!

(До этого, я работал с UART на другом Atmega8, все отлично принималось и передавалось, без ошибок)


Изменено пользователем admin

II.27

Понравилась статья? Поделить с друзьями:
  • Uap124 ошибка билайн как исправить
  • Unicum nero ошибка кофемолки
  • Ua 705 ошибка a00
  • Unicum nero ошибка кофейные отходы
  • Uer 2 3 ошибка шевроле нива