|
|
  |
алгоритм для записи пульта в AVR, помогите пожалуйста :( |
|
|
|
May 12 2008, 18:38
|
Местный
  
Группа: Свой
Сообщений: 230
Регистрация: 7-04-08
Из: Украина, Запорожье
Пользователь №: 36 541

|
Цитата(DpInRock @ May 12 2008, 21:37)  НЕТТТ!!! Еще раз. 1. Засекаете переход, например в ноль. 2. Включаете таймер. 3. Ждем переход в 1 4. Записываем длительность посылки и обнуляем таймер 5. Ждем переход в ноль 6. Записываем длительность посылки, обнуляем таймер. Гоу то пункт 3.
Каждое число полученное в ПРОЦЕССЕ будет говорить о КОЛИЧЕСТВЕ 0 или 1 на конкретном участке. А не ОБ ОДНОМ НУЛЕ ИЛИ ЕДИНИЦЕ.
Зная длительность минимального импулься можно расчитать, сколько нулей или единиц содержится в КАЖДОМ ИЗ ПОЛУЧЕННЫХ ЧИСЕЛ!!! Чем ваш алгоритм отличается от того, что я привет в во 2м или 3ем ответе на эту тему ? Я понимаю, о чем вы говорите, но это лишнее для понимания общей сути. И для того чтобы вычислить "минимальную длину" импульса необходимо собрать массив этих всех импульсов.
Сообщение отредактировал Клим - May 12 2008, 18:42
|
|
|
|
|
May 13 2008, 06:52
|
Местный
  
Группа: Свой
Сообщений: 230
Регистрация: 7-04-08
Из: Украина, Запорожье
Пользователь №: 36 541

|
Цитата(DpInRock @ May 13 2008, 08:13)  Отличается степенью доходчивости до клиента. Ибо если так непонятно, то надо объяснять сяк. Или эдак. До получения результата. 10101010101 - не такая. Против этого я возражал и возражаю. Смотря как тактировать. Если просто фиксировать изменение фронта сигнала, то будет именно такая  . Т.е. после 1 будет обязательно 0 и наоборот  Вы же предлагаете синхронизировать каким-нибудь сигналом, изначально не зная какая минимальная длина импульса. Т.е. для записи надо учитывать именно длины импульсов. А вот при распознавании уже можно упаковать это все.
|
|
|
|
|
May 13 2008, 10:27
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 22-09-05
Пользователь №: 8 834

|
Цитата(DpInRock @ May 13 2008, 09:13)  Отличается степенью доходчивости до клиента. Ибо если так непонятно, то надо объяснять сяк. Или эдак. До получения результата. 10101010101 - не такая. Против этого я возражал и возражаю. какой оптимальный вариант настроит таймер? тоесть настроить на 10милисекунд и взять значение TCNTx? или настроить на 1 микросикунд и инкрементироват по прериванию? и как обайтис с протоколм RC-5? там же управляющий бит всега инверсный.
--------------------
Прошивка это душа микроконтроллера!
|
|
|
|
|
May 13 2008, 11:41
|

Гуру
     
Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515

|
Цитата(Клим @ May 13 2008, 10:52)  Смотря как тактировать. Если просто фиксировать изменение фронта сигнала, то будет именно такая  . Т.е. после 1 будет обязательно 0 и наоборот  Вы же предлагаете синхронизировать каким-нибудь сигналом, изначально не зная какая минимальная длина импульса. Т.е. для записи надо учитывать именно длины импульсов. А вот при распознавании уже можно упаковать это все. БИТ, Клим, характеризуется не только ЗНАЧЕНИЕМ, но и ДЛИТЕЛЬНОСТЬЮ!!!! Вы описываете меандр. Настроить таймер на максимальную частоту. Но так, чтобы дительность самого большого интервала с постоянным уровнем укладывалась в 255 единиц инкремента таймер. Никаких прерываний от таймера. Таймер просто считывается в нужные моменты и обнуляется. Если есть возможность, то вход с приемника сделать прерыванием по изменению уровня. Тогда на каждое прерывание такого рода вы будете считывать число из таймера и потом обнулять таймер. Дальше по алгоритму.
--------------------
On the road again (Canned Heat)
|
|
|
|
|
May 13 2008, 12:35
|
Местный
  
Группа: Свой
Сообщений: 230
Регистрация: 7-04-08
Из: Украина, Запорожье
Пользователь №: 36 541

|
Цитата(DpInRock @ May 13 2008, 14:41)  БИТ, Клим, характеризуется не только ЗНАЧЕНИЕМ, но и ДЛИТЕЛЬНОСТЬЮ!!!! Вы описываете меандр. Бит - это единица информации. Время - это уже другое измерение. Чтобы говорить о битах в посылке ИК-пульта надо точно знать спецификацию протокола. У нас этого всего нет - по этому говорить тут бессмысленно. Нас интересуют ИНТЕРВАЛЫ. Цитата Настроить таймер на максимальную частоту. Но так, чтобы дительность самого большого интервала с постоянным уровнем укладывалась в 255 единиц инкремента таймер. Никаких прерываний от таймера. Таймер просто считывается в нужные моменты и обнуляется.
Если есть возможность, то вход с приемника сделать прерыванием по изменению уровня. Тогда на каждое прерывание такого рода вы будете считывать число из таймера и потом обнулять таймер. Дальше по алгоритму. Опять же, прочитайте что я писал вначале темы. Фактически тоже самое. Только вот прерывания от таймера НУЖНО. А именно для того чтобы определить окончание посылки.
|
|
|
|
|
May 13 2008, 13:48
|
Местный
  
Группа: Свой
Сообщений: 230
Регистрация: 7-04-08
Из: Украина, Запорожье
Пользователь №: 36 541

|
Цитата(DpInRock @ May 13 2008, 16:08)  Объясняю еще раз. Сначала накапливаем интервал, а потом режем его на один или несколько бит, в зависимости от длины. Таким образом мы всего лишь скокращаем необходимую память для хранения принятой посылки.
Но заодно и решае проблему сравнения интервалов, если бы мы не превращали эти интервалы в биты. Ибо тогда пришлось бы как-то округлять эти интервалы при сравнении. Ибо раз от раза они будут все равно разными. Объясняю еще раз  Мы получаем команду от абсолютно неизвестного пульта. И мы не знаем, пока не приняли всю посылку, какой интервал выбрать за длину 1 передаваемого бита. Так что что вы там резать собрались - не совсем ясно. И если вы будете брать изначально достаточно высокую частоту дискретизации, то рискуете получить при приеме одного и того же пакета, к примеру такие данные: 111111000000111111000111 1111110000000111111000111 Как вы их потом будет округлять ? А за память не беспокойтесь, у меги88 1к ОЗУ. И по моему нет пультов, отправляющих больше 100бит(разве что кондиционерные)
|
|
|
|
|
May 13 2008, 19:52
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 22-09-05
Пользователь №: 8 834

|
Цитата(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 } } } вот я так пишу, но зависимостьи расстояние между пультом и фотоприемника, разные цифры получаю
Сообщение отредактировал VAHOO - May 13 2008, 19:57
--------------------
Прошивка это душа микроконтроллера!
|
|
|
|
|
May 13 2008, 19:56
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(VAHOO @ May 13 2008, 21:52)  вот я так пишу... Moderator: Если еще будут постится неформатированные, нечитабельные куски исходников - буду просто удалять. И посты с полным ненужным цитированием - тоже.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 13 2008, 20:01
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 22-09-05
Пользователь №: 8 834

|
Цитата(zltigo @ May 13 2008, 23:56)  Moderator: Если еще будут постится неформатированные, нечитабельные куски исходников - буду просто удалять. И посты с полным ненужным цитированием - тоже. извините пожалуйста! просто кагда я отправляю через ссылку никто не смотрит
--------------------
Прошивка это душа микроконтроллера!
|
|
|
|
|
May 14 2008, 13:06
|

Гуру
     
Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515

|
http://ww1.microchip.com/downloads/en/AppNotes/01064A.pdfВот тут все описано. Максимальная длительно стабильного интервала у вас буде 1.7 мс. Это для RC5. У Сони битовый интервал тоже где-то в этих пределах. Вот сделайте так, чтобы таймер заполнялся (пока) за 2 миллисекунды. Т.е. на вход ему надо дать частоту 500 ГЦ*256=128 Кгц примерно.
--------------------
On the road again (Canned Heat)
|
|
|
|
|
May 14 2008, 13:15
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 22-09-05
Пользователь №: 8 834

|
[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
--------------------
Прошивка это душа микроконтроллера!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|