roboforum.ru

Технический форум по робототехнике.

Снова RC5 - Bascom - Atmega8. Не могу запустить аппарат.

Снова RC5 - Bascom - Atmega8. Не могу запустить аппарат.

flyroman » 10 мар 2011, 16:42

Все! Не могу! Никак не могу присабачить к микроконтроллеру пульт... :cry: :cry: :cry:

Подскажите , пожлуйста, что я делаю не так...а то кондиционером (самопальным) придется управлять вручную, :shock: :cry: , а хочется с дивана....

Что имеем:
- Atmega8, внутренний RC генератор 8МГц;
- на RESET подтягивающий резистор + конденсатор (104) на массу;
- TFMS5360 - инфракрасный приемник 36 кГц;
- наряжение питание схемы 5 Вольт (стабилизатор 7805);
- схема приемника собрана по предлагаемой схеме в BascomAVR для RC5 и тютелька в тютельку такая же в даташите на приемник:
tsop.JPG
;

- выход приемника подключен на PD2 (INT0) микроконтролера;
- светодиоды на PC4, PB7...
----------------------------------------------------
Код номер 1
По этому коду срабатывает прерывание INT0. Нажимаю на кнопку пульта, светодиод горит, ну естественно на любую кнопку.
:
Код: Выделить всёРазвернуть
$regfile = "m8def.dat"
$crystal = 8000000

Config Portc = Output

Dim Kod As Bit

On Int0 Rc53
Enable Int0
Config Int0 = Falling
Enable Interrupts


Do
If Kod = 1 Then
  Disable Int0
  Portc.4 = 1
  Waitms 100
  Portc.4 = 0
  Kod = 0
Enable Int0
End If
Loop

Rc53:
Kod = 1
Return



Код номер 2
На этот код светодиод PB7 иногда загорается...очень-очень редко, и то когда одновременно двумя пультами сигнал подаешь(на обоих пультах кнопки жму...)
Код: Выделить всёРазвернуть
$regfile = "m8def.dat"
$crystal = 8000000

Config Rc5 = Portd.2
Config Portb = Output

Enable Interrupts

Dim Address As Byte , Command As Byte

Do

Getrc5(address , Command)

If Address <> 255 Then
    Portb.7 = 1
    Waitms 100
    Portb.7 = 0   
End If

Loop
End


Замерял напряжение (мультиметром) на выходе приемника....так вот:\
При нажатии на кнопку пульта напряжение падает с 4.98....до всего-то 4.45...при одном пульте, а при другом до 3.8....
Проверял и подключенный к МК и отключенный.....

Что не так? Что со мной не так? :sorry:

Re: Снова RC5 - Bascom - Atmega8. Не могу запустить аппарат.

dccharacter » 10 мар 2011, 17:08

У тебя нет осциллографа....

Купи за 100 долларов, не пожалеешь. Две недели в него пялиться будешь.

Заставь светодиод моргать 1 раз в секунду. И смотри как он моргает. Если чаще или реже - с прескейлерами начудил и соответственно ничего работать не будет.

Re: Снова RC5 - Bascom - Atmega8. Не могу запустить аппарат.

flyroman » 10 мар 2011, 17:31

а для INTа спад напряжение с 4.98 до 4.4 ...это факт прерывания? или ему ниже надо?

Re: Снова RC5 - Bascom - Atmega8. Не могу запустить аппарат.

dccharacter » 10 мар 2011, 17:35

flyroman писал(а):а для INTа спад напряжение с 4.98 до 4.4 ...это факт прерывания? или ему ниже надо?

Берешь даташит на атмегу8 и смотришь :-) потом нам рассказываешь :-)

Добавлено спустя 1 минуту 24 секунды:
И еще. Представь себе пачку импульсов. Какое напряжение тебе показывает вольтметр?

Re: Снова RC5 - Bascom - Atmega8. Не могу запустить аппарат.

flyroman » 10 мар 2011, 17:47

тогда еще вопрос: на внутреннем RC генераторе это работает?
или обязательно нужен внешний?

Re: Снова RC5 - Bascom - Atmega8. Не могу запустить аппарат.

dccharacter » 10 мар 2011, 17:48

flyroman писал(а):тогда еще вопрос: на внутреннем RC генераторе это работает?
или обязательно нужен внешний?

я думаю точности внутреннего осциллятора вполне хватит.

Re: Снова RC5 - Bascom - Atmega8. Не могу запустить аппарат.

flyroman » 11 мар 2011, 17:45

Вот, проблему решил, вот таким кодом. По ходу пульты у меня нисколько не RC-5... :no: .... :oops: Один 1990 года...там фиг знает протокол какой.....а на пульте от DVD шника китайского хз...тож какой протокол...но по этому коду, работает на ура...тьфу, тьфу, тьфу... :beer:

http://bascomavr.3bb.ru/viewtopic.php?id=93#p525
Спасибо, 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


Добавлено спустя 21 минуту 7 секунд:
Для тех кто думает, что что-то не работает с RC-5 вот этот сайт с кучей разных протоколов....

http://www.sbprojects.com/knowledge/ir/ir.htm

мне повезло, у меня пульт оказался с протоколом NEC .....и нашелся код на BASCOM....
А так если не найдете, смотрите протоколы на этом сайте....или покупайте пульт..RC-5 и не парьтесь...ИМХО

Re: Снова RC5 - Bascom - Atmega8. Не могу запустить аппарат.

kara1126 » 14 ноя 2021, 08:08

Добрый день всем.

Предлагаю Вашему вниманию код для сканирования ИК пультов кондиционеров DAIKIN. Для реализации использовал информацию https://led-displays.ru/ir/daikin_irremote.html и https://www.sites.google.com/a/cdmt.vn/ … -protocol. Протокол весьма объемный. Решил поделиться, может кому пригодится.

Пульт такой - ARC466A9
Впереди теперь создание передатчика - имитатора этого пульта
Код: Выделить всёРазвернуть
$regfile = "m328pdef.dat"
$crystal = 16000000                                         ' used crystal frequency
$baud = 115200                                              ' use baud rate

$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 40                                               ' default use 10 for the SW stack
$framesize = 40                                             ' default use 40 for the frame space

Ddrd.2 = 0
Portd.2 = 1
Ddrb.0 = 1
Portb.0 = 0

Config Timer1 = Timer , Prescale = 256
Stop Timer1
Timer1 = 0

Config Int0 = Falling
On Int0 _rx_kod Nosave
Enable Int0

Enable Interrupts

Dim Firstt As Byte
Dim Startc As Byte
Dim Newc As Byte
Dim I As Byte
Dim A As Byte
Dim Paket1(8) As Byte                                       'Double
Dim Paket2(8) As Byte
Dim Paket3(19) As Byte
Dim Paket_id As Byte
Dim Priznak As Byte
Dim _temp As Byte

Print "Waiting for RC5..."

Do                                                          'основной цикл
If Priznak = 1 Then                                         'вывод сообщения в порт
    Priznak = 0
         For A = 8 To 1 Step -1
          Print Hex(paket1(a));
         Next A
         Print " ";
         For A = 8 To 1 Step -1
          Print Hex(paket2(a));
         Next A
         Print " ";
         For A = 19 To 1 Step -1
          Print Hex(paket3(a));
         Next A
         Print
End If

Loop

$asm
_rx_kod:
$end Asm
  If Startc = 0 Then                                        'первое прерывание
     Newc = 0                                               'флаг новой команды
     Startc = 1
     Firstt = 0                                             'начали принимать
     Start Timer1                                           'старт Т1
  Else                                                      '
     If Tcnt1 > 1595 And Tcnt1 < 1615 Then                  'ищем начало пакета
         Tcnt1 = 0                                          'если нашли
         For A = 1 To 8                                     'обнуляем массивы для сообщений
          Paket1(a) = 0
         Next A
         For A = 1 To 8
          Paket2(a) = 0
         Next A
         For A = 1 To 19
          Paket3(a) = 0
         Next A
         Paket_id = 1                                       'устанавливаем номер сообщения в !
         Newc = 1
     End If

     If Tcnt1 > 2215 And Tcnt1 < 2235 Then                  'ищем паузу между сообщениями
         Tcnt1 = 0
         Paket_id = Paket_id + 1                            'если нашли, то увеличиваем номер сообщения
     End If

     If Tcnt1 > 320 And Tcnt1 < 330 Then                    'ищем паузу перед каждым сообщением
         If Newc = 1 Then
         Tcnt1 = 0
         I = 8                                              'устанавливаем счетчик байт в сообщении 1 и 2
         A = 0                                              'устанавливаем счетчик бит в каждом байте
         If Paket_id = 3 Then I = 19                        'устанавливаем счетчик байт в сообщении 3
         Config Int0 = Rising
         End If
      End If

      If Tcnt1 > 103 And Tcnt1 < 114 Then                   'ищем "единицу" в потоке бит
         If I > 0 Then
         Tcnt1 = 0
         Set _temp.a                                        'пишем в байт
         A = A + 1
         If A > 7 Then
          Select Case Paket_id
            Case 1 : Paket1(i) = _temp                      'пишем байт в требуемое сообщение
            Case 2 : Paket2(i) = _temp
            Case 3 : Paket3(i) = _temp
          End Select
          _temp = 0
          I = I - 1
          A = 0
         End If
         If I = 0 Then
            Config Int0 = Falling
            If Paket_id = 3 Then Firstt = 1
         End If
         End If
      End If

      If Tcnt1 > 50 And Tcnt1 < 60 Then       'ищем "единицу" в потоке бит
         If I > 0 Then
         Tcnt1 = 0
         Reset _temp.a      'пишем в байт
         A = A + 1
         If A > 7 Then
          Select Case Paket_id                    'пишем байт в требуемое сообщение
            Case 1 : Paket1(i) = _temp
            Case 2 : Paket2(i) = _temp
            Case 3 : Paket3(i) = _temp
          End Select
          _temp = 0
          I = I - 1
          A = 0
         End If
         If I = 0 Then
            Config Int0 = Falling
            If Paket_id = 3 Then Firstt = 1
         End If
         End If
      End If

      If Firstt = 1 Then                                    'если приняли все биты всех сообщений в пакете
         Stop Timer1
         Priznak = 1
         Waitms 300
         Eimsk.int0 = 1
         'Toggle Portb.0
         Paket_id = 0
         Startc = 0
      End If
  Tcnt1 = 0
  End If
$asm
reti
$end Asm

End

Re: Снова RC5 - Bascom - Atmega8. Не могу запустить аппарат.

setar » 18 ноя 2021, 15:16

kara1126 писал(а):Предлагаю Вашему вниманию код для сканирования ИК пультов кондиционеров DAIKIN. Для реализации использовал информацию https://led-displays.ru/ir/daikin_irremote.html и https://www.sites.google.com/a/cdmt.vn/ … -protocol. Протокол весьма объемный. Решил поделиться, может кому пригодится.

вторая ссылка не работает


Rambler\'s Top100 Mail.ru counter