Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » смена скорости в SW UART


смена скорости в SW UART

Сообщений 1 страница 21 из 21

1

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

0

2

Не правильно выразился. По уарту приходит посылка с новой скоростью, как пере открыть порт согласно скорости в посылке?

0

3

Не очень понятно как это приходит посылка с новой скоростью. 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)

0

4

Разобрался уже)

для смены скорости использую
Baud #1, 14400

0

5

Назрел другой вопрос, при использовании 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.

0

6

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

0

7

Да не, 14400 это я  к примеру вписал, даже если 9600 поставить, один пень, после команды BAUD, уарт в 00 падает.

Те если убрать переменную, и вписать BAUD #1, 9600 , то все работает как часики, вопрос именно в том, можно ли через переменную проталкнуть скорость в BAUD ?

Отредактировано Kill17 (2013-03-07 11:17:03)

0

8

Вроде бы из хелпа, команда "BAUD" работает только с хардварным портом.

0

9

из хелпа.

Код:
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  -  Работает, проверенно в железе.

0

10

Нужно на один и тот же порт (пин) открыть два порта вывода с разными скоростями и разными номерами.
Соответственно, выводить для разных скоростей  - в разные номера

0

11

dmm написал(а):

Нужно на один и тот же порт (пин) открыть два порта вывода с разными скоростями и разными номерами.Соответственно, выводить для разных скоростей  - в разные номера

Даже не доходило никогда, неужели правда такая фишка срабатывает? o.O

0

12

Подниму тему.
Собственно, вопрос тот же.
Сделал автоопределение скорости обмена на прерываниях и таймере, теперь нужно на этой скорости открыть SW UART, т.е. в baud поставить переменную.
Проблема та же - baud работает только с константами. Скорости от 600 до 19200 с шагом 10, открывать 1860 портов на прием и столько же на передачу? Как поступить?

0

13

Непонятно, на передачу есть стандарты скоростей, там небольшое количество от 600 до 19200.
Если скорость и правда плавающая, то нет вообще смысла заморачиваться с UART, лучше уйти на SPI.

0

14

Поясню, некое устройство общается по lin-шине (тот же уарт в один провод), скорость его заранее не известна, может быть стандартной, может быть нестандартной. Первым байтом отправляется байт синхронизации (0x55), считаем время передачи бита, находим 8 последовательных одинаковых интервала, узнаем скорость, с этим все просто. А дальше - затык. Можно так же распарсить посылку по времени и пересчитать тайминги в байты, но много времени уйдет, на ответ уже не останется... единственный метод - работать c SW или HW уартом далее.

0

15

Если https://avrhelp.mcselec.com/index.html?baud_1.htm не подходит, то выход один, юзать хардварный и напрямую его попытаться переключать (через регистры).

0

16

demonizer написал(а):

т.е. в 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"

0

17

Вот небольшая таблица расчёта скорости uart с использованием регистров.

+1

18

Премного благодорен! Попробую этот вариант, собственно, других и не предполагается :)

Отредактировано demonizer (2017-10-22 06:26:51)

0

19

Попутно, вопрос: поискал инфу, не нашёл нигде.

При использовании timeout, есть ли какой-нибудь красивый способ ловить его как событие?

Сейчас я использую таймер, до приема обнуляю, после приема, cмотрю его значение.

Отредактировано demonizer (2017-10-22 07:31:58)

0

20

Нашел интересный пример. вроде, работает как надо (УАРТ железный)

Код:
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 переменную, которая
                   ' является старшим байтом

0

21

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

0

Похожие темы


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » смена скорости в SW UART