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

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

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

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



RC5

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

1

Понадобилось освоить ИК управление. И как всегда грабли. Код использовал стандартный с хелпа, ИК на 36кГц.
Прицепил ЖКИ для анализа кода. А в ответ тишина... Сам ИК импульсы выдаёт. Есть подозрения, что код не RC5. Пульты с телевизора и дивидишника SAMSUNG моделей этого года. Кто сталкивался с подобной проблемой? И если вдруг окажется, что код RC6 или другой, как приспособить эти пульты?

Код:
$regfile = "m8def.dat"
$crystal = 8000000
$lib "lcd4.lbx"
$lib "mcsbyte.lbx"

Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2
Config Rc5 = Pind.2

Enable Interrupts
Dim Address As Byte , Command As Byte

Do

Getrc5(address , Command)
Cls
Cursor Off
Lcd Address ; "  " ; Command

Loop

0

2

Знаком с такой ситуацией. TV Самсунг двухлетней давности. Как приспособить пульт не знаю. Проблему решил тупо, в лоб, покупкой китайского универсального пульта.

0

3

Какие пульты работают с протоколом RC5?

0

4

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

Какие пульты работают с протоколом RC5?

телевизор Philips Горизонт Витязь

http://pro-radio.ru/controllers/2997/
http://www.radiokot.ru/articles/14/

и т.д.

Отредактировано VladI+ (2007-10-23 07:18:02)

0

5

Коды RC5 и RC6 совместимы.
С ними нет никаких проблем.
А с RC4 я так и не разобрался, (это тот что в ЭЛЕКТРОНЕ му-55 стоял)

0

6

Спасибо, вижу два варианта. Первый как более лёгкий - купить ещё один пульт с RC5 что есть более просто но менее функционально, или освоить протокол NEC, с которым по-моему и работает Самсунг. По ссылке на Радиокоте есть исходник этого протокола на Си, но с Си у меня нет дружбы, хотя придётся разбираться с тем и тем.

0

7

В Киеве по 10 гривень пульты безимяные и заморачиваться с чем другим обламался
Нужно было срочно готовое изделие с того и пошло.... и теперь только RC5

0

8

_http://www.elektroda.pl/rtvforum/kb.php?k=3143&mode=article

Кое-что нарыл. Правда времени попробовать нет. Теперь до выходных.

0

9

Спасибо, VladI+  и ссылке http://www.radiokot.ru/articles/14/.
Перевёл на БАСКОМ, всё работает.

Фрагмент кода для работы с пультом ДУ протокол NEC.

Код:
'*******************************************************************************
'* Filename    : IR NEC by http://www.sbprojects.com/knowledge/ir/ir.htm
'* Revision    : 1.0
'* Controller  : ATMEGA8
'* Compiler    : BASCOM-AVR 1.11.8.3 DEMO
'* Author      : Rubashka Vasiliy , Ukraine , 2007
'* WWW         : http://ledeffects.net
'* Mail        : info@ledeffects.net
'* Thank you   : Aheir, aheir@radiokot.ru
'*******************************************************************************
$regfile = "m8def.dat"
$crystal = 8000000                                          'внутренний генератор
$lib "lcd4.lbx"

Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2
Config Pind.2 = Input
Config Portc.2 = Output
Config Timer0 = Timer , Prescale = 256                      '8000000/256=31250 Hz
Config Int0 = Falling                                       'Прерывание по спаду
Stop Timer0                                                 'останавливаем таймер
Enable Timer0                                               'разрешаем работу таймера0
Enable Int0                                                 'разрешаем работу прерывания0
Enable Interrupts                                           'Разрешаем прерывания

On Timer0 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                                                          'Основной цикл

Cls                                                         'Очистить ЖКИ
Cursor Off                                                  'Выключить курсор
Lcd Address ; " " ; Command                                 'Вывести на ЖКИ АДРЕС и КОММАНДУ
If Command = 8 Then Portc.2 = 1                             'Если нажата клавиша "P+" - включить светодиод
If Command = 240 Then Portc.2 = 0                           'Если нажата клавиша "P-" - выключить светодиод
Waitms 10                                                   'Задержка 10 мс
Loop
End                                                         'Конец основного цикла

'*******************************************************************************

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

 Timer0 = 253                                               '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 Timer0                                                'останавливаем таймер
 End If

  Return
'*******************************************************************************

 Infrared:                                                  'работа по прерыванию

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

  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 байта, проверяем правильность приёма команды
                                                             'если адрес или команда 16-ричные, проверка не проходит, поэтому закомментировано
    'Summa = Address_0 + Address_1
    'If Summa = 255 Then
    Address = Address_1
    'Else
    'Address = 0
    'End If

    'Summa = Command_0 + Command_1
    'If Summa = 255 Then
    Command = Command_1
    'Else
    'Command = 0
    'End If
  Byt = 0
  Repeat_flag = 0
  Start_flag = 0
  Stop Timer0                                               'останавливаем таймер
  End If

 Return

0

10

RC5 decoder
http://www.avrfreaks.net/index.php?module=Freaks Academy&amp;func=viewItem&amp;item_type=project&amp;item_id=1134

0

11

Народ по поводу RC5 такой вопрос, делаю я часы с управлениемот пульта (телевизионного). Принцип такой что при установки времени я хочу вводить само время с пульта, т.е. сейчас 14:50, значит я на пульте нажимаю последовательно 1 4 5 0 и должно все работать , но вместо этого у меня все принимается по разному. В чем может быть загвоздка???

Код:
$large
Baud = 9600                                                   ' Скорость обмена
$crystal = 11059200                                           ' Частота кварца
'---------------------------------------------------------------------------
P0 = 0
P1 = 0
P2 = 0
Config Scl = P3.6                                             ' I2C Clock
Config Sda = P3.7                                             ' I2C Data
Config Rc5 = P3.2
Dim All As Byte
'---------------------------------------------------------------------------
Sqw Alias P3.0                                                ' Square Pulse Out
Colon_d1 Alias P3.5                                           ' D1
Hour20 Alias P2.7                                             ' 20 Hour
Hour10_niz Alias P0.7                                         ' PM Mark
Hour10_verh Alias P1.7                                        ' 10 Hour
'------------------------------------------------------------------------
Dim Command As Byte , Subaddress As Byte
Dim Reg_sec As Byte                                           ' Секунды
Dim Reg_min As Byte                                           ' Минуты
Dim Reg_hour As Byte                                          ' Часы
Dim Tempb As Byte
Dim Temp1b As Byte
Dim Temp2b As Byte
Dim Temp3b As Byte
Dim Setup As Byte
Dim Cif As Byte
Cif = 1
Dim Keypad As Byte
Dim Key_set As Byte
Dim I As Byte
'---------------------------------------------------------------------------
Const Segpat0 = &B00111111                                    ' 0   ****A***
Const Segpat1 = &B00000110                                    ' 1   *      *
Const Segpat2 = &B01011011                                    ' 2   F      B
Const Segpat3 = &B01001111                                    ' 3   *      *
Const Segpat4 = &B01100110                                    ' 4   ****G***
Const Segpat5 = &B01101101                                    ' 5   *      *
Const Segpat6 = &B01111101                                    ' 6   E      C
Const Segpat7 = &B00000111                                    ' 7   *      *
Const Segpat8 = &B01111111                                    ' 8   ****D***
Const Segpat9 = &B01101111                                    ' 9
Const Segpblk = &B00000000                                    ' A BLANK
'---------------------------------------------------------------------------
Const Ds1307w = &HD0                                          ' Байт записи
Const Ds1307r = &HD1                                          ' Байт чтения
'---------------------------------------------------------------------------
' Чтение времени
'
I2cstart                                                      ' Старт передачи
I2cwbyte Ds1307w                                              ' Передаем байт записи
I2cwbyte &H00                                                 ' Адресс = 0
I2cstop                                                       ' Стоп передачи
'
I2cstart                                                      ' Старт передачи
I2cwbyte Ds1307r                                              ' Передаем байт чтения
I2crbyte Reg_sec , Ack                                        ' Принимаем 8 байт
I2crbyte Reg_min , Ack                                        ' Принимаем 8 байт
I2crbyte Reg_hour , Ack                                       ' Принимаем 9 байт
I2cstop                                                       ' Стоп передачи
'
Gosub Clock_init
'---------------------------------------------------------------------------
Reset Tcon.0
On Int0 Receiverc5
Enable Int0
Enable Interrupts
'***************Основная часть программы**********************
Do                                                            '
   Disable Int0                                               ' Запретить прерывание
'
         Gosub Read_ds1307                                    'Чтение данных с часов
   Enable Int0
         Gosub Displaysub                                     'Вывод на табло
         Tempb = Reg_sec And &B01110000                       ' Точки
         If Sqw = 1 Then
            Set Colon_d1
         Else
            Reset Colon_d1
         End If
   Disable Int0
   '
If Command = 12 Then
   'Цифра номер 1
      Gosub Read_ds1307                                       'Чтение данных с часов
      Gosub Displaysub                                        'Вывод на табло
P3.5 = 1
         Do
            Select Case Command
               Case 0:
                  P1.7 = 0
                  P0.7 = 0
                  P2.7 = 0
                  Reg_hour.4 = 0
                  Reg_hour.5 = 0
               Case 1:
                  P2.7 = 0
                  P1.7 = 1
                  P0.7 = 1
                  Reg_hour.4 = 1
                  Reg_hour.5 = 0
               Case 2:
                  P2.7 = 1
                  P0.7 = 0
                  P1.7 = 1
                  Reg_hour.4 = 0
                  Reg_hour.5 = 1
            End Select
            If Key_set = 1 Then
               Key_set = 0
               Exit Do
            End If
         Loop
         Key_set = 0
'Цифра номер 2
Fff:
         Do
            If Key_set = 1 Then
            If Reg_hour.5 = 1 And Command > 3 Then Goto Fff
               Key_set = 0
               Exit Do
            End If
   If Reg_hour.4 = 1 Then
      Hour10_niz = 1
      Hour10_verh = 1
      Hour20 = 0
   End If
   If Reg_hour.5 = 1 Then
      Hour10_verh = 1
      Hour10_niz = 0
      Hour20 = 1
   End If
   If Reg_hour.4 = 0 And Reg_hour.5 = 0 Then
      Hour10_niz = 0
      Hour10_verh = 0
      Hour20 = 0
   End If
Disable Int0
            Keypad.7 = P1.7
            nop
            nop
            P1 = Keypad
            If Command > 9 Then
               Enable Int0
               Goto Fff
            End If
            Reg_hour.0 = Command.0
            Reg_hour.1 = Command.1
            Reg_hour.2 = Command.2
            Reg_hour.3 = Command.3
Enable Int0
         Loop
         Key_set = 0
'Цифра номер 3
Des_min:
         Do
   If Reg_hour.4 = 1 Then
      Hour10_niz = 1
      Hour10_verh = 1
      Hour20 = 0
   End If
   If Reg_hour.5 = 1 Then
      Hour10_verh = 1
      Hour10_niz = 0
      Hour20 = 1
   End If
   If Reg_hour.4 = 0 And Reg_hour.5 = 0 Then
      Hour10_niz = 0
      Hour10_verh = 0
      Hour20 = 0
   End If
Disable Int0
            If Key_set = 1 Then
               Key_set = 0
               Exit Do
            End If
            If Command > 5 Then
               Enable Int0
               Goto Des_min
            End If
            Keypad.7 = P0.7
            nop
            nop
            P0 = Keypad
            Reg_min.4 = Command.0
            Reg_min.5 = Command.1
            Reg_min.6 = Command.2
Enable Int0
         Loop
         Key_set = 0
'Цифра номер 4
Qwe:
         Do
            If Key_set = 1 Then
               Key_set = 0
               Exit Do
            End If
   If Reg_hour.4 = 1 Then
      Hour10_niz = 1
      Hour10_verh = 1
      Hour20 = 0
   End If
   If Reg_hour.5 = 1 Then
      Hour10_verh = 1
      Hour10_niz = 0
      Hour20 = 1
   End If
   If Reg_hour.4 = 0 And Reg_hour.5 = 0 Then
      Hour10_niz = 0
      Hour10_verh = 0
      Hour20 = 0
   End If
Disable Int0
            nop
            nop
            P2 = Keypad
            If Command > 9 Then
               Enable Int0
               Goto Qwe
            End If
            Reg_min.0 = Command.0
            Reg_min.1 = Command.1
            Reg_min.2 = Command.2
            Reg_min.3 = Command.3
Enable Int0
         Loop
Key_set = 0
Disable Int0
      I2cstart                                                ' Generate start
      I2cwbyte Ds1307w                                        ' Slave adsress
      I2cwbyte &H00                                           ' Address of Control REG
      I2cwbyte &H00                                           ' Address of Control REG
      I2cwbyte Reg_min                                        ' Clear Second
      I2cwbyte Reg_hour
      I2cstop
      Wait 1
Enable Int0
End If
Loop                                                          '

'*************************************************************'
'---------------------------------------------------------------------------
Read_ds1307:                                                  ' Чтение времени
   '
   I2cstart                                                   ' Старт передачи
   I2cwbyte Ds1307w                                           ' Передаем байт записи
   I2cwbyte &H00                                              ' Адресс = 0
   I2cstop                                                    ' Стоп передачи
   '
   I2cstart                                                   ' Старт передачи
   I2cwbyte Ds1307r                                           ' Передаем байт чтения
   I2crbyte Reg_sec , Ack                                     ' Принимаем 8 байт
   I2crbyte Reg_min , Ack                                     ' Принимаем 8 байт
   I2crbyte Reg_hour , Nack                                   ' Принимаем 9 байт
   I2cstop                                                    ' Стоп передачи
   '
Return
'---------------------------------------------------------------------------
Displaysub:
   Tempb = Reg_min                                            ' Minutes
   Gosub Patcon
   Temp1b.7 = P2.7
   P2 = Temp1b
   Tempb = Reg_min
   Shift Tempb , Right , 4
   Gosub Patcon
   Temp1b.7 = P0.7
   P0 = Temp1b
   '
   Tempb = Reg_hour                                           ' Hours
   Gosub Patcon
   P1 = Temp1b
   If Reg_hour.4 = 1 Then
      Hour10_niz = 1
      Hour10_verh = 1
      Hour20 = 0
   End If
   If Reg_hour.5 = 1 Then
      Hour10_verh = 1
      Hour10_niz = 0
      Hour20 = 1
   End If
   If Reg_hour.4 = 0 And Reg_hour.5 = 0 Then
      Hour10_niz = 0
      Hour10_verh = 0
      Hour20 = 0
   End If
Return
   '---------------------------------------------------------------------------
Patcon:
Tempb = Tempb And &H0F
Select Case Tempb
  Case 0 : Temp1b = Segpat0
  Case 1 : Temp1b = Segpat1
  Case 2 : Temp1b = Segpat2
  Case 3 : Temp1b = Segpat3
  Case 4 : Temp1b = Segpat4
  Case 5 : Temp1b = Segpat5
  Case 6 : Temp1b = Segpat6
  Case 7 : Temp1b = Segpat7
  Case 8 : Temp1b = Segpat8
  Case 9 : Temp1b = Segpat9
  Case Else
End Select
'
Return
'---------------------------------------------------------------------------
Clock_init:                                                   ' DS1307 Initialize
'
   Tempb = Reg_sec And &B01111111                             ' Oscillator Enable
   I2cstart                                                   ' Generate start
   I2cwbyte Ds1307w                                           ' Slave adsress
   I2cwbyte &H00                                              ' Address of Seconds REG
   I2cwbyte Tempb                                             '
   I2cstop                                                    ' Generate Stop
   '
   Tempb = Reg_hour And &B10111111                            ' 24-Hour Mode
   I2cstart                                                   ' Generate start
   I2cwbyte Ds1307w                                           ' Slave adsress
   I2cwbyte &H02                                              ' Address of Seconds REG
   I2cwbyte Tempb                                             '
   I2cstop                                                    ' Generate Stop
   '
   Tempb = &B10010000                                         ' 1 Hz SQW Output
   I2cstart                                                   ' Generate start
   I2cwbyte Ds1307w                                           ' Slave adsress
   I2cwbyte &H07                                              ' Address of Control REG
   I2cwbyte Tempb                                             '
   I2cstop                                                    ' Generate Stop
   '
Return
'---------------------------------------------------------------------------
Receiverc5:
Getrc5(subaddress , Command)
   Subaddress = Subaddress And &B00011111                     '
   If Subaddress = 0 Then
      Command = Command And &B01111111
      Select Case Command
      Case 0 : Keypad = Segpat0
      Case 1 : Keypad = Segpat1
      Case 2 : Keypad = Segpat2
      Case 3 : Keypad = Segpat3
      Case 4 : Keypad = Segpat4
      Case 5 : Keypad = Segpat5
      Case 6 : Keypad = Segpat6
      Case 7 : Keypad = Segpat7
      Case 8 : Keypad = Segpat8
      Case 9 : Keypad = Segpat9
      Case 13 : Key_set = 1
      End Select
   End If
Return

Отредактировано M@T_F@Q (2008-05-27 23:03:54)

0

12

Попробуй фрагмент опроса Rc5 убрать с прерывания и поставить в основной цикл.

0

13

У меня возник такой вопрос:
Когда я нажимаю на кнопку на пульте, программа принимает команду постоянно, т.е. если я держу кнопку то получается что приходит команда с номером кнопки, а как сделать что бы программа понимала что кнопка еще нажата и уже отпущена??? Помоему какойто бит отвечал за это состояние???????Вот только как его получить?

0

14

Насчёт секретного бита не знаю. :O  А вот организовать установку времени я бы посоветовал по другому. Например, при нажатии кнопки ВКЛ/ВЫКЛ входим в режим программирования времени. Начинает мигать первый разряд. Кнопками переключения каналов изменяем его значение (или циферками). Кнопками регулировки громкости переходим на другое знакоместо. Опять изменяем (или не изменяем) значение. Установив время, выходим в рабочий режим с помощью той же кнопки ВКЛ/ВЫКЛ. Немного больше манипуляций, но ошибки исключены.
Как запустите, отпишитесь. Удачи!

0

15

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

+1

16

Насчет СЕКРЕТНОГО бита это бит номер 3!!! http://rr.boom.ru/shems/7shm1ir3.htm Тут подробно описано! Теперь вопрос поствлю по другому, BASCOM для RC5 использует библиотеку mcs.lib вот как в ней найти куда записывается третий бит??? Кто в этих библиотеках разбирался помогите плиззз!!!

Насчет временных задержок это тоже идея, попробовать можно, 2 Radan я тоже так хотел сделать но вот проблема в том что при нажатии например на кнопку 1 команда посылается постоянно!!! Т.е. происходит установка всего в 1!!! Еще проблема такая, что например жму на цифру 1 секунды 3-4 может появиться цивра 2, т.е. какойто сбой всётаки есть, команды иногда другие проскакивают. Команда Vol+ и Prog+ выглядят так 00010000 и 00100000 т.е. разница на один бит сдвинута одна команда, вот такие левые команды почемуто ловит приемник, а если найти куда он записыват бит номер 3 то можно (надеюся) всего этого избежать!!! Пробовал искать в переменной subaddress но так ничего не нашел. Осталось только разобрать библиотеку.

0

17

Я занимался RC5 И чесно ни разу не наступал на такое.
Проверь монтаж или пульт глючный

0

18

Втом то и дело что я проверяю это на разных железках и пультах, одинаковый глюк(((

0

19

Попробуй так. Вывод на ЖКИ, но это не принципиально. У меня работает, только что набросал и проверил. Алгоритм управления несложно изменить.

Код:
'*******************************************************************************
'Фрагмент программы для установки показаний часов с пульта ДУ (RC5)
'*******************************************************************************
$regfile = "m8def.dat"
$crystal = 8000000                                          'внутренний генератор
$lib "lcd4.lbx"
$lib "mcsbyte.lbx"                                          'Подключаем библиотеку функций

Config Rc5 = Pind.2
Enable Interrupts                                           'Разрешаем прерывания
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2
Config Pind.2 = Input                                       'настройка пина d2 на вход (IR)

Dim Address As Byte                                         'байт адреса
Dim Command As Byte                                         'байт команды
Dim D_hour As Byte                                          'десятки часов
Dim E_hour As Byte                                          'единицы часов
Dim D_minut As Byte                                         'десятки минут
Dim E_minut As Byte                                         'единицы минут

Cursor Off                                                  'Выключить курсор
Cls
'*******************************************************************************
'Алгоритм установки часов:
' Кнопка "1" - Увеличение десятков часов
' Кнопка "2" - Уменьшение десятков часов
' Кнопка "3" - Увеличение единиц часов
' Кнопка "4" - Уменьшение единиц часов
' Кнопка "5" - Увеличение десятков минут
' Кнопка "6" - Уменьшение десятков минут
' Кнопка "7" - Увеличение единиц минут
' Кнопка "8" - Уменьшение единиц минут
' При одиночном кратковременном нажатии изменение значения на единицу.
' При удержании кнопки - автоматическое изменение значения.
'*******************************************************************************
Do                                                          'Основной цикл

Getrc5(address , Command)
If Address = 0 Then
Command = Command And &B01111111
Locate 1 , 1
Lcd "Adr.: " ; Address ; " Cmd: " ; Command                 'принятые адрес и команда
End If

If Command = 1 Then Gosub Plus1                             '
If Command = 2 Then Gosub Minus1                            '
If Command = 3 Then Gosub Plus2                             '
If Command = 4 Then Gosub Minus2                            '
If Command = 5 Then Gosub Plus3                             '
If Command = 6 Then Gosub Minus3                            '
If Command = 7 Then Gosub Plus4                             '
If Command = 8 Then Gosub Minus4                            '

' отображение "часов"
Locate 2 , 1
Lcd D_hour
Locate 2 , 2
Lcd E_hour
Locate 2 , 3
Lcd ":"
Locate 2 , 4
Lcd D_minut
Locate 2 , 5
Lcd E_minut

'задержка для гарантированной установки часов
Waitms 100
Loop
End                                                         'Конец основного цикла
'*******************************************************************************
Plus1:                                                      'Увеличение десятков часов
If D_hour < 2 Then Incr D_hour
Return
'*******************************************************************************
Minus1:                                                     'Уменьшение десятков часов
If D_hour > 0 Then Decr D_hour
Return
'*******************************************************************************
Plus2:                                                      'Увеличение единиц часов
If E_hour < 9 Then Incr E_hour
Return
'*******************************************************************************
Minus2:                                                     'Уменьшение единиц часов
If E_hour > 0 Then Decr E_hour
Return
'*******************************************************************************
Plus3:                                                      'Увеличение десятков минут
If D_minut < 5 Then Incr D_minut
Return
'*******************************************************************************
Minus3:                                                     'Уменьшение десятков минут
If D_minut > 0 Then Decr D_minut
Return
'*******************************************************************************
Plus4:                                                      'Увеличение единиц минут
If E_minut < 9 Then Incr E_minut
Return
'*******************************************************************************
Minus4:                                                     'Уменьшение единиц минут
If E_minut > 0 Then Decr E_minut
Return
'*******************************************************************************

+1

20

M@T_F@Q написал(а):

'------------------------------------------------------------------------
Dim Command As Byte , Subaddress As Byte
Dim Reg_sec As Byte                                           ' Секунды
Dim Reg_min As Byte                                           ' Минуты
Dim Reg_hour As Byte                                          ' Часы

нужно вставить -
Dim Kod As Bit

т.е.

Dim Kod As Bit
Dim Command As Byte , Subaddress As Byte

В Bascom 8051 аналилизируют код rc5 так :

Код:
 Dim Kod As Bit 
Dim Command As Byte , Subaddress As Byte 
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2 'konfiguracja wyprowadzeń wyświetlacza LCD 
Config Lcd = 16 * 2 
$crystal = 8000000 
reset Tcon.0 
On Int1 Rc5 
Enable Interrupts 
Cls 
Lcd "Waiting for RC5" 
Cursor Off 
Do 
If Kod = 1 Then 
Disable Int1 
Cls 
Lcd "Com: " ; Command ; ",Adr:" ; Subaddress 
Kod = 0 
Enable Int1 
End If 
Loop 

Rc5: 
Getrc5(subaddress , Command) 
Kod = 1 
Return

0

21

ZEGAR RC5
http://rejestr.republika.pl/strony/zega … ascom.html
Listing zegara
http://rejestr.republika.pl/strony/list … r_rc5.html

0

22

2RADAN!!! Спасибо за отличную идею по поводу редакторования часов!!! Я даже не додумался так сделать(+1). И спасибо за почти готовую програмку))) Но все равно хочу найти этот бит отвечающия за кнопку нажата первый раз или второй раз уже. Если ктото сделает это раньше пожалуййййста напишите!!!

Я не сильно понял смысл программы, точнее ее алгоритм, но нашел работу с протоколом RC5, (http://rejestr.republika.pl/strony/list … r_rc5.html)

Код:
'  Procedura wysyla kod RC5 podany jako Rc5_addres i Rc5_command
'  na wyjscia portu P3
Sub Rc5
'
   Przel_bit = 0
'
For N = 0 To 20
   Call Logic_1                                               ' Pierwszy bit startu
   Call Logic_1                                               ' Drugi bit startu
   If Przel_bit = 0 Then Call Logic_0 Else Call Logic_1       ' Bit wyrównawczy
      For Rc5_bit_nr = 4 Downto 0                             ' Wysyłanie adresu
      If X1.rc5_bit_nr = 0 Then Call Logic_0 Else Call Logic_1
      Next Rc5_bit_nr
         For Rc5_bit_nr = 5 Downto 0                          ' Wysyłanie komendy
         If X6.rc5_bit_nr = 0 Then Call Logic_0 Else Call Logic_1
         Next Rc5_bit_nr

   P3 = Bp3_off
   Waitms 98
Next N
P3 = 255
P3.4 = 0
End Sub

'
Sub Logic_0
   P3 = Bp3_on
   Waitms 1
   P3 = Bp3_off
   Waitms 1
End Sub

Sub Logic_1
   P3 = Bp3_off
   Waitms 1
   P3 = Bp3_on
   Waitms 1
End Sub

Но чтото смысл я не сильно понимаю, т.е. они проверят биты адресса:
      For Rc5_bit_nr = 4 Downto 0                             ' Wysyłanie adresu
      If X1.rc5_bit_nr = 0 Then Call Logic_0 Else Call Logic_1
      Next Rc5_bit_nr
но почему с 4 по 0???

Отредактировано M@T_F@Q (2008-01-09 18:04:11)

0

23

Вообще у меня были подобные неприятности с RC5,как у M@T_F@Q. При непрерывном нажатии на одну и ту же кнопку иногда проскакивал
другой код команды. Но я заметил, что подобный глюк может проявляться, когда стоит кварц на специфическую частоту, например, 9.45768 МГц.
Глюк легко устранялся подбором керамических конденсаторов в обвязке кварца. А лучше всего применять кварц на частоты, кратные 1МГц.
Попробуйте, возможно глюк пропадёт.

0

24

http://slydiman.narod.ru/scr/irrc_irlink.htm
Вот тут нашел хорошую статейку объясняющая почему пульт так себя может вести!
Квар стоит 11.059, ставил кварц 4мгц, тоже самое. Стал искать в библиотеки mcs.lib где происходит сам прием битов и в какой последовательности. Блин программа вообще записывает 3й бит отвечающий за состояние кнопки???
Даже пробовал на АТМЕГ8 с внутренним кварцевым генератором, тоже самое!

Отредактировано M@T_F@Q (2008-01-11 09:02:01)

0

25

M@T_F@Q ,
Конденсатор C2 - увеличить до 100 мкф и дополнительно 100 nF должны
расположены  на монтажке как можно ближе к приемнику TSOP 1736.
Вывод 7  DS1307 - выход с открытым стоком. Добавьте резистор 4,7 ком на +5 В.

0

26

Привет всем! У меня есть часы на двух AT89C52 один контроллер дисплея 8 разрядный 7 сегментный другой мозг к нему часы PCF8583 термометр DS18B20  и RC5. Так вот: все работает на ура с программированием всеми перечисленными способами + использование секретного бита. Но грабли нашлись как всегда неожиданно. Дело в том что встроеный обработчик RC5 нифига не защищен от помех и все дополнительные импульсы (если у вас например рядом лампа дневного света) вызывают искажение команд. А если на приемник попадает солнечный свет то он и в нем различает коды RC5. Так за день мои часы сами полностью перепрограммируются.

Есть устройство RC5--->com RS232 программу я писал на ассемблере давно. На солнце не реагирует никак, команды не путает при посторонних помехах просто ничего не выдает. Короче ОК. Пишу подобную программу не бейсике неняю контроллер, кладу на солнце - команды идут сплошным потоком и все типа RC5.

Пытался адаптировать и вставить тот обработчик на ассемблере в бейсик. Получилось. Но не работает. ВОТ!

Код:
'----------------------------------------------------------------------------
$baud = 9600                                                  'скорость передачи                                          'try 1200 baud for example
$crystal = 11059000                                           '11059 MHz кварц


Dim New As Bit
Dim Com As Byte , Sb As Byte
'---------------RC5-----------------------------------------------------------
Const Clk_khz = 11059                                         'Тактовая частота 12МГц
Const Rc5_n =(1 + 2 *(clk_khz / 188)) / 2
Const Rc5_n1 =(1 + 2 *(clk_khz / 249)) / 2
Const Rc5_n2 =(1 + 2 *(clk_khz / 382)) / 2
Const Rc5_nt =(1 + 2 *(clk_khz / 135)) / 2
Ser Alias P3.2                                                'IR receiver out



$asm
' SETB PX0 'Высокий приоритет INT0
' Setb It0                                                      '    ;Прерывание INT0 по переходу
' SETB EX0 ';Разрешение INT0
' SETB EA ';Общее разрешение прерываний


$end Asm
Set Tcon.0                                                    'triggered by rising edge
On Int0 Receiverc5
Enable Int0
Enable Interrupts
'---------------RC5-----------------------------------------------------------


Print "RC-5 OK"
Do
  If New = 1 Then                                             'received new code
     Disable Int0
     Print Com
      New = 0                                                  'reset new bit
     Enable Int0
  End If
Loop



Receiverc5:                                                   'interrupt routine
$asm

'Rc5:
 Push Psw                                                'RC5-code program decoding
 SETB psw.3
 SETB psw.4      'bank 3
 MOV R5,a
 MOV R6,B
 MOV B,#2
 MOV R2,#2      'system byte init for 7 received bits
 MOV R3,#4      'command byte init for 6 received bits
 MOV R0,#1AH      'R32 address load
 MOV R1,#RC5_N    'Загрузка величины тайм-аута 2362 мкс


Wlow:
 JB ser,WHIGH
 MOV R4,#16
 Djnz R4 ,*+0

 DJNZ R1,WLOW 'wait up to 2362uS for SER = 1
 SJMP NORC5 'jump if time is over

Whigh:
 MOV R1,#RC5_N    'Загрузка величины тайм-аута 2362 мкс
Sample:
 Mov R4 , #8
 Djnz R4 ,*+0
Sam1:
 Mov R4 , #3
 Djnz R4 ,*+0
Sam2:
 Mov R4 , #2
 Djnz R4 ,*+0
Sam3:
 Mov c,ser
 MOV ACC.0,c
 XRL a,B
 JNB ACC.0,TRANS
 DJNZ R1,SAMPLE 'sample SER up to 2362uS
 SJMP NORC5 'jump if time is over

Trans:

 Cpl B.0                                            'transition detected
 MOV A,R1
 ADD A,#-RC5_N1

 JC NORC5  'jump if <577.5uS
 MOV A,R1
 ADD A,#-RC5_N2
 JC TRANS1

 JB B.1,NORC5 'jump if >1200uS(ЗАТЫКАЕТСЯ ВОТ НА ЭТОМ МЕСТЕ)
 SJMP STDATA
Trans1:
 CPL B.1
 MOV R1,#RC5_N   ;Загрузка величины тайм-аута 2362 мкс
 JB b.1,SAM1
Stdata:
 MOV C,b.0
 MOV A,@R0
 RLC A  'save data bit
 MOV @R0,A
 MOV R1,#RC5_N   ;Загрузка величины тайм-аута 2362 мкс
'  mov {com},#16
 JNC SAM2

 INC R0  'system done, begin command
 MOV A,R0
 MOV R1,#RC5_N   ;Загрузка величины тайм-аута 2362 мкс
 JNB ACC.2,SAM3
 MOV R1,#RC5_N   ;Загрузка величины тайм-аута 2362 мкс

Wlw:
 JB ser,TRM
 MOV R4,#16
 DJNZ R4,*+0
 DJNZ R1,WLW    'wait up to 2362uS for SER = 1
 SJMP NORC5   'jump if time is over

Trm:
 MOV R1,#RC5_NT  ;Загрузка величины тайм-аута 3000 мкс
Term:
 JNB ser,NORC5

 MOV R4,#16
 DJNZ R4,*+0
 DJNZ R1,TERM

' MOV A,R2  'system nom. and control bit in R2 R3 COMMAND
' ANL A,#1FH

' CJNE A,#SYS,NORC5 'system number check
 'CJNE R3,#0,NORC5 'system number check
 mov {com},R3
Norc5:
' CLR IE0
 MOV B,R6
 MOV Acc,R5
 POP PSW
 'RETI

$end Asm
  New = 1                                                     'set flag
Return

0

27

Я сделал это!
Работает и пока очень четко.
Помог М.Л.Кулиш  СПРАВОЧНИК ПО ПРОГРАММИРОВАНИЮ BASCOM-8051

Код:
'----------------------------------------------------------------------------
'   Улучшенная  процедура чтения кода ПДУ RC5
'   Адаптирована: Яшнов Дмитрий
'   Нижний Новгород 2009
'   Y.D.E. 2009
'
'Clk_khz = 11059                                         'Тактовая частота 12МГц
'Rc5_n =(1 + 2 *(clk_khz / 188)) / 2
'Rc5_n1 =(1 + 2 *(clk_khz / 249)) / 2
'Rc5_n2 =(1 + 2 *(clk_khz / 382)) / 2
'Rc5_nt =(1 + 2 *(clk_khz / 135)) / 2
'P3.2 IR receiver out
'Для изменения частоты кварца константы пересчитать по формулам и подставить в ручную
'в ассемблеровский код'
'
'----------------------------------------------------------------------------
$baud = 9600                                                  'скорость передачи                                          'try 1200 baud for example
$crystal = 11059000                                           '11059 MHz кварц

Dim New As Bit
Dim Command As Byte , Subaddress As Byte


Set Tcon.0                                                    'triggered by rising edge
On Int0 Receiverc5
Enable Int0
Enable Interrupts

Print "RC-5 OK"
Do
  If New = 1 Then                                             'received new code
     Disable Int0
     Print "ressive"
     Print Command
     Print Subaddress
     Reset New                                                'reset new bit
     Enable Int0
  End If
Loop



Receiverc5:                                                   'interrupt routine
$asm
 Push Psw
 mov psw,#&h18   ;bank 3

 MOV R5,a
 MOV R6,B
 MOV B,#2
 MOV R2,#2       ;system byte init for 7 received bits
 MOV R3,#4       ;command byte init for 6 received bits
 MOV R0,#&h1A    ;R32 address load
 MOV R1,#64      ;Rc5_n Загрузка величины тайм-аута 2362 мкс


Wlow:
 JB p3.2,WHIGH
 MOV R4,#16
 Djnz R4 ,*+0

 DJNZ R1,WLOW    ;wait up to 2362uS for SER = 1
 SJMP NORC5      ;jump if time is over

Whigh:
 MOV R1,#64      ;Rc5_n Загрузка величины тайм-аута 2362 мкс
Sample:
 Mov R4 , #8
 Djnz R4 ,*+0
Sam1:
 Mov R4 , #3
 Djnz R4 ,*+0
Sam2:
 Mov R4 , #2
 Djnz R4 ,*+0
Sam3:
 Mov c,p3.2
 MOV ACC.0,c
 XRL a,B
 JNB ACC.0,TRANS
 DJNZ R1,SAMPLE  ;sample SER up to 2362uS
 SJMP NORC5      ;jump if time is over

Trans:

 Cpl B.0         ;transition detected
 MOV A,R1
 ADD A,#-49      ;Rc5_n1

 JC NORC5        ;jump if <577.5uS
 MOV A,R1
 ADD A,#-32      ;Rc5_n2
 JC TRANS1


 JB B.1,NORC5    ;jump if >1200uS
 SJMP STDATA
Trans1:
 CPL B.1
 MOV R1,#64      ;Rc5_n Загрузка величины тайм-аута 2362 мкс
 JB b.1,SAM1
Stdata:
 MOV C,b.0
 MOV A,@R0
 RLC Acc         ;save data bit
 MOV @R0,A
 MOV R1,#64      ;Rc5_n Загрузка величины тайм-аута 2362 мкс

 JNC SAM2

 INC R0          ;system done, begin command
 MOV A,R0
 MOV R1,#64      ;Rc5_n Загрузка величины тайм-аута 2362 мкс
 JNB ACC.2,SAM3
 MOV R1,#64      ;Rc5_n Загрузка величины тайм-аута 2362 мкс

Wlw:
 JB p3.2,TRM
 MOV R4,#16
 DJNZ R4,*+0
 DJNZ R1,WLW     ;wait up to 2362uS for SER = 1
 SJMP NORC5      ;jump if time is over

Trm:
 MOV R1,#89      ;RC5_NT Загрузка величины тайм-аута 3000 мкс
Term:
 JNB p3.2,NORC5

 MOV R4,#16
 DJNZ R4,*+0
 DJNZ R1,TERM

 mov {command},r3
 mov {Subaddress},r2
 setb {new}
Norc5:
 MOV B,R6
 MOV A,R5
 POP PSW


$end Asm
'  New = 1                                                     'set flag
Return

0

28

Я вот так вот сделал для nec протокола. на одну кнопку чтоб светильником рулить. пашет но медленно относительно

$regfile = "attiny2313.dat"

$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
Config Portd.6 = Output
Config Portd.2 = Input
  Dim Adress As Byte

Dim Bt As Bit
Dim A As Word
Dim Flag As Byte

'в инверсии        !!!

  Do

    Bitwait Pind.2 , Reset
    Bitwait Pind.2 , Set

Pulsein A , Pind , 2 , 1
Pulsein A , Pind , 2 , 1
Pulsein A , Pind , 2 , 1
Pulsein A , Pind , 2 , 1
Pulsein A , Pind , 2 , 1
Pulsein A , Pind , 2 , 1
Pulsein A , Pind , 2 , 1
Pulsein A , Pind , 2 , 1
Pulsein A , Pind , 2 , 1
Pulsein A , Pind , 2 , 1
Pulsein A , Pind , 2 , 1
Pulsein A , Pind , 2 , 1
Pulsein A , Pind , 2 , 1
Pulsein A , Pind , 2 , 1
Pulsein A , Pind , 2 , 1
Pulsein A , Pind , 2 , 1

Pulsein A , Pind , 2 , 1

If A >= 47 And A <= 51 Then Bt = 0
If A >= 158 And A <= 161 Then Bt = 1

  Adress.0 = Bt

Pulsein A , Pind , 2 , 1
If A >= 47 And A <= 51 Then Bt = 0
If A >= 158 And A <= 161 Then Bt = 1
Adress.1 = Bt

Pulsein A , Pind , 2 , 1

If A >= 47 And A <= 51 Then Bt = 0
If A >= 158 And A <= 161 Then Bt = 1
Adress.2 = Bt

Pulsein A , Pind , 2 , 1

If A >= 47 And A <= 51 Then Bt = 0
If A >= 158 And A <= 161 Then Bt = 1
Adress.3 = Bt

Pulsein A , Pind , 2 , 1
If A >= 47 And A <= 51 Then Bt = 0
If A >= 158 And A <= 161 Then Bt = 1
Adress.4 = Bt

   If Adress = 13 Then Gosub Led

      Loop

     Led:
   Flag = Flag + 1
   If Flag > 1 Then Flag = 0
   If Flag = 1 Then Set Portd.6
   If Flag = 0 Then Reset Portd.6

    Return

End

0

29

И так, возвращаясь к старой теме, у меня тоже появилась задача проверить китайский датчик приёма сигнала и оказалось, что RC5 не работает.

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

Пульты с телевизора и дивидишника SAMSUNG моделей этого года. Кто сталкивался с подобной проблемой?


Да, оказалось, что вся современная техника, давно не использует этот устаревший RC5, используется новая, 32-х битная кодировка сигнала. Подглядел здесь. Один человек предложил простое решение (сам не пробовал, МК другой тип).
Впрочем у меня LG и Yamaha ресивер, посмотрев на их сигналы осцилом, увидел подобную же картину.
В общем пришлось писать с нуля код, но то ли датчик на 38КГц, то ли пульты на 40, в общем есть некая сбивка показаний на выходе, дрожание бита, причем по некоторой площади. Т.е. на 1 кнопку может требовать до 4-х кодов, чтобы надежно защелкивалось. Проблема алгоритма или чего - непонятно, придёт нормальный логический анализатор - буду разбираться, а то на осциле такие вещи длинные смотреть неудобно.

0

30

частоты разные.
Я недавно столкнулся, что у меня почти все пульты на 36 Кгц, а купить массово ИК-приёмник на эту частоту уже напряжно: в продаже все на 38 кГц

0