Столкнулся с проблемой, открываю порт софтовый, работаю, как только по уарту приходит определенный байт, порт должен открыться на другой скорости. Подскажите как реализовать это дело, точнее как пере открыть порт с новой скоростью?
смена скорости в SW UART
Сообщений 1 страница 21 из 21
Поделиться22013-03-06 16:37:33
Не правильно выразился. По уарту приходит посылка с новой скоростью, как пере открыть порт согласно скорости в посылке?
Поделиться32013-03-06 19:00:10
Не очень понятно как это приходит посылка с новой скоростью. UART изначально открывается с определенной скоростью. Можно на ней принять байт, а потом переключить приемник на другую.
Open "comd.1:2400,8,n,1" For Output As #1 'прием байта Close #1 'Приняли байт, закрыли порт и вновь его открываем на другой скорости Open "comd.1:19200,8,n,1" For Output As #1 'прием байта Close #1
Кстати, попробовал то, что сам написал. Действительно второй раз не открывается, даже если закрыть первый раз. Разрешает только со сменой ног. Странно.
Отредактировано sva-don (2013-03-06 19:07:46)
Поделиться42013-03-06 19:05:07
Разобрался уже)
для смены скорости использую
Baud #1, 14400
Поделиться52013-03-07 10:11:10
Назрел другой вопрос, при использовании Baud #1, 14400 возможно ли подставить переменную в место скорости?
Делаю так. Мини пример
Dim A as Long Open "coma.1:9600,8,n,1" for output #1 Do A = 14400 Baud #1, A Printbin #1, &H11223344 Loop Close #1 End
В таком виде передача просто падает, передается, только 00.
Поделиться62013-03-07 10:55:48
Влепить можно какую угодно скорость и попытаться её скормить баскому, но проблема-то в том, что железо не обманешь, есть кратные скорости частоте и если нужно именно 14400, то либо делаем сами программно приём/передачу (скажем на таймерах) либо пользуемся кратными установками в железе, но цепляем внешний кварц, который бы делал эту частоту.
Поделиться72013-03-07 11:15:41
Да не, 14400 это я к примеру вписал, даже если 9600 поставить, один пень, после команды BAUD, уарт в 00 падает.
Те если убрать переменную, и вписать BAUD #1, 9600 , то все работает как часики, вопрос именно в том, можно ли через переменную проталкнуть скорость в BAUD ?
Отредактировано Kill17 (2013-03-07 11:17:03)
Поделиться82013-03-07 11:18:16
Вроде бы из хелпа, команда "BAUD" работает только с хардварным портом.
Поделиться92013-03-07 11:21:31
из хелпа.
Do not confuse the BAUD statement with the $BAUD compiler directive. And do not confuse $CRYSTAL and CRYSTAL $BAUD overrides the compiler setting for the baud rate and BAUD will change the current baud rate. So $BAUD is a global project setting in your source code while BAUD will change the baud rate during run time. You could use BAUD to change the baud rate during run time after the user changes a setting. BAUD = ... will work on the hardware UART. BAUD #x, yyyy will work on the software UART.
Дя софтового уарта - BAUD #1, 9600 - Работает, проверенно в железе.
Поделиться102013-03-07 20:40:28
Нужно на один и тот же порт (пин) открыть два порта вывода с разными скоростями и разными номерами.
Соответственно, выводить для разных скоростей - в разные номера
Поделиться112013-03-08 21:22:03
Нужно на один и тот же порт (пин) открыть два порта вывода с разными скоростями и разными номерами.Соответственно, выводить для разных скоростей - в разные номера
Даже не доходило никогда, неужели правда такая фишка срабатывает?
Поделиться122017-10-19 15:42:41
Подниму тему.
Собственно, вопрос тот же.
Сделал автоопределение скорости обмена на прерываниях и таймере, теперь нужно на этой скорости открыть SW UART, т.е. в baud поставить переменную.
Проблема та же - baud работает только с константами. Скорости от 600 до 19200 с шагом 10, открывать 1860 портов на прием и столько же на передачу? Как поступить?
Поделиться132017-10-19 15:49:01
Непонятно, на передачу есть стандарты скоростей, там небольшое количество от 600 до 19200.
Если скорость и правда плавающая, то нет вообще смысла заморачиваться с UART, лучше уйти на SPI.
Поделиться142017-10-19 15:54:18
Поясню, некое устройство общается по lin-шине (тот же уарт в один провод), скорость его заранее не известна, может быть стандартной, может быть нестандартной. Первым байтом отправляется байт синхронизации (0x55), считаем время передачи бита, находим 8 последовательных одинаковых интервала, узнаем скорость, с этим все просто. А дальше - затык. Можно так же распарсить посылку по времени и пересчитать тайминги в байты, но много времени уйдет, на ответ уже не останется... единственный метод - работать c SW или HW уартом далее.
Поделиться152017-10-19 21:10:50
Если https://avrhelp.mcselec.com/index.html?baud_1.htm не подходит, то выход один, юзать хардварный и напрямую его попытаться переключать (через регистры).
Поделиться162017-10-20 16:40:17
т.е. в baud поставить переменную.
Проблема та же - baud работает только с константами
Используйте регистры:
UBRR и UCSRnA.U2Xn
Формула расчёта значений:
Const Const_usart_9600 = _xtal /(9600 * 16) - 1 'Расчёт скорости трансляции 9600 бод
Const Const_usart_115200 = _xtal /(115200 * 16) - 1 'Расчёт скорости трансляции 115200 бод
или подсмотреть готовые значения в документации, таблица: "Examples of UBRRn Settings for Commonly Used Oscillator Frequencies"
Поделиться172017-10-20 18:36:30
Вот небольшая таблица расчёта скорости uart с использованием регистров.
Поделиться182017-10-22 06:13:59
Премного благодорен! Попробую этот вариант, собственно, других и не предполагается
Отредактировано demonizer (2017-10-22 06:26:51)
Поделиться192017-10-22 06:26:31
Попутно, вопрос: поискал инфу, не нашёл нигде.
При использовании timeout, есть ли какой-нибудь красивый способ ловить его как событие?
Сейчас я использую таймер, до приема обнуляю, после приема, cмотрю его значение.
Отредактировано demonizer (2017-10-22 07:31:58)
Поделиться202017-10-30 23:51:14
Нашел интересный пример. вроде, работает как надо (УАРТ железный)
Dim L As Long , Bd As Long Dim Uh As Byte At L + 1 Overlay Bd = 38400 ' желаемая скорость L = 8000000 / Bd ' разделить частоту кварца на желаемую скорость L = L / 16 ' разделить результат на 16 L = L - 1 ' и вычесть 1 Ubrrl = L ' когда Вы присваиваете число long, это ' будет только байт (BYTE) Ubrrh = Uh ' мы используем overlayed переменную, которая ' является старшим байтом
Поделиться212017-10-31 11:14:17
Ну тут только одна проблема, погрешность в вычислении и разрядности шага скорости. Метод грубый, но рабочий, правда не на большой, постоянный поток данных.
Похожие темы
RS485 | Вопросы - ответы | 2017-11-20 |