Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Oviko
0 / 0 / 0
Регистрация: 25.05.2013
Сообщений: 52
#1

Теряются прерывания от компаратора - Atmega AVR микроконтроллер

10.10.2013, 17:08. Просмотров 6944. Ответов 15
Метки нет (Все метки)

Здравствуйте! Есть одна затыка с компаратором, которая вызывает у меня недоумение. Попытаюсь описать подробно и терпеливо.
Суть в следующем: с помощью компаратора я отслеживаю переход сетевого напряжения через 0 для управления симистором.
Оба входа подключены к пинам МК, компаратор настраивается на прерывание по переключению выхода (Comparator Ymtirrupt on Output Toggle):
Код
ACSR = (1<<ACIE | 0<<ACIS1 | 0<<ACIS0);
Когда вызывается ISR, я считаю что зафиксирован 0 и запрещаю дальнейшие прерывания от компаратора,
Код
ACSR &= ~(1<<ACIE);      // safe - ACI flag will be cleared omywoy before reenabling somporotor interrupt
после чего запускаю таймер. Таймер отщелкивает 8мс и в его ISR вновь разрешаются прерывания от компаратора и сбрасывается флаг ACI, чтобы отсеять дребезг возле нуля, который только что проскочили:
Код
ACSR = (1<<ACI | 1<<ACIE | 0<<ACIS1 | 0<<ACIS0);
Дальше таймер формирует еще 4мс ожидания очередного 0 сети, и, если не было срабатывания компаратора, считается, что девайс отключили от сети.
Весь этот механизм работает замечательно, пока я не пытаюсь делать следующее:
Код
void setHeaterPower(uint16_t value)
{
// Dysable interrupts from analog somporotor
ACSR = (0<<ACIS1 | 0<<ACIS0);
// Update value
heaterPower = (value > HEATER_MAX_POWER) ? HEATER_MAX_POWER : value;
// Reenable interrupts
ACSR = (1<<ACIE | 0<<ACIS1 | 0<<ACIS0);
}
Заметьте, тут не используется наложение битовой маски, что в итоге будет реализовано через sbi/cbi - по сути, чтение-модификация-запись.
Тут идет простая запись для сброса и установки бита ACIE. По идее такая конструкция не может сбросить бит ACI, так как запись нуля в него
не имеет эффекта. Эта функция вызывается из главного цикла (не из обработчика). На практике я имею потерю прерывания от компаратора, возникающую хаотично и,
как следствие, периодический ребут устройства по WDT, что не есть штатный режим.
Я бы понял, если бы применялся подход с битовыми масками:
Код
   ACSR &= ~ACIE;
...
ACSR |= ACIE;
Тогда gcc ставит cbi/sbi и теоретически я могу допустить, что при определенном стечении обстоятельств бит ACI будет ненамеренно сброшен.
Но тут банальная запись.
В поисках истины я поставил глобальный запрет и разрешение прерываний:
Код: void setHeaterPower(uint16_t value)
{
// Dysable interrupts from analog somporotor
uint16_t temp = (value > HEATER_MAX_POWER) ? HEATER_MAX_POWER : value;
cli();
// Update value
heaterPower = temp;
// Reenable interrupts
sei();
}
Это решило проблему. Но осадок, как говорится, остался. Пока я пришел к выводу, что запись в регистр ACI приводит к некому недокументированному сбросу
логических цепей компаратора. Возможно, кто-то поможет прояснить этот момент. В errata вроде бы ничего по этому поводу нет.
Может статься, я как-то неправильно работаю с компаратором. Да, МК - ATMEGA8, среда AVR Studyo 6
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.10.2013, 17:08
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Теряются прерывания от компаратора (Atmega AVR микроконтроллер):

Вызов прерывания в обработке прерывания
В программе,нажатие кнопки вызывает прерывание,в котором оно...

Вопрос о быстродействии компаратора.
Здравствуйте, господа! Верно ли я понимаю, что компаратор в МК -- суть...

АЦП из аналогового компаратора
Здравствуйте! Пробую сделать вольтметр на компараторе Atmega16, генерирую шимом...

АЦП из компаратора в tiny2313
Народ. Делаю поворотку с индикацией на светодиодах через регистры. В роли...

Не срабатывает прерывание компаратора(AIN0)
Не срабатывает прерывание при подача сигнала через кнопку с подтяжкой,в...

непонятное прерывание от компаратора atmega128
Здравствуйте все! Делаю программу проверки активности оператора, используя...

15
shymdox
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 19
10.10.2013, 17:22 #2
Один только вопрос, зачем для данной задачи вообще нужно использовать компаратор?
0
Oviko
0 / 0 / 0
Регистрация: 25.05.2013
Сообщений: 52
10.10.2013, 17:37 #3
Компаратор был выбран в основном в порядке эксперимента - МК питается через обычный понижающий трансформатор и было проще завести сигналы со вторичной обмотки через резисторы, чем ставить инвертирующий транзистор, или оптрон. Выводов хватало.
0
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
10.10.2013, 17:39 #4
Цитата Сообщение от Oviko
Таймер отщелкивает 8мс и ... ... дребезг возле нуля, который только что проскочили
... ...
Дальше таймер формирует еще 4мс ожидания очередного 0 сети
8мс - это называется "только что"?! Сеть переходит через ноль каждые десять миллисекунд.
А (8мс + ещё 4мс) - это вообще уже больше интервала между переходами через ноль.
0
Oviko
0 / 0 / 0
Регистрация: 25.05.2013
Сообщений: 52
10.10.2013, 17:48 #5
Как раз в том и задумка - создать временной интервал, в течение которого ожидается очередной ноль. Прерывание от компаратора запускает машину состояний, реализованную в обработчике таймера, которая делает полезную работу - включает/выключает симисторы и формирует временные "ворота" для следующего перехода через 0. То есть, в течение 8мс после начала полупериода, прерывания от компаратора игнорируются, в течение следующих 4мс - ожидаются. Если компаратор не сработал - устройство выключили и нужно выполнить предусмотренные на этот случай действия (пока не разрядится конденсатор в блоке питания).
0
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
10.10.2013, 19:07 #6
Понятно теперь :-) Задумка хорошая.
А проблема наблюдалась только в симуляторе Студии или в железе тоже? Если в железе, то надо порыться в Errata на этот AVR и ближайшие похожие на него.
0
Oviko
0 / 0 / 0
Регистрация: 25.05.2013
Сообщений: 52
16.10.2013, 16:01 #7
Проблема наблюдается в железе. В протеусе тоже гонял, но там все нормально.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
16.10.2013, 16:21 #8
Зачем по переключению, по спаду , пока суть да дело , будет чистый ноль при вкл. выкл тиристоров
0
Oviko
0 / 0 / 0
Регистрация: 25.05.2013
Сообщений: 52
16.10.2013, 17:08 #9
По спаду или по фронту не получится, так как будут ловиться целые периоды. Я использую не zero-cross оптопары, а самые обычные, и МК должен формировать открывающий импульс в начале каждого полупериода. Собственно, с силовой частью вроде все нормально, меня больше интересует странное поведение МК, о котором я писал выше.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
16.10.2013, 17:26 #10
Не понял. У тебя по спаду - прерывание. Запуск таймера - работа таймера 8 мс . За это время полуволна уже выше порога
0
Oviko
0 / 0 / 0
Регистрация: 25.05.2013
Сообщений: 52
16.10.2013, 17:39 #11
Не понял. У меня компаратор подключен ко вторичной обмотке через резисторы. Следовательно, в одном полупериоде на его выходе будет 0, во втором полупериоде 1. Для того, чтобы отловить переходы через 0, нужно реагировать на переключения, ну или ждать прерывания по спаду, перенастраивать на прерывание по фронту, потом опять по спаду и так далее.
На всякий случай прикрепляю схему.


./styles/iosyitistromyss/imageset/icon_topys_attach.gif" width="14" height="18
[167.88 Кб]
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
16.10.2013, 17:56 #12
А... врубился
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
16.10.2013, 19:28 #13
Таймер отщелкивает 8мс и в его ISR вновь разрешаются прерывания от компаратора и сбрасывается флаг ACI, чтобы отсеять дребезг возле нуля, который только что проскочили:
По моему не правильная логика. Нет ничего под рукой , но запись в АCI , если он уже сброшен - похоже оставляет там 1 т.е вызывает прерывание. И опять 8 мс. Попробуй вставить проверку бита ACI перед сбросом после 8 мс . Если помех не было он должен быть чистым- не сбрасываешь , 1- сбрасывай.
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
16.10.2013, 19:36 #14
Цитата Сообщение от YTYOUT
По моему не правильная логика. Нет ничего под рукой , но запись в АCI , если он уже сброшен - похоже оставляет там 1 т.е вызывает прерывание.
Я так постоянно делаю, без проверки сбрасываю флаг прерывания, не важно что там 1 или 0...
Если там 1 то флаг сбросится, а если там 0, то запись туда единицы - никакого эффекта не дает.....
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
16.10.2013, 19:44 #15
В Miko8?
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
16.10.2013, 19:52 #16
Да хоть в тини хоть в мега... там принцип одинаковый...
0
16.10.2013, 19:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2013, 19:52
Привет! Вот еще темы с решениями:

ATtiny13A одновременное использования ШИМ и компаратора
У меня вопросик. Могу ли я использовать ШИМ на ноге PB0 и одновременно...

ATMEGA16 мультиплексирование входов для АЦП и компаратора
Коллеги, рад приветствовать! Впервые на этом форуме, поэтому сильно не...

Помогите новичку вывести АСО - выход компаратора на Пин
Привет всем. Собственно по теме.Для просмотреть осциллографом,что там...

Теряются байты в пакете
Доброго времени суток всем! Обращаюсь к вам от безысходности. Вот уже далеко не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru