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

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

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

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



RS485

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

1

Народ! есть такая проблема:
Озадачили меня учетом топлива, только отдавать данные надо по сабжу.
из описаловы дали следующее:

Формат передаваемых данных:
        1 старт-бит
        8 бит данных
        контроля четности нет
        1 стоп-бит
        скорость - 9600 бод.   

Для считывания данных из датчика необходимо сформировать следующую посылку:
(все передаваемые и принимаемые байты в HEX виде)

запрос на датчик : 05   10 0A   0F   D2
(если в ответ от ДРТ ничего не придёт в течении 50мс то запрос необходимо повторить (до 3-х раз))

ответ от ДРТ:    15   0A 10   00   ED 28 00 00  00 00  D0 07  60 EA 00 00  60 EA 00 00  51
(обычно приходит через 2-3мс после окончания запроса).

где:       (последовательный разбор полей)
0A 10    стандартный ответ от ДРТ с адресом 10
00     флаг состояния датчика
        ED 28 00 00     4-х байтовый счётчик прошедшего через датчик
                        топлива  в миллилитрах (первый байт - младший);
        00 00            скорость расхода топлива л/час (до десятых -
                        15 = 31.5 л/ч) (первый байт - младший);
        d0 07     не используется
        60 EA 00 00     не используется;
        60 EA 00 00    не используется;
        e7    контрольная сумма (сумма всех байт с инверсией знака (перенос отбрасывается)).

Кто-нибудь обьяснит доступным языком, как организовать данный протокол?? проблема состоит больше в приеме данных\организации буфера\разборе запроса.
MAX485 у меня подключен к стандартному UARTу,по входу Т1 считаю импульсы, перевожу в литры и литры в час, а вот с пртоколом обмена не клеится никак.....

0

2

Длина запроса и ответа постоянная?

0

3

Делал подобное примерно так:
Запрос:
Printbin &H05 ; &H10 ; &H0A ; &H0F ; &HD2

0

4

принимаем ответ:

      N = 21      ' длина ответа
      For S = 1 To N
         Inputbin D Timeout = T   '
         ------   ' обрабатываем D
      Next

0

5

Спасибо! буду пробовать! Длина запроса постоянная, а ответ разный, но тот что меня интересует, я и дал.
Подскажите плиз, математику для  контрольной суммы(  сумма всех байт с инверсией знака (перенос отбрасывается).)

Отредактировано Skull (2007-10-10 10:21:38)

0

6

Скорее всего то, что я написал в предыдущих постах, работать у вас не будет
(Сразу не насторожился по поводу 05 и 15 в начале запроса и ответа!)
Если я правильно понял - этот протокол работает следующим образом:
1. В исходном состоянии датчик должен ждать запрос <ENQ> (&H05),
на который, если все нормально, должен ответить <NAK> (&H15)
После этого ХОСТ посылает команду.
2. Если команда принята, датчик отвечает <ASK> (&H06), готовит и посылает ответ.
<ASK> должет перевести ХОСТ на прием ответа.
После приема Хост посылает подтверждение приема <ASK> (если совпадает  контрольная сумма)
Если не выполняются эти условия, то все заново.

У меня это работает так (Меня интересует в ответе только длина сообщения и код ошибки):
$regfile = "89c4051.DAT"
$baud = 4800                             
$crystal = 11059000                     
$timeout
'$large

' ---------Всякие переменные
Dim Enq As Const &H05
Dim Ask As Const &H06
Dim Nak As Const &H15
Dim Alarm As Bit                          ' авария
Dim S As Byte
Dim D As Byte                             ' временая  переменная
Dim N As Byte                             ' кол-во байт в команде
Dim Er As Byte                            ' ошибка в принимаемом ответе
Dim T As Word                             ' таймаут

Dim I As Byte                             ' временая  переменная
'                  Н А Ч А Л О
   Do
Gosub Send_enq            '
             Printbin &H02 ; &H05 ; &H40 ; &H1E ; &H00 ; &H00 ; &H00 ; &H5B
Gosub Comport
Gosub Check_er                      ' Проверка кода ошибки
   Loop
End
Send_enq:                '    запрос состояния 
      Printbin Enq
      Gosub Comport                       ' принимаем ответ
      Gosub Check_er
      Wait 1
Return
Comport:
Inputbin D Timeout = T                    ' принимаем 1 й байт (06)
   If D = Nak Then
      Exit Sub
   End If
   If D = Ask Then
      Inputbin D Timeout = T              ' принимаем 2 й байт (02)  Эти данные не интересуют
      Inputbin N Timeout = T              ' принимаем 3 й байт (длина команды)
      Inputbin D Timeout = T              ' код команды    Эти данные не интересуют
      Inputbin Er Timeout = T             ' ошибка
      N = N - 1
      For S = 1 To N
         Inputbin D Timeout = T    ' Эти данные не интересуют
      Next
      Waitms 50
      Printbin Ask                        ' ответ ASK

   Else
      P1 = &B01100010                     'HA6                          ' Нет связи
      Wait 3
      Exit Sub
   End If

Return

0

7

Я тут поселюсь не на долго  :blush:
Буду дружить MAX485, там по мимо RX,TX есть ещё другие сигналы.
http://www.mini-tech.com.ua/image/cache/data/communication/MAX485_module_1-228x228.jpg
На модуле для Arduino:

Код:
DI (Driver Input - вход передатчика)	
RO (Receiver Out - выход приёмника)
Vcc (Voltage constant current - напряжение постоянного тока)
GND (GrouND - земля)
DE (Driver Enable - разрешение работы передатчика)
RE (Receiver Enable - разрешение работы приёмника)

Наличие логической "1" на входе "DE" разрешает работу передатчика.
Наличие логического "0"на входе "RE" разрешает работу приёмника.
Если соединить вход DE со входом ~RE и подключить их к любому цифровому выводу arduino, то подав на него «1» модуль будет работать только на передачу, а подав «0», только на приём.

0

8

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

Если соединить вход DE со входом ~RE


Обычно китайцы автоматом эти сигналы коротят на плате.

0

9

Не получилось никак подружить Atmega128 Usart0 с USB-RS485 переходником.
Всё делал правильно, питание в норме.
На компьютере не зависимо от скорости принимаю одни и те-же кариказябины.
Никто не сталкивался с этим?
http://s9.uploads.ru/t/12NhD.png
Схема в порядке, контроллер в режиме Mega128, используется Usart0, кварц и фузы в норме.
Даже не знаю в чём может быть дело, наверно китайский переходник RS-485 не исправен или есть то, что не знаю.

0

10

скорость не совпадает
Настройки фузов на кварц верные?
начните с 9600

0

11

Александр Д. написал(а):

скорость не совпадает

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

0

12

чтото я не сильно понял что вы делаете..
вы посылаете данные с  Usart0 сразу на USB-RS485 переходник  ?

тоесть схема такая : Usart0  > линия связи > RS485 > USB >ПК ?
или  схема такая : Usart0  > RS485(MAX485) > линия связи > RS485 > USB >ПК ?

0

13

Использовал китайский Usb-Rs485 переходник:

Свернутый текст

http://thumbs1.ebaystatic.com/m/mkPgw0V0xsd7K1Jb97FGOgQ/140.jpg

Для контроллера использовал готовый модуль:

Свернутый текст

http://thumbs4.ebaystatic.com/m/mQmNpFIXngbcPU_WbhK2IHQ/140.jpg

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

Отсылаю TEST{10} и должен принять TEST> TEST (PRINT "TEST>";S)
Но получаю это:

Свернутый текст

http://s1.uploads.ru/t/gaBKh.png

От версии Bascom не зависит (

Отредактировано Ev3658 (2017-11-19 15:00:52)

0

14

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

Для контроллера использовал готовый модуль:
Свернутый текст

Схематично всё верно, проверил на другом контроллере, тоже самое.


открою страшную тайну: данный модуль надо допилить напильником!
Чтобы избежать выдачи ошибочных сигналов на приемник UART, необходимо на входах A-B гарантировать разность потенциалов Uab > +200мВ. Это смещение при отсутствии входных сигналов обеспечивает на выходе приемника логическую "1", поддерживая, таким образом, уровень стопового бита. Резисторы R5 и R6  ( подтяжка  ) надо заменить на резисторы номиналом от 0.56к  до  4.7кОм  ( у меня китайцЫ впихнули по 200кОм ! ) .
При напряжение питания - 5В R5 и R6 выходят примерно по 650 Ом. Для смещения с запасом - сопротивление обычно ставят 560 Ом.

желательно  2й и 3й вывод микросхемы  (RE  DE)  обьединить и через резистор 4.7кОм  подтянуть к земле

Отредактировано Penumbra (2017-11-19 16:25:51)

0

15

Да-да, подтверждаю, если на модуле есть сопротивления согласно документации, то вот в Usb-RS485 одно не оказалось (220 Ом), из-за этого и были глюки.
Но хуже того, из 5ти штку модулей RS-485 - две штуки рабочие  :dontknow:

0

16

, у меня  до перепайки резисторов , из  8 модулей работало только 3, после допиливания - заработали все

0

17

Чудеса прям, вот ща делаю проект на RS485 и никаких проблем не наблюдаю.
Может проблема в правильности включения 485?

- подключать надо А к А и В к В.
- 0 на дирекшене - это приём.
- RE и DE замыкаем в общий вывод управления.

0

18

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

0

19

Ну да, только там по топологии должно выглядеть так:

https://www.abelectronics.co.uk/docs/stock/raspberrypi/rs485pi/rs485network.png

Это 120 Ом и не в одном месте, а обязательно по концам (не говоря уже о витой паре), в промежуточных устройствах его не должно быть, иначе сразу на 5-10 устройства получим перегрузку линии (120/10=12 Ом).

0