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

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

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

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



RC5

Сообщений 31 страница 60 из 80

31

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

а купить массово ИК-приёмник на эту частоту уже напряжно

TSOP2236 или tsop31236 - вроде на али и ебай всё есть, от 1 штучки или по 5...

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

0

32

Столкнулся с такой проблемой, необходимо сделать пульт и приемник.

за пульт взял ATmega8, потому как в ATtiny13 нет таймера 1
За приемник идет ATtiny13, мне всего две команды надо гонять

В приемнике по RC-5 уходит в прерывание, принимает адрес, команды, выходит из прерывания и дальше уже обработка идет.

Сначала столкнулся с проблемой, что после отправки кода RC-5 вывод оставался в высоком состоянии.

Поборол это через  Tccr1a = 0

Далее заметил, что при приеме Тинька уходит в прерывание и из него не возвращается, как-будто не может принять адрес и команду (дешифровать RC-5).

Перепробовал много примеров и не могу понять или протеус не может обработать IRLINK или я не с той деревни.

Перепробовал кучу примеров, с хэлпа и с интернета. Никак не хочет работать. Архив прилагаю.

Помогите разобраться, пожалуйста!

Архив zip на ЯДиске

0

33

надо сперва определиться с задачей
Вам именно RC5 надо принять и расшифровать или просто определить факт нажатия определенной кнопки?
первое - расшифровать протокол, второе - принять некий массив данных и сравнить по условию
я всё выкладывал в теме про FastAVR, поищите у нас на форуме

0

34

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

Вам именно RC5 надо принять и расшифровать или просто определить факт нажатия определенной кнопки?

тз для начала такое:
пульт на ATmega8, 2 кнопки, отдает адрес 7, команда 1 или команда 2 (соответственно кнопка 1 и кнопка 2).
на принимающей стороне - если адрес 7 то -> если команда 1 то переключаем один пин, если команда 2 то переключаем второй пин, ну или вариации вкл выкл один пин.

0

35

Попал в руки (полезно иногда ходить в гости) пультик примитивный, от чего уже не помнят...
Однозначно RC5 и 36 кГц (сзади стикер наклеен).
Надумал припупырить для своих нужд, но для этого надо знать коды этого пульта (адреса и команды).
Накопал в местных залежах код (ниже), собрал на макетке...
В результате: в Протеусе в "молчании" показывает Адрес=0, Команда=0, а в железе - Адрес=255, Команда=255...
На пульт не откликается (его исправность проверена).

Собственно, интересует не видимость пульта, а кардинальная разница в данных "молчания"...
Хотелось бы услышать мнение All'а... ;)

Код:
$Regfile="m8adef.dat"
$Crystal=8000000
$hwstack=64
$swstack=64
$framesize=64
$baud = 19200

$lib "mcsbyte.lbx"
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.0 , Rs = Portb.1
Cursor Off

Config PORTB.3 =Input
Config Rc5 = PinB.3 , Timer = 1 , Wait = 2000
'Config Rc5 = PinB.3 , Timer = 1 , Wait = 110

Dim Address As Byte , Command As Byte

Enable Interrupts

Locate 1, 1
Lcd "Wait code..."
Waitms 500

Do
GetRC5(Address , Command)
   Locate 1, 1
   Lcd "Address: " ;  Address
   Locate 2, 1
   Lcd "Command: " ; Command
Waitms 500
   Locate 1, 1
   Lcd "Address:     "
   Locate 2, 1
   Lcd "Command:     "
Loop

End

0

36

Вот точно рабочий код, под себя поправите:

Код:
$regfile = "m328pdef.dat"
$crystal = 16000000
$baud = 57600

Config Rc5 = Pind.3 , Wait = 100
Config Timer1 = Timer , Prescale = 1

Enable Interrupts

Dim Address As Byte , Command As Byte
Print "Waiting for RC5..."
Print

Do
Getrc5(address , Command)

If Address < 32 Then
   Command = Command And &B01111111
  Print "Адрес: " ; Address ; " , " ; "Команда: " ; Command
End If

Loop
End

0

37

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

Вот точно рабочий код, под себя поправите

Подправил, проверил...
Результат не изменился...
Исправность приемника сомнений не вызывает, выдернут из живой платы ТВ с разбитым кинескопом.
Репу уже счесал полностью... ;)

0

38

У приемника на выходе сигнал смотрели? У приемников тоже декодер несущей есть..

0

39

Yuriy.pv написал(а):

У приемника на выходе сигнал смотрели? У приемников тоже декодер несущей есть..

Дома смотреть нечем, а на работу только 5-го...

А МК разве не фиолетово, какие несущие выдает приемник ?
Думаю, это критично для пары "передатчик-приемник"...

0

40

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

0

41

Yuriy.pv написал(а):

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

Пара меня интересует пока во вторую очередь...
Я хочу выяснить - правду мне в железе показывает или в Протеусе ? ;)
Что выдает TSOP на выходе при отсутствии сигнала пульта, какие "адрес-команда" в численном виде ?

0

42

Путем частичного скрещивания приведенного мной и кода от max удалось-таки добиться одинаковости показаний в Протеусе и в железе - 255/255.
Пульт мы не видим все равно, но это можно объяснить, что приемник не 36 кГц (он из ТВ Aiwa "лохматых годов").
Новый TSOP на 36 кГц смогу заполучить только завтра, если после сегодняшней пурги расчистят дороги... ;)
Так что интригу оставляю открытой... ;)

0

43

ну хоть у кого то новый год со снегом удался))

0

44

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

Я хочу выяснить - правду мне в железе показывает или в Протеусе ?

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

0

45

Yuriy.pv написал(а):

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

Протеус 7.10 SP0
Bascom 2.0.7.8

0

46

Yuriy.pv написал(а):

ну хоть у кого то новый год со снегом удался))

Эта "удача" - с октября и до начала июня и так из года в год... ;)

Отредактировано Nord (2018-01-03 16:33:42)

0

47

А вот и наша зима - цветы цветут, только пчел не видно, спят наверное...
Фото сделаны сегодня. По правде говоря, уже хочется нормальной зимы.
http://s5.uploads.ru/t/v60aR.jpg
http://s4.uploads.ru/t/ZzCB1.jpg http://s9.uploads.ru/t/JdXlb.jpg
http://s7.uploads.ru/t/E5NaZ.jpg

0

48

Ну да.. нормально, эт где такая зима?

0

49

Yuriy.pv
Центральная (ближе к Югу) Украина, Таврийские степи...

0

50

чет как то аномально, в Полтаве служил вроде как недалеко, зимы нормальные были...

0

51

продам фотки снега. дорого. не гербалайф.  :glasses:

0

52

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

продам фотки снега. дорого. не гербалайф.

Модераторы нас за оффтоп сейчас нафотографируют... ;)

0

53

Дороги расчистили раньше, но добраться до продаванов смог только сегодня...
Результат: "нулячий" TSOP дает без сигнала пульта "255".
Пульт увиделся, списал его команды.

Самое интересное, что используемый ранее TSOP - тоже стал работать !
Воткнул его после проверки нового в макетку...
И ведь до этого перетыкал его не раз...

0

54

Где можно найти рабочий пример приема сигнала с любого пульта ?

0

55

Здесь есть для NEC, Samsung and Toshiba
https://www.mcselec.com/index2.php?opti … mp;t=13010
Только там регистрация нужна.

0

56

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

Здесь есть для NEC, Samsung and Toshiba
https://www.mcselec.com/index2.php?opti … mp;t=13010
Только там регистрация нужна.

Спасибо , а на русском есть чего ?

0

57

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

Спасибо , а на русском есть чего ?

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

0

58

radan, большое спасибо за код для пульта SAMSUNG, все работает, но немножко не так, как хотелось бы. Вместо таймер0 задействовал таймер1. С LCD все работает. Проблемы начались, когда вместо LCD подключил семисегментный индикатор, и задействовал таймер0 для динамической индикации. Команды не считываются, на индикаторе постоянно нули. В момент нажатия кнопки сегменты начинают мерцать, и больше ничего. Видимо как то не ладят прерывания между собой. Помогите советом.

Код
Код:
 $regfile = "m8def.dat"
$crystal = 8000000                                          'внутренний генератор
Config Portc = Output : Config Portb = Output : Config Portd = Output
Config Portd.2 = Input : Set Portd.2
A Alias Portd.7 : B Alias Portd.5 : C Alias Portd.1 : D Alias Portd.3 : E Alias Portd.4 : F Alias Portd.6 : G Alias Portd.0       ' : H Alias Portd.2
Dig1 Alias Portb.0 : Dig2 Alias Portb.1 : Dig3 Alias Portb.2 : Dig4 Alias Portb.3

Dim W As Byte , Z As Byte , Y As Byte , I As Byte , X As Byte , Chislo(4) As Integer , T_p As Word
Config Timer0 = Timer , Prescale = 8 : On Timer0 Pulse
 Enable Timer0 : Start Timer0

Config Timer1 = Timer , Prescale = 256                      '8000000/256=31250 Hz
Config Int0 = Falling                                       'Прерывание по спаду
Stop Timer1                                                 'останавливаем таймер
Enable Timer1                                               'разрешаем работу таймера0
Enable Int0                                                 'разрешаем работу прерывания0
Enable Interrupts                                           'Разрешаем прерывания
On Timer1 Tikers                                            'работа по таймеру
On Int0 Infrared                                            'работа по прерыванию

Dim Tik As Word                                             'счётчик тиков таймера
Dim Byt As Byte                                             'счётчик принятых бит
Dim Repeat_flag As Bit                                      'флаг повтора
Dim Start_flag As Bit                                       'флаг стартового условия
Dim Address As Byte                                         'байт адреса
Dim Command As Byte                                         'байт команды
Dim Address_1 As Byte                                       'прямой байт адреса
Dim Command_1 As Byte                                       'прямой байт команды
Dim Address_0 As Byte                                       'инверсный байт адреса
Dim Command_0 As Byte                                       'инверсный байт команды
Dim Summa As Word

Do

Loop

End

 Tikers:                                                    'работа по таймеру

 Timer1 = 65534                                             '31250/(256-253)=10416,66 Hz (96 мкс)
                                                             '254 - TV SAMSUNG, 253 - DVD SAMSUNG и другие NEC
 Incr Tik
 If Tik >= 1200 Then                                        'если насчитали 1200 тиков, сбросили всё в исходное состояние
 Tik = 0
 Repeat_flag = 0
 Start_flag = 0
 Address_1 = 0
 Command_1 = 0
 Address_0 = 0
 Command_0 = 0
 Command = 0
 Address = 0
 Stop Timer1                                                'останавливаем таймер
 End If

  Return
'*******************************************************************************
  Infrared:

  Start Timer1                                              'запускаем таймер

  If Tik >= 139 And Tik < 150 Then                          'если случилось от 139 до 150 тиков - "СТАРТ"
  Address = 1
  Repeat_flag = 0
  Start_flag = 1
  Address_1 = 0
  Command_1 = 0
  Address_0 = 0
  Command_0 = 0
  End If

  If Tik >= 116 And Tik < 139 Then                          'если случилось от 116 до 138 тиков - "ПОВТОР"
  Address = 2
  Repeat_flag = 1
  Start_flag = 0
  End If

  If Tik >= 22 And Tik < 116 And Start_flag = 1 Then        'если случилось от 22 до 115 тиков - приняли "1"
   Incr Byt

    If Byt < 9 Then
     Shift Address_1 , Left
     Address_1 = Address_1 + 1
    End If

    If Byt >= 9 And Byt < 17 Then
     Shift Address_0 , Left
     Address_0 = Address_0 + 1
    End If

    If Byt >= 17 And Byt < 25 Then
     Shift Command_1 , Left
     Command_1 = Command_1 + 1
    End If

    If Byt >= 25 Then
     Shift Command_0 , Left
     Command_0 = Command_0 + 1
    End If
  End If

  If Tik >= 10 And Tik < 22 And Start_flag = 1 Then         'если случилось от 10 до 21 тика - приняли "0"
   Incr Byt

    If Byt < 9 Then
     Shift Address_1 , Left
    End If

    If Byt >= 9 And Byt < 17 Then
     Shift Address_0 , Left
    End If

    If Byt >= 17 And Byt < 25 Then
     Shift Command_1 , Left
    End If

    If Byt >= 25 Then
     Shift Command_0 , Left
    End If
  End If

 Tik = 0

  If Byt = 32 Then                                          'если приняли 4 байта, проверяем правильность приёма команды
    Address = Address_1
    Command = Command_1
  Byt = 0
  Repeat_flag = 0
  Start_flag = 0
  Stop Timer1                                               'останавливаем таймер
  End If

  Pulse:
 Stop Timer0
 T_p = Command
For I = 4 To 1 Step -1                                      ' разбиваем переменную
Chislo(i) = T_p Mod 10
T_p = T_p / 10
Next I
Set Dig1 : Set Dig2 : Set Dig3 : Set Dig4                   ' гасим индикатор
Incr W : If W > 4 Then W = 1                                ' выбираем какую цифру сейчас включать
Y = 0
Gosub Look : A = Z                                          ' зажигаем сегменты
Gosub Look : B = Z
Gosub Look : C = Z
Gosub Look : D = Z
Gosub Look : E = Z
Gosub Look : F = Z
Gosub Look : G = Z

Select Case W                                               ' включаем нужную цифру (w). Подаем минус на общий провод конкретной цифры

 Case 1 :                                                   ' а так же точку, где и когда надо
 Reset Dig1
' H = 1

 Case 2 :
 Reset Dig2
' H = 1

 Case 3 :
 Reset Dig3
' H = 1

 Case 4 :
 Reset Dig4
' H = 1

End Select
Start Timer0
 Return

Look:
Z = Chislo(w) * 7 : Z = Y + Z
Z = Lookup(z , Цифры)
Incr Y
Return

Цифры:

 ' для индикатора с общим минусом
Data 1 , 1 , 1 , 1 , 1 , 1 , 0                              '0
Data 0 , 1 , 1 , 0 , 0 , 0 , 0                              '1
Data 1 , 1 , 0 , 1 , 1 , 0 , 1                              '2
Data 1 , 1 , 1 , 1 , 0 , 0 , 1                              '3
Data 0 , 1 , 1 , 0 , 0 , 1 , 1                              '4
Data 1 , 0 , 1 , 1 , 0 , 1 , 1                              '5
Data 1 , 0 , 1 , 1 , 1 , 1 , 1                              '6
Data 1 , 1 , 1 , 0 , 0 , 0 , 0                              '7
Data 1 , 1 , 1 , 1 , 1 , 1 , 1                              '8
Data 1 , 1 , 1 , 1 , 0 , 1 , 1                              '9
Data 0 , 0 , 0 , 0 , 0 , 0 , 1                              '10           "-"
Data 0 , 0 , 0 , 0 , 0 , 0 , 0                              '11           "" пусто
Data 1 , 0 , 0 , 1 , 1 , 1 , 1                              '12            E
Data 0 , 0 , 0 , 0 , 1 , 0 , 1                              '13             r

Отредактировано Andrusha (2018-08-19 19:29:45)

0

59

В коде, подпрограмма динамической индикации вызывается 3906 раз в секунду (зачем так часто?) и в ней довольно много кода с вычислениями. Неудивительно что ничего нормально не работает. Вообще эту задачу на современных МК можно решить почти аппаратно (прием с пульта) и полностью аппаратно (динамическая индикация). Вероятно на XMega такое тоже получится сделать.

+1

60

Пётр, огромное спасибо за совет. Все получилось. Вот эти вычисления из п/п индикации перенес в главный цикл.

Код:
If Command <> 0 Then
    T_p = Command
    Command = 0
For I = 4 To 1 Step -1                                      
Chislo(i) = T_p Mod 10
T_p = T_p / 10
Next I
End If

Предделитель таймера 0 сделал 64. Раньше при этом значении мерцал индикатор, теперь нет. Код с пульта начал высвечиваться, но криво. Чтобы высветилось нужное значение, надо 4-5 раз нажать на кнопку. Изменил предделитель на 256. Код стал считываться четко, но стал мерцать индикатор. Изменил предделители обоих таймеров на 64, пересчитал таймер 1. У меня получилось значение 65528, но заработал код при значении 65529.

0