Jump to content

    
Sign in to follow this  
VAHOO

алгоритм для записи пульта в AVR

Recommended Posts

НЕТТТ!!!

Еще раз.

1. Засекаете переход, например в ноль.

2. Включаете таймер.

3. Ждем переход в 1

4. Записываем длительность посылки и обнуляем таймер

5. Ждем переход в ноль

6. Записываем длительность посылки, обнуляем таймер. Гоу то пункт 3.

 

Каждое число полученное в ПРОЦЕССЕ будет говорить о КОЛИЧЕСТВЕ 0 или 1 на конкретном участке. А не ОБ ОДНОМ НУЛЕ ИЛИ ЕДИНИЦЕ.

 

Зная длительность минимального импулься можно расчитать, сколько нулей или единиц содержится в КАЖДОМ ИЗ ПОЛУЧЕННЫХ ЧИСЕЛ!!!

 

Ясно?

--

Пример.

Длительность нуля 150

Длительность 1 - 200

Длительность 0 -30

Длительность 1 60

....

 

Из этого делаем вывод

что сначала пришло 5 нулей

потом 7 единиц

потом один НОЛЬ

потом 2 единицы.

Понятно????

 

Кода у меня нет. Убил давно.

Edited by DpInRock

Share this post


Link to post
Share on other sites
НЕТТТ!!!

Еще раз.

1. Засекаете переход, например в ноль.

2. Включаете таймер.

3. Ждем переход в 1

4. Записываем длительность посылки и обнуляем таймер

5. Ждем переход в ноль

6. Записываем длительность посылки, обнуляем таймер. Гоу то пункт 3.

 

Каждое число полученное в ПРОЦЕССЕ будет говорить о КОЛИЧЕСТВЕ 0 или 1 на конкретном участке. А не ОБ ОДНОМ НУЛЕ ИЛИ ЕДИНИЦЕ.

 

Зная длительность минимального импулься можно расчитать, сколько нулей или единиц содержится в КАЖДОМ ИЗ ПОЛУЧЕННЫХ ЧИСЕЛ!!!

Чем ваш алгоритм отличается от того, что я привет в во 2м или 3ем ответе на эту тему ?

Я понимаю, о чем вы говорите, но это лишнее для понимания общей сути.

И для того чтобы вычислить "минимальную длину" импульса необходимо собрать массив этих всех импульсов.

Edited by Клим

Share this post


Link to post
Share on other sites

Отличается степенью доходчивости до клиента. Ибо если так непонятно, то надо объяснять сяк. Или эдак. До получения результата.

 

Да последоваельность будет именно такая.

10101010101 - не такая. Против этого я возражал и возражаю.

Share this post


Link to post
Share on other sites
Отличается степенью доходчивости до клиента. Ибо если так непонятно, то надо объяснять сяк. Или эдак. До получения результата.

10101010101 - не такая. Против этого я возражал и возражаю.

Смотря как тактировать. Если просто фиксировать изменение фронта сигнала, то будет именно такая :). Т.е. после 1 будет обязательно 0 и наоборот :)

Вы же предлагаете синхронизировать каким-нибудь сигналом, изначально не зная какая минимальная длина импульса.

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

Share this post


Link to post
Share on other sites
Отличается степенью доходчивости до клиента. Ибо если так непонятно, то надо объяснять сяк. Или эдак. До получения результата.

10101010101 - не такая. Против этого я возражал и возражаю.

 

какой оптимальный вариант настроит таймер?

тоесть настроить на 10милисекунд и взять значение TCNTx?

или настроить на 1 микросикунд и инкрементироват по прериванию?

 

и как обайтис с протоколм RC-5?

там же управляющий бит всега инверсный.

Share this post


Link to post
Share on other sites
Смотря как тактировать. Если просто фиксировать изменение фронта сигнала, то будет именно такая :). Т.е. после 1 будет обязательно 0 и наоборот :)

Вы же предлагаете синхронизировать каким-нибудь сигналом, изначально не зная какая минимальная длина импульса.

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

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

Вы описываете меандр.

 

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

Никаких прерываний от таймера. Таймер просто считывается в нужные моменты и обнуляется.

 

Если есть возможность, то вход с приемника сделать прерыванием по изменению уровня.

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

Дальше по алгоритму.

Share this post


Link to post
Share on other sites
БИТ, Клим, характеризуется не только ЗНАЧЕНИЕМ, но и ДЛИТЕЛЬНОСТЬЮ!!!!

Вы описываете меандр.

Бит - это единица информации. Время - это уже другое измерение.

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

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

Никаких прерываний от таймера. Таймер просто считывается в нужные моменты и обнуляется.

 

Если есть возможность, то вход с приемника сделать прерыванием по изменению уровня.

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

Дальше по алгоритму.

Опять же, прочитайте что я писал вначале темы. Фактически тоже самое.

Только вот прерывания от таймера НУЖНО. А именно для того чтобы определить окончание посылки.

Share this post


Link to post
Share on other sites

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

 

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

 

 

 

Объясняю еще раз.

Сначала накапливаем интервал, а потом режем его на один или несколько бит, в зависимости от длины.

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

 

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

Share this post


Link to post
Share on other sites
Объясняю еще раз.

Сначала накапливаем интервал, а потом режем его на один или несколько бит, в зависимости от длины.

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

 

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

Объясняю еще раз:)

Мы получаем команду от абсолютно неизвестного пульта. И мы не знаем, пока не приняли всю посылку, какой интервал выбрать за длину 1 передаваемого бита. Так что что вы там резать собрались - не совсем ясно.

И если вы будете брать изначально достаточно высокую частоту дискретизации, то рискуете получить при приеме одного и того же пакета, к примеру такие данные:

 

111111000000111111000111

1111110000000111111000111

Как вы их потом будет округлять ?

А за память не беспокойтесь, у меги88 1к ОЗУ. И по моему нет пультов, отправляющих больше 100бит(разве что кондиционерные)

Share this post


Link to post
Share on other sites
Не путайте человека. Окончание интервала со стабильным значением бита определяется сменой этого самого значения. Таймер вообще не причем.

 

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

Объясняю еще раз.

Сначала накапливаем интервал, а потом режем его на один или несколько бит, в зависимости от длины.

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

 

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

 

у меня вапрос такой.

как определить начало и конец пакета?

 

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

 

махимальная пауза между импулсами примерно 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= 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); // принт в терминал

 

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

 

 

}

 

}

 

}

 

 

 

вот я так пишу, но зависимостьи расстояние между пультом и фотоприемника, разные цифры получаю :(

irprotokol.rar

Edited by VAHOO

Share this post


Link to post
Share on other sites
вот я так пишу...

Moderator:

Если еще будут постится неформатированные, нечитабельные куски исходников - буду просто удалять. И посты с полным ненужным цитированием - тоже.

Share this post


Link to post
Share on other sites
Moderator:

Если еще будут постится неформатированные, нечитабельные куски исходников - буду просто удалять. И посты с полным ненужным цитированием - тоже.

 

извините пожалуйста! просто кагда я отправляю через ссылку никто не смотрит :(

Share this post


Link to post
Share on other sites

http://ww1.microchip.com/downloads/en/AppNotes/01064A.pdf

 

Вот тут все описано.

Максимальная длительно стабильного интервала у вас буде 1.7 мс.

Это для RC5.

У Сони битовый интервал тоже где-то в этих пределах.

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

Share this post


Link to post
Share on other sites

http://ww1.microchip.com/downloads/en/AppNotes/01064A.pdf

 

Вот тут все описано.

Максимальная длительно стабильного интервала у вас буде 1.7 мс.

Это для RC5.

У Сони битовый интервал тоже где-то в этих пределах.

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

 

как обайтис с протоколм RC-5?

там же управляющий бит всега инверсный.

 

 

 

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

 

 

у протокола NEC мах. интервал 9 МИЛИСЕКУНД,

скачайте пожалуйста irprotokol.rar

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this