Свежие обсуждения
Микроконтроллеры

UART без кварца

1 3

Всегда использовал кварц в схемах, где использовался UART.
Понадобилось сделать удлинитель для дисплея на базе HD44780, сделал на двух pic16f18346, один принимает и передает по UART, второй принимает. Про кварц как-то забыл и сделал без него. Схема работает (кабель 3 метра - это будут максимум). Теперь сижу и думаю, в документации пишут, что точность встроенного тактового генератора 1%, для UART нагуглил 2-3%. Теперь сижу и думаю, стоит ли в схему пытаться внедрить кварц или и так будет работать? Теоретически все будет в одном помещении, на расстоянии в пару метров. Питание 5В у обоих МК от одного источника, правда на удаленном оно может проседать из-за подсветки, которая до 400...500 мА может кушать. Скорость 115200 бит/с.
В интернете нагуглил, что на Атмегах работать не будет, а на ПИКах будет, т.к. у Атмегов точность внутренего генератора ниже. Больше особых подтверждений из практики не попадалось.
У кого какие мысли? Понимаю, что с кварцем явно будет ОК.

 

В неответственных приложениях я и на Atmega делал UART без кварца. Работало всегда без проблем. Максимально допустимая погрешность зависит от формата, при 8N1 она довольно большая. На память где-то около 5%.
Для устройств, которые уходили из родных стен, кварц ставился всегда. Чисто для спокойствия сна

 

Сергей К: Теоретически все будет в одном помещении, на расстоянии в пару метров.

Чего-то я не врубаюсь... Как несинхронность тактирования зависит от длины кабеля? По-моему, никак, поскольку скорость распространения по самому плохому кабелю столь высока, что на порядки перекроет любые задержки тактирования. Пресловутые 2...3%, которые UART умеет самокомпенсировать, заведомо перекрываются этой скоростью: тактовая частота UART в типовых применениях вряд ли превышает 1 МГц (т.е. импульс - 1 мксек), а за это время сигнал убежит не на 3, а на сотню метров (или много более). Чего бояться-то?
Или я чего-то не понимаю?

 

Проблема тут не в длине кабеля, а в ассинхронной природе UART.

 

на Мегах все работает, если скорость порта не задирать до потолка. в описаном случае с удлинением дисплея - даже 2400 будет достаточно....

 

Tadas: Чисто для спокойствия сна

Ну вот

Спец: Пресловутые 2...3%, которые UART умеет самокомпенсировать

UART не умет самоинхронизироваться.
Есть вариант в автонастройке скорости приема, но для этого передатчик должен посылать специальный байт. В модемах используется символ "А" (потому и все AT-команды начинаются на "А").
В этом МК нужен байт 0x55 ("U"), и команду автонастройки нужно специально запускать. Пока не знаю, что проще. Кварц или стартовый байт сделать "0x55" и после приема пакета каждого запускать функцию автонастройки частоты.

hanz45: даже 2400 будет достаточно

4 строки 20 символов = 80 байт (при 8-ми битном интерфейсе). У меня стартовый + стоповый байт, и два байта данных = 320 байт. Время полного обновления дисплея, при 115200 бит/с 30 мс. Ну да, можно и снизить скорость.

 

Для UART длина пакета данных не имеет значения. Запуск синхронизации приёмника начинается от стартового бита каждого символа. Тут важно чтобы ошибка не набежала до предела за время от старт до стоп бита.
Автонастройка по моему тут так же не причём. Она только позволяет выбрать одну из стандартных скоростей. "Тонкой" настройки там нет. Это про Atmega, как там в пиках не знаю, не моё это.

 

Tadas: Она только позволяет выбрать одну из стандартных скоростей

При автонастройке измеряется длительность бита (0x55 - это ...1010...) и в регистр скорости записывается ближайшее значение делителя. В зависимости от частоты кварца получается тонкая настройка с некоторым шагом. "Стандартных" скоростей там нет, нужно подбирать значение этого регистра в зависимости от желаемой скорости и частоты кварца.
....
Почитал документацию. На скорости 115200 шаг изменения скорости получается весьма грубым. По расчетам, изменение значения в регистре скорости на единицу, реальная скорость приобретает следующие значения: 100 000 (-13%), 125 000 (+9%) и 166 667 (+45%) бит/с.
Там-же в документации пишут, что более тонкую настройку с внутренним генератором можно реализовать за счет подстройки частоты тактового генератора. Соответственно режим автонастройки тут не поможет.
....
Не дочитал. Там есть переключение коэффициента деления и можно выставить скорость 115942 битс/с, т.е. 0.6% погрешности (от 115200). Ближайшее следующее значение скорости - 114 286 бит/с 0,8% (от 115200). Т.е. вполне автонастройкой можно подогнать скорость. Нужно будет поразмыслить над этим
....
В UART есть еще синхронный режим. В этом режиме используется отдельная линия для синхроимпульсов и здесь уже неважна точность генератора приемника. Но этот вариант не подходит для передачи через интерфейс RS485, т.к. требуется две линии на передачу.

 

Сергей К: в регистр скорости записывается ближайшее значение делителя

Т.к. делитель целочисленный, то тонкой настройкой назвать это трудно.
Сергей К: В UART есть еще синхронный режим.

Это уже не UART , а USART .
Сергей К: Т.е. вполне автонастройкой можно подогнать скорость.

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

 

Tadas: Да, это при точном значении частоты тактового генератора.

В этом случае стабильность вн. генератора должна обеспечить стабильную работу в пределах одного пакета. А температура не может так быстро изменяться. С напряжением питания сложнее