|
Модераторы: PILOT, ManiaK, Mazzi |
|
mr_smit |
|
||||||
Опытный Профиль Группа: Участник Сообщений: 254 Регистрация: 27.2.2008 Где: Самара Репутация: 1 Всего: 4 |
Здравствуйте. Вот уже который день бьюсь над плавной регулировкой яркости С ПУЛЬТА ДУ. Она регулируется, но почему то "ступенчато". Не пойму где ошибка в программе.
Итак по порядку: 1. Составил таблицу временных задержек для регулировки мощности с шагом 1% 2. При нажатии кнопки происходит плавное включение/выключение (РАБОТАЕТ!!!) 3. Добавил пульт ДУ. Он непонятно чьего производства (был куплен за 250 руб взамен умершего пульта от ТВ тюнера Beholder). К тюнеру подошел. Правда пришлось "обучать" программу тюнера (это предусмотрено). Но всё работает. По ссылке, приведенной выше, видно что пульт для техники Samsung. Я предположил что работает он по протоколу NEC. Взял исходник от статьи "Некоторые протоколы ИК-пультов" для NEC протокола... Не заработало :( Взялся за осциллограф. Оказалось что там не совсем NEC протокол... Т.е. единица и ноль кодируются как и в NEC протоколе: Только вот стартовая последовательность отличается по времени: ~4,5 мс вместо 9 мс. И нет последовательности повтора!!! Т.е. при удержании кнопки посылка отсылается постоянно. Интервал между посылками 44,8 мс, длинна самой посылки 61,6 мс. В посылке 32 бита: "адрес"+"адрес"+"команда"+"инв. команда" (это данные с осциллографа!!!) Адрес передается не инвертированный. Но он нам собственно и не нужен. Команда согласно NEC протоколу. Пришлось править исходник. А именно стартовую последовательность. 4. Я выяснил коды нужных мне кнопок, "вставил" их в программу и сравниваю с переменной cmd. А в OCR1A записываю соответствующую задержку:
Но вот незадача. При удержании кнопки яркость меняется, но очень странно. Медленно и как бы рывками что ли. Итак, при нажатии на кнопку вкл/выкл: плавный старт, потом плавное отключение. При нажатии на кнопку увеличения яркости, яркость должна так же плавно расти как и в предыдущем случае. До тех пор пока не отпустили кнопку. А она как бы замирает, увеличивается, замирает, увеличивается. Я снял на видео как всё происходит: http://www.youtube.com/watch?v=7xy9u1OUq9s Т.е. где то в коде не порядок. У меня есть предположение: Просто сравнивать с переменной cmd видно нельзя. Вводить флаг повтора? Но посылки то одинаковые!!!. Как быть? Команду я сбрасываю только если ничего не приходит уже на пин. Т.е. Условие if (cmd == 0b11000000) { должно выполняться при удержании кнопки. Или нет?????? Получается оно выполняется с какими то задержками... или где то команда успевает обнулиться и условие перестает выполняться. Чего то я запутался.
Как в таком случае корректно команду обработать? Вроде всё правильно :( Я принял за условие что при удержании кнопки переменная cmd всегда равна коду нажатой кнопки <-- может это не правильно??? Пробовал
Я в отчаянии... :( Не понимаю почему не работает. Уже столько вечеров убил на это. Не регулируется плавно, хоть об стенку расшибись. Ну вроде всё правильно в коде. Схема: Код в приложении: Присоединённый файл ( Кол-во скачиваний: 14 ) dimmer.c 12,07 Kb |
||||||
|
|||||||
UniBomb |
|
|||
Новичок Награды: 1 Профиль Группа: Участник Клуба Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 9 Всего: 97 |
Столько исходной информации, что я не могу всю её в голове удержать
Итак, во-первых попробуй вот что сделать - сбрасывай cmd сразу после обработки, во-вторых поставь else ко второму условию:
Добавлено через 2 минуты и 26 секунд В-третьих - поставь флаг срабатывая таймера по достижению OCR1, т.е. пока не зажгли с текущим значением яркости не изменять её. |
|||
|
||||
mr_smit |
|
|||
Опытный Профиль Группа: Участник Сообщений: 254 Регистрация: 27.2.2008 Где: Самара Репутация: 1 Всего: 4 |
Сюда флаг:
И как его обработать в основном цикле??? К чему привязать? Это сообщение отредактировал(а) mr_smit - 25.11.2010, 15:30 |
|||
|
||||
UniBomb |
|
|||
Новичок Награды: 1 Профиль Группа: Участник Клуба Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 9 Всего: 97 |
Я указал в каком месте в коде))) Сразу после захода в каждый if. |
|||
|
||||
mr_smit |
|
|||
Опытный Профиль Группа: Участник Сообщений: 254 Регистрация: 27.2.2008 Где: Самара Репутация: 1 Всего: 4 |
Сразу не заметил. Исправил сообщение
|
|||
|
||||
UniBomb |
|
|||
Новичок Награды: 1 Профиль Группа: Участник Клуба Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 9 Всего: 97 |
Как-то так:
|
|||
|
||||
mr_smit |
|
|||
Опытный Профиль Группа: Участник Сообщений: 254 Регистрация: 27.2.2008 Где: Самара Репутация: 1 Всего: 4 |
То же самое. Плавности нет. С задержками
|
|||
|
||||
mr_smit |
|
|||
Опытный Профиль Группа: Участник Сообщений: 254 Регистрация: 27.2.2008 Где: Самара Репутация: 1 Всего: 4 |
Пока победил это так:
Т.е. если прошло более 48 мс и от TSOPа ничего не пришло, то значит кнопку отпустили button_up = yes; и увеличение яркости в цикле while (button_up == no) прекращается. Теперь регулируется плавно. Но заметил такую особенность: если нажать кнопку уменьшения яркости, а потом через 0,5-1 или 2-3 сек нажать кнопку увеличения яркости, то яркость продолжает уменьшаться :( Подождал. Дальше как надо регулируется. Достала эта не стабильность :((((( |
|||
|
||||
UniBomb |
|
|||
Новичок Награды: 1 Профиль Группа: Участник Клуба Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 9 Всего: 97 |
mr_smit, в общем логика должна быть такая:
определить момент изменения cmd->запретить её изменять->инкрементировать или декрементировать ocr1a->дождаться нескольких срабатываний таймера с текущим ocr1a->обнулить и разрешить изменять cmd->перейти к первому пункту |
|||
|
||||
mr_smit |
|
|||
Опытный Профиль Группа: Участник Сообщений: 254 Регистрация: 27.2.2008 Где: Самара Репутация: 1 Всего: 4 |
Как это в коде сделать? Я запутался окончательно. Голова сейчас взорвется.
Добавлено через 1 минуту и 9 секунд Попытался синхронизироваться по импульсам от ДУ. Т.е. по приходу команды выполнять действие. Как раз разница между посылками вроде и должна дать задержку на плавность:
Нет эффекта. Так же ступенчато. Хоть об стену расшибись Мой код то почти что рабочий. Думаю где то надо просто или прерывания отключать или ещё что. Но не хватает мозгов сообразить где. |
|||
|
||||
mr_smit |
|
|||
Опытный Профиль Группа: Участник Сообщений: 254 Регистрация: 27.2.2008 Где: Самара Репутация: 1 Всего: 4 |
Убавил задержку в прерывании. Было 200 мкс, поставил 75 мкс. Стало плавнее...
Как подать импульс открытия не используя delay_us(75) я не знаю. Понимаю что в прерывании нельзя использовать задержку. Но а как без неё?????????? Вот, смотрите как всё работает: http://www.youtube.com/watch?v=gSkNSZsmZ8Q Последняя редакция кода в приложении. Заметил что: (cmd == 0b11111000) { // кнопка "Display" - увеличение яркости (cmd == 0b11011000) { // кнопка "TV" - вкл/выкл диммера отличаются только 1 битом. Может поэтому иногда при нажатии на увеличение лампа загорается полностью???? Не правильное принятие команды???? Это сообщение отредактировал(а) mr_smit - 27.11.2010, 17:28 Присоединённый файл ( Кол-во скачиваний: 13 ) dimmer.rar 3,11 Kb |
|||
|
||||
UniBomb |
|
|||
Новичок Награды: 1 Профиль Группа: Участник Клуба Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 9 Всего: 97 |
Любые задержки в прерывании - зло. Вообще регулирование яркости не так делают. В прерывании убери задержку и просто изменяй состояние вывода. Таким образом он честь времени горит, и такую же часть времени не горит. Из-за инертности лампы накаливания мерцания не будет видно. А вот сама яркость будет регулироваться частотой срабатывания таймера. |
|||
|
||||
mr_smit |
|
|||
Опытный Профиль Группа: Участник Сообщений: 254 Регистрация: 27.2.2008 Где: Самара Репутация: 1 Всего: 4 |
Я вот так сделал:
По совпадению А включили, по совпадению В выключили (через 100 мкс). На текущей яркости проблем нет. Стабильно горит на заданной яркости. Проблемы именно при регулировании. Иногда, когда полностью выключено, нажатие кнопки увеличения яркости приводит к плавному включению на 100%. Как будто команды путаются... (cmd == 0b11111000) { // кнопка "Display" - увеличение яркости (cmd == 0b11011000) { // кнопка "TV" - вкл/выкл диммера Это сообщение отредактировал(а) mr_smit - 27.11.2010, 21:51 |
|||
|
||||
UniBomb |
|
|||
Новичок Награды: 1 Профиль Группа: Участник Клуба Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 9 Всего: 97 |
1. А ты проверяешь принятые команды? Ну т.е. ты же получаешь команды в прямом и инверсном виде. Ты их сравниваешь? 2. Закомментируй одну из веток (например на снижение яркости) и посмотри будет ли плавно увеличиваться яркость. |
|||
|
||||
mr_smit |
|
|||
Опытный Профиль Группа: Участник Сообщений: 254 Регистрация: 27.2.2008 Где: Самара Репутация: 1 Всего: 4 |
Конечно проверяю:
С cmd уже работаю. |
|||
|
||||
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)" | |
|
На данный раздел помимо Правил форума распространяются текже следующие правила:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |