TSOP,PIC18 и RC5

В наличии был вытянутый из плеера цоп, и демоборда из PICKIT3. Собственно декодирование RC5 осуществляется по таймеру: приходит стартовый бит, запускается таймер и определяет лог. уровень на INT0(У RC5 особенность, что если заполнена первая половина периода — 0, если вторая — 1) и собирает 2 байта информации(14 бит).Код на ассемблере для pic18f45k20:



#include "p18f45k20.inc"

NBRC5 equ 0x00
RCBH  equ 0x01
RCBL  equ 0x02
tempW equ 0x10

org 0x00
	goto start

org 0x08
	movwf tempW
	call intH
	movf tempW,w
retfie

org 0x18
	movwf tempW
	call intL
	movf tempW,w
retfie

org 0x100

intH:
;	bsf PORTD,1
	bcf INTCON,7   ;запретить прерывания высокого приоритета
	bcf INTCON,1   ;сбросить флаг прерывания ИНТ0
	bcf INTCON,4   ;запретить прерывания от ИНТ0
	movlw b'01000100'; когфиг. таймера0:8бит,предделитель 128
	movwf T0CON
	movlw 0x50
	movwf TMR0L
	clrf NBRC5
	clrf RCBH
	clrf RCBL
	bcf RCBH,6
	bsf T0CON,7    ;включить таймер0
	bsf INTCON,5   ;разрешить прерывания от таймер0
	bsf INTCON,6   ;разрешить прерывания низкого приоритета
	bsf INTCON,7   ;разрешить прерывания высокого приоритера
return

intL:
	bsf PORTD,0
	bcf INTCON,6
	bcf INTCON,TMR0IF
	movlw 0x22
	movwf TMR0L
	bsf INTCON,6
	incf NBRC5
	btfss PORTB,0
	bcf RCBH,7
	btfsc PORTB,0
	bsf RCBH,7
	bcf PORTD,0
	movlw 0x01
	CPFSEQ NBRC5
	goto bs2
	btfsc RCBH,7
	bsf RCBH,4	
	goto exit
bs2:movlw 0x02
	CPFSEQ NBRC5
	goto bs3
	btfsc RCBH,7
	bsf RCBH,3
	goto exit
bs3:movlw 0x03
	CPFSEQ NBRC5
	goto bs4
	btfsc RCBH,7
	bsf RCBH,2
	goto exit
bs4:movlw 0x04
	CPFSEQ NBRC5
	goto bs5
	btfsc RCBH,7
	bsf RCBH,1
	goto exit
bs5:movlw 0x05
	CPFSEQ NBRC5
	goto bs6
	btfsc RCBH,7
	bsf RCBH,0
	goto exit
bs6:movlw 0x06
	CPFSEQ NBRC5
	goto bs7
	btfsc RCBH,7
	bsf RCBL,7
	goto exit
bs7:movlw 0x07
	CPFSEQ NBRC5
	goto bs8
	btfsc RCBH,7
	bsf RCBL,6
	goto exit
bs8:movlw 0x08
	CPFSEQ NBRC5
	goto bs9
	btfsc RCBH,7
	bsf RCBL,5
	goto exit
bs9:movlw 0x09
	CPFSEQ NBRC5
	goto bsA
	btfsc RCBH,7
	bsf RCBL,4
	goto exit
bsA:movlw 0x0A
	CPFSEQ NBRC5
	goto bsB
	btfsc RCBH,7
	bsf RCBL,3
	goto exit
bsB:movlw 0x0B
	CPFSEQ NBRC5
	goto bsC
	btfsc RCBH,7
	bsf RCBL,2
	goto exit
bsC:movlw 0x0C
	CPFSEQ NBRC5
	goto bsD
	btfsc RCBH,7
	bsf RCBL,1
	goto exit
bsD:movlw 0x0D
	CPFSEQ NBRC5
	goto bsE
	btfsc RCBH,7
	bsf RCBL,0
bsE:movlw 0x0F
	CPFSEQ NBRC5
	goto exit
;	movf RCBL,W
;	movwf PORTD
	bsf RCBH,6
	bcf T0CON, TMR0ON
	bcf INTCON,TMR0IE
	bcf INTCON,6
	bcf INTCON,INT0IF
	bsf INTCON,INT0IE
exit
return


start:
	bsf OSCTUNE, PLLEN ; включаем множитель для 64мгц
	bsf OSCCON,4
	bsf OSCCON,5
	bsf OSCCON,6
	clrf ANSEL
	clrf ANSELH
	clrf TRISD
	clrf PORTD   
	BSF RCON,IPEN
	BSF TRISB,0    ;настройка RB0 на вход
	BCF INTCON2,6  ;прерывание ИНТ0 по спаду
	BCF INTCON2,2  ;прерывание таймера0 низкий приоритет
	BSF INTCON,4   ;разрешить прерывание ИНТ0
	movlw b'01000100'; когфиг. таймера0:8бит,предделитель 128
	movwf T0CON
	BSF INTCON,6   ;разрешить прерывания низкого приоритета
	BSF INTCON,7   ;разрешить прерывания низкого приоритета
	bsf PORTD,3
wait:
	btfss RCBH,6
	goto wait
	movlw 0x10
	CPFSEQ RCBL
	goto r
	rrncf PORTD
	btfsc STATUS,Z
	bsf PORTD,7
	bcf STATUS,Z
	clrf RCBL
r:  movlw 0x11
	CPFSEQ RCBL
	goto wait
	rlncf PORTD
	btfsc STATUS,Z
	bsf PORTD,1
	clrf RCBL
	bcf STATUS,Z
	goto wait
end


Контроллер ждет пока TSOP примет первую стартовую пачку импульсов и опустит уровень к «0», при этом происходит прерывание, запускается таймер, на время приема команды отключается прерывания высокого приоритета(INT0). В коде специально нет проверки источников прерываний, т.к. кроме таймера и INT0 ничего произойти не должно.

Пример управляет светодиодами подключенными к PORTD(у кого есть подходящий пульт со стрелками в лево-право могут посмотреть, светодиод будет вращаться под управлением пульта). Памяти занимается 3 байта: номер принимаемого бита, 2 байта команды(RCBH.6 флаг принятой команды(устанавливается когда команда принята полностью)) и используется много кода, да к тому же в прерывании(хотя выполняется ведь не весь т.к. там что-то вроде case-а организованно). Может у кого есть идеи оптимизации?
  • 0
  • 07 марта 2011, 01:07
  • kest

Комментарии (4)

RSS свернуть / развернуть
Про PIC на асме идей не подскажу. А на Си для AVRок у меня где-то валяется модуль для работы с самсунговскими пультами. Если кому интересно — могу поискать выложить.
0
0
PIC18F45K20 имеет расширенный набор комманд

там есть команда CALLW как раз для данного случая подходит
в оптимизации intL
и всегда выполняться будет по времени одинаково быстро
+1
хм… не видел нигде такую полезную команду, а до места где в ДШ описана система команд не дошел ещё(пользуюсь списком команд для 18х с microchip.ru). спасиба за подсказку
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.