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

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: demanik, ivan_fd  
Вольтметр на 874А
mikhail09p Дата: Вт, 10.12.2013, 13:22  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 481
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Здравствуйте,господа!
Прошу совета.
Нужно измерять мгновенное пиковое значение напряжения. Сделал по прерыванию INT. По осциллограмме, смотрю, всё нормально, считывает АЦП в нужный момент времени, а программа висит. Не выходит с прерывания. Что же она делает так долго? Или это Протеус барахлит?

Похоже, происходят прерывания ещё от чего-то... Не понимаю...
Нет, всё-таки не происходит левых прерываний. И Протеус перепрыгивает во времени при пошаговой симуляции. Почему?..
Прикрепления: Volt_Amper_874A.rar (64.4 Kb)

Сообщение отредактировал mikhail09p - Вт, 10.12.2013, 13:58
ЯНДЕКС Дата: 10.12.2013
ADMIN Дата: Вт, 10.12.2013, 15:56  |                                                                                                                Сообщение # 2
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Ну, во-первых, я бы не стал измерять прямо в прерывании, поставил бы флаг, вышел из прерывания, а только потом считал бы АЦП, поскольку преобразование длится достаточно долго. Во-вторых, при входе в пп обработки, я сначала сбрасываю бит GIE, а в конце, при выходе, устанавливаю.
xvovanx Дата: Вт, 10.12.2013, 18:08  |                                                                                                                Сообщение # 3
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 328
Репутация: 59   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

Цитата ADMIN ()
я бы не стал измерять прямо в прерывании

+1. Тоже сталкивался с зависаниями и некорректными замерами. Теперь в прерываниях только тактую, а все замеры и расчеты формул в теле программ
mikhail09p Дата: Вт, 10.12.2013, 18:52  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 481
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Цитата ADMIN ()
я бы не стал измерять прямо в прерывании, поставил бы флаг, вышел из прерывания, а только потом считал бы АЦП
Тогда подскажите, пожалуйста, как в теле программы при условии установленного флага немедленно произвести измерение. Или можно выйти из прерывания в указанное место - как дикая идея...
brown Дата: Вт, 10.12.2013, 21:02  |                                                                                                                Сообщение # 5
Группа: Пользователи
Ранг:  Помогаю всем
Сообщений: 333
Репутация: 12   ±
Замечания:   ±
На сайте с 18.09.2007

Статус: Offline

У меня в теле прерывания по INT измеряло 50 раз через 200 мкс, вычисления производились конечно вне прерывания - все работало.
Посмотрю вложение - может замечу ошибку.


Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
xvovanx Дата: Вт, 10.12.2013, 23:02  |                                                                                                                Сообщение # 6
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 328
Репутация: 59   ±
Замечания:   ±
На сайте с 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
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Это всё понятно.
Получилось так. Во вложении.
Но посмотрите, как гуляет время считывания АЦП! +- 0.5 милисек. минимум. И это ещё нету основной программы...
Почему не работает в прерывании? И я не понял о большом времени преобразования?.. По даташиту максимум 500 микросек. полный цикл. А прерывание через 5 милисек.
Прикрепления: Volt_Amper_874A.rar (67.1 Kb)
anatol Дата: Ср, 11.12.2013, 01:48  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 471
Репутация: 32   ±
Замечания:   ±
На сайте с 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
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Цитата mikhail09p ()
Но посмотрите, как гуляет время считывания АЦП! +- 0.5 милисек. минимум. И это ещё нету основной программы... Почему не работает в прерывании? И я не понял о большом времени преобразования?.. По даташиту максимум 500 микросек. полный цикл. А прерывание через 5 милисек.
А что насчет этого проекта? Посмотрел сейчас, там исходников почему-то нет. Как там реализовано?
mikhail09p Дата: Ср, 11.12.2013, 21:54  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 481
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

anatol, не совсем понял.
ADMIN, там всё проще, измерение в теле программы. Посмотрел, вроде есть исходники. Вот ещё раз, выложите тут на сайте.

Добавлено (11.12.2013, 21:54)
---------------------------------------------

Цитата brown ()
У меня в теле прерывания по INT измеряло 50 раз через 200 мкс, вычисления производились конечно вне прерывания - все работало.
Если не сложно - покажите, пожалуйста, код, а то уже который день бьюсь и пока без толку..
Прикрепления: _676_doma.rar (118.0 Kb)
anatol Дата: Ср, 11.12.2013, 23:53  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 471
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

Я просто изменил ваши условия.
По срабатыванию прерывания по порту В.0 и прерывания отсчета полпериода,  просто запрещаю прерывания и разрешаю их по сформированному результату АЦП. Исключая перезапуски модуля АЦП во время работы по прерыванию. Лень разбираться, но вы не указали откуда тактируется АЦП. По умолчанию как бы не РС-внутренний, что не совсем правильно.
ЯНДЕКС Дата: 11.12.2013
mikhail09p Дата: Чт, 12.12.2013, 00:08  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 481
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Так я тоже пробовал. Также не работает.
anatol Дата: Чт, 12.12.2013, 01:40  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 471
Репутация: 32   ±
Замечания:   ±
На сайте с 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
Репутация: 12   ±
Замечания:   ±
На сайте с 18.09.2007

Статус: Offline

У меня несколько другая задача стояла и другой метод, поэтому использовал пик18. От такого метода измерения напряжения, как у вас отказался, не помню по какой причине. Посмотрите мой демо-код, может чем-то поможет
Прикрепления: Demo_RMS.rar (24.2 Kb)


Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
mikhail09p Дата: Чт, 12.12.2013, 12:30  |                                                                                                                Сообщение # 15
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 481
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Цитата anatol ()
Перенеси управление портом в прерывание
Так это ведь служебная информация именно для того, чтобы видеть, где что происходит!

Цитата anatol ()
Более того необходимо сразу стартовать АЦП и из нее восстановить регистры
Как ?
brown, спасибо!

Сообщение отредактировал mikhail09p - Чт, 12.12.2013, 12:32
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: