Завтра
Вот «Завтра» и пришло.
Ранее уже описана проверка релейного модуля и модуля приема системных ИК-команд. Осталось проверить модуль трансляции ИК-кодов. Предполагаю следующий порядок проверки. Подключаю модуль. Отправляю с компьютера команду трансляции ИК-кода и читаю его с помощью WinLIRC в режиме прямого чтения кода.
Первая правильная мысль - не устанавливать для излучения светодиод ИК-диапазона, а использовать три светодиода АЛ307, которые уже установлены на макетной плате. Возможно, красный светодиод «прихватит» и ИК-диапазон.
Первый результат. После включения клавиши Телевизор включить и отправки ИК-кода модуль «виснет», а программа WinLIRC хладнокровно выводит результат:
Outputting raw mode2 data.
Space 6025710
Pulse 1086
Space 994
Pulse 1074
Space 1301
Pulse 1057
Space 978
Pulse 1185
Space 1011
Pulse 1448
Space 979
Pulse 1147
Space 983
Pulse 1155
Space 1002
Pulse 1158
Space 1014
Pulse 1441
Space 998
Pulse 1145
Space 992
Pulse 1133
Space 1002
Pulse 1163
Space 1012
Pulse 1442
Space 998
Pulse 1136
Space 976 pulse 1157 space 981 pulse 1156 space 977 pulse 1158 space 977 pulse 1130 space 1068 pulse 1467 space 951 pulse 1156 space 1053 pulse 1427 space 978 pulse 1159 space 999 pulse 1160 space 954 pulse 1183 space 1013 pulse 1466 space 950 pulse 1104
Я повторяю эксперимент несколько раз, постепенно приходя к выводу, что удобнее фиксировать результат в записи короткие (0) и длинные (1) импульсы, чтобы удобнее было сравнивать с исходным кодом.
Воспроизводимый код: 000100001000000010000000100000 000000100010000000100
Повторное воспроизведение дает тот же код, что уже хорошо.
Но оригинальный код имеет вид (в том же виде): Заголовок 01 0001 0001 000001 01 0001 00
Структура похожа, но сам код...
Первое, что я делаю, - убираю все отладочные вставки в программе модуля. Попутно «смахиваю» функцию putch () - модуль работает «молча» - и убираю настройки контроллера, относящиеся к настройке передатчика. Модуль не подает признаков жизни. Возвращаюсь на исходные позиции. Не помогает.
Изменяю количество байтов, принимаемых в массив записи команды, с 54 до 29 (реальных). И это не помогает.
Возможно, вам быстрее, чём мне, приходит в голову мысль - а что я читаю из файла input. irc? В отладочной программе MPLAB я записывал символы. И читаю, надо понимать, символы. А ожидаю числа.
Открываю файл input. irc в НЕХ-редакторе и меняю символы на числа. Пробую:
Outputting raw mode2 data.
Space 10739323
Pulse 3650
Space 732
Pulse 1951
Space 733
Pulse 834
Space 755
Pulse 1983
Space 684
Pulse 859
Space 719
Pulse 2009
Space 667
Pulse 833
Space 759
Pulse 811
Space 740
Pulse 1937
Space 742
Pulse 1977
Space 704
Pulse 844
Space 726
Pulse 1978
Space 705
Pulse 832
Space 2487801
Заголовок 010001000100000101000100
Пытаюсь разобраться с временами, что не сложно, - уменьшить числа в файле input. irc. Меняю коэффициент с 13,8 на 19. Мне не нравится, что первое нажатие клавиши
Телевизор включить не воспроизводит код, требуется повторное нажатие. Но времена становятся ближе к исходным.
Делаю попытку включить магнитофон. Неудачно. Одна из причин этого может оказаться в единичности посылки кода. «Родные» коды идут сплошным потоком. А если попробовать четыре повтора с паузой в 24505 мс? Пробую переделать программу для реализации четырех повторов. Делаю паузу между повторами с помощью цикла for. Заодно пытаюсь понять, отчего и где зависает модуль.
Дополняю еще одно число в файл. ire, чтобы цикл воспроизведения в программе модуля заканчивался правильно. То есть, чтобы программа не «зависала» на отсутствующем числе длительностью в паузу. Попутно меняю условие завершения чтения с количества чисел (29) на байт завершения файла «00».
В какой-то момент видеомагнитофон даже удается включать и выключать, нажимая клавишу Телевизор включить. Но модуль продолжает виснуть.
На все это уходит два дня «борьбы с собственной гениальностью». Но есть и моменты проблесков. Проблема, которой закончилась отладка модуля приема ИК-кодов, превратилась в ясное понимание, что лень не всегда хороша. Чтобы не создавать весь проект полностью, я копирую предыдущий в другую папку, правлю имена файлов и т. д. Но, поправляя программу при отладке, порой забываю, с какой из папок я работаю. Если бы не лень, я создавал бы новый проект, открывал новые файлы... Словом, получилось так, что исходный текст я правил в одной из папок, а компилировал в другую. Даю себе слово впредь в менеджере проекта удалять и добавлять все файлы заново. Посмотрим!
За время отладки в голову приходила мысль, что завершение файла байтом «00», может каким-то образом влиять на зависание. Но как? Когда не остается никаких разумных вариантов, и я устаю от бесконечного перепрограммирования микросхемы, я меняю в файле input. ire завершающий байт с 00 на FF, а коэффициент - на 25.
Модуль перестает «виснуть», магнитофон исправно включается и выключается. Программа модуля имеет к этому времени вид, представленный в начале раздела.
В основной программе фрагменты для клавиш Телевизор включить и Телевизор выключить к концу наладки выглядят так:
Private Sub IRemitter01_off_Click() intFH = FreeFileO
Open "D:barbyinput_l. irc" For Input As intFH
Do Until EOF(intFH)
Line Input #intFH# strString
Loop
Forml. MSComml. Output = "I14$5P" For і = 0 To 10000 Next і
Forml. MSComml. Output = strString For і = 0 To 20000000 Next і
Forml. TV_on. Visible = False Forml. TV_off. Visible = True End Sub
Private Sub IRemitter01__on_Click () intFH = FreeFileO
Open "D:barbyinput_l. і re" For Input As intFH
Do Until EOF(intFH)
Line Input tfintFH, strString
Rem strCmnd = strCmnd & strString & vbLf
Loop
Rem Forml. wrem. Caption = strCmnd Forml. MSComml. Output = "I14$5P" For і = 0 To 10000 Next і
Forml. MSComml. Output = strString For і = 0 To 20000000 Next і
Forml. TV_off. Visible = False Forml. TV_on. Visible = True End Sub
И немного назад
Поскольку в первой версии единственным средством управления служит старый пульт от видеомагнитофона (или телевизора), хотелось бы быть уверенным, что все будет работать правильно (или, хотя бы, будет работать). Немного переделаю основную программу:
Dim ext As Boolean
Private Sub mnuWork_Click() Forml. mnuTest. Enabled = False Forml. Commandl. Enabled = False Forml. Commandl. Visible = False Forml. Reley01_off. Enabled = False Forml. Reley01_off. Visible = False Forml. Reley02_off. Enabled = False Forml. Reley02_off. Visible = False Forml. Reley03_off. Enabled = False Forml. Reley03_off. Visible = False Forml. Reley01_on. Enabled = False Forml. Reley01_on. Visible = False Forml. Reley02_on. Enabled = False Forml. Reley02__on. Visible = False Forml. Reley03__on. Enabled = False Forml. Reley03__on. Visible = False Forml. Photo01__on. Enabled = False Forml. Photo01__on. Visible = False Forml. PhotoOLoff. Enabled = False Forml. Photo01__of f. Visible = False Forml. IRemitter01_off. Visible = False Forml. IRemitter01_off. Enabled = False Forml. IRemitter01__on. Visible = False Forml. IRemitter01_on. Enabled = False Forml. work End Sub
Sub work()
Forml. Key Preview = True Forml. MSComml. Output = "C14S0S" For і = 0 To 10000000
Next і
StrAnsw = Forml. MSComml. Input Forml. wrem. Enabled = False Forml. wr em. Visible = False Forml. Refresh
Select Case strAnsw
Case "С14$05С14001И Forml. Lamp_off. Visible = False Forml. Lamp_on. Visible = True Foml. Refresh
Case НС14$0$С14129И Forml. Lamp_off. Visible = True Forml. Lamp_on. Visible = False Forml. Refresh
Case "C14$0SC14193" Forml. Torsher_off. Visible = False Forml. Torsher_on. Visible = True Forml. Refresh
Case HC14$0SC14033" Forml. Torsher_off. Visible = True Foml. Tor sher_on. Visible = False Foml. Re fresh
Case HC14$0SC14161" Foml. Bra_off. Visible = False Foml. Bra_on. Visible = True Foml. Refresh
Case "C14$0SC14097" Foml. Br a_off. Visible = True Foml. Br a_on. Visible = False Foml. Re fresh
Case HC14$0SC14065" ext = True End Select
Loop While ext = False
Forml. Commandl. Enabled = True Forml. Commandl. Visible = True Forml. Refresh End Sub
Переделка касается добавления функции work (), где программа «крутится» в цикле после включения режима Работа, ожидая ввода ИК-команд с пульта. Команды включают и выключают «лампы» на форме. Модуль приема системных ИК - команд я проверял и полагал, что с ним не возникнет проблем. Я ошибался!
При тестировании модуля он правильно отвечал на ИК - команды. Но, когда запросы пошли часто, во время прохождения бесконечного цикла основной команды модуль стал «виснуть». Пришлось вернуться к его наладке. В итоге программа модуля приобрела вид, представленный в начале описания модуля.
Теперь модуль не «виснет», основная программа «крутится» в цикле. По командам с пульта лампочки на форме включаются и выключаются, а, нажав на цифру «3» на пульте, я покидаю режим работы и могу выключить основную программу.
Здесь тоже есть момент, который меня не устраивает, но с ним, я думаю, можно разобраться позже. Он относится к выходу из цикла в основной программе. Если я пытаюсь остановить программу с помощью меню или закрыть ее привычным для Windows образом, ничего не получается. Проблема в том, что программа «крутится» в цикле, из которого может выйти только по событиям, включенным в этот цикл. А единственное событие - прием команды, отправляемой клавишей «3» с пульта. Я думаю, это решаемый вопрос, но к его решению мы вернемся позже.
Текст основной программы на языке Visual Basic
Dim strAnsw As String Dim ext As Boolean
Sub work() Do
Forml. Key Preview = True Forml. MSComml. Output = "D14$0S"
For і = 0 То 10000000 Next і
StrAnsw = Forml. MSComml. Input
Rem Forml. wrem. Caption = strAnsw
Forml. wrem. Enabled = False
Forml. wrem. Visible = False
Forml. Refresh
Select Case strAnsw
Case "С14$05С14001И
Forml. Lamp_off. Visible = False
Forml. Lamp_on. Visible = True
Forml. Refresh
Case "C14$0SC14129"
Forml. Lamp_off. Visible = True
Forml. Lamp_on. Visible = False
Forml. Re fresh
Case "C14$0SC1419311
Forml. Torsher_off. Visible = False
Forml. Torsher_on. Visible = True
Forml. Re fresh
Case nC14$0SC14033"
Forml. Torsher_off. Visible = True
Forml. Torsher_on. Visible = False
Forml. Refresh
Case "C14$0SC14161"
Forml. Bra_off. Visible = False
Forml. Bra_on. Visible = True
Forml. Refresh
Case "C14$0SC14097"
Forml. Bra_off. Visible = True
Forml. Br a^_on. Visible = False
Forml. Refresh
Case "D14$0SD14240"
Ext = True
End Select
Loop While ext = False
Forml. Commandl. Enabled = True Forml. Commandl. Visible = True Forml. Refresh End Sub
Private Sub Commandl_Click()
Forml. Commandl. Caption = "Test run" Forml. Commandl. Enabled = True Forml. wrem. Caption = и Forml. MSComml. Output = "R14$1N" For і = 0 To 10000000 Next і
StrAnsw = Forml. MSComml. Input Forml. wrem. Caption = strAnsw Forml. Commandl. Caption = "Test R" Forml. Commandl. Enabled = True End Sub
Private Sub IRemitter01_off_Click() intFH = FreeFileO
Open "D:barbyinput_JL. irc" For Input As intFH
Do Until EOF(intFH)
Line Input #intFH, strString
Loop
Forml. MSComml. Output = ИІ14$5Р" For і = 0 To 10000 Next і
Forml. MSComml. Output = strString For і = 0 To 20000000 Next і
Forml. TV_on. Visible = False Forml. TV_off. Visible = True End Sub
Private Sub IRemitter01_on_Click() intFH = FreeFileO
Open "D:barbyinput_Jl. irc" For Input As intFH
Do Until EOF(intFH)
Line Input #intFH, strString
Rem strCmnd = strCmnd & strString & vbLf
Loop
Rem Forml. wrem. Caption = strCmnd Forml. MSComml. Output = ИІ14$5РИ For і = 0 To 10000 Next і
Forml. MSComml. Output = strString For і = 0 To 20000000 Next і
Forml. TV_off. Visible = False
Forml. TV_on. Visible = True End Sub
Private Sub mnuStop_Click() Forml. mnuTest. Enabled = True Forml. mnuWork. Enabled = False Forml. MSComml. PortOpen = False End Sub
Private Sub mnuTest_Click() Forml. mnuWork. Enabled = True Forml. MSComml. CommPort = 1 Forml. MSComml. Set tings = "2400,N,8,1" Forml. MSComml. PortOpen = True Forml. Reley01_off. Enabled = True Forml. Reley01_off. Visible = True Forml. Reley02_off. Enabled = True Forml. Reley02_off. Visible = True Forml. Reley03_off. Enabled = True Forml. Reley03_off. Visible = True Forml. Reley01_on. Enabled = True Forml. Reley01_on. Visible = True Forml. Reley02_on. Enabled = True Forml. Reley02_on. Visible = True Forml. Reley03_on. Enabled = True Forml. Reley03_on. Visible = True Forml. Photo01_on. Enabled = True Forml. Photo01_on. Visible = True Forml. IRemitter01_off. Visible = True Forml. IRemitter01_off. Enabled = True Forml. IRemitter01_on. Visible = True Forml. IRemitter01_on. Enabled = True Forml. Phot o01_off. Enabled = True Forml. Photo01_off. Visible = True End Sub
Private Sub mnuWork_Click() Forml. mnuTest. Enabled = False Forml. Commandl. Enabled = False Forml. Commandl. Visible = False Forml. Reley01_off. Enabled = False Forml. Reley01_off. Visible = False Forml. Reley02_off. Enabled = False
Forml. Reley02_off .Visible = False Forml. Reley03_off. Enabled = False Forml. Reley03_off. Visible = False Forml. Reley01_on. Enabled = False Forml. Reley01_on. Visible = False Forml. Reley02_on. Enabled = False Forml. Reley02_on. Visible = False Forml. Reley03_on. Enabled = False Forml. Reley03_on. Visible = False Forml. Phot o01_on. Enabled = False Forml. Photo01_on. Visible = False Forml. Photo01_off. Enabled = False Forml. Photo01_off. Visible = False Forml. IRemitter01_off. Visible = False Forml. IRemitter01_off. Enabled = False Forml .IRemitter01_on. Visible = False Forml. IRemitter01_on. Enabled = False Forml. work End Sub
Private Sub Photo01_off_Click() Forml. IRcmnd_on. Visible = False Forml. IRcmnd_off. Visible = True End Sub
Private Sub Photo01_on_Click() Forml. wrem. Caption = " Forml. MSComml. Output = "C14$0S" For і = 0 To 10000000 Next і
StrAnsw = Forml. MSComml. Input If strAnsw = "C14$0SC14001" Then Forml. IRcmnd_off .Visible = False Forml. IRcmnd_on. Visible = True Forml. wrem. Caption = strAnsw Else
Forml. IRcmnd_on. Visible = False Forml. IRcmnd_off. Visible = True Forml. wrem. Caption = strAnsw End If
If strAnsw = "C14$0SC14129" Then Forml. Lamp_on. Visible = True Forml. Lamp_off .Visible = False
Forml. wrem. Cape ion = strAnsw End If End Sub
Private Sub Reley01_of f_Click () Forml. MSComml. Output = "R14$0F" Forml. MSComml. Output = "R14$0S" For і = 0 To 10000000 Next і
StrAnsw = Forml. MSComml. Input If strAnsw = I, R14$0FR14$0SR14#0F11 Then Forml. Lamp_on. Visible = False Forml. Lamp_off. Visible = True End If End Sub
Private Sub Reley01_on_Click () Forml. MSComml. Output = "R14$0N" Forml. MSComml. Output = "R14$0S" For і = 0 To 10000000 Next і
StrAnsw = Forml. MSComml. Input
If strAnsw = l, R14$0NR14$0SR14#0N11 Then
Forml. Lamp_off. Visible = False
Forml. Lamp_on. Visible = True
End If
End Sub
Private Sub Reley02_off_C 1 іck О Forml. MSComml. Output = "R14$1F" Forml. MSComml. Output = "R14$1S" For і = 0 To 10000000 Next і
StrAnsw = Forml. MSComml. Input Forml. wrem. Caption = strAnsw If strAnsw = I, R14$1FR14$1SR14#1F1' Then Forml. Tor sher_on. Visible = False Forml. Tor sher_off. Visible = True End If End Sub
Private Sub Reley02_on_Click() Forml. MSComml. Output = "R14$1N"
Forml. MSComml. Output = "R14$1S" For і = 0 To 10000000 Next і
StrAnsw = Forml. MSComml. Input If strAnsw = "R14$1NR14$1SR14#1N" Then Forml. Tor sher_off. Visible = False Forml. Tor sher^on. Visible = True End If End Sub
Private Sub Reley03_offjClick () Forml. MSComml. Output = "R14$2F" Forml. MSComml. Output = "R14$2S" For і = 0 To 10000000 Next і
StrAnsw = Forml. MSComml. Input
If strAnsw = l, R14$2FR14$2SR14#2F" Then
Forml. Bra_on. Visible = False
Forml. Bra_off. Visible = True
End If
End Sub
Private Sub Reley03_on_Click() Forml. MSComml. Output = "R14$2N" Forml. MSComml. Output = "R14$2S" For і = 0 To 10000000 Next і
StrAnsw = Forml. MSComml. Input
If strAnsw = I, R14$2NR14$2SR14#2N" Then
Forml. Bra_off. Visible = False
Forml. Bra_on. Visible = True
End If
End Sub