Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
25.11.2010, 23:27
|
|
Временная регистрация
Регистрация: 14.09.2009
Сообщений: 87
Сказал спасибо: 6
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: Задержки при плавной регулировке. Диммер с ДУ
Код:
|
#define delay_ 30 // плавность включения
...
status++;
...
OCR1A = nagruzka[status]; // увеличиваем яркость
delay_ms(delay_); |
Т.е. значение в OCR1A меняется с интервалом 30 мс. А разве можно как то по другому плавно включить????
|
|
|
|
25.11.2010, 23:51
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Задержки при плавной регулировке. Диммер с ДУ
Сообщение от mr_smit
|
Т.е. если прошло более 48 мс и от TSOPа ничего не пришло, то значит кнопку отпустили button_up = yes; и увеличение яркости в цикле while (button_up == no) прекращается.
|
Таймер увеличения/уменьшения - сами посылки. Если 1 посылка с паузой занимает 100мС, то и синхронизируйтесь прямо по ним. Это проще, чем отсчитывать 48мС и заканчивать текущую операцию. Получили команду с пульта - выполнили ее. Придет следующая - опять реакция. Не пришла - угол включения тиристора остается постоянным.
|
|
|
|
26.11.2010, 01:05
|
|
Вид на жительство
Регистрация: 21.10.2009
Сообщений: 343
Сказал спасибо: 181
Сказали Спасибо 64 раз(а) в 56 сообщении(ях)
|
Re: Задержки при плавной регулировке. Диммер с ДУ
Сообщение от mr_smit
|
Т.е. значение в OCR1A меняется с интервалом 30 мс. А разве можно как то по другому плавно включить????
|
У вас не плавно включить, а плавно изменять.
Даже показал примерно как.
|
|
|
|
26.11.2010, 22:09
|
|
Временная регистрация
Регистрация: 14.09.2009
Сообщений: 87
Сказал спасибо: 6
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
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; // полностью включили
}
} |
|
|
|
|
26.11.2010, 22:14
|
|
Временная регистрация
Регистрация: 14.09.2009
Сообщений: 87
Сказал спасибо: 6
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: Задержки при плавной регулировке. Диммер с ДУ
Сообщение от CodeNameHawk
|
Зачем здесь
Вместо того, чтобы делать прерывания минимально короткими, вы в них применяете задержку. А ведь пока выполняется одно прерывание, то другое прерывание, с более низким приоритетом, будет отложено.
|
Так ведь в прерывании нет delay_ms(delay_). Эту задержку использую в основном цикле. Я окончательно запутался. Руки опускаются... как только люди яркость регулируют...
|
|
|
|
26.11.2010, 23:02
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Задержки при плавной регулировке. Диммер с ДУ
Сообщение от mr_smit
|
Сделал. Нет плавности.
|
Теперь отключите светодиод оттуда, где он сейчас и инвертируйте его состояние при каждом приеме посылки. Проблема именно в неравномерном приеме. А задержка в прерывании у Вас все же есть, пусть и на 200мкС всего. Но при такте в 16МГц это 3200 тактов. Разблокируйте прерывания внутри обработчика перед задержкой и запретите сразу после нее. Я не думаю что будут проблемы если эта задержка вдруг станет 257мкС.
|
|
|
|
26.11.2010, 23:03
|
|
Вид на жительство
Регистрация: 21.10.2009
Сообщений: 343
Сказал спасибо: 181
Сказали Спасибо 64 раз(а) в 56 сообщении(ях)
|
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_);
}
} |
Если есть индикатор, для отладки выводите на него код принятой команды и количество правильно принятых импульсов и количество неудачных декодирований команд.
(Придется изменить подпрограмму)
Узнаете успевает ли все обрабатывать проц.
|
|
|
|
27.11.2010, 02:01
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Задержки при плавной регулировке. Диммер с ДУ
Сообщение от CodeNameHawk
|
Узнаете успевает ли все обрабатывать проц.
|
На 16MHz?!!
Возможно Вы загнали пульт в слишком жесткие условия по времени. Если поможет, здесь проект обработки как раз с таким пультом(системой команд). Вся работа с пультом в прерывании Ext_INT0, для отсчета интервалов использован Timer0. МК Attiny15(1.6MHz). Внешнее прерывание настроено на любой перепад. Правда всё на ассемблере... как сумел...
На картинке верхние 3 графика - начало команд.
Remote_On-Off.zip
|
|
|
|
27.11.2010, 17:13
|
|
Временная регистрация
Регистрация: 14.09.2009
Сообщений: 87
Сказал спасибо: 6
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: Задержки при плавной регулировке. Диммер с ДУ
Сообщение от omercury
|
Возможно Вы загнали пульт в слишком жесткие условия по времени.
|
Таймер тикает каждые 96 мкс. Он что на 16МГц так будет тикать что на 8МГц и т.д. О каких интервалах вы говорите???
Это?
Код:
|
if (tick ›= 92 && tick ‹ 96)
if (tick ›= 21 && tick ‹ 25 && start_cond)
if (tick ›= 10 && tick ‹ 22 && start_cond) |
|
|
|
|
27.11.2010, 18:01
|
|
Временная регистрация
Регистрация: 14.09.2009
Сообщений: 87
Сказал спасибо: 6
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
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) я не знаю. Понимаю что в прерывании нельзя использовать задержку. Но а как без неё??????????
Вот, смотрите как всё работает:
Последняя редакция кода в приложении.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:20.
|
|