| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
ir+pic628a
26.03.2008, 22:33
|
|
|
Временная регистрация
Регистрация: 16.01.2007
Адрес: Казахстан
Сообщений: 73
Сказал спасибо: 18
Сказали Спасибо 61 раз(а) в 18 сообщении(ях)
|
ir+pic628a
Здравствуйте. Собрал схему,прицепил приемник IR. Должно получится управление светом в зале с помощью пульта от телевизора.
Разобрался с протоколом от пульта телека,научился определять переход фазы через 0.
А проблема такова: Определяю переход через 0 в прерывании и если размещаю подпрограмму приёма от пульта команды, в прерывании то при нажатии на кнопки пульта, люстра мигает но команды выполняет правильно.
Если размещаю подпрограмму приёма от пульта не в прерывании то команды не принимаются. Ясно что при приёме команды,может произойти прерывание по переходу через 0 и команда принимается неправильно.
Как люди совмещают контроль переходов через 0 и приём от пульта команды? заранее благодарен...
|
|
|
|
26.03.2008, 23:01
|
|
|
Временная регистрация
Регистрация: 11.12.2007
Сообщений: 79
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Я бы использовал прерывание по компараторам.
|
|
|
|
27.03.2008, 10:38
|
|
|
Частый гость
Регистрация: 26.01.2007
Сообщений: 10
Сказал спасибо: 3
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
По прерыванию по фронту заполняешь буфер битами,
внутри прерывания каждый раз, проверяешь, правильная команда в буфере или нет, если нет - сдвигаешь буфер. Во время обработки прерывания - придется прерывания запретить, но оно быстро выполняется - это не помешает.
Когда буфер заполнен и проверен на валидность, все еще внутри прерывания включаешь свою лампочку (или выключаешь). чтобы различать следующие одно за другим отдельные нажатия кнопки на пульте от "нажал и не отпустил" в протоколе RC5 есть специальный бит.
То есть лампочка мигать не должна непрерывно, да и наверняка включение - выключение с разных кнопок происходит.
Проверял такой подход на RC5, но думаю для других протоколов разницы не будет особой.
|
|
|
|
27.03.2008, 11:11
|
|
|
Временная регистрация
Регистрация: 16.01.2007
Адрес: Казахстан
Сообщений: 73
Сказал спасибо: 18
Сказали Спасибо 61 раз(а) в 18 сообщении(ях)
|
спасибо! с пульта протокол не RC5, но думаю ваша методика подойдёт. Примерно я представляю так: по заднему фронту завожу таймер и в прерывании от таймера заполняю буфер, там же проверяю правильность приёма. Щас буду пробовать написать подпрограмму...
|
|
|
|
27.03.2008, 11:12
|
|
|
Прописка
Регистрация: 14.10.2006
Адрес: Ростов-на-Дону
Сообщений: 114
Сказал спасибо: 14
Сказали Спасибо 33 раз(а) в 22 сообщении(ях)
|
Могу предложить два варианта:
1)сделать вхождения в прерывание по заданным двум событиям (переход ч/0 и изменение сигнала с IR-приёмника) как можно короче; после реакции на прерывание проверять флаг второго события тут же, не выходя из прерывания (экономия времени); если необходимо, поднять тактовую частоту процессора, чтобы ускорить обработку; использовать для вышеуказанных событий разные входы INT (для 18 серии) или INT и прерывание по изменению порта B (для 16 серии), дабы не тратить время на сортировку.
2) Экстенсивный метод - разнести функции управления яркостью ламп и приёма IR-кода на два небольших м/к, связанных между собой любым интерфейсом ( в простейшем случае - линией on/off и линиями D0-Dn уровня яркости).
|
|
|
|
27.03.2008, 11:19
|
|
|
Временная регистрация
Регистрация: 16.01.2007
Адрес: Казахстан
Сообщений: 73
Сказал спасибо: 18
Сказали Спасибо 61 раз(а) в 18 сообщении(ях)
|
|
Цитата:
|
|
Я бы использовал прерывание по компараторам.
|
Подскажите как можно реализовать обнаружение перехода фазы через 0 с помощью компаратора?
Я использовал прерывания от порта Б(RB4-RB7).Но он почемуто нехочет работать по 2 фронтам! а только по заднему фронту перехода через 0. При переходе через 0 я завожу таймер на 10мс(для включения симистора в слующем полупериоде) и таймер на 0,1-8мс(для задержки вкл симистора, то есть яркости лампы)
|
|
|
|
27.03.2008, 11:27
|
|
|
Временная регистрация
Регистрация: 16.01.2007
Адрес: Казахстан
Сообщений: 73
Сказал спасибо: 18
Сказали Спасибо 61 раз(а) в 18 сообщении(ях)
|
|
Цитата:
|
Могу предложить два варианта:
1)сделать вхождения в прерывание по заданным двум событиям (переход ч/0 и изменение сигнала с IR-приёмника) как можно короче; после реакции на прерывание проверять флаг второго события тут же, не выходя из прерывания (экономия времени); если необходимо, поднять тактовую частоту процессора, чтобы ускорить обработку; использовать для вышеуказанных событий разные входы INT (для 18 серии) или INT и прерывание по изменению порта B (для 16 серии), дабы не тратить время на сортировку.
2) Экстенсивный метод - разнести функции управления яркостью ламп и приёма IR-кода на два небольших м/к, связанных между собой любым интерфейсом ( в простейшем случае - линией on/off и линиями D0-Dn уровня яркости).
|
Про второй вариант уже думал.Хотелось бы в 1 мк это сделать.
Ну в принципе первый вариант я щас пробую сделать, чуть выше я примерно про это написал.
|
|
|
|
27.03.2008, 13:05
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
|
|
Сообщение от serj_neo
|
|
Цитата:
|
|
Я бы использовал прерывание по компараторам.
|
Подскажите как можно реализовать обнаружение перехода фазы через 0 с помощью компаратора?
Я использовал прерывания от порта Б(RB4-RB7).Но он почемуто нехочет работать по 2 фронтам! а только по заднему фронту перехода через 0. При переходе через 0 я завожу таймер на 10мс(для включения симистора в слующем полупериоде) и таймер на 0,1-8мс(для задержки вкл симистора, то есть яркости лампы)
|
А почему - нет ???
https://kazus.run/datasheets/pdf-dat...PIC16F62X.html
|
|
|
|
27.03.2008, 21:34
|
|
|
Временная регистрация
Регистрация: 16.01.2007
Адрес: Казахстан
Сообщений: 73
Сказал спасибо: 18
Сказали Спасибо 61 раз(а) в 18 сообщении(ях)
|
|
Цитата:
|
|
А почему - нет ???
|
Сорри, я не понял что вы имеете ввиду.
Если про прерывания по 1 фронту, то согласно даташиту на этот мк я написал прогу, и в мплабе она исправно работает по 2 фронтам...а в железе нехочет.
RegSimistorTemp-тут хранится переменная яркости лампы
static void interrupt
isr(void)
{
/*прерывание перехода фазы через 0*/
if(RBIF)
{
T0CS = 0;
TMR0 = 0XD9;
T0IF = 0;
T0IE = 1;
TMR1ON=0;
TMR1IF=0;
TMR1L = RegSimistorTemp;
TMR1H = (RegSimistorTemp ››  ;
TMR1ON=1;
TMR1IE=1;
PORTB = PORTB;
RBIF = 0;
}
/*сюда через 10мс после перехода через 0*/
if(T0IF)
{
T0IE = 0;
TMR1ON=0;
TMR1IF=0;
TMR1L = RegSimistorTemp;
TMR1H = (RegSimistorTemp ››  ;
TMR1ON=1;
TMR1IE=1;
T0IF = 0;
}
/*импульс включения симистора*/
if(TMR1IF)
{
PORTB = PORTB & 0B11110000;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
PORTB = PORTB | 0B00001111;
TMR1ON=0;
TMR1IE=0;
TMR1IF=0;
}
}
заместо смайлика цифра 8...почемуто форум её исправляет на смайлик
|
|
|
|
27.03.2008, 21:53
|
|
|
Временная регистрация
Регистрация: 11.12.2007
Сообщений: 79
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
|
Сообщение от serj_neo
|
|
Цитата:
|
|
А почему - нет ???
|
Сорри, я не понял что вы имеете ввиду.
Если про прерывания по 1 фронту, то согласно даташиту на этот мк я написал прогу, и в мплабе она исправно работает по 2 фронтам...а в железе нехочет.
RegSimistorTemp-тут хранится переменная яркости лампы
|
Код:
|
static void interrupt
isr(void)
{
/*прерывание перехода фазы через 0*/
if(RBIF)
{
///-----------------------------------
INTEDG^=1;
////////////////////////////////////////
T0CS = 0;
TMR0 = 0XD9;
T0IF = 0;
T0IE = 1; |
|
PS У меня получалось сделать плавную регулировку яркости лампы с пульта - без миганий в момент приема - на 628.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
| Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
|
PIC628A
|
max0000 |
Микроконтроллеры, АЦП, память и т.д |
2 |
25.01.2007 12:35 |
Часовой пояс GMT +4, время: 07:42.
|
|