Добрый день всем.
Не нашел, куда разместить свое сообщение, поэтому написал в главную ветку. Просьба к админам, переместить сообщение в необходимое место.
Теперь к вопросу, который хотел осветить. Началось все с просьбы начальника реализовать удаленное управление кондиционером DAIKIN. Принял указания к действию и начал поиски. Все вроде просто казалось - обычный ИК пульт ДУ, собрал макетку с приемником TL1838 38КГц, взял готовую программку для RC-5 и ....ничего не получилось. Начал поиски. Нашел 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
Отредактировано kara1126 (2021-11-13 15:31:01)