Обработка прерывния. Что то уходит не туда!?
|
|
vladh |
Дата: Чт, 13.08.2015, 11:54 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Добрый день уважаемые форумчане. Второй день бодаюсь с программой и никак не могу найти где в ней черт спрятался . Может у меня внимание замылилось и я чего то не вижу. Поэтому обращаюсь к вам. Может кто то что то и найдет в ней. Суть проблемы такова. Разрабатываемое устройство состоит из двух частей. Стационарного аппарата и пульта управления. Аппарат и пульт связываются друг с другом по RS485 интерфейсу. Но поскольку этот интерфейс в Протеусе смоделировать не удалось, я моделирую его через USART. Логика связи такова, что оба устройства находятся в режиме прослушки линии. Как только на линии появляются данные, контроллеры, по прерыванию, переходят на подпрограмму приема данных. После приема, он возвращается к исходной своей работе. После включения симуляции все идет по плану. Это значит, что я выбрав в меню на экране дисплея "1" перехожу на подпрограмму "Компенсации". Далее, в режиме Компенсация, я хочу нажать на клавишу "5" тем самым осуществить режим Пуск. При этом пульт должен передать в аппарат код установленного режима(Reg=1) и код команды Пуск(Pusk=1). На экране дисплея выводится сообщение о том, что следующее нажатие на клавишу "5" должно перевести устройство в исходное состояние. Так вот уже после того как пульт передал данные он должен был получить от аппарата данные об измеренном токе и код ошибки. Вот теперь программа как бы подвисает. Т.е. она перестает воспринимать клавиатуру. Если в этот момент запустить пошаговый анализ программа пульта ведет себя странно. Она только как бы прерывается и переходит на прием данных и это все повторяется с периодом в 41 мс. Т.е. программа как бы не возвращается в основной цикл. Даже если там я поставлю точку останова. Что ото может быть?
|
|
|
|
ADMIN |
Дата: Чт, 13.08.2015, 13:33 | Сообщение # 2 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Сделать, однако, стоит так: Dim RS as Bit Prer: Context Save RS = 1 INTCON.7 = 1 Context Restore Resume
Main: If RS=1 Then RS=0 GoSub RS232_in EndIf ------------------------------ -------------------------
|
|
|
|
vladh |
Дата: Чт, 13.08.2015, 13:46 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Цитата ADMIN ( ) Сделать, однако, стоит так: Максим, в Вашем варианте получается, ситуация при которой возникшее прерывание устанавливает только флаг RS, а сама обработка будет тогда когда программа наткнется в своем теле на этот флажок! Но тогда уже вероятно принимать будет нечего, передача данных уже закончится. И все равно это ничего не меняет.
Сообщение отредактировал
vladh - Чт, 13.08.2015, 13:49
|
|
|
|
ADMIN |
Дата: Чт, 13.08.2015, 16:24 | Сообщение # 4 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Ну, по крайней мере, в симуляторе, проц начинает на нажатия реагировать. Думаю, выход все-таки есть. Нужно подумать...
|
|
|
|
vladh |
Дата: Чт, 13.08.2015, 16:37 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Цитата ADMIN ( ) Ну, по крайней мере, в симуляторе, проц начинает на нажатия реагировать. Думаю, выход все-таки есть. Нужно подумать... Не вижу, чтобы появились изменения к лучшему. Наоборот если раньше первый МК успевал передать значение тока, то сейчас даже и этого нет. Может Вы что то другое поменяли. Пришлите Ваш вариант, пожалуйста.
|
|
|
|
ADMIN |
Дата: Чт, 13.08.2015, 16:44 | Сообщение # 6 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Вот сейчас вижу, что в U1 - переполнение стека после нажатия 5 для стопа.
|
|
|
|
vladh |
Дата: Чт, 13.08.2015, 16:48 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
В Вашем варианте даже U1 перестал принимать первоначальные данные.
|
|
|
|
ADMIN |
Дата: Чт, 13.08.2015, 17:27 | Сообщение # 8 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Так..., такой вариант не идет. Вернул первоначальный вариант. Но так, по идее, не делается. Я заметил, что после отправки команды Пуск(клавишей 5) аппарат (U1) начинает как раз с частотой 40 с чем то мС отправлять данные на U4, что, собственно и приводит к прерываниям с такой же частотой микроконтроллера U4. Может. стоит в этом направлении копнуть?
|
|
|
|
ADMIN |
Дата: Чт, 13.08.2015, 17:37 | Сообщение # 9 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Вот такой вариант.... Обратите внимание на бит First
|
|
|
|
vladh |
Дата: Пт, 14.08.2015, 10:01 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Сегодня все утро сравнивал и анализировал. Сделал для себя следующий вывод. Ваш вариант вроде как работает. Но дело в том, что МК U1 посылает посылку второму МК только один раз. Мне же надо, чтобы аппарат более менее регулярно отсылал значения тока и еще разных вещей регулярно. Я это предполагал делать 1 раз в секунду(в программе цикл гораздо меньше). А в этом случае компьютер не успевал просчитывать модель и программа зависала. Видимо это смоделировать не выйдет. Надо будет проверять в железе. На следующей неделе соберу и проверю. Максим, спасибо за участие.
|
|
|
|
ADMIN |
Дата: Пт, 14.08.2015, 12:13 | Сообщение # 11 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Да не за что! Посылать постоянно - запросто! Заведите таймер на 1 сек. В прерывании по таймеру ставьте флаг, что пора отправлять. При выходе из прерывания - при проверке флага отправляйте данные, сбрасывайте флаг и т.д. Отправка будет 1 раз в сек, более или менее равномерно. Это будет лучше, чем 1 раз в 42 мСек.
|
|
|
|
vladh |
Дата: Пт, 14.08.2015, 12:47 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Я и собирался использовать прерывания по таймеру, но здесь для простоты сделал такую задержку.
|
|
|
|
ADMIN |
Дата: Пт, 14.08.2015, 18:46 | Сообщение # 13 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Надеюсь, все получится. Что за аппарат, если не секрет?
|
|
|
|
vladh |
Дата: Сб, 15.08.2015, 08:39 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Секрет, но Вам я скажу. Аппарат для размагничивания различных конструкций .
|
|
|
|