Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: алгоритм для записи пульта в AVR
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Страницы: 1, 2
VAHOO
Всем привет! уже более 3 недели мучаюсь не могу написать код,
делаю выключатель который регулирует яркость и надо
что-бы работал с любым пультом, тоесть надо стачало записать
сигнали от пульта в EEPROM а потом сравнить, делаю проект
на mega88 в CVAVR на языке СИ, протоколы пультов очень много,
если я все протоколы сунул в AVR то место не будет хватать,
у меня алгоритм был такой но корекно не работает,
я записал временные интервалы между импулсами, но
временные интервалы от растояния пульта всегда меняются.

буду рад любой информации

спасибо!
DpInRock
У вас осциллограф есть?
VAHOO
Цитата(DpInRock @ May 11 2008, 23:25) *
У вас осциллограф есть?


да, конечно есть
Клим
Цитата(VAHOO @ May 11 2008, 22:04) *
у меня алгоритм был такой но корекно не работает,
я записал временные интервалы между импулсами, но
временные интервалы от растояния пульта всегда меняются.

Что значит меняется ?
Какой пульт, самое главное, какой приемник ?
И чем записываете ?
Не должно быть настолько больших отклонений в зависимости от расстояния.
yarunt
Цитата(VAHOO @ May 11 2008, 22:04) *
Всем привет! уже более 3 недели мучаюсь не могу написать код,
делаю выключатель который регулирует яркость и надо
что-бы работал с любым пультом, тоесть надо стачало записать
сигнали от пульта в EEPROM а потом сравнить, делаю проект
на mega88 в CVAVR на языке СИ, протоколы пультов очень много,
если я все протоколы сунул в AVR то место не будет хватать,
у меня алгоритм был такой но корекно не работает,
я записал временные интервалы между импулсами, но
временные интервалы от растояния пульта всегда меняются.

буду рад любой информации

спасибо!

В китайских выключателях света ,принцип простой.Специально загрубляется чувствительность фотоприемника импульсы с него выпрямляются в логическую 1 и идут на тригер.
Все просто,пульт направляется на выключатель ,фпремник ловит и управляет тригером ,а он тиристором .

Цитата(yarunt @ May 11 2008, 22:35) *
В китайских выключателях света ,принцип простой.Специально загрубляется чувствительность фотоприемника импульсы с него выпрямляются в логическую 1 и идут на тригер.
Все просто,пульт направляется на выключатель ,фпремник ловит и управляет тригером ,а он тиристором .

Вобщем надо в место тригера всунуть АВР ,который нубудет заморачиватся на код с пульта а будет заниматся регулировкой яркости.
Все равно управлять чем-то одним телевизором или выключателем
DpInRock
Поменяйте батарейки в пульте. Или поменяйте пульт.
А если есть осциллограф, то почему не говорите о том, что вы на нем видите.
VAHOO
фотоприемник TSOP4838, подключил к вывду МК INT0,
вот кусок кода

Цитата(DpInRock @ May 11 2008, 23:46) *
Поменяйте батарейки в пульте. Или поменяйте пульт.
А если есть осциллограф, то почему не говорите о том, что вы на нем видите.


я настроил UART, и в терминале видно
Клим
Цитата(VAHOO @ May 11 2008, 22:51) *
фотоприемник TSOP4838, подключил к вывду МК INT0,
вот кусок кода
я настроил UART, и в терминале видно

Рекомендовал смореть либо на осциллографе либо подключить к компу. А потом уже подключать к контроллеру.
Про батарейки - правильно написано если слабый уровень сигнала - то не все имульсы доходят - и могут быть глюки.
Также важно напряжение питания приемника - на них хоть и пишут 4,5-5,5 - но в действительности даже при 4,5 уже работает гораздо хуже чем при 5. Также экранирование не помешает и фильрация питания - приемник сильно шумат, если к нему, к примеру, палец поднести.
VAHOO
Взял другой пульт не помогло sad.gif
DpInRock
Никогда не использовал принт внутри прерывания.
Неизвестно, какое время он отнимает.
И вообще. В прерываниях нужно выполнять только необходимую работу. А смотреть наполнение массива следует в фоне.
VAHOO
Цитата(DpInRock @ May 12 2008, 00:10) *
Никогда не использовал принт внутри прерывания.
Неизвестно, какое время он отнимает.
И вообще. В прерываниях нужно выполнять только необходимую работу. А смотреть наполнение массива следует в фоне.


скажите пожалуйста, какой нибудь алгоритм что-бы я использовал.
спасибо!
Клим
Цитата(VAHOO @ May 11 2008, 23:20) *
скажите пожалуйста, какой нибудь алгоритм что-бы я использовал.
спасибо!

Алгоритм - мерять длину импульса и длину паузы.
Только для начала сообразить и отладить это все на компе.
А в исходнике у вас черти что творится. И меряется только длина самого имульса - что есть неправильно. Еще, принт в цикле - как отметили выше - тоже неправильно.
Могу предложить такой метод:
1.вешаем приемник на int0 или int1 - прерывание при смене уровня.
2. При лог 0 запускаем таймер
3. при следующем прерывании пишем в массив текущее значение таймера и сбрасываем таймер.
4. выключение таймера и просмотр результата - при переполнении таймера либо при переполнении массива.
5. только после этого вывод результата
VDG
Цитата(VAHOO @ May 11 2008, 23:04) *
если я все протоколы сунул в AVR то место не будет хватать,
..
буду рад любой информации

все протоколы не "всунете", их ~ 10000 smile.gif

граббить нужно только одну посылку. а то мож у вас там сграблено обованными кусками. во вторых, один бит при удержании кнопки всегда меняется от пакета к пакету.
=AK=
Цитата(yarunt @ May 12 2008, 05:14) *
В китайских выключателях света ,принцип простой.Специально загрубляется чувствительность фотоприемника импульсы с него выпрямляются в логическую 1 и идут на тригер.
Все просто,пульт направляется на выключатель ,фпремник ловит и управляет тригером ,а он тиристором .
Вобщем надо в место тригера всунуть АВР ,который нубудет заморачиватся на код с пульта а будет заниматся регулировкой яркости.
Все равно управлять чем-то одним телевизором или выключателем

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

Цитата(VAHOO @ May 12 2008, 04:34) *
делаю выключатель который регулирует яркость и надо
что-бы работал с любым пультом, тоесть надо стачало записать
сигнали от пульта в EEPROM а потом сравнить

То есть, вы пытаетесь сделать "обучаемый" приемник, способный настраиваться на любой ИК пульт? Бросьте эту затею, это совершенно точно задача не для начинающих. В общем виде она скорей всего вообще не решается. Вряд ли вы представляете себе, насколько разнообразны ИК протоколы в пультах, поэтому поставили себе задачу, с которой не справитесь.
Ден
Дело в том, что в некоторых протоколах, когда подаете первую посылку, она имеет одни временные интервалы, когда идут следующие (с этой же нажатой клавиши) временные интервалы уже другие. Обычно они инверсные и поэтому если просто тупо записать временные интервалы, то с некоторыми протоколами ничего работать не будет.
Во вторых
Цитата
все протоколы не "всунете", их ~ 10000

Точно сказать не могу столько их или нет в мире, но могу сказать точно, что на практике, в бытовой аппаратуре чаще всего используется RC-5, и его модификации, да и к тому же количество фирм производящей аппаратуру не так уж и много, поэтому я считаю что все же лучше запихнуть несколько наиболее распространенных модификаций RC5 в AVR и уже не заморачиваться с такой сверхуниверсальностью.
Клим
Цитата(=AK= @ May 12 2008, 01:52) *
То есть, вы пытаетесь сделать "обучаемый" приемник, способный настраиваться на любой ИК пульт? Бросьте эту затею, это совершенно точно задача не для начинающих. В общем виде она скорей всего вообще не решается. Вряд ли вы представляете себе, насколько разнообразны ИК протоколы в пультах, поэтому поставили себе задачу, с которой не справитесь.

Очень даже решается. И если система не будет работать с каким-нибудь чудо-пультом от супернавороченной автомагнитолы - это не такая уж проблема.
Ну, еще от кондиционеров пульты точно не подойдут...
VAHOO
а как решают эту проблему в выключателях?
по моему сделан "обучаемый" приемник, способный настраиваться на любой ИК пульт.
чаще встречаются пульты от NEC a, а мне очень знакомо протокол RC-5, я уже написла код
и нормально работает, но только с RC-5 не обойтись sad.gif , а у SONY совсем другой протокол.

" 3. при следующем прерывании пишем в массив текущее значение таймера и сбрасываем таймер. "

дорогой Клим скажите пожалуйста

1. какой таймер мне надо настроить и запустить?
2. текущее значение таймера что означает?
тоесть инкрементировать? так как я сделал?
или взять значение TCNT0?
Клим
Цитата(VAHOO @ May 12 2008, 11:32) *
1. какой таймер мне надо настроить и запустить?
2. текущее значение таймера что означает?
тоесть инкрементировать? так как я сделал?
или взять значение TCNT0?

1. Какой не жалко их там в меге аж 3 штуки. 1 из них, еще нужно будет использовать для слежения за фазой. (Или регулировки яркости не будет?)
2. Текущее значение таймера при прерывании =время предыдущего импульса (или паузы).
Брать TCNTx
VAHOO
Цитата(Клим @ May 12 2008, 12:39) *
1. Какой не жалко их там в меге аж 3 штуки. 1 из них, еще нужно будет использовать для слежения за фазой. (Или регулировки яркости не будет?)
2. Текущее значение таймера при прерывании =время предыдущего импульса (или паузы).
Брать TCNTx



регулировки яркости будет, а таймер0 8 разр. настроить на 1 мкс?
Клим
Цитата(VAHOO @ May 12 2008, 12:03) *
регулировки яркости будет, а таймер0 8 разр. настроить на 1 мкс?

Там смотреть надо, какая максимально длина импульса может быть(и паузы) Чтоб таймера хватило.
А 1мкс - это очень мало. Там модуляция идет 38кгц - так что меньше 25мкс - смысла нету.
=AK=
Цитата(Клим @ May 12 2008, 13:49) *
Очень даже решается. И если система не будет работать с каким-нибудь чудо-пультом от супернавороченной автомагнитолы - это не такая уж проблема.
Ну, еще от кондиционеров пульты точно не подойдут...

Угу. И если не использовать пульты с импульсными кодами. И если игнорировать пульты со слишком низкими и слишком высокими несущими (бог с ним, с редким Сони протоколом, имеющим несущую порядка 2 МГц, я имею в виду прежде всего достаточно распространенные протоколы с несущей 455 кГц). И если исключить протокол JVC, где в соседних рамках инвертируется часть битовых полей. И если "вручную" заточить под протокол RC-5 и т.п., где составе посылки есть двухбитный счетчик нажатий. И т.д.

А не слишком ли много "если", ась? Вот именно поэтому я и сказал, что в общем виде задача скорей всего вообще не решается.
VAHOO
Цитата(Клим @ May 12 2008, 13:08) *
Там смотреть надо, какая максимально длина импульса может быть(и паузы) Чтоб таймера хватило.
А 1мкс - это очень мало. Там модуляция идет 38кгц - так что меньше 25мкс - смысла нету.


Извините, Клим, но я с вами не согласен,
у меня есть монжество протоколв, по моему надо настроить по махимум длини между импулсами,
а махимум примерно 9000 мкс, а модуляция сигнала здесь не причем, по моему надо
настроить таймер на 10 милисекунд,
DpInRock
По поводу удержания кнопок и повторных посылок.
Насколькоя я лично это дело делал, то существует специальный код - "Повтор предыдущей посылки". Он одинаков для повтора любой клавиши.

http://ru.wikipedia.org/wiki/%D0%9F%D1%83%...%BD%D0%B8%D1%8F

Вот тут все написано. И есть ссылки на системы кодирования.
VAHOO
Цитата(=AK= @ May 12 2008, 13:18) *
Угу. И если не использовать пульты с импульсными кодами. И если игнорировать пульты со слишком низкими и слишком высокими несущими (бог с ним, с редки Сони протоколом, имеющим несущую порядка 2 МГц, я имею в виду прежде всего достаточно распространенные протоколы с несущей 455 кГц). И если исключить протокол JVC. И если "вручную" заточить под протокол RC-5 и т.п., где составе посылки есть двухбитный счетчик нажатий. И т.д.

А не слишком ли много "если", ась? Вот именно поэтому я и сказал, что в общем виде задача скорей всего вообще не решается.


мне надо только что-бы работал с пультов от телика, ДВД, видек, это достаточно.
=AK=
Цитата(VAHOO @ May 12 2008, 18:02) *
а как решают эту проблему в выключателях?

О каких выключателях идет речь?

Например, я совершенно точно знаю, что выключатели системы управления освещением C-bus, которые управляются от ИК пультов, НЕ обучаемые, протокол в них зашит намертво.
Клим
Цитата(=AK= @ May 12 2008, 12:18) *
Угу. И если не использовать пульты с импульсными кодами. И если игнорировать пульты со слишком низкими и слишком высокими несущими (бог с ним, с редки Сони протоколом, имеющим несущую порядка 2 МГц, я имею в виду прежде всего достаточно распространенные протоколы с несущей 455 кГц). И если исключить протокол JVC. И если "вручную" заточить под протокол RC-5 и т.п., где составе посылки есть двухбитный счетчик нажатий. И т.д.

А не слишком ли много "если", ась? Вот именно поэтому я и сказал, что в общем виде задача скорей всего вообще не решается.

Насчет модуляции сильно отличной от 38 - то тут уже приемник просто не пропустит.
Я ж про сильно экзотические не говорю. Но лично я пробовал штук 5 различных пультов отличных от RC5 - все работало. Не захотел какой-то от Creative audigy и sony тож какой-то был. А так, это выключатель света в комнате, в которой навернякак пульт не один имеется. И хоть один будет работать. Если все совсем грустно - то в крайнем случае покупается на радиорынке любой RC5.



Цитата(VAHOO @ May 12 2008, 12:18) *
Извините, Клим, но я с вами не согласен,
у меня есть монжество протоколв, по моему надо настроить по махимум длини между импулсами,
а махимум примерно 9000 мкс, а модуляция сигнала здесь не причем, по моему надо
настроить таймер на 10 милисекунд,

У вас приемник настроен на 38кгц модуляцию. 36 с небольшими потерями тоже кушает. Все что по частоте ниже - будет очень плохо. Выше - вообще работать не будет.
А для 38кгц модуляции минимальная длина импульса 26микросекунд

Цитата(DpInRock @ May 12 2008, 12:18) *
По поводу удержания кнопок и повторных посылок.
Насколькоя я лично это дело делал, то существует специальный код - "Повтор предыдущей посылки". Он одинаков для повтора любой клавиши.

В разных протоколах - по разному
adc
А в чем вопрос? Поскольку приемник детектирует сигнал (обрезает засветки и помехи) то на выходе у него последовательность импульсов с интервалами в зависимости от протокола. Достаточно принимаемым контроллером определить присутствие импульсов (вообще любых!!!) и это и будет условием переключения, включения, уменьшения/увеличения яркости.
Уменьшение/увеличение яркости делаем так:
Опрос входа(периодичность хоть 1 сек) на наличие импульсов (любых импульсов) есть значит увеличиваем. Закончились- ждем следущей непрерывной посылки при которой будем уменьшать яркость и т.д.
вход в режим регулировки (чтобы случайно не срабатывало при управлении тв) можно установить по присутствию сигнала с условными интервалами пакетов.
Может вас этот вариант устроит...
Есть только вопрос с пультами которые посылают после отправки команды короткие команды подтверждения.. но думаю можно решить это алгоритмами в контроллере.
VAHOO
Цитата(DpInRock @ May 12 2008, 13:18) *
По поводу удержания кнопок и повторных посылок.
Насколькоя я лично это дело делал, то существует специальный код - "Повтор предыдущей посылки". Он одинаков для повтора любой клавиши.

http://ru.wikipedia.org/wiki/%D0%9F%D1%83%...%BD%D0%B8%D1%8F

Вот тут все написано. И есть ссылки на системы кодирования.


ни у всех протоколов, у RC-5, PANASONIC да, а у NEC a после первой посылки отправляет
только стартовый импулс.
=AK=
Цитата(adc @ May 12 2008, 19:00) *
А в чем вопрос? Поскольку приемник детектирует сигнал (обрезает засветки и помехи) то на выходе у него последовательность импульсов с интервалами в зависимости от протокола. Достаточно принимаемым контроллером определить присутствие импульсов (вообще любых!!!) и это и будет условием переключения, включения, уменьшения/увеличения яркости.
Уменьшение/увеличение яркости делаем так:
Опрос входа(периодичность хоть 1 сек) на наличие импульсов (любых импульсов) есть значит увеличиваем. Закончились- ждем следущей непрерывной посылки при которой будем уменьшать яркость и т.д.
вход в режим регулировки (чтобы случайно не срабатывало при управлении тв) можно установить по присутствию сигнала с условными интервалами пакетов.

Вот это вполне разумный и осуществимый вариант. Не протоколы изучать и декодировать, а обнаруживать сам факт ИК посылки на частоте, близкой к 38 кГц.

Цитата(VAHOO @ May 12 2008, 19:03) *
ни у всех протоколов, у RC-5, PANASONIC да, а у NEC a после первой посылки отправляет
только стартовый импулс.

А ведь есть протоколы, которые делают с точностью до наоборот: сначала посылают "стартовый" пакет, а потом повторяют информационные пакеты. smile.gif
VAHOO
Цитата(Клим @ May 12 2008, 13:28) *
Насчет модуляции сильно отличной от 38 - то тут уже приемник просто не пропустит.
Я ж про сильно экзотические не говорю. Но лично я пробовал штук 5 различных пультов отличных от RC5 - все работало. Не захотел какой-то от Creative audigy и sony тож какой-то был. А так, это выключатель света в комнате, в которой навернякак пульт не один имеется. И хоть один будет работать. Если все совсем грустно - то в крайнем случае покупается на радиорынке любой RC5.
У вас приемник настроен на 38кгц модуляцию. 36 с небольшими потерями тоже кушает. Все что по частоте ниже - будет очень плохо. Выше - вообще работать не будет.
А для 38кгц модуляции минимальная длина импульса 26микросекунд
В разных протоколах - по разному


если я буду брать знаяение TCNTx, мне больше не надо по моему прерывание от таймера и здесь
модуляция ни причем
Клим
Цитата(VAHOO @ May 12 2008, 12:44) *
если я буду брать знаяение TCNTx, мне больше не надо по моему прерывание от таймера и здесь
модуляция ни причем

прерывание от таймера происходит при слишком длительной паузе. По нему определяется окончание посылки.
Про модуляцию я сказал к тому, что длина импульса на выходе из приемника не может быть меньше 26мкс.
VAHOO
Цитата(adc @ May 12 2008, 13:30) *
А в чем вопрос? Поскольку приемник детектирует сигнал (обрезает засветки и помехи) то на выходе у него последовательность импульсов с интервалами в зависимости от протокола. Достаточно принимаемым контроллером определить присутствие импульсов (вообще любых!!!) и это и будет условием переключения, включения, уменьшения/увеличения яркости.
Уменьшение/увеличение яркости делаем так:
Опрос входа(периодичность хоть 1 сек) на наличие импульсов (любых импульсов) есть значит увеличиваем. Закончились- ждем следущей непрерывной посылки при которой будем уменьшать яркость и т.д.
вход в режим регулировки (чтобы случайно не срабатывало при управлении тв) можно установить по присутствию сигнала с условными интервалами пакетов.
Может вас этот вариант устроит...
Есть только вопрос с пультами которые посылают после отправки команды короткие команды подтверждения.. но думаю можно решить это алгоритмами в контроллере.


нет это не устроивает sad.gif , по моему оптимальный вариант, это сначало записать в EEPROM
а потом сравнить
Клим
Цитата(VAHOO @ May 12 2008, 12:53) *
по моему оптимальный вариант, это сначало записать в EEPROM
а потом сравнить

Только ж как будете "сначало записать в EEPROM", сначала примите команду в RAM послностью, а потом уже писать в епром - там задержки большие.
VAHOO
Цитата(Клим @ May 12 2008, 13:58) *
Только ж как будете "сначало записать в EEPROM", сначала примите команду в RAM послностью, а потом уже писать в епром - там задержки большие.



я так и делаю, только непонимаю почему от расстоянии, пульт от фотоприемника,
паузы между импулсами меняются???
пробал разные пульты.
Клим
Цитата(VAHOO @ May 12 2008, 13:04) *
я так и делаю, только непонимаю почему от расстоянии, пульт от фотоприемника,
паузы между импулсами меняются???
пробал разные пульты.

Насколько сильно меняются ?
Осциллограмму в студию smile.gif
VAHOO
Цитата(Клим @ May 12 2008, 14:13) *
Насколько сильно меняются ?
Осциллограмму в студию smile.gif



сейчас TSOP подключю к саунд карту и в саунд фордже посмотрю и скажу,
по моему идеальный осциллограф smile.gif

Цитата(VAHOO @ May 12 2008, 14:39) *
сейчас TSOP подключю к саунд карту и в саунд фордже посмотрю и скажу,
по моему идеальный осциллограф smile.gif



с расстоянии 5 см между импулсами 1111 мкс, а 1м 1156мкс crying.gif
DpInRock
Вы читали или не читали мою ссылку? В пустую, что-ли?
Ничего там не меняется. Сто раз делал такие приемники.

Алгоритм простой. Измеряете длительность посылок 0 и 1. Сохраняете эти числа в РАМ. Все. Дальше их можно превратить в код (см. документацию про RC5). А можно и не превращать. Тогда сравнивать одну посылку с другой следует с неким допуском погрешности для измеренных числе.

Задача очень простая.
Клим
Цитата(VAHOO @ May 12 2008, 14:16) *
сейчас TSOP подключю к саунд карту и в саунд фордже посмотрю и скажу,
по моему идеальный осциллограф smile.gif
с расстоянии 5 см между импулсами 1111 мкс, а 1м 1156мкс crying.gif

Вообще мерять при 5см - это не правильно.
Можно сравнивать метр и 3 метра.
Погрешность в 4% как у вас это вполне приемлимо.
Только вот я не понял, что значит у вас "расстояние между импульсами" ? И какой пульт ? РЦ5?
VAHOO
Цитата(Клим @ May 12 2008, 15:28) *
Вообще мерять при 5см - это не правильно.
Можно сравнивать метр и 3 метра.
Погрешность в 4% как у вас это вполне приемлимо.
Только вот я не понял, что значит у вас "расстояние между импульсами" ? И какой пульт ? РЦ5?


пульт протокол NEC, а расстояние между пульта и фотоприемника,
паузы между импулсами 1111 мкс (на 5см) и 1156 мкс (на 1м)


Цитата(DpInRock @ May 12 2008, 15:16) *
Вы читали или не читали мою ссылку? В пустую, что-ли?
Ничего там не меняется. Сто раз делал такие приемники.

Алгоритм простой. Измеряете длительность посылок 0 и 1. Сохраняете эти числа в РАМ. Все. Дальше их можно превратить в код (см. документацию про RC5). А можно и не превращать. Тогда сравнивать одну посылку с другой следует с неким допуском погрешности для измеренных числе.

Задача очень простая.


да читал вашу ссылку,

" Измеряете длительность посылок 0 и 1." как?
вот в чем вапрос, у разных пультов разные определение в 0 и 1
Клим
Цитата(VAHOO @ May 12 2008, 14:41) *
пульт протокол NEC, а расстояние между пульта и фотоприемника,
паузы между импулсами 1111 мкс (на 5см) и 1156 мкс (на 1м)

Зато длина импульса уменьшится smile.gif
Это вполне нормальные цифры.
Цитата
" Измеряете длительность посылок 0 и 1." как?
вот в чем вапрос, у разных пультов разные определение в 0 и 1

Если вы имеете в виду логический протокол - то забудьте про него. Тут есть выход с приемника у которого - 0 когда идут ИК импульсы с частотой 38кгц и лог.1 - когда не идут. Вот время между сменами состояние и надо мерять. Причем не настолько точно.
DpInRock
У вашего ПРИЕМНИКА определение 0 и 1 соответсвующее ИМЕННО ЭТОМУ приемнику.
Приемник просто демодулирует посылку. А вы превращаете эту посылку в список длительностей.
Скажем, в посылке 30 бит. Значит длина массива с длительностями будет где-нибудь 60 байт. (Первую длинную можно не учитывать, а использовать как признак начала посылки).
Если столько места нет, то превращать эти длительности тупо в биты.
Например, замерили вы следущее:
100, 30, 47, 210, 150 каких нибудь единиц времени.
Видим, что минимальная длительность бита - 30. значит превращаем эти числа в биты:

11101000000011111 - уже намного короче. И делать это можно по ходу действия. Только заранее забить минимальную длительность бита. Можно брать реальную (будет точнее), а можно и от балды.
domowoj
А зачем писать массив?
Можно же сразу анализировать 1 или 0 и писать в память сод посылки.
http://fi-com.ru/mcu/rc5.htm
DpInRock
Цитата
Можно же сразу анализировать 1 или 0 и писать в память сод посылки.

1. Нам неизвестна природа посылки.
2. Нам неизвестна скорость передачи
3. Единственное, что мы знаем наверняка, это то, что из приемника выходит некая последовательность уровней. Эти последовательности обычно разделены паузой. Все.

Записывая же напрямую битовую последовательность, мы можем напороться (и скорее всего напоремся) на ЛИШНИЕ или недостающие биты (из-за незнания точной скорости и из-за неумение ее точно поддерживать, как нами так и передатчиком).

То, как я описал - я лично делал. Работало со всеми пультами, которые видел приемник. Т.е. обучаемость была очень высокая. С полтыка.
VAHOO
Цитата(DpInRock @ May 12 2008, 18:32) *
У вашего ПРИЕМНИКА определение 0 и 1 соответсвующее ИМЕННО ЭТОМУ приемнику.
Приемник просто демодулирует посылку. А вы превращаете эту посылку в список длительностей.
Скажем, в посылке 30 бит. Значит длина массива с длительностями будет где-нибудь 60 байт. (Первую длинную можно не учитывать, а использовать как признак начала посылки).
Если столько места нет, то превращать эти длительности тупо в биты.
Например, замерили вы следущее:
100, 30, 47, 210, 150 каких нибудь единиц времени.
Видим, что минимальная длительность бита - 30. значит превращаем эти числа в биты:

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


тoгда последовательность будет ВСЕГДА 01010101010101010101010101010101 , по моему,

если не жалко поделитесь с кодом
Клим
Цитата(VAHOO @ May 12 2008, 20:19) *
тoгда последовательность будет ВСЕГДА 01010101010101010101010101010101 , по моему,

если не жалко поделитесь с кодом

Да последоваельность будет именно такая. Только нас интересует длина каждого 0 и каждой диницы.
DpInRock
НЕТТТ!!!
Еще раз.
1. Засекаете переход, например в ноль.
2. Включаете таймер.
3. Ждем переход в 1
4. Записываем длительность посылки и обнуляем таймер
5. Ждем переход в ноль
6. Записываем длительность посылки, обнуляем таймер. Гоу то пункт 3.

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

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

Ясно?
--
Пример.
Длительность нуля 150
Длительность 1 - 200
Длительность 0 -30
Длительность 1 60
....

Из этого делаем вывод
что сначала пришло 5 нулей
потом 7 единиц
потом один НОЛЬ
потом 2 единицы.
Понятно????

Кода у меня нет. Убил давно.
Клим
Цитата(DpInRock @ May 12 2008, 21:37) *
НЕТТТ!!!
Еще раз.
1. Засекаете переход, например в ноль.
2. Включаете таймер.
3. Ждем переход в 1
4. Записываем длительность посылки и обнуляем таймер
5. Ждем переход в ноль
6. Записываем длительность посылки, обнуляем таймер. Гоу то пункт 3.

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

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

Чем ваш алгоритм отличается от того, что я привет в во 2м или 3ем ответе на эту тему ?
Я понимаю, о чем вы говорите, но это лишнее для понимания общей сути.
И для того чтобы вычислить "минимальную длину" импульса необходимо собрать массив этих всех импульсов.
DpInRock
Отличается степенью доходчивости до клиента. Ибо если так непонятно, то надо объяснять сяк. Или эдак. До получения результата.

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

10101010101 - не такая. Против этого я возражал и возражаю.
Клим
Цитата(DpInRock @ May 13 2008, 08:13) *
Отличается степенью доходчивости до клиента. Ибо если так непонятно, то надо объяснять сяк. Или эдак. До получения результата.
10101010101 - не такая. Против этого я возражал и возражаю.

Смотря как тактировать. Если просто фиксировать изменение фронта сигнала, то будет именно такая smile.gif. Т.е. после 1 будет обязательно 0 и наоборот smile.gif
Вы же предлагаете синхронизировать каким-нибудь сигналом, изначально не зная какая минимальная длина импульса.
Т.е. для записи надо учитывать именно длины импульсов. А вот при распознавании уже можно упаковать это все.
VAHOO
Цитата(DpInRock @ May 13 2008, 09:13) *
Отличается степенью доходчивости до клиента. Ибо если так непонятно, то надо объяснять сяк. Или эдак. До получения результата.
10101010101 - не такая. Против этого я возражал и возражаю.


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

и как обайтис с протоколм RC-5?
там же управляющий бит всега инверсный.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.