Главная » Статьи » PIC Simulator IDE

Пульт ДУ для телевизора sharp на PIC16F84A

Данное устройство позволяет:
- регулировать громкость
- переключать каналы
Частота кварцевого резонатора 4МГц
Используемая память:
- flash 43%
- EEPROM 0 bytes
- RAM 3 bytes

Назначение портов:
- rb.1-включить/выключить
- rb.2-громкость прибавить
- rb.3-громкость убавить
- rb.4-переключение каналов в начало
- rb.5-переключение каналов в конец
- rb.6-переключение режимов видео/тв
- rb.7-вывод для подключения светодиода
*rb.0-зарезервирован для использования в качестве источника
прерывания в следующих модификациях пульта ДУ.

Выводы порта используемые для опроса кнопок имеют внешние подтягивающие

к земле резисторы (~ 3кОм)
Программа написана в среде PICSimulatorIDE на языке basic для МК PIC16F84A
но может быть скомпилирована на любой совместимый МК (например PIC16F628).
Каждя кодовая посылка пульта ДУ содержит пятиразрядный двоичный адрес устройства,
у меня это 10000, у других телевизоров может быть иначе, не проверял. Поэтому
в программе заложен алгоритм автоматического перебора адресов устройств от 00000000
до 00011111.
Подключить инфракрасный светодиод к порту МК можно через резистор сопротивлением 300 Ом,
а для достижения максимальной дальности, как показано на рисунке irdriver или
стабилизированный по питанию вариант на рисунке iremitter.
irdriver iremitter  
Рис.: irdriver Рис.: iremitter
     

При разработке пульта помогла справочная информация о протоколе sharp
взятая с сайта sbprojects.com, там же можно найти описание других протоколов.

Схема устройства:


Программа для компилятора PICSimulatorIDE

 

Code


'rb.0 -
'rb.1 - on/off
'rb.2 - volume plus
'rb.3 - volume minus
'rb.4 - chanel plus
'rb.5 - chanel minus
'rb.6 - AV/TV
'rb.7 - infrared transiever

WaitMs 100

Dim a1 As Byte
Dim addres_var As Byte
Dim add0 As Bit
Dim add1 As Bit
Dim add2 As Bit
Dim add3 As Bit
Dim add4 As Bit

addres_var = %00000000

TRISB = %01111111
RB.7 = 0

start:

add0 = addres_var.0
add1 = addres_var.1
add2 = addres_var.2
add3 = addres_var.3
add4 = addres_var.4

If RB.1 = 1 Then
'on/off
Gosub addres
Gosub logic_zero
Gosub logic_one
Gosub logic_one
Gosub logic_zero
Gosub logic_one
Gosub logic_zero
Gosub logic_zero
Gosub logic_zero
Gosub logic_one
Gosub logic_zero
Gosub pulse

WaitMs 40
'on/off inverse
Gosub addres
Gosub logic_one
Gosub logic_zero
Gosub logic_zero
Gosub logic_one
Gosub logic_zero
Gosub logic_one
Gosub logic_one
Gosub logic_one
Gosub logic_zero
Gosub logic_one
Gosub pulse
Endif

If RB.2 = 1 Then
'volume plus
Gosub addres
Gosub logic_zero
Gosub logic_zero
Gosub logic_one
Gosub logic_zero
Gosub logic_one
Gosub logic_zero
Gosub logic_zero
Gosub logic_zero
Gosub logic_one
Gosub logic_zero
Gosub pulse

WaitMs 40
'volume plus inverse
Gosub addres
Gosub logic_one
Gosub logic_one
Gosub logic_zero
Gosub logic_one
Gosub logic_zero
Gosub logic_one
Gosub logic_one
Gosub logic_one
Gosub logic_zero
Gosub logic_one
Gosub pulse
Endif

If RB.3 = 1 Then
'volume minus
Gosub addres
Gosub logic_one
Gosub logic_zero
Gosub logic_one
Gosub logic_zero
Gosub logic_one
Gosub logic_zero
Gosub logic_zero
Gosub logic_zero
Gosub logic_one
Gosub logic_zero
Gosub pulse

WaitMs 40
'volume minus inverse
Gosub addres
Gosub logic_zero
Gosub logic_one
Gosub logic_zero
Gosub logic_one
Gosub logic_zero
Gosub logic_one
Gosub logic_one
Gosub logic_one
Gosub logic_zero
Gosub logic_one
Gosub pulse
Endif

If RB.4 = 1 Then
'chanel plus
Gosub addres
Gosub logic_one
Gosub logic_zero
Gosub logic_zero
Gosub logic_zero
Gosub logic_one
Gosub logic_zero
Gosub logic_zero
Gosub logic_zero
Gosub logic_one
Gosub logic_zero
Gosub pulse

WaitMs 40
'chanel plus inverse
Gosub addres
Gosub logic_zero
Gosub logic_one
Gosub logic_one
Gosub logic_one
Gosub logic_zero
Gosub logic_one
Gosub logic_one
Gosub logic_one
Gosub logic_zero
Gosub logic_one
Gosub pulse
Endif

If RB.5 = 1 Then
'chanel minus
Gosub addres
Gosub logic_zero
Gosub logic_one
Gosub logic_zero
Gosub logic_zero
Gosub logic_one
Gosub logic_zero
Gosub logic_zero
Gosub logic_zero
Gosub logic_one
Gosub logic_zero
Gosub pulse

WaitMs 40
'chanel minus inverse
Gosub addres
Gosub logic_one
Gosub logic_zero
Gosub logic_one
Gosub logic_one
Gosub logic_zero
Gosub logic_one
Gosub logic_one
Gosub logic_one
Gosub logic_zero
Gosub logic_one
Gosub pulse
Endif

If RB.6 = 1 Then
'AV/TV
Gosub addres
Gosub logic_one
Gosub logic_one
Gosub logic_zero
Gosub logic_zero
Gosub logic_one
Gosub logic_zero
Gosub logic_zero
Gosub logic_zero
Gosub logic_one
Gosub logic_zero
Gosub pulse

WaitMs 40
'AV/TV inverse
Gosub addres
Gosub logic_zero
Gosub logic_zero
Gosub logic_one
Gosub logic_one
Gosub logic_zero
Gosub logic_one
Gosub logic_one
Gosub logic_one
Gosub logic_zero
Gosub logic_one
Gosub pulse
Endif

addres_var = addres_var + 1
If addres_var > %00011111 Then
addres_var = %00000000
Endif

WaitMs 40
Goto start

End  

pulse:
For a1 = 0 To 11
RB.7 = 1
WaitUs 7
RB.7 = 0
WaitUs 19
Next a1
Return  

addres:
If add4 = 1 Then
Gosub logic_one
Else
Gosub logic_zero
Endif

If add3 = 1 Then
Gosub logic_one
Else
Gosub logic_zero
Endif

If add2 = 1 Then
Gosub logic_one
Else
Gosub logic_zero
Endif

If add1 = 1 Then
Gosub logic_one
Else
Gosub logic_zero
Endif

If add0 = 1 Then
Gosub logic_one
Else
Gosub logic_zero
Endif
Return  

logic_zero:
For a1 = 0 To 11
RB.7 = 1
WaitUs 7
RB.7 = 0
WaitUs 19
Next a1
WaitUs 680
Return  

logic_one:
For a1 = 0 To 11
RB.7 = 1
WaitUs 7
RB.7 = 0
WaitUs 19
Next a1
WaitUs 1680
Return  

'' (PIC16F628)
'' PIC16F84A @ 4MHz
'' -----
'' -|1 |-
'' -| |-
'' -| |-
'' -| |-
'' -| |- 300 Ом
'' -| |------[res]--------[IR diode]---
'' VDD-- /--------| |--------/ --VDD |
'' VDD-- /--------| |--------/ --VDD |
'' VDD-- /--------| |--------/ --VDD |
'' ----- GND
''
''
''К rb.1-rb.6 подключены подтягивающие
''резисторы 3кОм (на схеме не показаны)
''для подтяжки входов к земле
 

Архив с материалами можно скачать здесь

Обсудить на форуме




Категория: PIC Simulator IDE | Добавил: deskjet (03.09.2010)
Просмотров: 9530 | Комментарии: 2 | Теги: IR, ик, Проекты, пульт ДУ, picsimulatoride | Рейтинг: 5.0/1
Всего комментариев: 2
1 deskjet   (09.09.2010 11:24)
Интересно, кто-нибудь повторил проект или все скачали и убрали в долгий ящик?
Хотелось бы ознакомиться с критическими замечаниями, предложениями по
усовершенствованию кода или железа.

Добавлю еще, что время переключения на одно деление шкалы громкости примерно 5 секунд.
Если убрать подпрограмму автоматического перебора адресов устройств и установить
фиксированный адрес, то за одну секунду будет проходиться, примерно, половина
диапазона шкалы.
Еще заметил, что при использовании алгоритма автоматического перебора адресов устройств
громкость каждые 5 секунд изменяется не на одно деление а на несколько,
это значит, что телевизор реагирует на несколько разных адресов устройств.


2 MasterPic   (23.03.2011 12:23)
А здесь если бы комментарии были, то было бы лучше намного.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]