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

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

Статус: Offline

Цитата ivan_fd ()
Прерывание происходит когда Вы устанавливаете в пульте PORTC.5 = 0.
Ну Вы Иван молодец! Вы так быстро находите ответы.. Я Вами восхищен. И премного благодарен.

Добавлено (05.09.2015, 07:17)
---------------------------------------------
В общем тема раскрыта. Единственно, на что бы хотелось обратить внимание. У меня в программе присутствуют 4 битовых переменных. Для того, чтобы при передаче по каналу связи такой переменной не занимать целый байт, я решил присвоить одной однобайтовой переменной на каждый бит символ. Сделал я это так:

Dim Perem As Byte
Symbol Pusk Perem.0
Symbol Napr Perem.1
Symbol konec Perem.2
Symbol Pr_k Perem.3

В Протеусе все работает нормально, но в живом изделии не работало. После достаточно долгих выяснений причины выяснилось, что когда должен был меняться один бит, изменялся другой. И только когда я переписал код вот так:

Dim Perem As Byte
Dim Pusk As Perem.0
Dim Napr As Perem.1
Dim Konec As Perem.2
Dim Pr_k As Perem.3

Все заработало так как надо!

ADMIN Дата: Сб, 05.09.2015, 18:15  |                                                                                                                Сообщение # 17
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1087
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

vladh, добавьте в репу товарищу за помощь. 
Тоже уже хотел копать в сторону PORTC.5 = 0. Но по работе отвлекли, уж не вернулся к вопросу....
Только вернулся.
vladh Дата: Пн, 07.09.2015, 09:01  |                                                                                                                Сообщение # 18
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

ADMIN, мне фраза: "
Цитата ADMIN ()
добавьте в репу товарищу за помощь
в этом месте не совсем понятна? Дать в репу это обычно означает означает стукнуть человека по голове или в лицо. Это что, вместо СПАСИБО?
А вообще интересно, Иван, как Вы на это вышли. Я пытался найти причину по времени срабатывания прерывания, т.е. так как прерывание возникало через 459 мкс после начала работы, то я пытался отслеживать по времени отработки команд пульта. Но получалось срабатывание прерывания происходило значительно позже после причинной команды.

Сообщение отредактировал vladh - Пн, 07.09.2015, 09:02
ADMIN Дата: Пн, 07.09.2015, 13:06  |                                                                                                                Сообщение # 19
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1087
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Это значит, повысить репутацию человеку.
vladh Дата: Пн, 07.09.2015, 14:01  |                                                                                                                Сообщение # 20
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата ADMIN ()
Это значит, повысить репутацию человеку.
Занятно, как может сильно измениться понятие:
Дать в репу: http://enc-dic.com/word/d/Davat-dat-v-repu-29134.html
Добавить в репу: http://www.programmersforum.ru/showthread.php?t=113632

Сообщение отредактировал vladh - Пн, 07.09.2015, 14:29
ivan_fd Дата: Пн, 07.09.2015, 14:54  |                                                                                                                Сообщение # 21
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Цитата vladh ()
как Вы на это вышли

Поскольку было разрешено прерывание от USART,  посмотрел, что устанавливается
бит прерывания по USART. Отключил провод RX, все встало на свои места. Значит, что
то приходит на прием..... ну и далее понятно
ЯНДЕКС Дата: 07.09.2015
vladh Дата: Чт, 10.09.2015, 06:32  |                                                                                                                Сообщение # 22
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Всем доброго времени дня. Хотелось бы продолжить обсуждение проблем возникающих у меня при передаче данных по RS485. Как то здесь на сайте взял пример и вот немного переделал программу. В пересылаемом варианте все вроде как работает нормально(кстати и в живую тоже). Но вот если в программе приемника в строках 47 и 50 отключить команды откл/вкл прерывания, то в результате прием прекращается. Почему? Вообще говоря эти команды как бы здесь и не нужны. Вживую, вначале прием идет но через несколько строк у дисплея пропадает синхронизация(если что у меня OLED дисплей). Или если в 33 строке включить команду очистки экрана, то результат будет похожий. Почему? Если в программе передатчика в строке 38 уменьшить время задержки менее 5 мс, то результат опять будет похожий. Почему? Здесь задержка как бы и не очень нужна.

Добавлено (10.09.2015, 06:18)
---------------------------------------------
И ещё. Время цикла работы приемника в несколько тысяч раз меньше времени цикла передатчика. Т.е. передатчик достаточно редко передает данные приемнику, чтобы внести сумятицу в его работу. А на вид получается, что он(приемник) начинает путать порядок принимаемых переменных.

Добавлено (10.09.2015, 06:32)
---------------------------------------------
Если кто то из форумчан сумеех хорошо перевести эти вопросы на английский, то может стоит задать эти вопросы на форуме Crownhill : http://www.protonbasic.co.uk/forumdi....iler-v3

Прикрепления: EKSp.rar (70.2 Kb)

Сообщение отредактировал vladh - Чт, 10.09.2015, 06:20
anatol Дата: Пт, 11.09.2015, 10:15  |                                                                                                                Сообщение # 23
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 472
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

Не надо переводить. Все работает как надо. Автор недопонимает как должно работать.
vladh Дата: Сб, 12.09.2015, 08:40  |                                                                                                                Сообщение # 24
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата anatol ()
Все работает как надо.
Если Вы так считаете, то докажите или объясните. А так это, это утверждение пустое.

Добавлено (11.09.2015, 11:16)
---------------------------------------------
Цитата anatol ()
Автор недопонимает как должно работать.
То как я понимаю устройство работает неправильно. А если Вы сказали эту фразу то докажите, сто оно так и должно работать.

Добавлено (12.09.2015, 08:40)
---------------------------------------------
Всем привет. Пообщавшись вчера на Казусе выяснил причину неполадок. Дело в том, что оказывается в Протоне возникшее прерывание может вытащить программу из выполняемой протоновской команды и потом вернуться не туда откуда была выведена. Раньше, при написании программ, я больше использовал программные прерывания и с тех пор у меня отложилось, что прерывания не могут прекратить выполняемую бейсиковскую команду. А оказалось могут. И как результат возникает каша. Поэтому хотел бы обратить ваше внимание, когда используете прерывания в критических места необходимо их запрещать. Критическими местами я считаю команды Протона состоящие из большого количества команд ассемблера.

Сообщение отредактировал vladh - Пт, 11.09.2015, 11:17
anatol Дата: Пн, 14.09.2015, 09:57  |                                                                                                                Сообщение # 25
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 472
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

vladh, я на Казусе вел с вами беседу. Там к моему нику ещё три цифры добавлены. Поэтому здесь не отвечал.
Когда доработаете опишите все познания и ошибки. Мне тоже познавательно будет.
По поводу прерываний - они выполняются (при разрешении прерываний) по окончании машинной команды. Язык программирования, в том числе ассемблер, на прерывания не влияет.

Сообщение отредактировал anatol - Пн, 14.09.2015, 09:58
vladh Дата: Пн, 14.09.2015, 12:42  |                                                                                                                Сообщение # 26
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата anatol ()
vladh, я на Казусе вел с вами беседу. Там к моему нику ещё три цифры добавлены. Поэтому здесь не отвечал.Когда доработаете опишите все познания и ошибки. Мне тоже познавательно будет.
По поводу прерываний - они выполняются (при разрешении прерываний) по окончании машинной команды. Язык программирования, в том числе ассемблер, на прерывания не влияет.
Сообщение отредактировал anatol - Пн, 14.09.2015, 09:58

Так я сразу понял. Имя немного другое, а на фото - один в один.
Позвольте С Вами не согласиться по поводу влияния языка на прерывание. Влияют и даже Бейсик. Если в разделе обработки прерываний будет такая запись:

Prer:
Context Save
If PORTD.1 = 0 Then INTCON.5 = 0
Context Restore
Resume

Здесь третья строка отключает установленные ранее прерывания от таймера. А эта строка на Бейсике.
Хорошо. когда закончу отпишусь. Поплачу в жилетку или спою.

Сообщение отредактировал vladh - Пн, 14.09.2015, 12:43
anatol Дата: Пн, 14.09.2015, 15:12  |                                                                                                                Сообщение # 27
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 472
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

vladh, я согласен что можно отключить прерывания прямой записью в регистр (INTCON.5 = 0).
Но у вас до этого Context Save и If PORTD.1 = 0 несколько операций. И если в момент их выполнения произойдет прерывание, то все сначала - "Prer: - Context Save и т.д.
Поэтому в обработчике прерывания первым делом запретить прерывания и последним разрешить если необходимо.
Обработчик прерывания работает также, как и основная программа. Со всеми прибабахами по отношению к программному счетчику, аккумулятору, флагам - поэтому и нужна связка
Context Save - Context Restore записывающее состояние значимых регистров в момент возникновения прерывания и ! восстанавивающее их значение по окончании обработки прерывания.
Какие операции и как влияют на флаги - расписано в ДШ в разделе ассемблерных команд.
vladh Дата: Вт, 15.09.2015, 07:03  |                                                                                                                Сообщение # 28
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата anatol ()
Но у вас до этого Context Save и If PORTD.1 = 0 несколько операций. И если в момент их выполнения произойдет прерывание, то все сначала - "Prer: - Context Save и т.д. Поэтому в обработчике прерывания первым делом запретить прерывания и последним разрешить если необходимо.

Нет, Анатолий, не совсем так. Когда программа переходит на подпрограмму обработки прерываний указанную строчкой:

On_Hardware_Interrupt GoTo Prer

компилятор отключает обработку следующих прерываний пока не будет сделан выход(Resume). Только после этого вновь бит INTCON.7 снова становится равным 1 и компилятор вновь может обрабатывать прерывания. И если в тот момент, когда шла обработка прерываний, что то установило флаг разрешонного прерывания, то да компилятор вновь направит программу в подпрограмму обработки прерываний(Prer:).

Сообщение отредактировал vladh - Вт, 15.09.2015, 07:05
anatol Дата: Вт, 15.09.2015, 11:03  |                                                                                                                Сообщение # 29
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 472
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

Вот кусок вашей программы приемника касающейся перехода на прерывания :

Код
0004                  00954     org 4
0004   00FF           00955     movwf WSAVE                  сохраняем аккумулятор     
0005   0803           00956     movf STATUS,W               флаги в аккумулятор
0006   0183           00957     clrf STATUS                       обнуляем регистр
0007   00FE           00958     movwf SSAVE                    сохраняем флаги
0008   0804           00959     movf FSR,W                       сохраняем регистры
0009   00FC           00960     movwf FSRSAVE                             
000A   080A           00961     movf PCLATH,W                 
000B   00FD           00962     movwf PSAVE
000C   3001           00963     movlw (loop_start >> 8) & 255      читаем адрес подпрограммы прерываний
000D   008A           00964     movwf PCLATH                    и заносим адрес в счетчик
000E   2914           00965     goto loop_start                    стартуем подпрограмму обработки прерываний

И где здесь регистр INTCON?
А это из документации на 877-й
регистр PIR1 - флаги прерываний устанавливаются при возникновении условий прерывания независимо от INTCON.7. Програмное обеспечение пользователя должно сбрасывать соответствующие флаги при обработке прерываний.
"КУ" - Кин-дза-дза.
Регистр INTCON биты 6,7 - разрешают прерывания от переферийных модулей, регистр PIE1  - биты 4,5 разрешаютпрерывания от USART,  регистр PIR1- биты 4,5  контролируют работу приемника и передатчика
USART.
В каком объеме и насколько полно в Протоне отслеживаются регисты - не знаю. Копать пока нет желания, да  и некогда.
Ваш переход на имена приветствую, но не знаю как вас. Или Владимир или Владислав?
vladh Дата: Вт, 15.09.2015, 12:08  |                                                                                                                Сообщение # 30
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата anatol ()
И где здесь регистр INTCON?А это из документации на 877-й
Как это делает компилятор в подробности я не знаю. Да и если честно говорить мне это не важно, но я вижу, что если во время симуляции работы программы в Протеусе установить точку останова на входе в подпрограмму обработки прерываний я увижу, если еще открыть окно регистров, что основной бит регистра INTCON = 0 сброшен. Хотя я его при этом не сбрасывал. Это сделал компилятор. А при выходе из этой подпрограммы компилятор его восстанавливает.
Цитата anatol ()
Ваш переход на имена приветствую, но не знаю как вас. Или Владимир или Владислав?
Это мне в принципе все равно. Лишь бы не в печь головой. А вообще Владимир.

Сообщение отредактировал vladh - Вт, 15.09.2015, 12:09
Форум Picbasic.ru » Программирование МК » Proton PicBasic » почему не работает RS485
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Поиск: