DpInRock 0 Posted May 12, 2008 (edited) · Report post НЕТТТ!!! Еще раз. 1. Засекаете переход, например в ноль. 2. Включаете таймер. 3. Ждем переход в 1 4. Записываем длительность посылки и обнуляем таймер 5. Ждем переход в ноль 6. Записываем длительность посылки, обнуляем таймер. Гоу то пункт 3. Каждое число полученное в ПРОЦЕССЕ будет говорить о КОЛИЧЕСТВЕ 0 или 1 на конкретном участке. А не ОБ ОДНОМ НУЛЕ ИЛИ ЕДИНИЦЕ. Зная длительность минимального импулься можно расчитать, сколько нулей или единиц содержится в КАЖДОМ ИЗ ПОЛУЧЕННЫХ ЧИСЕЛ!!! Ясно? -- Пример. Длительность нуля 150 Длительность 1 - 200 Длительность 0 -30 Длительность 1 60 .... Из этого делаем вывод что сначала пришло 5 нулей потом 7 единиц потом один НОЛЬ потом 2 единицы. Понятно???? Кода у меня нет. Убил давно. Edited May 12, 2008 by DpInRock Quote Ответить с цитированием Share this post Link to post Share on other sites
tklim 0 Posted May 12, 2008 (edited) · Report post НЕТТТ!!! Еще раз. 1. Засекаете переход, например в ноль. 2. Включаете таймер. 3. Ждем переход в 1 4. Записываем длительность посылки и обнуляем таймер 5. Ждем переход в ноль 6. Записываем длительность посылки, обнуляем таймер. Гоу то пункт 3. Каждое число полученное в ПРОЦЕССЕ будет говорить о КОЛИЧЕСТВЕ 0 или 1 на конкретном участке. А не ОБ ОДНОМ НУЛЕ ИЛИ ЕДИНИЦЕ. Зная длительность минимального импулься можно расчитать, сколько нулей или единиц содержится в КАЖДОМ ИЗ ПОЛУЧЕННЫХ ЧИСЕЛ!!! Чем ваш алгоритм отличается от того, что я привет в во 2м или 3ем ответе на эту тему ? Я понимаю, о чем вы говорите, но это лишнее для понимания общей сути. И для того чтобы вычислить "минимальную длину" импульса необходимо собрать массив этих всех импульсов. Edited May 12, 2008 by Клим Quote Ответить с цитированием Share this post Link to post Share on other sites
DpInRock 0 Posted May 13, 2008 · Report post Отличается степенью доходчивости до клиента. Ибо если так непонятно, то надо объяснять сяк. Или эдак. До получения результата. Да последоваельность будет именно такая. 10101010101 - не такая. Против этого я возражал и возражаю. Quote Ответить с цитированием Share this post Link to post Share on other sites
tklim 0 Posted May 13, 2008 · Report post Отличается степенью доходчивости до клиента. Ибо если так непонятно, то надо объяснять сяк. Или эдак. До получения результата. 10101010101 - не такая. Против этого я возражал и возражаю. Смотря как тактировать. Если просто фиксировать изменение фронта сигнала, то будет именно такая :). Т.е. после 1 будет обязательно 0 и наоборот :) Вы же предлагаете синхронизировать каким-нибудь сигналом, изначально не зная какая минимальная длина импульса. Т.е. для записи надо учитывать именно длины импульсов. А вот при распознавании уже можно упаковать это все. Quote Ответить с цитированием Share this post Link to post Share on other sites
VAHOO 0 Posted May 13, 2008 · Report post Отличается степенью доходчивости до клиента. Ибо если так непонятно, то надо объяснять сяк. Или эдак. До получения результата. 10101010101 - не такая. Против этого я возражал и возражаю. какой оптимальный вариант настроит таймер? тоесть настроить на 10милисекунд и взять значение TCNTx? или настроить на 1 микросикунд и инкрементироват по прериванию? и как обайтис с протоколм RC-5? там же управляющий бит всега инверсный. Quote Ответить с цитированием Share this post Link to post Share on other sites
DpInRock 0 Posted May 13, 2008 · Report post Смотря как тактировать. Если просто фиксировать изменение фронта сигнала, то будет именно такая :). Т.е. после 1 будет обязательно 0 и наоборот :) Вы же предлагаете синхронизировать каким-нибудь сигналом, изначально не зная какая минимальная длина импульса. Т.е. для записи надо учитывать именно длины импульсов. А вот при распознавании уже можно упаковать это все. БИТ, Клим, характеризуется не только ЗНАЧЕНИЕМ, но и ДЛИТЕЛЬНОСТЬЮ!!!! Вы описываете меандр. Настроить таймер на максимальную частоту. Но так, чтобы дительность самого большого интервала с постоянным уровнем укладывалась в 255 единиц инкремента таймер. Никаких прерываний от таймера. Таймер просто считывается в нужные моменты и обнуляется. Если есть возможность, то вход с приемника сделать прерыванием по изменению уровня. Тогда на каждое прерывание такого рода вы будете считывать число из таймера и потом обнулять таймер. Дальше по алгоритму. Quote Ответить с цитированием Share this post Link to post Share on other sites
tklim 0 Posted May 13, 2008 · Report post БИТ, Клим, характеризуется не только ЗНАЧЕНИЕМ, но и ДЛИТЕЛЬНОСТЬЮ!!!! Вы описываете меандр. Бит - это единица информации. Время - это уже другое измерение. Чтобы говорить о битах в посылке ИК-пульта надо точно знать спецификацию протокола. У нас этого всего нет - по этому говорить тут бессмысленно. Нас интересуют ИНТЕРВАЛЫ. Настроить таймер на максимальную частоту. Но так, чтобы дительность самого большого интервала с постоянным уровнем укладывалась в 255 единиц инкремента таймер. Никаких прерываний от таймера. Таймер просто считывается в нужные моменты и обнуляется. Если есть возможность, то вход с приемника сделать прерыванием по изменению уровня. Тогда на каждое прерывание такого рода вы будете считывать число из таймера и потом обнулять таймер. Дальше по алгоритму. Опять же, прочитайте что я писал вначале темы. Фактически тоже самое. Только вот прерывания от таймера НУЖНО. А именно для того чтобы определить окончание посылки. Quote Ответить с цитированием Share this post Link to post Share on other sites
DpInRock 0 Posted May 13, 2008 · Report post Не путайте человека. Окончание интервала со стабильным значением бита определяется сменой этого самого значения. Таймер вообще не причем. А, бит, конечно не имеет размерности времени, пока лежит в памяти. А вот при передаче уже имеет размерность времени. Объясняю еще раз. Сначала накапливаем интервал, а потом режем его на один или несколько бит, в зависимости от длины. Таким образом мы всего лишь скокращаем необходимую память для хранения принятой посылки. Но заодно и решае проблему сравнения интервалов, если бы мы не превращали эти интервалы в биты. Ибо тогда пришлось бы как-то округлять эти интервалы при сравнении. Ибо раз от раза они будут все равно разными. Quote Ответить с цитированием Share this post Link to post Share on other sites
tklim 0 Posted May 13, 2008 · Report post Объясняю еще раз. Сначала накапливаем интервал, а потом режем его на один или несколько бит, в зависимости от длины. Таким образом мы всего лишь скокращаем необходимую память для хранения принятой посылки. Но заодно и решае проблему сравнения интервалов, если бы мы не превращали эти интервалы в биты. Ибо тогда пришлось бы как-то округлять эти интервалы при сравнении. Ибо раз от раза они будут все равно разными. Объясняю еще раз:) Мы получаем команду от абсолютно неизвестного пульта. И мы не знаем, пока не приняли всю посылку, какой интервал выбрать за длину 1 передаваемого бита. Так что что вы там резать собрались - не совсем ясно. И если вы будете брать изначально достаточно высокую частоту дискретизации, то рискуете получить при приеме одного и того же пакета, к примеру такие данные: 111111000000111111000111 1111110000000111111000111 Как вы их потом будет округлять ? А за память не беспокойтесь, у меги88 1к ОЗУ. И по моему нет пультов, отправляющих больше 100бит(разве что кондиционерные) Quote Ответить с цитированием Share this post Link to post Share on other sites
VAHOO 0 Posted May 13, 2008 (edited) · Report post Не путайте человека. Окончание интервала со стабильным значением бита определяется сменой этого самого значения. Таймер вообще не причем. А, бит, конечно не имеет размерности времени, пока лежит в памяти. А вот при передаче уже имеет размерность времени. Объясняю еще раз. Сначала накапливаем интервал, а потом режем его на один или несколько бит, в зависимости от длины. Таким образом мы всего лишь скокращаем необходимую память для хранения принятой посылки. Но заодно и решае проблему сравнения интервалов, если бы мы не превращали эти интервалы в биты. Ибо тогда пришлось бы как-то округлять эти интервалы при сравнении. Ибо раз от раза они будут все равно разными. у меня вапрос такой. как определить начало и конец пакета? вот я изучал эти протоколы и можно сказать что махимальная пауза между импулсами примерно 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 May 13, 2008 by VAHOO Quote Ответить с цитированием Share this post Link to post Share on other sites
zltigo 0 Posted May 13, 2008 · Report post вот я так пишу... Moderator: Если еще будут постится неформатированные, нечитабельные куски исходников - буду просто удалять. И посты с полным ненужным цитированием - тоже. Quote Ответить с цитированием Share this post Link to post Share on other sites
VAHOO 0 Posted May 13, 2008 · Report post Moderator: Если еще будут постится неформатированные, нечитабельные куски исходников - буду просто удалять. И посты с полным ненужным цитированием - тоже. извините пожалуйста! просто кагда я отправляю через ссылку никто не смотрит :( Quote Ответить с цитированием Share this post Link to post Share on other sites
DpInRock 0 Posted May 14, 2008 · Report post http://ww1.microchip.com/downloads/en/AppNotes/01064A.pdf Вот тут все описано. Максимальная длительно стабильного интервала у вас буде 1.7 мс. Это для RC5. У Сони битовый интервал тоже где-то в этих пределах. Вот сделайте так, чтобы таймер заполнялся (пока) за 2 миллисекунды. Т.е. на вход ему надо дать частоту 500 ГЦ*256=128 Кгц примерно. Quote Ответить с цитированием Share this post Link to post Share on other sites
VAHOO 0 Posted May 14, 2008 · Report post 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 Quote Ответить с цитированием Share this post Link to post Share on other sites