Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: demanik, ivan_fd  
Форум Picbasic.ru » Программирование МК » Proton PicBasic » почему не работает RS485
почему не работает RS485
vladh Дата: Ср, 02.09.2015, 11:17  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Добрый день. Второй день не могу разобраться. Написал простой код передачи данных по USART. Вроде как работает. Хотя, через некоторое время работы данные пятого измерения начинают повторять первое измерение. Затем соединяю те же МК через MAX487. Код тот же. Но данные чего то не передаются. Где отгадка на это дело?

Добавлено (02.09.2015, 10:37)
---------------------------------------------
Жаль, что никто не высказал своих догадок  cry .Ну да ладно. Сегодня мне удалось добиться положительного результата. Правда в
некоторых случаях я не понимаю почему это приводит к положительному эффекту.
1. Если в коде приемника(Pult.bas)? перед строками, которые осуществляют вывод
на LCD, установить запрет прерываний, а в строке 44 их снова разрешить, то
программа общения по RS232 станет более стабильной.

INTCON.7 =0
If I < 4 Then Print At I+1,1,Dec Number
If I= 4 Then Print At 1,11,Dec Number
INTCON.7= 1

2. И если в коде передатчика(Peredatchik.bas) в 36 строке убратьпереключение порта C.5 наприем (PORTС.5 = 0), тотогда и в случае с RS485все работает. Но мне, вообще то, надо переводить приемник USART в процессе работытуда-сюда. Как теперь выйти из этой проблемы?

Добавлено (02.09.2015, 11:17)
---------------------------------------------
Сегодня добавил новую запись, в которой указаны некоторые ошибки в исходном коде, а редактор поместил мою запись в предыдущий блок. И в результате далеко не сразу видно, что были сделаны изменения к предыдущему, а также старый пример находится в месте, в котором подразумевался бы он как новый. что то не так работает.

Прикрепления: S485_.rar (115.8 Kb)

Сообщение отредактировал vladh - Ср, 02.09.2015, 10:39
ЯНДЕКС Дата: 02.09.2015
ivan_fd Дата: Ср, 02.09.2015, 12:36  |                                                                                                                Сообщение # 2
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Цитата vladh ()
2. И если в коде передатчика(Peredatchik.bas) в 36 строке убратьпереключение порта C.5 наприем (PORTС.5 = 0), тотогда и в случае с RS485все работает. Но мне, вообще то, надо переводить приемник USART в процессе работытуда-сюда. Как теперь выйти из этой проблемы?


Поставьте после
Код
HSerOut [n, Napr]     ' ×òåíèå ÀÖÏ À.n
небольшую паузу и можно переводить в приемник.
vladh Дата: Ср, 02.09.2015, 12:43  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата ivan_fd ()
Поставьте послеКод
HSerOut [n, Napr] ' ×òåíèå ÀÖÏ À.n
небольшую паузу и можно переводить в приемник.

Пробовал. И даже большую паузу. Не помогало.
ivan_fd Дата: Ср, 02.09.2015, 15:21  |                                                                                                                Сообщение # 4
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Что не помогало, не передаются данные?
Я посмотрел терминалом, что на передаче то и на приеме, совпадает, с паузой в 10мс.
vladh Дата: Ср, 02.09.2015, 16:17  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Если в режиме только USART, все передается. Но если в режиме RS485 - нет. Причем вроде как по на экране в том месте где должно меняться значение передаваемой величины первого АЦП, отображается не нулевое значение. Чаще всего 255. Но постоянное, хотя движок переменника меняется. И еще. Если анализировать пошаговый режим, то можно увидеть, что в режиме USART (схема RS232) код пульта на команду приема данных тратит 18 мкс на команду HSerIn. Зато в другом режиме (схема RS485) эта же команда выполняется с с переменным временем. То 18 мкс, то 8,6 мс, то 8,1 мс, то снова 18 мкс. Почему? Ведь МК не знают, что у них в цепи появились М/сх MAX487. Причем, если отключить в передатчике переключение вывода на прием(ПОРТС.5 = 0) то время отработки этой команды становится таким же как и без М/схем MAX487.
Вновь подключил немного переделанные примеры.

Добавлено (02.09.2015, 16:17)
---------------------------------------------
Кстати, сейчас проверил на реальном объекте. Передача не только по чистому USART идет нормально, но и по RS485. Похоже что Протеус не дорабатывает.

Прикрепления: S485.rar (109.2 Kb)
AndrF Дата: Ср, 02.09.2015, 17:23  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 145
Репутация: 3   ±
Замечания:   ±
На сайте с 03.02.2012

Статус: Offline

А нагрузка-то в линии есть? Какая?

Лично я применял ADM2582E/2587E - интересные микросхемки, представляющие из себя конвертор с опторазвязкой. Все работало нормально. Но я не на протоне писал. Точнее сначала на нем, а потом съехал на Swordfish.
dimvad Дата: Ср, 02.09.2015, 19:15  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 79
Репутация: 54   ±
Замечания:   ±
На сайте с 20.07.2012

Статус: Offline

Странно, а у меня если задержку 10мс убрать, то все работает, а с ней висит 255
Прикрепления: 7661921.rar (109.4 Kb)
vladh Дата: Чт, 03.09.2015, 08:25  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата dimvad ()
Странно, а у меня если задержку 10мс убрать, то все работает, а с ней висит 255

Что интересно и у меня дома пример стал себя вести также. Т.е. если задержку убрать то информация принимается и время выполнения команды приема одно и то же - 18 мкс. С задержкой все плохо. Утром, на работе еще раз проверю.

Добавлено (03.09.2015, 08:25)
---------------------------------------------
Странно, сейчас попробовал на работе. Все так как написал dimvad. Но попробовал переместить команду на передачу(ПОРТС.5 = 1) поставив её перед непосредственной передачей, как сразу все испаганилось. И уже наличие или отсутствие задержки после передачи мало влияет. Все равно передача идет плохо.

ivan_fd Дата: Чт, 03.09.2015, 09:32  |                                                                                                                Сообщение # 9
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

vladh, а Вы какой пример пробовали, dimvad?

Если да, то посмотрите внимательно на настройки скорости (19200)
Эта скорость, при кварце 8МГц, дает ошибку.

Хотя, смотрю 
Код
'Declare Hserial_SPBRG 6 ; Значение регистра SPBRG для выбранной скорости

у Вас закоментировано, и компилятор сам пишет в регистр SPBRG.

Сообщение отредактировал ivan_fd - Чт, 03.09.2015, 09:46
vladh Дата: Чт, 03.09.2015, 11:43  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата ivan_fd ()
vladh, а Вы какой пример пробовали, dimvad?
И dimvad'а и свой. Я так думаю если установки скорости стоят одинаковые и в приемнике, и в передатчике, ошибка будет у обоих одинакова и поэтому они должны друг с другом "разговаривать". Вот для общения с комп-ом могли быть проблемы.

Добавлено (03.09.2015, 11:43)
---------------------------------------------

Цитата AndrF ()
Лично я применял ADM2582E/2587E - интересные микросхемки, представляющие из себя конвертор с опторазвязкой. Все работало нормально. Но я не на протоне писал. Точнее сначала на нем, а потом съехал на Swordfish
Вживую я использую MAX485, а в Протеусе - то что нашел. На Рыбе очень тяжело писать для 16F877A biggrin .
AndrF Дата: Чт, 03.09.2015, 12:07  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 145
Репутация: 3   ±
Замечания:   ±
На сайте с 03.02.2012

Статус: Offline

Цитата vladh ()
На Рыбе очень тяжело писать для 16F877A

Ну так зачем выискивать древние чипы - чтобы себя ограничивать? К тому же и стоят они зачастую дороже современных.
ЯНДЕКС Дата: 03.09.2015
vladh Дата: Чт, 03.09.2015, 12:33  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата AndrF ()
Ну так зачем выискивать древние чипы - чтобы себя ограничивать? К тому же и стоят они зачастую дороже современных.
Все не так просто в этом подлунном мире. У меня стоит задача и её надо закончить к декабрю. Плата уже разложена и изготовлена под неё, да и распаяна. Не подключены только внешние цепи. Под этот контроллер я часто писал программы. И пока проблем не было. Так что к контроллеру вопросов нет. Рыба же, насколько я знаю, заточена под 18 серию. А это очень узкая специализация. А значит осваивать этот язык не перспективно. Скорее лучще осваивать МикроБейсик. Там и АВРы и АРМы и многое другое.

Сообщение отредактировал vladh - Чт, 03.09.2015, 12:34
AndrF Дата: Чт, 03.09.2015, 13:48  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 145
Репутация: 3   ±
Замечания:   ±
На сайте с 03.02.2012

Статус: Offline

Цитата vladh ()
Рыба же, насколько я знаю, заточена под 18 серию. А это очень узкая специализация. А значит осваивать этот язык не перспективно.

Неправда. Дальнейшее развитие рыбы - Firewing. Можно использовать сразу его, тем более что бесплатен и работает со всеми сериями, начиная с 18-ой.

И вы так и не написали - нагрузка-то в линии есть и какая?  Какая длина линии?

---------------------------
Я работал вообще без прерываний. Просто опрашивал входной буфер в цикле...

Сообщение отредактировал AndrF - Чт, 03.09.2015, 14:10
vladh Дата: Чт, 03.09.2015, 14:34  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата AndrF ()
Дальнейшее развитие рыбы - Firewing. Можно использовать сразу его, тем более что бесплатен и работает со всеми сериями, начиная с 18-ой.
При беглом взгляде на Ваш Firewing там начиная с 8 разрядной серии, но почему то пропуская 14 разрядную. Ну да ладно. О вкусах и пристрастиях спорить бесполезно.
Цитата AndrF ()
И вы так и не написали - нагрузка-то в линии есть и какая? Какая длина линии?
Сейчас длина линии 10 см! Нагрузка с двух сторон 120 Ом. Но я пока живую модель почти не трогаю. Провожу эксперименты в Протеусе. Это он мне сейчас сильно морочит голову.
Вот я прикладываю свою работу, правда чуть подсокращенную. Так вот я устанавливаю точку останова на начало подпрограммы прерывания кода Apparat.bas(левый контроллер) И хочу спросить. Может кто догадается почему после запуска симуляции через 559 мкс этот Мк переходит на обработку прерываний? Причем это для случая RS485 интерфейса. В случае связи по USART такого нет.
Прикрепления: 222.rar (197.3 Kb)
ivan_fd Дата: Чт, 03.09.2015, 15:34  |                                                                                                                Сообщение # 15
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Прерывание происходит когда Вы устанавливаете в пульте PORTC.5 = 0.
Видимо в MAX487 меняется уровень на выходе, и приемник думает, что, что то пришло и устанавливает
флаг прерывания по USART.
Форум Picbasic.ru » Программирование МК » Proton PicBasic » почему не работает RS485
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск: