Перейти к содержанию
    

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

НЕТТТ!!!

Еще раз.

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

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

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

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

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

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

 

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

 

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

 

Ясно?

--

Пример.

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

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

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

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

....

 

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

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

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

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

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

Понятно????

 

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

Изменено пользователем DpInRock

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

НЕТТТ!!!

Еще раз.

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

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

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

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

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

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

 

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

 

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

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

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

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

Изменено пользователем Клим

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

 

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

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

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

 

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

 

 

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

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

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

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

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

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

 

111111000000111111000111

1111110000000111111000111

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

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

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

 

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

 

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

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

 

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

 

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

Изменено пользователем VAHOO

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот я так пишу...

Moderator:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Moderator:

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

Это для RC5.

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...