Вольтметр на 874А
|
|
mikhail09p |
Дата: Вт, 10.12.2013, 13:22 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Здравствуйте,господа! Прошу совета. Нужно измерять мгновенное пиковое значение напряжения. Сделал по прерыванию INT. По осциллограмме, смотрю, всё нормально, считывает АЦП в нужный момент времени, а программа висит. Не выходит с прерывания. Что же она делает так долго? Или это Протеус барахлит?
Похоже, происходят прерывания ещё от чего-то... Не понимаю... Нет, всё-таки не происходит левых прерываний. И Протеус перепрыгивает во времени при пошаговой симуляции. Почему?..
Сообщение отредактировал
mikhail09p - Вт, 10.12.2013, 13:58
|
|
|
|
ADMIN |
Дата: Вт, 10.12.2013, 15:56 | Сообщение # 2 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Ну, во-первых, я бы не стал измерять прямо в прерывании, поставил бы флаг, вышел из прерывания, а только потом считал бы АЦП, поскольку преобразование длится достаточно долго. Во-вторых, при входе в пп обработки, я сначала сбрасываю бит GIE, а в конце, при выходе, устанавливаю.
|
|
|
|
xvovanx |
Дата: Вт, 10.12.2013, 18:08 | Сообщение # 3 |
Группа:
Модераторы
Ранг:
Помогаю всем
Сообщений:
328
Замечания:
±
На сайте с 02.05.2013
Статус:
Offline
|
Цитата ADMIN ( ) я бы не стал измерять прямо в прерывании +1. Тоже сталкивался с зависаниями и некорректными замерами. Теперь в прерываниях только тактую, а все замеры и расчеты формул в теле программ
|
|
|
|
mikhail09p |
Дата: Вт, 10.12.2013, 18:52 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Цитата ADMIN ( ) я бы не стал измерять прямо в прерывании, поставил бы флаг, вышел из прерывания, а только потом считал бы АЦП Тогда подскажите, пожалуйста, как в теле программы при условии установленного флага немедленно произвести измерение. Или можно выйти из прерывания в указанное место - как дикая идея...
|
|
|
|
brown |
Дата: Вт, 10.12.2013, 21:02 | Сообщение # 5 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
333
Замечания:
±
На сайте с 18.09.2007
Статус:
Offline
|
У меня в теле прерывания по INT измеряло 50 раз через 200 мкс, вычисления производились конечно вне прерывания - все работало. Посмотрю вложение - может замечу ошибку.
Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
|
|
|
|
xvovanx |
Дата: Вт, 10.12.2013, 23:02 | Сообщение # 6 |
Группа:
Модераторы
Ранг:
Помогаю всем
Сообщений:
328
Замечания:
±
На сайте с 02.05.2013
Статус:
Offline
|
Цитата mikhail09p ( ) Тогда подскажите, пожалуйста, как в теле программы при условии установленного флага немедленно произвести измерение. Я делаю так- в прерываниях TMR1 работает счетчик, скажем sec=sec+1. А в теле программы идет проверка if sec_proverka<>sec then переход на ADC замер и запись в sec_proverka=sec значения счетчика и переход на начало.
|
|
|
|
mikhail09p |
Дата: Вт, 10.12.2013, 23:51 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Это всё понятно. Получилось так. Во вложении. Но посмотрите, как гуляет время считывания АЦП! +- 0.5 милисек. минимум. И это ещё нету основной программы... Почему не работает в прерывании? И я не понял о большом времени преобразования?.. По даташиту максимум 500 микросек. полный цикл. А прерывание через 5 милисек.
|
|
|
|
anatol |
Дата: Ср, 11.12.2013, 01:48 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
Михаил. Я не буду приводить все. У меня почему то протон не жует букву "я" - перековеркал твою прогу. Цитата If TMR1IF = 1 Then TMR1ON = 0 Flag_ADin = 1 TMR1IF = 0 TMR1ON = 0 INTF = 0 Disable
.......
If Flag_ADin = 1 Then PORTB.7 = 0 U = ADIn 0 Ux = Ux + U Flag_ADin = 0 INTE = 1 Enable
Смысл простой - покуда не получу результат преобразования торпедирую прерывания.
Сообщение отредактировал
anatol - Ср, 11.12.2013, 01:51
|
|
|
|
ADMIN |
Дата: Ср, 11.12.2013, 03:43 | Сообщение # 9 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Цитата mikhail09p ( ) Но посмотрите, как гуляет время считывания АЦП! +- 0.5 милисек. минимум. И это ещё нету основной программы... Почему не работает в прерывании? И я не понял о большом времени преобразования?.. По даташиту максимум 500 микросек. полный цикл. А прерывание через 5 милисек. А что насчет этого проекта? Посмотрел сейчас, там исходников почему-то нет. Как там реализовано?
|
|
|
|
mikhail09p |
Дата: Ср, 11.12.2013, 21:54 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
anatol, не совсем понял. ADMIN, там всё проще, измерение в теле программы. Посмотрел, вроде есть исходники. Вот ещё раз, выложите тут на сайте.Добавлено (11.12.2013, 21:54) ---------------------------------------------
Цитата brown ( ) У меня в теле прерывания по INT измеряло 50 раз через 200 мкс, вычисления производились конечно вне прерывания - все работало. Если не сложно - покажите, пожалуйста, код, а то уже который день бьюсь и пока без толку..
|
|
|
|
anatol |
Дата: Ср, 11.12.2013, 23:53 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
Я просто изменил ваши условия. По срабатыванию прерывания по порту В.0 и прерывания отсчета полпериода, просто запрещаю прерывания и разрешаю их по сформированному результату АЦП. Исключая перезапуски модуля АЦП во время работы по прерыванию. Лень разбираться, но вы не указали откуда тактируется АЦП. По умолчанию как бы не РС-внутренний, что не совсем правильно.
|
|
|
|
mikhail09p |
Дата: Чт, 12.12.2013, 00:08 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Так я тоже пробовал. Также не работает.
|
|
|
|
anatol |
Дата: Чт, 12.12.2013, 01:40 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
Михаил. Перенеси управление портом в прерывание (выделил жирным) Цитата Context Save If INTF = 1 Then OPTION_REG = %11000111 TMR1L = $00 ' Значение младшего регистра TMR1 TMR1H = $80 ' Значение старшего регистра TMR1 TMR1CS = 0 TMR1ON = 1 INTE = 0 PORTB.7 = 1 INTF = 0 EndIf
If TMR1IF = 1 Then PORTB.7 = 0 TMR1ON = 0 Flag_ADin = 1 TMR1IF = 0 INTF = 0 EndIf
Context Restore В связи с первой и последней командой вы всегда возвращаетесь в произвольную точку программы. Отсюда и дерганье. Более того необходимо сразу стартовать АЦП и из нее восстановить регистры. (т.е. Context Restore ). А именно ввести перенаправление вместо Flag_ADin = 1
Сообщение отредактировал
anatol - Чт, 12.12.2013, 01:42
|
|
|
|
brown |
Дата: Чт, 12.12.2013, 02:07 | Сообщение # 14 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
333
Замечания:
±
На сайте с 18.09.2007
Статус:
Offline
|
У меня несколько другая задача стояла и другой метод, поэтому использовал пик18. От такого метода измерения напряжения, как у вас отказался, не помню по какой причине. Посмотрите мой демо-код, может чем-то поможет
Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
|
|
|
|
mikhail09p |
Дата: Чт, 12.12.2013, 12:30 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Цитата anatol ( ) Перенеси управление портом в прерывание Так это ведь служебная информация именно для того, чтобы видеть, где что происходит!
Цитата anatol ( ) Более того необходимо сразу стартовать АЦП и из нее восстановить регистры Как ? brown, спасибо!
Сообщение отредактировал
mikhail09p - Чт, 12.12.2013, 12:32
|
|
|
|