Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
13.01.2009, 23:46
|
|
Прописка
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Несколько операций одновременно
Здравствуйте. Проблема такая.Диммер с ИК пультом. Управляющий элемент - симистор. Микроконтролер отслеживает переход ~220 через 0 и в каждый полупериод открывает симистор. 100 раз в сеукнду. для этого задействовано прерывания INT0 (по нему определяем переход через 0) и прерывание по таймеру-счетчику1 (2 прерывания: первое по компаратору для открытия в положительной полуволне ~220, и по переполнению для открытия в отрицательной полуволне).
ИК датчик припаян на INT1. я отдельно написал программу для регулирования яркостью. она отлажена и работает. потом написал программу которая запоминает и в последующем распознает команду с пульта.
А вместе програмы соединить не получается. вся посылка ик пульта это приблизительно 67 милисекунд. За это время проходит 3 периода сетевого напряжения. если я брошу следить за перепадом сетевого напряжения и буду принимать команду с ик пульта лампочка потухнет. а если эта не нужная мне кнопка на пульте нажата - уже моргает лампочка. я бы бросил уже думать, уже думал 2 микроконтролера в схеме делать. но ведь аналогичные схемы другим удается сделать на 1 мк. значит есть выход, только не могу дойти до него. что можно сделать?
-- Прилагается рисунок: --
|
|
|
|
14.01.2009, 00:34
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Работой в прерываниях добиваются "одновременности" выполнения нескольких процессов.
Кстати оба полупериода по INT можно отвлеживать - просто переключая от чего он срабатывает.
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
14.01.2009, 00:39
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Такая проблема возникает достаточно часто - в этом случае обычно запускают таймер, которым делят процессорное время на задачи - в основном цикле по флагам и состоянию таймера определяют, какую задачу именно сейчас нужно выполнять - и ее реализуют.
при этом сбрасыывают флаг задачи. установленный в прерывании.
время в прерывании используют только для анализа и установки флага задачи - и ни на что более - само прерывание должно быть как более коротким - ни в коем случае не приближаться к времени выпонения задачи в основном цикле.
Как-то путано рассказал..
|
|
|
|
14.01.2009, 00:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Добавлю что повышение тактовой частоты иногда помагает.
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
14.01.2009, 01:22
|
|
Прописка
Регистрация: 27.05.2005
Сообщений: 127
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 2 сообщении(ях)
|
По моему всю задачу можно решить чисто программно.
urry пытался объяснить как работает операционная система)
Что типа этого и нужно сделать.
Хватит одного единственного таймера.
Забывем про остальные прерывания.
Создаем одно прерывание по таймеру. "Квант времени" например 1 ms.
Внутри прерывания проверяем состояния входов контроллера и накапливаем данные, либо формируем очередь на передачу. Смысл в том что наш код должен должен выполняться меньше по времени чем 1 мс. То есть,например, за 1 секунду мы 1000 раз попадем в прерывание и каждый 10ый раз будем открывать симистор.
то же самое для ИК приемника. квант времени у нас известен. соответственно собираем команду от пульта
|
|
|
|
14.01.2009, 01:50
|
|
Прописка
Регистрация: 31.08.2008
Сообщений: 183
Сказал спасибо: 25
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
deCoder, я не понял сути. у меня команда длится 67,2 ms. тоесть квант времени должен быть больше 67,2 ms?
а это невозможно так как полупериод 10 ms длится. обьясните пожалуйста еще раз
|
|
|
|
14.01.2009, 03:20
|
|
Прописка
Регистрация: 27.05.2005
Сообщений: 127
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 2 сообщении(ях)
|
например у тебя от ик идет сигнал с периодом 1,72 мс. Значит нужен квант времени минимум раз в 8 меньше.
пусть это будет 1.72/8. С этим интервалом будет вызываться прерывание по таймеру. В начале приема команды мы ожидаем едиинцу (или какой там сигнал начала команды)
Произошло изменение, выставляем флаг и далее необходимое количество циклов прерываний мы записываем в ОЗУ. потом выдергиваем каждый 4ый бит и получаем команду. То есть чтобы получить всю команду длиной 67,2 мс нужно будет нырнуть в прерывание 67,2/квант времени
то есть в данном случае примерно 313 раз.
Все это не будет мешать коду управления симистором.
|
|
|
|
14.01.2009, 09:45
|
|
Почётный гражданин KAZUS.RU
Регистрация: 09.12.2007
Адрес: Новосибирск
Сообщений: 1,021
Сказал спасибо: 10
Сказали Спасибо 70 раз(а) в 63 сообщении(ях)
|
kvark85
Перепиши ты прогр. обработки пульта не используя внешние прерывания.
Вот так люди делают
http://www.ivica-novakovic.from.hr/Lightdimmer.htm
Иеще существует вложенность прерываний,
но это только для ассов,
такой гемор...
__________________
И на камнях растут деревья!
|
|
|
|
14.01.2009, 11:16
|
|
Прописка
Регистрация: 21.10.2005
Сообщений: 251
Сказал спасибо: 11
Сказали Спасибо 22 раз(а) в 17 сообщении(ях)
|
Предлагаю в обработчиках прерываний просто запускать таймеры ,а команду с пульта и димминг удобней будет обрабатывать через прерывания от таймеров.Один таймер настраивается на время задержки димминга ,а второй на время приема одного бита от пульта. При обработке прерываний другие прерывания не запрещать ,пусть стоят в очереди (опоздание на пару мкс проблем на создаст ).В этом случае у Вас все должно получится и останется еще куча свободного процессорного времени .В общем у Вас изначально неправильно был полстроен алгоритм ,потому и проблемки .Придется все переписывать сначала.
|
|
|
|
14.01.2009, 11:46
|
|
Прописка
Регистрация: 21.10.2005
Сообщений: 251
Сказал спасибо: 11
Сказали Спасибо 22 раз(а) в 17 сообщении(ях)
|
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:40.
|
|