Задача
Принять команду с пульта дистанционного управления и вывести её номер.
Микроконтроллер: PIC16F84A, кварц 4 МГц. Среда: MPLAB X + MPASM (или любой совместимый ассемблер). Как настроить среду и прошить контроллер — в статье программирование PIC.
Что понадобится
- PIC16F84A
- кварц 4 МГц + 2×22 пФ
- ИК-приёмник TSOP1736 (36 кГц)
- конденсатор 100 нФ по питанию приёмника
- светодиоды индикации
Схема подключения
| Вывод | Подключение |
|---|---|
| RB0 | выход ИК-приёмника (активен низким уровнем) |
| Питание приёмника | +5 В и GND, обязательно с конденсатором 100 нФ |
| RB1…RB7 | индикация номера команды |
Алгоритм
- Дождаться паузы между посылками, затем стартового фронта.
- Сместиться на три четверти бита — в середину информационной половины.
- Считывать уровень каждые 1,778 мс, вдвигая биты в регистры.
- Выделить из кадра шесть бит команды.
Листинг на ассемблере
Код проверен ассемблером и собирается без ошибок. Скачать: p40.asm · p40.hex (готовая прошивка).
;=======================================================
; Проект 40. Приём ИК-пульта в коде RC5
; PIC16F84A, 4 МГц. Приёмник TSOP1736 -> RB0 (выход активен низким)
; Принятый номер команды выводится на RB1..RB7
;=======================================================
LIST p=16F84A
#include <p16f84a.inc>
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
#define IR PORTB,0
cblock 0x0C
d1, bitcnt, cmd, addr, tmp
endc
ORG 0x000
goto Start
Start
bsf STATUS,RP0
movlw b'00000001' ; RB0 — вход приёмника
movwf TRISB
bcf STATUS,RP0
clrf PORTB
Main
call RcRead
movf cmd,w
rlf cmd,w ; сдвигаем, RB0 занят приёмником
andlw 0xFE
movwf PORTB
goto Main
;--- приём посылки RC5: 14 бит, манчестер, бит 1,778 мс ---
RcRead
;--- ждём паузы между посылками ---
WaitIdle
btfss IR
goto WaitIdle
;--- ждём стартового фронта ---
WaitStart
btfsc IR
goto WaitStart
call Delay1200us ; смещаемся в середину второй половины бита
movlw .13 ; после старт-бита осталось 13 бит
movwf bitcnt
clrf cmd
clrf addr
RcBit
call Delay1778us ; шаг ровно на один бит
bcf STATUS,C
btfss IR ; уровень в середине бита
bsf STATUS,C ; низкий уровень = логическая единица
rlf addr,f ; сдвигаем 14-битный кадр
rlf cmd,f
decfsz bitcnt,f
goto RcBit
movlw 0x3F ; оставляем 6 бит команды
andwf cmd,f
return
Delay1200us
movlw .240
movwf d1
X12 nop
nop
nop
decfsz d1,f
goto X12
return
Delay1778us
movlw .148
movwf d1
X17 nop
nop
nop
nop
nop
nop
nop
nop
nop
decfsz d1,f
goto X17
return
END
Пояснения
- В коде RC5 информация закодирована направлением перепада в середине бита, поэтому выборку делают именно в середине — там уровень однозначен.
- Выход TSOP инвертирован: несущая 36 кГц даёт на выходе низкий уровень, поэтому логическая единица RC5 читается как ноль на выводе.
- Приёмник чувствителен к помехам по питанию — конденсатор 100 нФ рядом с ним обязателен, иначе появятся ложные срабатывания.
Что дальше
Разобравшись с этим проектом, переходите к следующему в разделе проекты на PIC. Справочник по архитектуре и периферии контроллеров — на странице микроконтроллеры PIC.