TSOP,PIC18 и RC5

#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 свернуть / развернуть