AFON // радиотехник affonya@mail.ru
← Проекты на PIC

Проект 40. Приём ИК-пульта в коде RC5

Контроллер принимает команды обычного телевизионного пульта. Разбираем протокол RC5: манчестерское кодирование, стартовые биты, адрес и команда — и получаем беспроводное управление почти даром.

Задача

Принять команду с пульта дистанционного управления и вывести её номер.

Микроконтроллер: PIC16F84A, кварц 4 МГц. Среда: MPLAB X + MPASM (или любой совместимый ассемблер). Как настроить среду и прошить контроллер — в статье программирование PIC.

Что понадобится

  • PIC16F84A
  • кварц 4 МГц + 2×22 пФ
  • ИК-приёмник TSOP1736 (36 кГц)
  • конденсатор 100 нФ по питанию приёмника
  • светодиоды индикации

Схема подключения

ВыводПодключение
RB0выход ИК-приёмника (активен низким уровнем)
Питание приёмника+5 В и GND, обязательно с конденсатором 100 нФ
RB1…RB7индикация номера команды

Алгоритм

  1. Дождаться паузы между посылками, затем стартового фронта.
  2. Сместиться на три четверти бита — в середину информационной половины.
  3. Считывать уровень каждые 1,778 мс, вдвигая биты в регистры.
  4. Выделить из кадра шесть бит команды.

Листинг на ассемблере

Код проверен ассемблером и собирается без ошибок. Скачать: 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.