Страница 1 из 2

Несколько операций одновременно

Добавлено: Вт янв 13, 2009 22:49:45
kvark85
Здравствуйте. Проблема такая.Диммер с ИК пультом. Управляющий элемент - симистор. Микроконтролер отслеживает переход ~220 через 0 и в каждый полупериод открывает симистор. 100 раз в сеукнду. для этого задействовано прерывания INT0 (по нему определяем переход через 0) и прерывание по таймеру-счетчику1 (2 прерывания: первое по компаратору для открытия в положительной полуволне ~220, и по переполнению для открытия в отрицательной полуволне).

ИК датчик припаян на INT1. я отдельно написал программу для регулирования яркостью. она отлажена и работает. потом написал программу которая запоминает и в последующем распознает команду с пульта.

А вместе програмы соединить не получается. вся посылка ик пульта это приблизительно 67 милисекунд. За это время проходит 3 периода сетевого напряжения. если я брошу следить за перепадом сетевого напряжения и буду принимать команду с ик пульта лампочка потухнет. а если эта не нужная мне кнопка на пульте нажата - уже моргает лампочка. я бы бросил уже думать, уже думал 2 микроконтролера в схеме делать. но ведь аналогичные схемы другим удается сделать на 1 мк. значит есть выход, только не могу дойти до него. что можно сделать?

Добавлено: Вт янв 13, 2009 23:57:06
NiTr0
1) Зачем таймер? Почему бы не детектить переход через 0 на выходе диодного моста?
2) Почему бы задержку включения не реализовать таймером (типа перевалило через 0, запускается таймер, который через столько-то мсек поднимет нужный пин в "1"), а обработку BR ltkfnm d бесконечном цикле? Ресурсов на прерывания уйдет мизер...

Добавлено: Ср янв 14, 2009 01:23:47
kvark85
диоды я не стал использовать так как мне лишние элементы в схеме не нужны. а делаю я так как вы описали в пункте 2. весь опрос, тоесть вся обработка команды у меня помещается в прерывании по INT1, в основной цикл ничего помещать не надо. так вот. собственно, происходит прерывание по, либо по INT0, либо по переполнению таймера, либо по компаратору таймера, а в этот момент в команде сменилось значение бита посылки. все - команда принята неправильно. и такая ошибка полюбому происходит так как полупериод сетевого напряжения 0,01 с а команда 0,067 с. тоесть прерывания которые обеспечивают горения лампочки полюбому помешают приему команды. вот ломаю сейчас голову. толи в обработку прерываний обеспечивающих свечение чтото добавлять коректирующее код, толи незнаю пока что делать.

Добавлено: Ср янв 14, 2009 01:37:05
NiTr0
Задействовать еще 1 таймер, который и будет выполнять роль задержки - пускаться/инициализироваться по переходу через 0, по переполнению - останавливаться и включать тиристор.
Задержка в 10-15 тактов на обработку данных прерываний ИМХО не скажется на приеме ИК.

Re: Несколько операций одновременно

Добавлено: Ср янв 14, 2009 09:14:24
Neekeetos
kvark85 писал(а): А вместе програмы соединить не получается. вся посылка ик пульта это приблизительно 67 милисекунд. За это время проходит 3 периода сетевого напряжения. если я брошу следить за перепадом сетевого напряжения и буду принимать команду с ик пульта лампочка потухнет. а если эта не нужная мне кнопка на пульте нажата - уже моргает лампочка. я бы бросил уже думать, уже думал 2 микроконтролера в схеме делать. но ведь аналогичные схемы другим удается сделать на 1 мк. значит есть выход, только не могу дойти до него. что можно сделать?
Сделай шим на 16бит таймере, выход шима на тиристор. В таком случае тебе не придется следить за переходом через ноль, лишь иногда привязывать таймер к этому переходу. Соотв. освободится масса времени на пульт, фактически ик приемник не будет работать только во время периодической калибровки.

Добавлено: Ср янв 14, 2009 22:07:59
Aheir
kvark85 писал(а):...тоесть вся обработка команды у меня помещается в прерывании по INT1, в основной цикл ничего помещать не надо...
По-моему, нужно делать наоборот. В прерывании только выставлять флаг того, что событие произошло, а обрабатываеть его именно в основном цикле.

Добавлено: Чт янв 15, 2009 00:47:15
kvark85
Neekeetos, шимом управлять симистором нельзя, или что вы имеете в виду?

у меня нудьт не RS5. вначале посылки стартовый импульс определенной длинны. и через некоторое время посылка. импулься с периодом 2.24 мс я считаю за "1", а импульсы с периодом 1.15 считаю "0". я непонимаю что вы имеете в виду. ниже прикрепил график по которому управляется симистор и по код посылки на фоне него. можете как то показать принцип который вы предлагаете на данном графике?

и еще добавлю, что в основном теле програмы, в maind, програма опроса сенсорной кнопки. но на время приема посылки буду выключать.

Aheir, в основном цикле присудствуют задержки. если в прерывании просто выставлять флаг. то точного приема команды не получится. понятно обьяснил? может выходить из прерывания через goto? и вручную однудять влаги прерывания и разрещшать прерывания глобально после этого? проблематично конечно. но реально?

Добавлено: Чт янв 15, 2009 01:09:25
NiTr0
kvark85 писал(а):Neekeetos, шимом управлять симистором нельзя, или что вы имеете в виду?
Можно. Если частота ШИМ = удвоенной частоте сети, и 0 ШИМ синхронизирован с переходом через 0 сети.
kvark85 писал(а):может выходить из прерывания через goto? и вручную однудять влаги прерывания и разрещшать прерывания глобально после этого? проблематично конечно. но реально?
Это называется "через ж... рвать гланды".

Не нужно делать задержки в прерываниях - задержки можно реализовать таймерами. Аппаратно (ШИМ) или программно-аппаратно (через N тиков таймера или N прерываний от него менять бит порта) - не важно.

Добавлено: Чт янв 15, 2009 01:19:39
kvark85
NiTr0, у меня задержек в прерываниях нет... а, есть две. они нужны потому что. чтоб импульс на входе симистора немного подержать чтоб он открылся, 10мксек всего. работе не мешают.

я имел в виду что в maind функции есть задержки и вот они то ббудут мешать приему команды если вв прерываниях использовать только флаги, а в главной в-ции обработку.

сейчас пытаюсь представить как должна выглядеть шим модуляция для нормального управления симистором... чтото в этом есть. NiTr0, пробовал на практике управлять симистором при помощт шим или это в теории?

Добавлено: Чт янв 15, 2009 01:29:56
NiTr0
kvark85 писал(а):NiTr0, у меня задержек в прерываниях нет... а, есть две. они нужны потому что. чтоб импульс на входе симистора немного подержать чтоб он открылся, 10мксек всего. работе не мешают.

я имел в виду что в maind функции есть задержки и вот они то ббудут мешать приему команды если вв прерываниях использовать только флаги, а в главной в-ции обработку.
Если в прерываниях нет задержек - откуда тогда сбои при приеме возьмутся?
kvark85 писал(а):сейчас пытаюсь представить как должна выглядеть шим модуляция для нормального управления симистором... чтото в этом есть. NiTr0, пробовал на практике управлять симистором при помощт шим или это в теории?
Нет, не пробовал. Но ИМХО проблемы из этого не возникнет - разве что на выходе ШИМ нужно будет поставить дифференциирующую цепочку - иначе на УЭ симистора будет до окончания полупериода подаваться единица, а при небольшом уходе частоты - возможно, что симистор откроется в начале периода, что не есть хорошо...

Добавлено: Чт янв 15, 2009 01:41:24
kvark85
ну если в шиме будет сигнал с пиком в 20 мкс и промежутками между пиками - 0.01с. то работать должно четко и без дополнений в схеме, без цепочки этой. а фазой шима тогда менять мощность. правильно я понимаю? только еще не совсем понимаю как менять эту фазу, тобишь отставание от перехода через 0.

Добавлено: Чт янв 15, 2009 12:22:54
Neekeetos
kvark85 писал(а):ну если в шиме будет сигнал с пиком в 20 мкс и промежутками между пиками - 0.01с. то работать должно четко и без дополнений в схеме, без цепочки этой. а фазой шима тогда менять мощность. правильно я понимаю? только еще не совсем понимаю как менять эту фазу, тобишь отставание от перехода через 0.
Есть два варианта насколько я понял, один это менять скважность шима, тогда тиристор будет открываться фронтом шим (если сделать инверсный выход). А второй вариант это как ты сказал - скважность сделать постоянной и видимо небольшой (чтобы импульс был достаточным для отпирания), и менять начальную фазу шима. Теперь как привязывать фазу - надо иногда разрешать прерывания по переходу нуля, внутри прерывания просто задавать значение счетчика таймера(который делает шим) . Для первого случая это значение будет в районе нуля и постоянно - чуть больше за счет задержки прерывания. Для второго случая значение будет зависеть от задержки включения которую ты хочеш получить.

Добавлено: Чт янв 15, 2009 23:09:19
Aheir
kvark85 писал(а):
я имел в виду что в maind функции есть задержки и вот они то ббудут мешать приему команды если вв прерываниях использовать только флаги, а в главной в-ции обработку.
Это, конечно, зависит от того, как реализован прием ИК-посылок, но поскольку обычно оно делается на внешнем перывании и таймере, задержки в main ему пофиг, нет?

Добавлено: Пт янв 16, 2009 17:45:45
chief
сколько времени выполняется прерывание INT0? может его просто разрешить запускать из INT1? Тогда оно будет выполнятся даже во время приема сигнала.

Добавлено: Пт янв 16, 2009 21:15:28
Neekeetos
chief писал(а):сколько времени выполняется прерывание INT0? может его просто разрешить запускать из INT1? Тогда оно будет выполнятся даже во время приема сигнала.
Вложенные прерывания в АВР? можно но имхо не нужно такое советовать, не больно стандартный подход :shock:

Добавлено: Пт янв 16, 2009 21:18:48
chief
а в чем собственно проблема если прерывание выполняется короткое время то можно на пару микросекунд выскочить в другое прерывание

Добавлено: Сб янв 17, 2009 22:51:54
Neekeetos
chief писал(а):а в чем собственно проблема если прерывание выполняется короткое время то можно на пару микросекунд выскочить в другое прерывание
Я и не писал что в этом есть проблема, я написал что это нестандартный подход и он лично мне не нравится по двум причинам

причина номер 1 - в программе придется учесть все детали создания вложеных прерываний на системе без поддержки таковых, это не сложно достаточно сохранять переменные, статусный регистр и следить за флагом разрешения прерываний который меняется в том числе некоторыми командами вроде reti. Имхо если бы автор этой темы знал как это сделать то темы бы не было :) кроме того судя по описанию он не в прерывании работает с ИК приемом поэтому и вложеные прерывания как бы не к месту

причина номер 2 - я обычно перед тем как писать какую либо прошивку сначала думаю как бы это удачнее реализовать чтобы уменьшить затраты процессорного времени и вцелом алгоритм поэффективнее применить, а вариант когда "делаю как придется" а потом мужественно писать вложенные прерывания на АВР и обходить прочий геморой бессмысленных изначально алгоритмов это не по мне, почему я и посоветовал поменять прерывания и использовать таймер - это освобождает кучу ресурсов и возможно сделает железку рабочей, идея автора то явно хорошая!

Добавлено: Вс янв 18, 2009 01:53:04
kvark85
Neekeetos писал(а): кроме того судя по описанию он не в прерывании работает с ИК приемом поэтому и вложеные прерывания как бы не к месту
я в прерывании обрабатываю ИК сигнал. У меня все сделано в прерываниях. лампочка с заданой яркостью будет гореть даже если в maind вобще ничего вписано не будет. и ИК команда принимается и помещается в масив у меня в прерывании. а в maind только функция опроса сенсорной кнопки.

я действительно ничего не знал о вложеных прерываниях. буду пробовать разобраться как их реализовать. еще несовсем пойму что такое приоритет прерываний. это мое первое устройство и первые попытки програмирования. не думал что таким заумным включатель света получится.

и когда я делал программу сенсорной кнопки я понятия не имел как я буду принимать ИК команду, решил по ходу разбираться. так что до создания програмки продумать как будет лучше я не то что не мог, я даже одного варианта продумать не смог. и вот делаю.

Добавлено: Вс янв 18, 2009 01:59:13
NiTr0
kvark85 писал(а):я в прерывании обрабатываю ИК сигнал. У меня все сделано в прерываниях.
Зачем ресурсоемкие задачи полностью запихивать в прерывания?
Если хочется обрабатывать в прерывании ИК - тогда уже по каждому фронту читать показания какого-либо таймера, и вычислять таким образом время между импульсами... Или еще каким-то сходным образом извращаться...

Добавлено: Вс янв 18, 2009 02:31:07
kvark85
NiTr0 писал(а): Зачем ресурсоемкие задачи полностью запихивать в прерывания?
Если хочется обрабатывать в прерывании ИК - тогда уже по каждому фронту читать показания какого-либо таймера, и вычислять таким образом время между импульсами... Или еще каким-то сходным образом извращаться...
я так и делаю только я считаю время только по спаду. и получаю периоды всех сигналов. период старт импулься, период 0 и период1.

а чем черевато обрабатывание ресурсоемких задач в прерывании? частота аж 4 Мгц. полупериод сетевого напряжения - 0.01с. я прикинул что таже ооочнь большое прерывание будет успешно обрабатываться. и еще время для опроса сансорной кнопки полюбому остается. или слева млм справа от прерывания.