Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » ! Санькины ПЛЮШКИ ! » Прием сигналов от ИК-пульта с RC5 с обработкой повторений


Прием сигналов от ИК-пульта с RC5 с обработкой повторений

Сообщений 1 страница 30 из 30

1

Тоже столкнулась с необходимостью использования ИК-пульта.
Купила набор: маленький пульт с пленочными кнопками и плату с ИК-приемником.
Стала бороться с граблями.
Баском поддерживает альтернативный, фоновый режим - то, что нужно!
Однако для этого приемник следует подключать к выводу запуска таймера ICP.
В моем случае это был PORTB.0.
Все ок, но не понравилось то, что не работало повторение. Пульт при удержании кнопок продолжает посылать команды, но штатными средствами принимается только первая.
К тому же оказалось, что нет никакого прерывания, и я должна отслеживать состояние битов внутренней переменной в цикле. Решение так себе, критичное к задержкам в цикле (если выполняется еще какая-то работа), и глючное: иногда принималось по одной команде, иногда по две...

Как обычно, пришлось разбираться.

На ту же ногу, куда подключен ИК-приемник, назначила прерывание PCINT.

В обработчике ставится флаг плюс происходит еще некоторое шаманство с дополнительным флагом. Для контроля приема в примере задействована штатная лампочка Arduino Nano на порту PORTB.5.

Что имеем в итоге:

При однократном нажатии кнопки ловим АДРЕС1 + КОМАНДА, при удержании начинаются посылки АДРЕС2 + КОМАНДА.
Это выводится в тестовом примере в UART.

Пример:

0x0723 - адрес однократного нажатия 0x07, команда 0x23
0x0D23 - адрес повторных посылок 0xD0, команда та же, 0x23
0x0D23 - " - и так далее, пока кнопка не будет отпущена.

Пульт также посылал для каждой кнопки одинаковые посылки  0x1F / 0x2A, которые в примере отсеиваются.

Никакой корреляции битов АДРЕС1 и АДРЕС2 я не обнаружила, такое впечатление, что все они от балды (парочка даже одинаковые).  Так что если в программе хотим раздельно обрабатывать однократное и повторное нажатие, придется держать два адреса. Правда, некоторые кнопки имеют одинаковый адрес нажатия и повтора - их между собой отличить не получится. Также не исключено, что у кнопок будет совпадать КОМАНДА (но будут разные адреса).

Код примера:

Код:
$regfile = "m328pdef.dat"
$crystal = 16000000
$hwstack = 64
$swstack = 64
$framesize = 128

config RC5 = PinB.0 , timer = 1 , prescaler = 64 , mode = background       ' (D12)
config PORTB.5 = output

dim a as byte, c as byte, flag_rc5_recieved as bit, flag_rc5_toggle as bit

   'В ATmega328 есть три группы прерываний PCINT, управление которыми осуществляется регистром PCICR:
   '7        6        5        4        3        2        1        0
   '-        -        -        -        -        PCIE2    PCIE1    PCIE0
   ' PCMSK0 отвечает за PORTB, PCMSK1 - PORTC, PCMSK2 - PORTD.

   'От какой группы выводов поступило прерывание, показывает регистр PCIFR:
   '7        6        5        4        3        2        1        0
   '-        -        -        -        -        PCIF2    PCIF1    PCIF0

   'Прерывание вызывает любое изменение на выводе. Выводы включаются через регистры-маски PCMSK2, PCMSK1, PCMSK0.

   'Регистр PCMSK2:
   '7        6        5        4        3        2        1        0
   'PCINT23  PCINT22  PCINT21  PCINT20  PCINT19  PCINT18  PCINT17  PCINT16

   'Регистр PCMSK1:
   '7        6        5        4        3        2        1        0
   '-        PCINT14  PCINT13  PCINT12  PCINT11  PCINT10  PCINT9   PCINT8

   'Регистр PCMSK0:
   '7        6        5        4        3        2        1        0
   'PCINT7   PCINT6   PCINT5   PCINT4   PCINT3   PCINT2   PCINT1   PCINT0

   pcmsk0 = &b000_0001                                      ' маска разрешает прерывание от PORTB.0, на которую подключен RC5
   set pcicr.pcie0                                          ' включим группу 0 прерываний (порт B)
   on PCINT0 int_rc5 save
   enable PCINT0                                            ' разрешим прерывания от группы  0
   enable interrupts

do
   if flag_rc5_recieved = 1 then
      _rc5_bits.4 = 0
      a = RC5_address
      c = RC5_command
      if _rc5_bits.2 = 0 and a <> 0x1F and c <> 0x2A then
         print "0x"; hex(a); hex(c)
      end if
      flag_rc5_recieved = 0
   end if
loop
end

int_rc5:
   toggle PORTB.5
   toggle flag_rc5_toggle
   if flag_rc5_recieved = 0  then
      if flag_rc5_toggle = 1 then
         set flag_rc5_recieved
      end if
   end if
return

P.S. Собственно, зачем в обработчике шаманство в виде toggle flag_rc5_toggle? Дело в том, что прерывания PCINT срабатывают на любое изменение сигнала на ножке, и это никак не регулируется (PCINT и значит Pin Change INTerrupt). Поэтому мы будем ловить прерывание дважды, и по фронту, и по спаду имульса. Переключение бита позволяет нам отсеять лишние срабатывания. В принципе, с той же целью мы могли бы просто проверять ножку на уровень: =0 или =1.

+5

2

Хороший описанный пример

0

3

Комплект, кому интересно, вот такой:

https://upforme.ru/uploads/0000/25/b8/2070/t853586.png

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

0

4

Решил попробовать, но что-то пошло не так. :dontknow: Ничего не менял, просто скопировал и нажал кнопочку "Компилировать". Bascom 2.0.8.1
https://upforme.ru/uploads/0000/25/b8/1811/t528743.jpg

0

5

Cirno_9 написал(а):

prescaler = 64

Лишняя буковка "r" ситуацию не изменила.

0

6

Andrusha написал(а):

Решил попробовать, но что-то пошло не так.
Ничего не менял, просто скопировал и нажал кнопочку "Компилировать". Bascom 2.0.8.1

Жаль, что Саша не указала версию Bascom.
Наверно, для подобных случаев это было бы желательно...

В 2.0.8.5 компилируется без ошибок.

+1

7

Andrusha написал(а):

Решил попробовать, но что-то пошло не так. :dontknow: Ничего не менял, просто скопировал и нажал кнопочку "Компилировать". Bascom 2.0.8.1
https://upforme.ru/uploads/0000/25/b8/1811/t528743.jpg

Версия компилятора 2.8.0.5.

В мануале сказано, "...when you use the MODE=BACKGROUND. This option is not available in the DEMO.", то есть опция работы в фоне доступна только в зарегистрированной версии, и недоступна в DEMO.

+1

8

Nord написал(а):

Andrusha написал(а):

    Решил попробовать, но что-то пошло не так.
    Ничего не менял, просто скопировал и нажал кнопочку "Компилировать". Bascom 2.0.8.1

Жаль, что Саша не указала версию Bascom.
Наверно, для подобных случаев это было бы желательно...

В 2.0.8.5 компилируется без ошибок.

Как написала выше, нужна зареганная версия. У каких-то алахакбаров брала. Вполне гуглится.

+1

9

Cirno_9 написал(а):

Версия компилятора 2.8.0.5.

В мануале сказано, "...when you use the MODE=BACKGROUND. This option is not available in the DEMO.", то есть опция работы в фоне доступна только в зарегистрированной версии, и недоступна в DEMO.

Но в хелпе не нашел и про параметр "prescaler" в строке Config RC5...  :dontknow:
Тем не менее компилятор хавает... ;)

0

10

У меня не Demo, крякнутая. Скачаю сегодня 2.0.8.5, попробую. Спасибо.

0

11

Andrusha написал(а):

У меня не Demo, крякнутая. Скачаю сегодня 2.0.8.5, попробую. Спасибо.

Перед установкой обязательно вычистить все следы предыдущей версии !
Установка в виде обновления не получится.

+2

12

Nord написал(а):

Cirno_9 написал(а):

    Версия компилятора 2.8.0.5.

    В мануале сказано, "...when you use the MODE=BACKGROUND. This option is not available in the DEMO.", то есть опция работы в фоне доступна только в зарегистрированной версии, и недоступна в DEMO.

Но в хелпе не нашел и про параметр "prescaler" в строке Config RC5...  :dontknow:
Тем не менее компилятор хавает... ;)

Именно prescaler, c r. Почему так? А фиг ее знает ))

0

13

Cirno_9 написал(а):

Именно prescale, без r. Почему так? А фиг ее знает ))

Дело не в правописании, а в отсутствии этого параметра в описании Config RC5 в хелпе на сайте...

0

14

Nord написал(а):

Cirno_9 написал(а):

    Именно prescale, без r. Почему так? А фиг ее знает ))

Дело не в правописании, а в отсутствии этого параметра в описании Config RC5 в хелпе на сайте...

https://upforme.ru/uploads/0000/25/b8/2070/t246783.png

+2

15

Nord написал(а):

Перед установкой обязательно вычистить все следы предыдущей версии !

Именно так и сделал. В общем всё получилось. Деинсталлировал старую версию, почистил, установил новую, код скомпилировался успешно. Всем спасибо за помощь. Хочу вот этот пульт попробовать.
https://upforme.ru/uploads/0000/25/b8/1811/t471448.jpg
Коды считаны программой Радана, хочу сравнить.

0

16

Andrusha написал(а):

Nord написал(а):

    Перед установкой обязательно вычистить все следы предыдущей версии !

Именно так и сделал. В общем всё получилось. Деинсталлировал старую версию, почистил, установил новую, код скомпилировался успешно. Всем спасибо за помощь. Хочу вот этот пульт попробовать.
https://upforme.ru/uploads/0000/25/b8/1811/t471448.jpg
Коды считаны программой Радана, хочу сравнить.

Тестовый код выше печатает в UART 16-разрядные коды, первый байт - "адрес", второй - "команда". Адрес для каждой кнопки отличается, смотря по тому, первое это нажатие или повтор (но пара кнопок имеют одинаковый адрес первого нажатия и повтора, почему-то). Команда всегда одинаковая и для первого нажатия, и для повторных. Но для других пультов это может быть и не так.

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

Код:
'// remote and virtual keys (commands)
'// remote stick command codes
const KEY_1 = 0x0723                                        ' first press only for keys 0...9
const KEY_2 = 0x1727
const KEY_3 = 0x081F
const KEY_4 = 0x181B
const KEY_5 = 0x0D25                                        ' same as repeat (!)
const KEY_6 = 0x0F21
const KEY_7 = 0x0800
const KEY_8 = 0x0603
const KEY_9 = 0x033D
const KEY_0 = 0x0202
const KEY_STAR = 0x1607
const KEY_GRID = 0x0403
const KEY_UP_F = 0x1D3A                                     ' first press
const KEY_UP_R = 0x153A                                     ' repeated press
const KEY_DN_F = 0x1126
const KEY_DN_R = 0x1326
const KEY_LEFT_F = 0x1C05
const KEY_LEFT_R = 0x0A05
const KEY_RIGHT_F = 0x1219                                  '} same first...
const KEY_RIGHT_R = 0x1219                                  '} and repeated
const KEY_OK = 0x1A04
' virtual commands
const KEY_NONE = 0xF000
const KEY_ENCMINUS = 0xF100
const KEY_ENCPLUS = 0xF200
const KEY_ENCBTN = 0xF300

Обработчик прерывания PCINT, на который подключен ИК-приемник:

Код:
int_rc5:
   toggle flag_rc5_toggle
   if flag_rc5_recieved = 0 then
      if flag_rc5_toggle = 1 then
         set flag_rc5_recieved
      end if
   end if
return

В основном цикле отслеживается флажок события "поступил RC5-код". Тут следует пояснить, что байты keyadr и keycmd  в блоке определений картированы на слово key и по сути являются его старшим и младшим байтом:

Код:
dim key as word
dim keycmd as byte at key overlay
dim keyadr as byte at key + 1 overlay

Сам основной цикл:

Код:
do
  '// RC5 keys processing
   if flag_rc5_recieved = 1 then
      _rc5_bits.4 = 0
      keyadr = RC5_address
      keycmd = RC5_command
      if _rc5_bits.2 = 0 and keyadr <> 0x1F and keycmd <> 0x2A then
         debug "# LOOP : RC5 : " ; hex(key)
         key_press
      end if
      flag_rc5_recieved = 0
   else
      if key <> KEY_NONE then
         debug "# LOOP : KEY : " ; hex(key)
         key_press
      end if
   end if
   key = KEY_NONE

'// some other code
'// ...

loop

Как видно, для отладочных целей обработка реальных и виртуальных кодов разделена. Но в принципе нет разницы. Самой обработкой занимается процедура key_press(). Не забываем сбросить код после обработки key = KEY_NONE !

Обработчик  key_press() содержит следующий код:

Код:
select case key
   case KEY_1 
   '// other keys
   '// ...
   case KEY_ENCBTN
end select

Внутри каждого case KEY_<something> могут быть дополнительные условия, например, смотря от режима, в котором находится устройство, одни и те же кнопки могут обрабатываться по-разному.

0

17

Cirno_9 написал(а):

https://upforme.ru/uploads/0000/25/b8/1743/t246783.png

Да, уже сам нашел...  :blush:
Это из тех случаев, когда описание используемых параметров не указываются в числе возможных с самого начала, а прячутся в описании других... ;)

+1

18

Andrusha написал(а):

Nord написал(а):

    Перед установкой обязательно вычистить все следы предыдущей версии !

Именно так и сделал. В общем всё получилось. Деинсталлировал старую версию, почистил, установил новую, код скомпилировался успешно. Всем спасибо за помощь. Хочу вот этот пульт попробовать.
https://upforme.ru/uploads/0000/25/b8/1811/t471448.jpg
Коды считаны программой Радана, хочу сравнить.

Такой же (или похожий) пультик у меня тоже есть, от встраиваемого мини-плеера. Все его коды совпадают с тем пультиком, что у меня на картинке, т.е. кнопки в тех же местах дают тот же код (только у меня нет кнопок 1, 3, 7, 9, соответственно). Похоже, у них одинаковая начинка и только пленочная клавиатура может быть с разными значениями. Интересно открыть пульт и посмотреть на плату: может быть, там есть перемычки, задающие кодовый набор (потому что третий такой пультик работает иначе).

0

19

Cirno_9 написал(а):

Все его коды совпадают с тем пультиком, что у меня на картинке

Хочется самому поковыряться.

Cirno_9 написал(а):

Интересно открыть пульт и посмотреть на плату

Он клееный, а ломать как-то не хочется. Завтра попробую аккуратно, если получится, сфоткаю. У меня другая беда. Купил, в своё время, три пульта, с заделом на будущее. В один поставил батарейку, а два других положил в стол. Те два в столе так и лежат, а куда дел с батарейкой - ума не приложу. Все столы и ящики несколько раз проверил, так и не нашёл. А ведь я с ним уже работал, разбирался, коды считывал. Может барабашка взял поиграться.  :crazyfun: Завтра продолжу поиск.

0

20

Там сверху наклейка. Под ней - плата с токопроводящими дорожками. С обратной стороны - чип-"капля" и несколько компонентов, включая транзистор и светодиод ИК.
Алгоритм работы, как и коды, зависят от производителя. Внешне все абсолютно одинаковы!
Мы заказывали внешне точно такие, только радио 433МГц. Под нас делали наклейки с нашими "кнопками" и пиктограммами.

Отредактировано Александр Д. (2024-01-27 23:09:32)

0

21

Cirno_9 написал(а):

Сам основной цикл:

А зачем гонять бесконечный цикл DO LOOP? Ведь нажатие кнопок происходит не очень часто. Можно использовать такую конструкцию:

Main:
  '// RC5 keys processing
   if flag_rc5_recieved = 1 then
    ........................
   end if
   key = KEY_NONE

   Config Powermode = IDLE  (или другой сон)            'Спим
   GoTo Main                                                              'Проснулись, идём проверять что случилось
   End
Для PCIINT можно даже POWEDOWN или более глубокий сон.
И батарейка будет служить гораздо дольше.

Отредактировано sva-don (2024-01-28 11:11:17)

0

22

sva-don написал(а):

Cirno_9 написал(а):

    Сам основной цикл:

А зачем гонять бесконечный цикл DO LOOP? Ведь нажатие кнопок происходит не очень часто. Можно использовать такую конструкцию:

Main:
  '// RC5 keys processing
   if flag_rc5_recieved = 1 then
    ........................
   end if
   key = KEY_NONE

   Config Powermode = IDLE  (или другой сон)            'Спим
   GoTo Main                                                              'Проснулись, идём проверять что случилось
   End
Для PCIINT можно даже POWEDOWN или более глубокий сон.
И батарейка будет служить гораздо дольше.

Отредактировано sva-don (Сегодня 08:11:17)

Для батарейного девайса - безусловно можно и нужно!

Просто в данном случае у меня девайс сетевой, блок управления УНЧ, и ему потребление в общем-то фиолетово. В рабочем режиме он и вовсе постоянно будет занят анализом спектра - как раз сейчас занимаюсь переводом своих легаси-наработок с компа на МК. Там для анализа используется занятный и довольно упрощенный алгоритм (сегодня я узнала, что это функции Уолша). Суть в том, что:
1) для простейшего анализатора спектра нам не обязательно знать фазу (комплексная часть преобразования), и даже не обязательно выполнять комплексное суммирование через квадратный корень. Достаточно вообще брать только вещественную компоненту.
2) для тех же целей вовсе не обязательно перемножать значения с плавающей точкой на значения синуса из предварительно вычисленной таблицы. Вполне достаточно вычислить ее с точностью -1, 0, 1, и, таким образом, заменить умножения на три варианта: вычитание из суммы, ничего не делать, прибавление к сумме. Это позволяет драматически ускорить вычисления и получить вполне приемлемый результат. Остается даже время на доп. вычисления типа сглаживания падения спектров и "поплавочки" (подскакивающие указатели максимума, которые потом медленно опадают или растворяются).
Тем не менее, работы чипу хватает.

0

23

Александр Д. написал(а):

Там сверху наклейка.

Так и оказалось. Корпус цельный, не клееный, чтобы разобрать нужно отклеивать наклейку. Не стал пульт курочить.

0

24

Cirno_9 написал(а):

В рабочем режиме он и вовсе постоянно будет занят анализом спектра

Я пока разобрался только с Хартли. Если есть желание найдите на форуме "Алгоритм Хартли в целях спектрального анализа."
Там описание и ссылка на исходник.

+1

25

Гы, прикольно
А я попробовал через RC5, не вышло с лёту, решил, что не поддерживает, и сделал через  Pulsein :blush:

0

26

как автор определяет начало посылки, а как - окончание?
Видели на осциллографе форму сигналов?

Код:

$regfile = "attiny13a.dat"
$crystal = 9600000                                          ' для Димки
' Принимаем команды ИК пульта DRE, преобразуем и выдаём как OPENBOX-S1

$hwstack = 8
$swstack = 8
$framesize = 16


Ir_receiver Alias Pinb.1                                    ' Подключение ИК-приёмника   #6
' По включению ноги МК = Входы

Ir_out Alias Portb.0                                        ' Выход  #5

Dim Temp As Byte , Tiki As Byte , Temp2 As Byte , Temp3 As Byte
Dim Data_1 As Byte , Data_2 As Byte , Data_3 As Byte , Data_4 As Byte


Start_prg:

  Config Ir_out = Input                                    ' Схема с ОК
  Waitms 100

  Bitwait Ir_receiver , Set                                ' Ждём сигнал = 1...
  Bitwait Ir_receiver , Reset                              ' Ждём сигнал = 0...

Aa:
  Temp = 245                                               ' Ждём _длинную_ паузу в сигнале >7500 us!

Ab:
  If Ir_receiver = 1 Then Goto Aa
  Gosub Waitus_30                                          ' Пауза
  Decr Temp : If Temp > 1 Then Goto Ab

Bb:
  Temp = 100                                               ' Ждём _длинный  сигнал

Bc:
  If Ir_receiver = 0 Then Goto Bb
  Gosub Waitus_30                                          ' Пауза
  Decr Temp : If Temp > 1 Then Goto Bc

  Bitwait Ir_receiver , Reset                              ' Ждем завершения сигнала

  Gosub Rx_ir : Data_1 = Data_4
  Gosub Rx_ir : Data_2 = Data_4
  Gosub Rx_ir : Data_3 = Data_4
  Gosub Rx_ir                                              ' Data_4


  If Data_1 = 0 Then                                       ' Если это пульт DRE
    Temp = 255 - Data_4

    If Temp = Data_3 Then                                 ' Если CRC сошлась, то:

       '-  КОНВЕРТЕР DRE >> Openbox-S1
      Data_1 = 16 : Data_2 = 111                         ' маркер пульта Openbox-S1

      Select Case Data_3
        Case 136 : Data_3 = 172                         ' Ch +
        Case 168 : Data_3 = 156                         ' Ch -
        Case 8 : Data_3 = 52                            ' Ch +2
        Case 240 : Data_3 = 244                         ' Ch -2

        Case 40 : Data_3 = 28                           ' Vol +
        Case 72 : Data_3 = 108                          ' Vol -
        Case 248 : Data_3 = 116                         ' Vol +2
        Case 2 : Data_3 = 12                            ' Vol -2

        Case 200 : Data_3 = 236                         ' OK
        Case 104 : Data_3 = 188                         ' Exit
        Case 0 : Data_3 = 132                           '  On\Off
        Case 24 : Data_3 = 68                           '  MUTE

        Case 192 : Data_3 = 196                         ' 1
        Case 32 : Data_3 = 36                           ' 2
        Case 160 : Data_3 = 164                         ' 3
        Case 96 : Data_3 = 100                          ' 4
        Case 224 : Data_3 = 228                         ' 5
        Case 16 : Data_3 = 20                           ' 6
        Case 144 : Data_3 = 148                         ' 7
        Case 80 : Data_3 = 84                           ' 8
        Case 208 : Data_3 = 212                         ' 9
        Case 48 : Data_3 = 180                          ' 0

        Case 130 : Data_3 = 220                         '  Back
        Case 176 : Data_3 = 4                           '  TV\Radio
      End Select

      Data_4 = 255 - Data_3                              ' CRC

    End If
  End If


          '= Передаем преамбулу ==========
  Config Ir_out = Output                                   ' Чтобы смочь управлять схемой ОК
  Ir_out = 0
  Waitus 8500
  Ir_out = 1                                               ' ____/----\____
  Waitus 4250
  Ir_out = 0
  Gosub Waitus_560


  Gosub Send_byte                                          ' data_1
  Data_1 = Data_2 : Gosub Send_byte                        ' data_2
  Data_1 = Data_3 : Gosub Send_byte                        ' data_3
  Data_1 = Data_4 : Gosub Send_byte                        ' data_4

  Goto Start_prg



'=========================================================
' ===============    ПРИЕМ КОМАНД ИК-ПУЛЬТА   ===================
Rx_ir:

  For Temp3 = 7 To 0 Step -1
    Tiki = 0
    Shift Data_4 , Left , 1

    Bitwait Ir_receiver , Set                             ' Ждём сигнал = 1...
    Waitus 300                                            ' пауза на часть импульса

    While Ir_receiver = 1
      Incr Tiki : Gosub Waitus_30
    Wend

    If Tiki > 30 Then Data_4 = Data_4 Or 1                'длинный -> бит =1

    Bitwait Ir_receiver , Reset                           ' Ждем завершения сигнала
  Next Temp3
Return


' ''===============    ПЕРЕДАЧА КОМАНД   ===================
Send_byte:

  For Temp2 = 7 To 0 Step -1
    Ir_out = 1
    Gosub Waitus_560

    If Data_1.temp2 = 1 Then Waitus 1080

    Ir_out = 0
    Gosub Waitus_560
  Next

Return



Waitus_560:
  Waitus 520
Return


Waitus_30:
  Waitus 30
Return

Отредактировано Александр Д. (2024-01-31 10:26:18)

0

27

kip написал(а):

Гы, прикольно
А я попробовал через RC5, не вышло с лёту, решил, что не поддерживает, и сделал через  Pulsein

Вариант через bitwait подходит только если устройство не делает никакой работы в фоне. PulseIn можно, наверное, приспособить на прерывание.
Но зачем, если есть готовая, и даже более того, встроенная в компилятор библиотека, позволяющая принимать RC5 в фоне? Нужно веское обоснование, чтобы отказываться от нее и городить свой собственный огород.

По итогам экспериментов предложенный мной вариант работает хорошо, несмотря на высокую нагруженность МК: в цикле обрабатывается еще несколько флагов от прерываний, в том числе весьма частых (VU-метр требует вычислений и отрисовки на дисплей каждые 20-30 циклов ADC, работающего на частоте 150 кГц (предделитель 128 от частоты кварца 16 МГц). Несмотря на это, сигналы пульта успевают обработаться четко.

+1

28

Прикол в том, что все посылки от ИК пульта можно принимать по UART в буфер, при этом не мешая основной программе. И ни надо ни каких заморочек. В частности этого пульта на скорости 1786

0

29

kip написал(а):

Прикол в том, что все посылки от ИК пульта можно принимать по UART в буфер, при этом не мешая основной программе. И ни надо ни каких заморочек. В частности этого пульта на скорости 1786

А какая должна быть битность / четность / стопы?

0

30

https://cxem.net/ik/2-21.php
вот от сюда пробовал, через терминал, как в комментариях под статьёй. Так же, как в комментарии было

+1


Вы здесь » Программирование ATMEL в BASCOM. » ! Санькины ПЛЮШКИ ! » Прием сигналов от ИК-пульта с RC5 с обработкой повторений