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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Соединение двух МК по UART и пересылка данных


Соединение двух МК по UART и пересылка данных

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

1

Доброго времени суток, коллеги!

Ситуация следующая, имеется некий девайс ТЫК, от которого есть возможность принимать данные по UART (TTL уровни).

Для того, чтоб девайс передал данные - необходимо послать ему запрос 0xAA (в hex), в ответ он присылает  блок информации размером 15 байт.
запрос делаю следующим образом:

КОД
Код:
$regfile = "m8def.dat"
$crystal = 8000000
$baud = 38400
dim Otvet as string*15
do
Print Chr(170)

Chr(170) применил как раз для инициализации отправки данных с девайса (в HEX это 0xAA)/

Вопрос теперь такой, все 15 байт отправляются сразу в UART, а как их от туда считывать?

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

Подскажите, как можно принять 15 байт по UART и запихать их в переменную Otvet?!

конкретно про передачу данных из девайса сказано

ТЫК

Интерфейс обмена данными по UART

Предлагаемый прибор имеет возможность выдачи результатов измерений через стандартный последовательный интерфейс UART. Т.о. можно использовать его в составе более сложных устройств либо подключать его к компьютеру для автоматизированного сбора информации.
Параметры обмена данными – 38400, 8N1.
Протокол обмена очень прост – по однобайтовой команде 0xAA контроллер выдаёт блок информации размером 15 байт следующего формата – табл. 1.

Таблица 1.

Смещение, байт       Длина, байт      Назначение

0                            2                      Напряжение, В

2                            2                      Ток lo, мА

4                            2                      Ток hi, мА

6                            1                      Признак канала: 0 – low, 1 - hi

7                            2                      S, ВА

9                            2                      P, Вт

11                          2                      Q, Вар

13                          1                      cos (φ) * 100

14                          1                      φ, градусы

Следует отметить следующую особенность протокола – все величины передаются в целочисленном формате (токи в миллиамперах, косинус, который всегда меньше 1, умноженным на 100). Это сделано по следующим причинам:
- целые числа занимают меньше места – 1 или 2 байта. Числа с плавающей точкой в используемом диалекте языка Си – всегда 4 байта. Кроме того, все выдаваемые величины укладываются в целочисленный формат без каких-либо значимых потерь точности.
- т.к. заранее неизвестно, вычислительная система какой архитектуры будет подключена к прибору, то формат плавающих чисел может оказаться совершенно иным, чем применяемый в приборе, что внесёт дополнительные сложности в декодирование блока данных.

Двухбайтовые числа передаются в формате т.н. маленького индейца – т.е. сперва идёт младший байт, затем старший.
Также имеют место особенности:
- возможность калибровки и считывания калибровочной информации через UART отсутствует;
- в режиме калибровки интерфейс UART недоступен (МК не реагирует на него). Запросы данных, присланные в то время, пока шла калибровка теряются;
- МК может отсылать информацию примерно раз в секунду (после оконцания замеров и вычисления всех измеряемых величин), это следует учитывать при разработке системы опроса прибора. Поэтому не стоит «заваливать» его запросами данных, это может помешать работе измеряющего модуля.

0

2

конкретно меня, сейчас интересует как получить с него значения активной и реактивной мощностей

0

3

Здесь смотрели?

Как по мне, так это лучшее описание работы с USART в Bascom  -  перейти

Я бы сделал приём ответа в буфер на прерывании

Буфер разложен overlay-ем на готовые значения

например так

Dim Буфер_приема_usart As String * 20

  Dim Напряжение_в As Word At Буфер_приема_usart Overlay
  Dim Ток_low_ma As Word At Буфер_приема_usart + 2 Overlay
  Dim Ток_high_ma As Word At Буфер_приема_usart + 4 Overlay
  Dim Признак_канала Byte At Буфер_приема_usart + 6 Overlay
  Dim S_ва As Word At Буфер_приема_usart + 7 Overlay
  Dim P_вт As Word At Буфер_приема_usart + 9 Overlay
  Dim Q_вар As Word At Буфер_приема_usart + 11 Overlay
  Dim Cos_x_100 As Byte At Буфер_приема_usart + 13 Overlay
  Dim Градусы As Byte At Буфер_приема_usart + 14 Overlay

или так

Dim Буфер_приема_usart_byte(20) As Byte

  Dim Напряжение_в As Word At Буфер_приема_usart_byte(1) Overlay
  Dim Ток_low_ma As Word At Буфер_приема_usart_byte(3) Overlay
  Dim Ток_high_ma As Word At Буфер_приема_usart_byte(5) Overlay
  Dim Признак_канала Byte At Буфер_приема_usart_byte(7) Overlay
  Dim S_ва As Word At Буфер_приема_usart_byte(8) Overlay
  Dim P_вт As Word At Буфер_приема_usart_byte(10) Overlay
  Dim Q_вар As Word At Буфер_приема_usart_byte(12) Overlay
  Dim Cos_x_100 As Byte At Буфер_приема_usart_byte(14) Overlay
  Dim Градусы As Byte At Буфер_приема_usart_byte(15) Overlay

Подняли флаг, что всё готово, реагируете согласно Вашего алгоритма.

Вот собственно и всё.

Отредактировано sasha_1973 (2014-11-30 15:31:06)

0

4

Если точно знаете что 15 байт, и после запроса ждёте ответ. то почему бы не попробовать просто

Код:
Inputbin U , Io,hi,Cn,sS,P,Q,COS_,F '  сумма всех байт равна 15

Ну и на всякий случай таймаут включить.

0

5

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

Если точно знаете что 15 байт  ..... включить.


А вот это уже интереснее. Завтра буду на работе, обязательно попробую!
Спасибо за подсказки!

0

6

спасибо огромное! теперь все получилось!
помогло inputbin, а чтоб не парится с байтами где по два а где по одному я назначил для переменных следующие типы

Dim U As Word ' 2 Байта
Dim Io As Word ' 2 Байта
Dim Hi As Word ' 2 Байта
Dim Cn As Byte ' 1 Байт
Dim Ss As Word ' 2 Байта
Dim P As Word ' 2 Байта
Dim Q As Word ' 2 Байта
Dim Cos_ As Byte ' 1 Байт
Dim F As Byte ' 1 Байт

и все заработало!!!

0

7

:cool:

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Соединение двух МК по UART и пересылка данных