Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

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

 
Опции темы

ir+pic628a

Непрочитано 26.03.2008, 22:33  
serj_neo
Временная регистрация
 
Аватар для serj_neo
 
Регистрация: 16.01.2007
Адрес: Казахстан
Сообщений: 73
Сказал спасибо: 18
Сказали Спасибо 61 раз(а) в 18 сообщении(ях)
serj_neo на пути к лучшему
По умолчанию ir+pic628a

Здравствуйте. Собрал схему,прицепил приемник IR. Должно получится управление светом в зале с помощью пульта от телевизора.
Разобрался с протоколом от пульта телека,научился определять переход фазы через 0.
А проблема такова: Определяю переход через 0 в прерывании и если размещаю подпрограмму приёма от пульта команды, в прерывании то при нажатии на кнопки пульта, люстра мигает но команды выполняет правильно.
Если размещаю подпрограмму приёма от пульта не в прерывании то команды не принимаются. Ясно что при приёме команды,может произойти прерывание по переходу через 0 и команда принимается неправильно.
Как люди совмещают контроль переходов через 0 и приём от пульта команды? заранее благодарен...
Реклама:
serj_neo вне форума  
Непрочитано 26.03.2008, 23:01  
urry1
Временная регистрация
 
Регистрация: 11.12.2007
Сообщений: 79
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
urry1 на пути к лучшему
По умолчанию

Я бы использовал прерывание по компараторам.
urry1 вне форума  
Непрочитано 27.03.2008, 10:38  
otima
Частый гость
 
Регистрация: 26.01.2007
Сообщений: 10
Сказал спасибо: 3
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
otima на пути к лучшему
По умолчанию

По прерыванию по фронту заполняешь буфер битами,
внутри прерывания каждый раз, проверяешь, правильная команда в буфере или нет, если нет - сдвигаешь буфер. Во время обработки прерывания - придется прерывания запретить, но оно быстро выполняется - это не помешает.
Когда буфер заполнен и проверен на валидность, все еще внутри прерывания включаешь свою лампочку (или выключаешь). чтобы различать следующие одно за другим отдельные нажатия кнопки на пульте от "нажал и не отпустил" в протоколе RC5 есть специальный бит.
То есть лампочка мигать не должна непрерывно, да и наверняка включение - выключение с разных кнопок происходит.
Проверял такой подход на RC5, но думаю для других протоколов разницы не будет особой.
otima вне форума  
Непрочитано 27.03.2008, 11:11  
serj_neo
Временная регистрация
 
Аватар для serj_neo
 
Регистрация: 16.01.2007
Адрес: Казахстан
Сообщений: 73
Сказал спасибо: 18
Сказали Спасибо 61 раз(а) в 18 сообщении(ях)
serj_neo на пути к лучшему
По умолчанию

спасибо! с пульта протокол не RC5, но думаю ваша методика подойдёт. Примерно я представляю так: по заднему фронту завожу таймер и в прерывании от таймера заполняю буфер, там же проверяю правильность приёма. Щас буду пробовать написать подпрограмму...
serj_neo вне форума  
Непрочитано 27.03.2008, 11:12  
varostov
Прописка
 
Регистрация: 14.10.2006
Адрес: Ростов-на-Дону
Сообщений: 114
Сказал спасибо: 14
Сказали Спасибо 33 раз(а) в 22 сообщении(ях)
varostov на пути к лучшему
По умолчанию

Могу предложить два варианта:
1)сделать вхождения в прерывание по заданным двум событиям (переход ч/0 и изменение сигнала с IR-приёмника) как можно короче; после реакции на прерывание проверять флаг второго события тут же, не выходя из прерывания (экономия времени); если необходимо, поднять тактовую частоту процессора, чтобы ускорить обработку; использовать для вышеуказанных событий разные входы INT (для 18 серии) или INT и прерывание по изменению порта B (для 16 серии), дабы не тратить время на сортировку.
2) Экстенсивный метод - разнести функции управления яркостью ламп и приёма IR-кода на два небольших м/к, связанных между собой любым интерфейсом ( в простейшем случае - линией on/off и линиями D0-Dn уровня яркости).
varostov вне форума  
Непрочитано 27.03.2008, 11:19  
serj_neo
Временная регистрация
 
Аватар для serj_neo
 
Регистрация: 16.01.2007
Адрес: Казахстан
Сообщений: 73
Сказал спасибо: 18
Сказали Спасибо 61 раз(а) в 18 сообщении(ях)
serj_neo на пути к лучшему
По умолчанию

Цитата:
Я бы использовал прерывание по компараторам.
Подскажите как можно реализовать обнаружение перехода фазы через 0 с помощью компаратора?

Я использовал прерывания от порта Б(RB4-RB7).Но он почемуто нехочет работать по 2 фронтам! а только по заднему фронту перехода через 0. При переходе через 0 я завожу таймер на 10мс(для включения симистора в слующем полупериоде) и таймер на 0,1-8мс(для задержки вкл симистора, то есть яркости лампы)
serj_neo вне форума  
Непрочитано 27.03.2008, 11:27  
serj_neo
Временная регистрация
 
Аватар для serj_neo
 
Регистрация: 16.01.2007
Адрес: Казахстан
Сообщений: 73
Сказал спасибо: 18
Сказали Спасибо 61 раз(а) в 18 сообщении(ях)
serj_neo на пути к лучшему
По умолчанию

Цитата:
Могу предложить два варианта:
1)сделать вхождения в прерывание по заданным двум событиям (переход ч/0 и изменение сигнала с IR-приёмника) как можно короче; после реакции на прерывание проверять флаг второго события тут же, не выходя из прерывания (экономия времени); если необходимо, поднять тактовую частоту процессора, чтобы ускорить обработку; использовать для вышеуказанных событий разные входы INT (для 18 серии) или INT и прерывание по изменению порта B (для 16 серии), дабы не тратить время на сортировку.
2) Экстенсивный метод - разнести функции управления яркостью ламп и приёма IR-кода на два небольших м/к, связанных между собой любым интерфейсом ( в простейшем случае - линией on/off и линиями D0-Dn уровня яркости).
Про второй вариант уже думал.Хотелось бы в 1 мк это сделать.
Ну в принципе первый вариант я щас пробую сделать, чуть выше я примерно про это написал.
serj_neo вне форума  
Непрочитано 27.03.2008, 13:05  
urry
Почётный гражданин KAZUS.RUN
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

Сообщение от serj_neo
Цитата:
Я бы использовал прерывание по компараторам.
Подскажите как можно реализовать обнаружение перехода фазы через 0 с помощью компаратора?

Я использовал прерывания от порта Б(RB4-RB7).Но он почемуто нехочет работать по 2 фронтам! а только по заднему фронту перехода через 0. При переходе через 0 я завожу таймер на 10мс(для включения симистора в слующем полупериоде) и таймер на 0,1-8мс(для задержки вкл симистора, то есть яркости лампы)
А почему - нет ???
https://kazus.run/datasheets/pdf-dat...PIC16F62X.html
urry вне форума  
Непрочитано 27.03.2008, 21:34  
serj_neo
Временная регистрация
 
Аватар для serj_neo
 
Регистрация: 16.01.2007
Адрес: Казахстан
Сообщений: 73
Сказал спасибо: 18
Сказали Спасибо 61 раз(а) в 18 сообщении(ях)
serj_neo на пути к лучшему
По умолчанию

Цитата:
А почему - нет ???
Сорри, я не понял что вы имеете ввиду.

Если про прерывания по 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...почемуто форум её исправляет на смайлик
serj_neo вне форума  
Непрочитано 27.03.2008, 21:53  
urry1
Временная регистрация
 
Регистрация: 11.12.2007
Сообщений: 79
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
urry1 на пути к лучшему
По умолчанию

Сообщение от 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.
urry1 вне форума  
 
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PIC628A max0000 Микроконтроллеры, АЦП, память и т.д 2 25.01.2007 12:35


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


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