Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Задержки при плавной регулировке. Диммер с ДУ

Непрочитано 25.11.2010, 23:27  
mr_smit
Временная регистрация
 
Аватар для mr_smit
 
Регистрация: 14.09.2009
Сообщений: 87
Сказал спасибо: 6
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
mr_smit на пути к лучшему
По умолчанию Re: Задержки при плавной регулировке. Диммер с ДУ

Код:
#define delay_   30    // плавность включения
...
status++;
...
OCR1A = nagruzka[status];   // увеличиваем яркость
delay_ms(delay_);
Т.е. значение в OCR1A меняется с интервалом 30 мс. А разве можно как то по другому плавно включить????
Реклама:
mr_smit вне форума  
Непрочитано 25.11.2010, 23:51  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Задержки при плавной регулировке. Диммер с ДУ

Сообщение от mr_smit Посмотреть сообщение
Т.е. если прошло более 48 мс и от TSOPа ничего не пришло, то значит кнопку отпустили button_up = yes; и увеличение яркости в цикле while (button_up == no) прекращается.
Таймер увеличения/уменьшения - сами посылки. Если 1 посылка с паузой занимает 100мС, то и синхронизируйтесь прямо по ним. Это проще, чем отсчитывать 48мС и заканчивать текущую операцию. Получили команду с пульта - выполнили ее. Придет следующая - опять реакция. Не пришла - угол включения тиристора остается постоянным.
kison вне форума  
Непрочитано 26.11.2010, 01:05  
CodeNameHawk
Вид на жительство
 
Регистрация: 21.10.2009
Сообщений: 349
Сказал спасибо: 181
Сказали Спасибо 65 раз(а) в 57 сообщении(ях)
CodeNameHawk на пути к лучшему
По умолчанию Re: Задержки при плавной регулировке. Диммер с ДУ

Сообщение от mr_smit Посмотреть сообщение
Т.е. значение в OCR1A меняется с интервалом 30 мс. А разве можно как то по другому плавно включить????
У вас не плавно включить, а плавно изменять.
Даже показал примерно как.
CodeNameHawk вне форума  
Непрочитано 26.11.2010, 22:09  
mr_smit
Временная регистрация
 
Аватар для mr_smit
 
Регистрация: 14.09.2009
Сообщений: 87
Сказал спасибо: 6
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
mr_smit на пути к лучшему
По умолчанию Re: Задержки при плавной регулировке. Диммер с ДУ

Сообщение от kison Посмотреть сообщение
Таймер увеличения/уменьшения - сами посылки. Если 1 посылка с паузой занимает 100мС, то и синхронизируйтесь прямо по ним. Это проще, чем отсчитывать 48мС и заканчивать текущую операцию. Получили команду с пульта - выполнили ее. Придет следующая - опять реакция. Не пришла - угол включения тиристора остается постоянным.
Сделал. Нет плавности.

Код:
...
        if (b_cnt == 32)  {                                                     //если приняли уже 4 байта
                 if ((cmd_1 + cmd_0) == 0xFF) {                                  //проверили правильность приема команды              
                  cmd = cmd_1;
                    if (cmd == 0b11111000) {      // кнопка "Display" - увеличение яркости
                     TCCR1B=0x02;
                     OCR1A = nagruzka[status];
                     status++;
                     if (status ›= 98) {
                      TCCR1B=0x00;
		              status = 97;   
                      PORTC.5 = 1;                // полностью включили
			         }
                    }
mr_smit вне форума  
Непрочитано 26.11.2010, 22:14  
mr_smit
Временная регистрация
 
Аватар для mr_smit
 
Регистрация: 14.09.2009
Сообщений: 87
Сказал спасибо: 6
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
mr_smit на пути к лучшему
По умолчанию Re: Задержки при плавной регулировке. Диммер с ДУ

Сообщение от CodeNameHawk Посмотреть сообщение
Зачем здесь
Код:
delay_ms(delay_);
Вместо того, чтобы делать прерывания минимально короткими, вы в них применяете задержку. А ведь пока выполняется одно прерывание, то другое прерывание, с более низким приоритетом, будет отложено.
Так ведь в прерывании нет delay_ms(delay_). Эту задержку использую в основном цикле. Я окончательно запутался. Руки опускаются... как только люди яркость регулируют...
mr_smit вне форума  
Непрочитано 26.11.2010, 23:02  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Задержки при плавной регулировке. Диммер с ДУ

Сообщение от mr_smit Посмотреть сообщение
Сделал. Нет плавности.
Теперь отключите светодиод оттуда, где он сейчас и инвертируйте его состояние при каждом приеме посылки. Проблема именно в неравномерном приеме. А задержка в прерывании у Вас все же есть, пусть и на 200мкС всего. Но при такте в 16МГц это 3200 тактов. Разблокируйте прерывания внутри обработчика перед задержкой и запретите сразу после нее. Я не думаю что будут проблемы если эта задержка вдруг станет 257мкС.
kison вне форума  
Непрочитано 26.11.2010, 23:03  
CodeNameHawk
Вид на жительство
 
Регистрация: 21.10.2009
Сообщений: 349
Сказал спасибо: 181
Сказали Спасибо 65 раз(а) в 57 сообщении(ях)
CodeNameHawk на пути к лучшему
По умолчанию Re: Задержки при плавной регулировке. Диммер с ДУ

Сообщение от mr_smit Посмотреть сообщение
Так ведь в прерывании нет delay_ms(delay_).
Задержка в прерывании, это типа здесь.
Код:
// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
  { 
  PORTC.5 = 1;    // открыли симистор
  delay_us(200);  // импульс 200 мкс
  PORTC.5 = 0;    // вернулись в режим ожидания
  }
Попробуйте выкинуть delay_ms(delay_) в основном цикле.
Код:
	   if (cmd == 0b11111000) {       // кнопка "Display" - увеличение яркости
          TCCR1B=0x02;
		  status++;
		  if (status ›= 98) {
            TCCR1B=0x00;
		    status = 98;   
            PORTC.5 = 1;                // полностью включили
			}
          else {
		    OCR1A = nagruzka[status];   // увеличиваем яркость
		    delay_ms(delay_);
            }
		 }
Если есть индикатор, для отладки выводите на него код принятой команды и количество правильно принятых импульсов и количество неудачных декодирований команд.
(Придется изменить подпрограмму)
Узнаете успевает ли все обрабатывать проц.
CodeNameHawk вне форума  
Непрочитано 27.11.2010, 02:01  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Задержки при плавной регулировке. Диммер с ДУ

Сообщение от CodeNameHawk Посмотреть сообщение
Узнаете успевает ли все обрабатывать проц.
На 16MHz?!!

Возможно Вы загнали пульт в слишком жесткие условия по времени. Если поможет, здесь проект обработки как раз с таким пультом(системой команд). Вся работа с пультом в прерывании Ext_INT0, для отсчета интервалов использован Timer0. МК Attiny15(1.6MHz). Внешнее прерывание настроено на любой перепад. Правда всё на ассемблере... как сумел...
На картинке верхние 3 графика - начало команд.
Remote_On-Off.zip
Нажмите на изображение для увеличения
Название: Nec.jpg
Просмотров: 77
Размер:	156.6 Кб
ID:	15165
omercury вне форума  
Непрочитано 27.11.2010, 17:13  
mr_smit
Временная регистрация
 
Аватар для mr_smit
 
Регистрация: 14.09.2009
Сообщений: 87
Сказал спасибо: 6
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
mr_smit на пути к лучшему
Вопрос Re: Задержки при плавной регулировке. Диммер с ДУ

Сообщение от omercury Посмотреть сообщение
Возможно Вы загнали пульт в слишком жесткие условия по времени.
Таймер тикает каждые 96 мкс. Он что на 16МГц так будет тикать что на 8МГц и т.д. О каких интервалах вы говорите???

Это?
Код:
if (tick ›= 92 && tick ‹ 96)  
if (tick ›= 21 && tick ‹ 25 && start_cond) 
if (tick ›= 10 && tick ‹ 22 && start_cond)
mr_smit вне форума  
Непрочитано 27.11.2010, 18:01  
mr_smit
Временная регистрация
 
Аватар для mr_smit
 
Регистрация: 14.09.2009
Сообщений: 87
Сказал спасибо: 6
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
mr_smit на пути к лучшему
Вопрос Re: Задержки при плавной регулировке. Диммер с ДУ

Убавил задержку в прерывании. Было 200 мкс, поставил 75 мкс. Стало плавнее...
Код:
// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
  { 
  PORTC.5 = 1;    // открыли симистор
  delay_us(75);  // импульс 75 мкс
  PORTC.5 = 0;   // вернулись в режим ожидания
  }
Как подать импульс открытия не используя delay_us(75) я не знаю. Понимаю что в прерывании нельзя использовать задержку. Но а как без неё??????????

Вот, смотрите как всё работает:
Видео:


Последняя редакция кода в приложении.
Вложения:
Тип файла: rar dimmer.rar (3.1 Кб, 65 просмотров)
mr_smit вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FAQ (ЧаВО) по PROTEUS для начинающих и не только dosikus Proteus 221 07.03.2024 22:45
Нужна схема автоматического закрывания дверей автомобиля при движении Aviasined Электроника средств транспорта 17 28.09.2010 06:14


Часовой пояс GMT +4, время: 09:47.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.