Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: алгоритм для записи пульта в AVR
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Страницы: 1, 2
DpInRock
Цитата(Клим @ May 13 2008, 10:52) *
Смотря как тактировать. Если просто фиксировать изменение фронта сигнала, то будет именно такая smile.gif. Т.е. после 1 будет обязательно 0 и наоборот smile.gif
Вы же предлагаете синхронизировать каким-нибудь сигналом, изначально не зная какая минимальная длина импульса.
Т.е. для записи надо учитывать именно длины импульсов. А вот при распознавании уже можно упаковать это все.

БИТ, Клим, характеризуется не только ЗНАЧЕНИЕМ, но и ДЛИТЕЛЬНОСТЬЮ!!!!
Вы описываете меандр.

Настроить таймер на максимальную частоту. Но так, чтобы дительность самого большого интервала с постоянным уровнем укладывалась в 255 единиц инкремента таймер.
Никаких прерываний от таймера. Таймер просто считывается в нужные моменты и обнуляется.

Если есть возможность, то вход с приемника сделать прерыванием по изменению уровня.
Тогда на каждое прерывание такого рода вы будете считывать число из таймера и потом обнулять таймер.
Дальше по алгоритму.
Клим
Цитата(DpInRock @ May 13 2008, 14:41) *
БИТ, Клим, характеризуется не только ЗНАЧЕНИЕМ, но и ДЛИТЕЛЬНОСТЬЮ!!!!
Вы описываете меандр.

Бит - это единица информации. Время - это уже другое измерение.
Чтобы говорить о битах в посылке ИК-пульта надо точно знать спецификацию протокола. У нас этого всего нет - по этому говорить тут бессмысленно. Нас интересуют ИНТЕРВАЛЫ.
Цитата
Настроить таймер на максимальную частоту. Но так, чтобы дительность самого большого интервала с постоянным уровнем укладывалась в 255 единиц инкремента таймер.
Никаких прерываний от таймера. Таймер просто считывается в нужные моменты и обнуляется.

Если есть возможность, то вход с приемника сделать прерыванием по изменению уровня.
Тогда на каждое прерывание такого рода вы будете считывать число из таймера и потом обнулять таймер.
Дальше по алгоритму.

Опять же, прочитайте что я писал вначале темы. Фактически тоже самое.
Только вот прерывания от таймера НУЖНО. А именно для того чтобы определить окончание посылки.
DpInRock
Не путайте человека. Окончание интервала со стабильным значением бита определяется сменой этого самого значения. Таймер вообще не причем.

А, бит, конечно не имеет размерности времени, пока лежит в памяти. А вот при передаче уже имеет размерность времени.



Объясняю еще раз.
Сначала накапливаем интервал, а потом режем его на один или несколько бит, в зависимости от длины.
Таким образом мы всего лишь скокращаем необходимую память для хранения принятой посылки.

Но заодно и решае проблему сравнения интервалов, если бы мы не превращали эти интервалы в биты. Ибо тогда пришлось бы как-то округлять эти интервалы при сравнении. Ибо раз от раза они будут все равно разными.
Клим
Цитата(DpInRock @ May 13 2008, 16:08) *
Объясняю еще раз.
Сначала накапливаем интервал, а потом режем его на один или несколько бит, в зависимости от длины.
Таким образом мы всего лишь скокращаем необходимую память для хранения принятой посылки.

Но заодно и решае проблему сравнения интервалов, если бы мы не превращали эти интервалы в биты. Ибо тогда пришлось бы как-то округлять эти интервалы при сравнении. Ибо раз от раза они будут все равно разными.

Объясняю еще разsmile.gif
Мы получаем команду от абсолютно неизвестного пульта. И мы не знаем, пока не приняли всю посылку, какой интервал выбрать за длину 1 передаваемого бита. Так что что вы там резать собрались - не совсем ясно.
И если вы будете брать изначально достаточно высокую частоту дискретизации, то рискуете получить при приеме одного и того же пакета, к примеру такие данные:

111111000000111111000111
1111110000000111111000111
Как вы их потом будет округлять ?
А за память не беспокойтесь, у меги88 1к ОЗУ. И по моему нет пультов, отправляющих больше 100бит(разве что кондиционерные)
VAHOO
Цитата(DpInRock @ May 13 2008, 17:08) *
Не путайте человека. Окончание интервала со стабильным значением бита определяется сменой этого самого значения. Таймер вообще не причем.

А, бит, конечно не имеет размерности времени, пока лежит в памяти. А вот при передаче уже имеет размерность времени.
Объясняю еще раз.
Сначала накапливаем интервал, а потом режем его на один или несколько бит, в зависимости от длины.
Таким образом мы всего лишь скокращаем необходимую память для хранения принятой посылки.

Но заодно и решае проблему сравнения интервалов, если бы мы не превращали эти интервалы в биты. Ибо тогда пришлось бы как-то округлять эти интервалы при сравнении. Ибо раз от раза они будут все равно разными.


у меня вапрос такой.
как определить начало и конец пакета?

вот я изучал эти протоколы и можно сказать что

махимальная пауза между импулсами примерно 9 милисекунд,
милимальная пауза между импулсами примерно 275 микросекунд,
махимум тактов 48, тоесть надо делать масив из 48 битов


как я понимаю надо настроить таймер так?

только для нулей


unsigned int MASS[48];


interrupt [TIM0_OVF] void timer0_ovf_isr(void) // prerivanie po 10ms
{

TCNT0=0x9E;


}

interrupt [EXT_INT0] void ext_int0_isr(void)
{


if(!PINB.1) // кагда кнопка нажата

{

k=1;

if (!PIND.2 && i<48) // берем первые 48 тактов

{

TIMSK0=0x01; // вклю. TAIMER0
TCNT0=0x00;
TCCR0B=0x05;



while(!PIND.2); // ждем кагда будьет высокий уровень

TCCR0B=0x00; // запрет TIMER0
TIMSK0=0x00;

MASS[i]= TCNT0;
i++;



}
}

if (PINB.1 && k==1) // кагда кнопка отпус.

{


k=0;
i=0;
j=0;


for (i=0;i<48;i++)

{


UCSR0B=0x08; // разреш. UART

printf("%d",MASS[i]); // принт в терминал

UCSR0B=0x00; // запретить UART


}

}

}



вот я так пишу, но зависимостьи расстояние между пультом и фотоприемника, разные цифры получаю sad.gif
zltigo
Цитата(VAHOO @ May 13 2008, 21:52) *
вот я так пишу...

Moderator:
Если еще будут постится неформатированные, нечитабельные куски исходников - буду просто удалять. И посты с полным ненужным цитированием - тоже.
VAHOO
Цитата(zltigo @ May 13 2008, 23:56) *
Moderator:
Если еще будут постится неформатированные, нечитабельные куски исходников - буду просто удалять. И посты с полным ненужным цитированием - тоже.


извините пожалуйста! просто кагда я отправляю через ссылку никто не смотрит sad.gif
DpInRock
http://ww1.microchip.com/downloads/en/AppNotes/01064A.pdf

Вот тут все описано.
Максимальная длительно стабильного интервала у вас буде 1.7 мс.
Это для RC5.
У Сони битовый интервал тоже где-то в этих пределах.
Вот сделайте так, чтобы таймер заполнялся (пока) за 2 миллисекунды. Т.е. на вход ему надо дать частоту 500 ГЦ*256=128 Кгц примерно.
VAHOO
[quote name='DpInRock' post='411047' date='May 14 2008, 17:06']
http://ww1.microchip.com/downloads/en/AppNotes/01064A.pdf

Вот тут все описано.
Максимальная длительно стабильного интервала у вас буде 1.7 мс.
Это для RC5.
У Сони битовый интервал тоже где-то в этих пределах.
Вот сделайте так, чтобы таймер заполнялся (пока) за 2 миллисекунды. Т.е. на вход ему надо дать частоту 500 ГЦ*256=128 Кгц примерно.
[/quote]

как обайтис с протоколм RC-5?
там же управляющий бит всега инверсный.



Вот сделайте так, чтобы таймер заполнялся (пока) за 2 миллисекунды. Т.е. на вход ему надо дать частоту 500 ГЦ*256=128 Кгц примерно.
[/quote]


у протокола NEC мах. интервал 9 МИЛИСЕКУНД,
скачайте пожалуйста irprotokol.rar
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.