IRremote и прерывания

mikrob24RUS
Offline
Зарегистрирован: 30.04.2014

Всем привет!

Нужна помощь!!! Делаю устройство на базе UNO, с ИК приёмником в котором сначала требовалось использовать только одно прерывание. Использую библиотеку IRremote. Прерывание использовал INT0, что на 4-ой ноге ATMega. Потом потребовалось использовать функцию tone. Прошёлся по "граблям" с таймерами(IRremote + tone). Решение нашёл здесь. Всё заработало!

Теперь возникла потребность использовать второе прерывание INT1. Теперь наглухо отвалился IRremote... Возможно ли использовать одновременно оба прерывания + функцию tone + IRremote?

Растолкуйте чайнику! Заранее сспасибо!

mikrob24RUS
Offline
Зарегистрирован: 30.04.2014

Всем ещё раз привет!

Нашёл решение всех своих проблем и решил описать. Вдруг кому пригодится!

В общем прошёлся я вот ещё по каким "граблям".... При использовании библиотеки IRremote, той версии, что идёт с инсталятором оболочки для разработки, попадаешь в "страну чудес"! То одна системная функия станет недоступна, то прерывание "отвалится". Писал я значит программу. Пока программа была небольшого об\ема и с малым количеством переменных ИК работал. В какой-то момент начались "глюки" с распознованием кодов с ИК пприёмника. Ещё немного кода добавил и IRremote уже не способен распознавать коды. Вместо ожидаемых кодов кнопок из библиотеки посыпался какой-то шум. Правильно распознавались лишь 2-3 нажатия из 20-30. и чем больше дописывал код основной программ, тем становилось всё хуже и хуже. При чём, загружая пустой скетч, в котором только проверка ИК, вновь 100% "попаданий по кодам.

Явно стало очевидным, что дело не аппаратной части, в общем-то. Полез штурмовать интернет и наткнулся на сайт разработчиков IRremote. Скачал свежую версию, установил и сразу все проблемы (связанные с ИК) в большой программе ИСЧЕЗЛИ!

Вывод: Если работаете с ИК и возникают непреодалимые или даже необъяснимые сбои, помехи и т.п., то смело ищите и качайте свежую версию IRremote и скорее всего будет Вам счастье!!!

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

хм.. и, какая версия IRremote самая свежая, где сайт разработчиков?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Клапауций 999 пишет:

хм.. и, какая версия IRremote самая свежая, где сайт разработчиков?

которая не пахнет!

mikrob24RUS
Offline
Зарегистрирован: 30.04.2014

https://github.com/z3t0/Arduino-IRremote

Кстати длительный опыт эксплуатации устройства показал, что глюки с распознанием кодов по прежнему имеют место быть, но в значительно меньшей степени.

Клапауций 998
Offline
Зарегистрирован: 12.08.2015

mikrob24RUS пишет:

https://github.com/z3t0/Arduino-IRremote

Кстати длительный опыт эксплуатации устройства показал, что глюки с распознанием кодов по прежнему имеют место быть, но в значительно меньшей степени.

какого рода глюки имеют место быть?

mikrob24RUS
Offline
Зарегистрирован: 30.04.2014

mikrob24RUS пишет:

В какой-то момент начались "глюки" с распознованием кодов с ИК приёмника. Ещё немного кода добавил и IRremote уже не способен распознавать коды. Вместо ожидаемых кодов кнопок из библиотеки посыпался какой-то шум. Правильно распознавались лишь 2-3 нажатия из 20-30. и чем больше дописывал код основной программ, тем становилось всё хуже и хуже. При чём, загружая пустой скетч, в котором только проверка ИК, вновь 100% "попаданий по кодам.

Ещё одно странное проявление: прикрывая пальцем примерно на 50% "линзу" ИК-приёмника или ИК-передатчика, коды распознаются в 99% случаев правильно. Я пока вообще отказываюсь что-либо понимать... Иной раз с момента загрузки МК всё работает идеально, а иной раз вылазит такой глюк.

mikrob24RUS
Offline
Зарегистрирован: 30.04.2014

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

Может кто подскажет как при занятом другими делами прерывании INT0, навешать ИК приёмник на ногу INT1, и в момент поступления сигнала вызывать обработку бибилотекой поступившего сигнала?

По умолчанию, я так понял библиотека работает исключительно по таймеру(прерыванию), который в определённых случаях может и пропустить своё важное дело, обработать, в данном случае сигналы с ноги ИК. Так и теряются данные и появляется "шум". У меня программа большая и видимо не совсем оптимально написана и такие случаи, чем дальше тем больше, возникают. Хочу попробовать привязаться к внешнему прерыванию, и надеюсь перестанут теряться данные с ИК-приёмника.

Может кто-то что-то подсказать по данному вопросу? Если я конечно ясно описал ситуацию!? ))

SuperSU
Offline
Зарегистрирован: 04.11.2017

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

mikrob24RUS
Offline
Зарегистрирован: 30.04.2014

Исходник здесь - https://cloud.mail.ru/public/BVe8/ZQKMPb6wq

ua4fas
Offline
Зарегистрирован: 05.09.2019

Пару лет назад, устав воевать с IRremote и необходимости использовать все таймеры МК, поискал и нашёл библиотеку, работающую намного стабильней и использующую прерывание для ИК-приемника, и не использующую настройки таймеров. И с тех пор не знаю горя с Arduino. Это IRlib.

https://github.com/cyborg5/IRLib

Теперь началась та же морока, как у вас, с IRremoteESP8266 и альтернативы пока не нашёл.

mikrob24RUS
Offline
Зарегистрирован: 30.04.2014

Спасибо за ссылку! У меня авто уехало вместе с девайсом и не решённой проблемой к новому автовладельцу...

Logik
Offline
Зарегистрирован: 05.08.2014

ua4fas пишет:

 и не использующую настройки таймеров. И с тех пор не знаю горя с Arduino. Это IRlib.

Ага. Вот здесь как раз выбор какой таймер не использовать ;)

IRLibTimer.h стр.258

/* This section sets up the 50 microsecond interval timer used by the
 * IRrecv receiver class. The various timers hhave already been selected 
 * earlier in this file. 
 */

#if defined(IR_RECV_TIMER1)  // defines for timer1 (16 bits)
	#define IR_RECV_ENABLE_INTR    (TIMSK1 = _BV(OCIE1A))
	#define IR_RECV_DISABLE_INTR   (TIMSK1 = 0)
	#define IR_RECV_INTR_NAME      TIMER1_COMPA_vect
	#define IR_RECV_CONFIG_TICKS() ({ \
		TCCR1A = 0;   TCCR1B = _BV(WGM12) | _BV(CS10); \
		OCR1A = SYSCLOCK * USECPERTICK / 1000000;   TCNT1 = 0; })

#elif defined(IR_RECV_TIMER2)  // defines for timer2 (8 bits)
	#define IR_RECV_ENABLE_INTR    (TIMSK2 = _BV(OCIE2A))
	#define IR_RECV_DISABLE_INTR   (TIMSK2 = 0)
	#define IR_RECV_INTR_NAME      TIMER2_COMPA_vect
	#define IR_RECV_COUNT_TOP      (SYSCLOCK * USECPERTICK / 1000000)
	#if (IR_RECV_COUNT_TOP < 256)
		#define IR_RECV_CONFIG_TICKS() ({ \
			TCCR2A = _BV(WGM21);  TCCR2B = _BV(CS20); \
			OCR2A = IR_RECV_COUNT_TOP;   TCNT2 = 0; })
	#else
		#define IR_RECV_CONFIG_TICKS() ({ \
			TCCR2A = _BV(WGM21);   TCCR2B = _BV(CS21); \
			OCR2A = IR_RECV_COUNT_TOP / 8;   TCNT2 = 0; })
	#endif

#elif defined(IR_RECV_TIMER3)  // defines for timer3 (16 bits)
..........

Еще и содержит в себе делеи на десятки миллисекунд. Очень полезная )))

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

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Он некропостер, ему пофик

Logik
Offline
Зарегистрирован: 05.08.2014

Их двое.

IVAN222
Offline
Зарегистрирован: 19.04.2017

Вчера у меня была такая же проблема. Библиотека то же  IRremote. Когда датчик стоял в платке все работало чудесно, но место куда надо было устанавливать датчик, вмести с платкой не помещался. Датчик и платку соединил проводами 12 см. Начались глюки, то сигнал проходит, а в основном не проходит, я пустил экранированный провод - нет результата, когда припаял конденсатор на 100мкф проблема пропала. Источник питания у меня импульсный мне кажется он и дает помеху.

Green
Offline
Зарегистрирован: 01.10.2015

Logik пишет:

Их двое.

Я вообще не понимаю как эти некропосты появляются... Неужто сложно поглядеть на дату! Нет, надо отвечать как будто бы вчера.)))

mikrob24RUS
Offline
Зарегистрирован: 30.04.2014

IVAN222 пишет:
...я пустил экранированный провод - нет результата, когда припаял конденсатор на 100мкф проблема пропала...

У меня приёмник от Arduino был на удалении около метра, в салоне машины. Мне не помогли ни экранированный провод ни фильтра у самого приёмника...

IVAN222
Offline
Зарегистрирован: 19.04.2017

У меня от ардуино до платки около полу метра и от платки до датчика еще сантиметров 15. Попробуйте без провода то есть сразу датчик подключить к ардуино, как будет работать? Если будет работать нормально то причина в этом удлененном проводе. Попробуйте на сам датчик в питание последовательно поставить резистор ом 50-100 и сглаживающий конденсатор 100 мкф.

Alex178
Offline
Зарегистрирован: 06.03.2018

ТС не парьте мозги со слайконтролом, установите Intelli Remote.