Форумы Modlabs.net: Связь на IR, нужна помощь - Форумы Modlabs.net

Перейти к содержимому

  • (3 Страниц)
  • +
  • 1
  • 2
  • 3
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

Связь на IR, нужна помощь

#41 Пользователь офлайн   Зинец Виктор 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 204
  • Регистрация: 02 Июнь 03

Отправлено 14 Июнь 2004 - 11:47

про стандарты (не на русском): вот накопал http://www.xs4all.nl...ledge/ir/ir.htm

про стандарт для хранения - читать тебе http://users.skynet....t2_protocol.htm вот это, агрегат, который получает и воспроизводит коды с ДУ

про eerpom в icc avr: открываешь хелп -> Programming AVR -> Accessing EEPROM и читаешь :-) ; если по-русски, то добавляешь в начало файла

#include <eeprom.h>



#define x_loc 0x01  // это адрес ячейки, в 0x00 лучше не писать ничего

а потом пишешь

char x;



EEPROM_READ(x_loc, x);


и все - в x - считанный байт из ячейки 0x01

вроде так; там в хелпе все понятно расписано
0

#42 Пользователь офлайн   Fusion 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 241
  • Регистрация: 25 Май 04

Отправлено 14 Июнь 2004 - 11:50

Зинец Виктор
Спасибо
0

#43 Пользователь офлайн   BlackAlex 

  • Advanced Member
  • PipPipPipPipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 458
  • Регистрация: 18 Апрель 03

Отправлено 14 Июнь 2004 - 12:14

по дальности - в советских пультах ставили последовательно 3-4 светодиода. А еще, у ИК, как и у обычных есть светимость, бери те, что помощнее.
0

#44 Пользователь офлайн   Fusion 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 241
  • Регистрация: 25 Май 04

Отправлено 15 Июнь 2004 - 09:19

Зинец Виктор
Поизучал материалы, что ты дал... Еще раз спасибо, узнал много нового и полезного....

Вот только еще остались вопросы, если можеш прочитай, и если знаешь ответь, плз...

Значит есть всего 3 метода модуляции сигнала... При чем изучив полученый сигнал, можно опредилить метод модуляции (об этом потом)... Дальше, грубо говоря, каждая фирма используя тот или иной метод модуляции и свой метод кодирования сигнала, передает данные с пульта на приемник....

Каждый метод модуляции можно описать не более чем 3 параметрами...

Но нам надо еще узнать и описать метод кодирования сигнала!!!! Вот тут начинается самое интересное...
Можно ли как-то, если можно то как, описать метод кодирования сигнала??? Стартовые биты, стоповые биты, есть ли они вообще.... И самая главная проблема - есть кодировки в киторых импульс повторяеться через паузу.... Как это отследить и сохранить???
Пока вырисовывается такая структура

unsigned char MType; // тип модуляции
unsigned char Par1,Par2,Par3; //параметры (временные)
unsigned char Start1,Start0,End1,End0;//старт-стоп биты
longint Data;//данные

Что ты думаешь об этом?????

Как узнать метод модуляции(продолжение):

берем середину пакета(откидываем стартовые и стоповые биты, если они есть)... Если в пакете все "0" - одинаковой длины - то это - Pulse-length code... Если "1" - Pulse-distance modulation... В противном случае - Bi-phase coding...
0

#45 Пользователь офлайн   Зинец Виктор 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 204
  • Регистрация: 02 Июнь 03

Отправлено 15 Июнь 2004 - 09:54

я сначала хотел тоже (при приеме) определять тип модуляции и его потом расшифровывать... чтоб если что - можно было потом правильные коды слать... потом забил (uirt2 я собирал, но мулей об отсылке кодов так и не пользовался)

(С) не знаю чей - "все придумано уже до нас"; это я про то, что по ссылке про протокол uirt-а почитай - может просто реализовать его и не морочить голову?..

вообще если честно - некогда сейчас ни думать, ни советовать что-то, привалил вагон абсолютно дурной (в смысле возникшей из-за чужой глупости) работы :e

з.ы. а мне влом писать unsigned char - если напишешь просто char, компилятор тебя поймет... (кардинальный способ - описать что u8 = unsigned char и писать везде u8 - только имхо некрасиво :) ... char - звучит, а u8 - не звучит...)
0

#46 Пользователь офлайн   Fusion 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 241
  • Регистрация: 25 Май 04

Отправлено 15 Июнь 2004 - 10:10

Зинец Виктор
Еще один вопросик, сколько (приблезительно) стоит дополнительная память????
Я про то, что все это замучено ради ее экономии.... может просто поставить еще один модуль памяти, и не париться, а хранить масив импульсов?????

Добавлено спустя 7 часов 34 минуты 43 секунды :

Люди...

Можно ли полагать, что универсальный пульт ДУ Мак2000(есть такая штука) посылает оригинальные пакеты пульта, на который он настроен?????
0

#47 Пользователь офлайн   Зинец Виктор 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 204
  • Регистрация: 02 Июнь 03

Отправлено 16 Июнь 2004 - 09:56

Цитата

Еще один вопросик, сколько (приблезительно) стоит дополнительная память????


БМП (в смысле "без малейшего понятия")

ты имеешь в виду очевидно ram память? а накладные расходы всякие по ее подключению/программированию? наверное проще все-таки над алгоритмом думать (имхо)

вообще в протоколе uirt, на который ссылка была, _вроде_ вся обязанность на анализ ложилась на компутер - контроллер получал посылку и передавал в обработанном виде хосту, а тот уже дальше с ней разбирался и формировал такой пакет для передачи

ну а про стоимость - поищи сначала название какой-нить подходящей тебе памяти, а потом в efind.ru...
0

#48 Пользователь офлайн   Fusion 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 241
  • Регистрация: 25 Май 04

Отправлено 16 Июнь 2004 - 10:14

Зинец Виктор

Ты наверное не понял, что я делаю... Это будет НЕЗАВИСИМОЕ устройство (не подключенное к компу).... Такой себе программируемый пультик.... Постараюсь сделать, что бы можно было пультов 5 запихнуть в EEPROM.... Сейчас пишу (на Delphi) анализатор принятых импульсов (по времени), а потом постараюсь все запихнуть в микроконтроллер (думаю, что надо будет купить с большей flash и EEPROM памятью, а то места вряд ли хватит).... Принятые импульсы беру с проги WinLirc (это, если тебе интересно), там если нажать Raw Codes (что-то типа того), то при нажатии на кнопку пульта он выдает импульсы и паузы считаные с ИК приемника... Кидаю это дело в Delphi в массив и анализирую.... Пока есть загвоздка с паузой между двумя пачками в одном пакете (ну это типа проверки правильности, ты об этом писал, вроде)... Если хватит FLASH памяти для программы, то надо будет только EEPROM докупить (для хранения кодов пультов)....

В общем такая петрушка получаеться...
0

#49 Пользователь офлайн   Зинец Виктор 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 204
  • Регистрация: 02 Июнь 03

Отправлено 16 Июнь 2004 - 11:26

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

по идее, раз так, то может стоит покопаться еще в доках: скажем, кнопка "канал 0" имеет свой код, кнопка "1" - свой; т.е. твой дивайс должен определять тип кодировки и знать коды различных команд в этой кодировке?.. да можно и просто составить такую таблицу, имея кучу пультов...

у меня было 3 пульта, 2 из них одного производителя, с нес-стандартом; коды кнопок у них одинаковы, но еще шлется код устройства - т.е. твой дивайс должен получив команду на обучение 1) определить стандарт кодирования 2) определить код устройства; если ты хочешь поддерживать 5 пультов, то он ищет, есть ли этот код уже в списке, нет - добавляет, есть - ничего не делает

потом, когда ты 1) как-то выбираешь пульт из 5, 2) нажимаешь копку, дивайс шлет код устройства и потом по таблице команд шлет команду

в теории почти красиво :gigi:
0

#50 Пользователь офлайн   Fusion 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 241
  • Регистрация: 25 Май 04

Отправлено 16 Июнь 2004 - 11:44

Я думаю сделать чуть по-другому:

Для каждого пульта буду хранить структуру, которая описывает тип кодировки и модуляции с временными параметрами Это максимум 8 байт (пока), но думаю, что можно будет уменьшить до 4-5... А для кнопок только их коды - максимум 8 байт(это если учитывать повторения, но с условием, что одна пачка не больше 4 байт [пока только такие и встречаются])... Тогда получается, что для каждого пульта надо максимум 5*8+8=48 байт памяти EEPROM.... Что уже радует :-)

Твой метод тоже хорош, но если есть необходимая память, ведь временные параметры (длина "1","0" там всяких) для разных фирм могут быть разными, а это думаю сожрет немало памяти...
0

#51 Пользователь офлайн   Зинец Виктор 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 204
  • Регистрация: 02 Июнь 03

Отправлено 16 Июнь 2004 - 11:53

вот искал свое и наткнулся:

AT45DB041B-SI Память DataFlash, 4 Мбит, последовательный интерфейс, два буферных ОЗУ по 264 байта

стоит 10 грн с копейками, это отсюда: http://www.biakom.co...shop.pl?id=2120
0

#52 Пользователь офлайн   Fusion 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 241
  • Регистрация: 25 Май 04

Отправлено 16 Июнь 2004 - 12:40

Зинец Виктор
Как ты думаешь, какой процент погрешности можно поставить по длине одного и того же импульса (ведь погрешность есть...) ????
У меня получаеться макс погрешность 34%!!!! И можно ли определив тип модуляции привести все значения к среднему (арифметическому например), то есть если у нас тип модуляции Pulse distance modulation то:

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

Или может, стоит взять максимальные, или минимальные значения????

Ответь, плз...

Добавлено спустя 43 минуты 33 секунды :

Зинец Виктор
Пасибо

Добавлено спустя 19 часов 15 минут 46 секунд :

Зинец Виктор
Может ли быть такое, что из-за херовых батареек пульт (Мак2000) шлет что попало?????
0

#53 Пользователь офлайн   Зинец Виктор 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 204
  • Регистрация: 02 Июнь 03

Отправлено 17 Июнь 2004 - 10:00

вывод про погрешность и про "...пульт (Мак2000) шлет что попало" ты делаешь на основании чего - того, что тебе выдает твоя программа на сом-порту? предположи на секунду, что это она (программа) сбоит?

ведь если у меня контроллер формирует паузы, тактуется он кварцем, у которого погрешность я думаю слегка << 34%, паузы стало быть тоже связаны прямо с его частотой - откуда тогда такие ошибки?

(я не знаю, как устроены пульты внутри, но есть подозрение такое, что там какой-то спецконтроллер, который вообще ничем кроме формирования правильных пауз не занимается)

да, если его (контроллер) нагрузить еще туевой хучей задач, с тыщей прерываний, то тогда всякое может быть... но еще раз, я все-таки думаю, что если в стандарте написано 1.2 мс, то там и будет 1.2 мс, а не 0,79 и не 1,6 (твой разброс 34%)

сделай анализер из контроллера - и экспериенс дополнительный, и будешь уверен в результатах

что-то типа - настрой таймер на 50 мкс, в обработчике прерывания просто увеличивай какую-то глоб. переменную-счетчик; дальше настраиваешь внешнее прерывание, где ir-приемник висит, на переход "1"->"0", как сработает - обнуляешь счетчик, запускаешь таймер, настраиваешь ext.int. на переход "0"->"1"; в след. срабатывании отсылаешь хосту по rs232 свой счетчик, умножишь потом это число на 50 и получишь длительность в микросекундах... вместе с показаниями счетчика еще надо слать какой-то маркер - длина чего это

или найди осцилограф и убедись, что там паузы тютя в тютю :beer:
0

#54 Пользователь офлайн   Fusion 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 241
  • Регистрация: 25 Май 04

Отправлено 17 Июнь 2004 - 10:17

Зинец Виктор

Что надо поменять когда перенастраиваешь внешнее прерывание???

с MCUCR = 0x02; на MCUCR = 0x03;?????
А там CLI(); или SEI(); не надо вызывать????

И еще, как запустить/остановить таймер???

И есть ли у тебя пример кода для работы с COM портом???? И куда что паять надо... А то я этого никогда не делал, и почти нихера не знаю...
0

#55 Пользователь офлайн   Зинец Виктор 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 204
  • Регистрация: 02 Июнь 03

Отправлено 17 Июнь 2004 - 12:50

почитай мой "опус" про прием кодов - там все это есть:

как менять MCUCR - это в даташите глядеть надо или в визарде каком-нибудь (как будто можно такие вещи напамять знать :) )

cli и sei ГЛОБАЛЬНО останавливают и запускают прерывания... а если тебе надо только timer0 остановить, так зачем все глушить? КРОМЕ конечно случая, где действ. надо все заглушить :)

настройка таймера (тут о timer1 речь идет):
void tmr_init (const char en) {

	if (en) {

		TCNT1 = tmr_cnt; 		// таймер на 200 us

		TCCR1B = tmr_div;	   	// div = 8

		TIMSK |= 1 << TOIE1;

	} else {

		TCCR1B = 0x00;

		TIMSK &= ~ (1 << TOIE1);

	};

}


TCNT1 = *** - это просто ты восстанавливаешь счетчик, с этого числа он будет идти вперед, пока не перевалит за 0xFF и не вызовет прерывание (FF это для 8-битного конечно таймера, а тут FFFF)
TCCR1B = <>0 - вот тут ты таймер и запускаешь, одновременно устанавливая, как часто он ++ делать будет - каждый такт контроллера, или каждые 8, или ... ну вобщем ты понял думаю :)
TIMSK |= 1 << TOIE1 - тут ты разрешаешь вызывать прерывания, когда счетчик переваливает свой максимум (т.е. можно разрешить прерывания и не запустить счетчик - и ничего никогда не произойдет; можно запустить счетчик, но не разрешить прерывания - то же самое)

что куда паять к сом-у - вот например картинка, как 2313 подключается к сом-у: Изображение; вместо мах232 есть аналоги дешевле (st232 напрмиер) или вообще на 2-х транзисторах, как в аппноуте 910 атмеловском

пример кода для icc avr или со стороны компа? со стороны компа просто - для делфи полно компонентов, а я так вообще терминальной программой часто пользуюсь и хватает

со стороны icc avr ничего нету; был у меня кусок, которым пользовался все время для связи через сом, с fifo, только он для асм-а, а сейчас все сообщения на lcd вывожу... но теоретич. в хелпе icc avr почитай, там как-то совсем просто - подключить какой-то *.h и потом просто тупо printf делать - все в послед. порт уйдет
0

#56 Пользователь офлайн   Fusion 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 241
  • Регистрация: 25 Май 04

Отправлено 17 Июнь 2004 - 13:13

Зинец Виктор
Я в визарде смотрел, получаеться:
для INT0 (Falling edge) :

#pragma interrupt_handler int0_isr:2

void int0_isr(void)

{

 //external interupt on INT0

}



//call this routine to initialize all peripherals

void init_devices(void)

{

 //stop errant interrupts until set up

 CLI(); //disable all interrupts

 port_init();



 MCUCR = 0x02;

 GIMSK = 0x40;

 TIMSK = 0x00;

 SEI(); //re-enable interrupts

 //all peripherals are now initialized

}


Для INT0 (Rising edge) тоже самое только
MCUCR = 0x03;


Я так понимаю, что при попадании в функцию int0_isr нужно поменять значение MCUCR на "обратное"... Тогда эта функция будет вызываться при каждом изменении состояния порта.... Правильно???

Потом, если таймер настроен на 50 uSec, то можно просто в функции прерывания менять значение счетчика.... Вроде тоже правильно....

И еще, в help где смотреть UART????
0

#57 Пользователь офлайн   Зинец Виктор 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 204
  • Регистрация: 02 Июнь 03

Отправлено 17 Июнь 2004 - 14:00

ну дык типа да (кстати, визард из icc avr никак почему-то не отражал мое желание настроить int2 - при любых комбинациях "галочек" заготовка получалась одна и та же - так что есть смысл все-таки пару раз перечитать даташыт, чтобы представлять, что должно получится)

про хелп: F1 -> Programming the AVR -> UART, EEPROM, etc и читаешь там - тебя ткнут в пример; потом разбираешься, что такое "...The default getchar and putchar functions use the UART in polled mode to read and write the port" - F1 -> C Library and Startup files -> Standart IO functions и читаешь все, что там написано...
0

#58 Пользователь офлайн   Fusion 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 241
  • Регистрация: 25 Май 04

Отправлено 19 Июнь 2004 - 21:44

Зинец Виктор
Все подключил по схеме.. Вроде как-то наваял передачу одного байта.... И прием его на компе, но есть одно НО... Иногда принимает то, что надо, а иногда что-то левое... Делаю так:

На контроллере:
TransmitByte (функция нашел в каком-то примере)...

А на компе OnRecieveByte приходит:
Buffer:Pointer; и BufferSize:Word;
принимаю так
var i:^Byte;
begin
i:=Buffer;
Label.Caption := IntToStr(i^);
end;

Что не так?????
0

#59 Пользователь офлайн   Зинец Виктор 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 204
  • Регистрация: 02 Июнь 03

Отправлено 21 Июнь 2004 - 10:04

ну вроде сильно ошибится в приеме негде... проверить можно - посмотри в любой терминальной программе, что в порт приходит, да и все

компонент для сом-порта правильно настроен (стоповые биты там, к-во бит в байте, скорость наконец)? передача в 2313 правильно настроена? кварц какой к 2313 подключен? минимум ошибок при работе с сом-портом дают кварцы 3.***, 11.059 МГц - про это в даташите почитай

попробуй передать от 2313 в комп строчку текста - приходит все и правильно?

если "хело это я" от контроллера твоя программа через сом-порт принимает и показывает стабильно нормально, значит надо рыться в твоей ф-ции передачи; надо искать закономерность какую-нибудь, когда ошибка проявляется - может на 3-й раз или там при передаче байта 0x12...
0

Поделиться темой:


  • (3 Страниц)
  • +
  • 1
  • 2
  • 3
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

4 человек читают эту тему
0 members, 4 guests, 0 anonymous users