почему не работает RS485
|
|
vladh |
Дата: Сб, 05.09.2015, 07:17 | Сообщение # 16 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 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 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
vladh, добавьте в репу товарищу за помощь. Тоже уже хотел копать в сторону PORTC.5 = 0. Но по работе отвлекли, уж не вернулся к вопросу.... Только вернулся.
|
|
|
|
vladh |
Дата: Пн, 07.09.2015, 09:01 | Сообщение # 18 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
ADMIN, мне фраза: " Цитата ADMIN ( ) добавьте в репу товарищу за помощь в этом месте не совсем понятна? Дать в репу это обычно означает означает стукнуть человека по голове или в лицо. Это что, вместо СПАСИБО? А вообще интересно, Иван, как Вы на это вышли. Я пытался найти причину по времени срабатывания прерывания, т.е. так как прерывание возникало через 459 мкс после начала работы, то я пытался отслеживать по времени отработки команд пульта. Но получалось срабатывание прерывания происходило значительно позже после причинной команды.
Сообщение отредактировал
vladh - Пн, 07.09.2015, 09:02
|
|
|
|
ADMIN |
Дата: Пн, 07.09.2015, 13:06 | Сообщение # 19 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Это значит, повысить репутацию человеку.
|
|
|
|
vladh |
Дата: Пн, 07.09.2015, 14:01 | Сообщение # 20 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Цитата vladh ( ) как Вы на это вышли Поскольку было разрешено прерывание от USART, посмотрел, что устанавливается бит прерывания по USART. Отключил провод RX, все встало на свои места. Значит, что то приходит на прием..... ну и далее понятно
|
|
|
|
vladh |
Дата: Чт, 10.09.2015, 06:32 | Сообщение # 22 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 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
Сообщение отредактировал
vladh - Чт, 10.09.2015, 06:20
|
|
|
|
anatol |
Дата: Пт, 11.09.2015, 10:15 | Сообщение # 23 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
Не надо переводить. Все работает как надо. Автор недопонимает как должно работать.
|
|
|
|
vladh |
Дата: Сб, 12.09.2015, 08:40 | Сообщение # 24 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 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 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
vladh, я на Казусе вел с вами беседу. Там к моему нику ещё три цифры добавлены. Поэтому здесь не отвечал. Когда доработаете опишите все познания и ошибки. Мне тоже познавательно будет. По поводу прерываний - они выполняются (при разрешении прерываний) по окончании машинной команды. Язык программирования, в том числе ассемблер, на прерывания не влияет.
Сообщение отредактировал
anatol - Пн, 14.09.2015, 09:58
|
|
|
|
vladh |
Дата: Пн, 14.09.2015, 12:42 | Сообщение # 26 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 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 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 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 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Цитата anatol ( ) И где здесь регистр INTCON?А это из документации на 877-й Как это делает компилятор в подробности я не знаю. Да и если честно говорить мне это не важно, но я вижу, что если во время симуляции работы программы в Протеусе установить точку останова на входе в подпрограмму обработки прерываний я увижу, если еще открыть окно регистров, что основной бит регистра INTCON = 0 сброшен. Хотя я его при этом не сбрасывал. Это сделал компилятор. А при выходе из этой подпрограммы компилятор его восстанавливает. Цитата anatol ( ) Ваш переход на имена приветствую, но не знаю как вас. Или Владимир или Владислав? Это мне в принципе все равно. Лишь бы не в печь головой. А вообще Владимир.
Сообщение отредактировал
vladh - Вт, 15.09.2015, 12:09
|
|
|
|