Ответ:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено vesago 01 марта 2005 г. 17:11
В ответ на: Декодирование RC5 отправлено fader 01 марта 2005 г. 16:38

;************************************************************************
; Autor: Alexey Starostin *
; Company: ARM *
;************************************************************************

LIST P=16F84
__CONFIG _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_ON

#include
#include
#include
; #include
;=================Биты инициализации=======================================
INIT_OPT EQU B'10010010' ;OPTION - включены внешние подтягивающие резисторы
INIT_INT EQU B'00001000' ;INTCON
;==========================================================================
INIT_PORTA EQU B'00000' ;PORTA
INIT_PORTB EQU B'11000000' ;PORTB
;========================Комманды===========================================
SYS EQU .1 ;Код системы
ON EQU .16 ;Код включения
OFF EQU .17 ;Код выключения
LEDS EQU .13 ;Код управления светодиодами
;======================================================================
ONE EQU B'01000000' ; 2-bit incoming pattern matches
ZERO EQU B'10000000'
TEST EQU B'11000000'
;***************************************************************************
CBLOCK 0x0C
COUNT ; A counter, used multiple places
FIELD
TOGGLE ; The RC5 Toggle bit
SYSTEM ; The RC5 System word
COMND ; The RC5 Command word
BIT_COUNT ; Counter for incoming bits
BYTE_COUNT ; Counter for buffer bytes
TEMP ; Used by PARSE to hold the 2-bit pattern
BUF
BAYT1
BAYT2
BAYT3
BAYT4
BIT1
BIT2
BIT3
BIT4
BIT5
BIT6
DELAYL
DELAYH
COUNTERL
COUNTERH
TEMP_ROM_ADR
Call_Temp
Count
FLAGS
w_temp
status_temp
super_count
ENDC

;**********************************************************************
;Железо
#DEFINE di PORTB,7 ;Вход ИК - ресивера
#DEFINE led PORTA,1 ;Выход для подключения светодиода

;Определения
#DEFINE dat INDF,0
#DEFINE d_temp TEMP,0

;Флаги
#DEFINE bad FLAGS,0

;************************************************************************
; Program start
;***********************************************************************
ORG 0x0000 ; RESET vector location
goto main
;*******************************************************************
ORG 0x0004
goto int
;**************МАКРОСЫ**********************************************
INIT_
CLEAR_
DELAY_
;*****************Подпрограммы**************************************
ww
movlw .8
movwf COUNT
goto ss

xx
movlw .4
movwf COUNT
decf super_count,f
goto ss
;==============Обработка прерывания=================================
;********************************************************************
int ;Подпрограмма
movwf w_temp
movf STATUS,w
movwf status_temp
;======================================================
bcf INTCON,T0IF
movlw .203
;""""""
movwf TMR0

movlw BAYT1
movwf FSR

movlw .4
movwf super_count
qq
btfss INTCON,T0IF
goto qq
;"""""""
;=====================================================
_рр
movlw b'00000010'
movwf INDF
movlw .6
movwf COUNT
nop
bcf INTCON,T0IF ;888
movlw .146
;""""""
movwf TMR0
btfsc di
goto Home
;===============================================
ss
btfss INTCON,T0IF
goto ss
;"""""""
ll
bcf INTCON,T0IF ;888
movlw .146
;"""""""
movwf TMR0

bsf dat
btfsc di
bcf dat

decfsz COUNT,f
goto _Next_Bit
goto _Next_Byt

_Next_Bit
rlf INDF,f
goto ss

_Next_Byt
incf FSR,f
movlw 18
xorwf FSR,w
bz xx
_dd
decfsz super_count,f
goto ww

;=====================================================
_Decode
rlf BAYT4,f ;Всего 14 х 2 = 28 бит
rlf BAYT4,f ;
rlf BAYT4,f ;
rlf BAYT4,f ;

;+++++++++
movf BAYT1,w
movwf TEMP
;+++++++++
rlf TEMP,f
rlf TEMP,f
call _Code ;Декодирование второго бита - FIELD
movwf FIELD ;

btfsc bad
goto Home ;Если установлен флаг ошибки - выход
;+++++++++

call _Code ;Декодирование третьего бита - TOGGLE
movwf TOGGLE
btfsc bad
goto Home ;Если установлен флаг ошибки - выход
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
movlw BIT1
movwf FSR
call _Code ;Декодирование кода системы -1
movwf INDF
btfsc bad
goto Home ;Если установлен флаг ошибки - выход

;==========
movf BAYT2,w ;BAYT2
movwf TEMP
movlw .4
movwf COUNT
loop
incf FSR,f
call _Code ;Декодирование кода системы -2
movwf INDF
btfsc bad
goto Home ;Если установлен флаг ошибки - выход
decfsz COUNT,f
goto loop

;Забивка команды
movlw .5
movwf COUNT
movlw BIT1
movwf FSR
clrf TEMP
loop_sys
bcf d_temp
btfsc dat
bsf d_temp
rlf TEMP,f
incf FSR,f
decfsz COUNT,f
goto loop_sys
rrf TEMP,f
movf TEMP,w
movwf SYSTEM ;система


;=========Декодирование кода команды===============
movf BAYT3,w ;BAYT3
movwf TEMP
movlw .4
movwf COUNT
movlw BIT1
movwf FSR
loop_com
call _Code ;Декодирование кода команды - 1..4
movwf INDF
btfsc bad
goto Home ;Если установлен флаг ошибки - выход
incf FSR,f
decfsz COUNT,f
goto loop_com

movf BAYT4,w ;BAYT4
movwf TEMP
movlw .2
movwf COUNT
loop_com1
call _Code ;Декодирование кода команды - 5..6
movwf INDF
btfsc bad
goto Home ;Если установлен флаг ошибки - выход
incf FSR,f
decfsz COUNT,f
goto loop_com1

;=========
;Забивка кода
movlw .6
movwf COUNT
movlw BIT1
movwf FSR
clrf TEMP
loop_com2
bcf d_temp
btfsc dat
bsf d_temp
rlf TEMP,f
incf FSR,f
decfsz COUNT,f
goto loop_com2
rrf TEMP,f
movf TEMP,w
movwf COMND ;комманда
;**********************************************************************
; goto _Analiz ;здесь анализируется система
;и команда и исполняется

movwf PORTB

bcf PORTA,0
btfsc FIELD,0
bsf PORTA,0

bcf PORTA,2
btfsc TOGGLE,0
bsf PORTA,2

Home ;Окончание!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
movf status_temp,w
movwf STATUS
swapf w_temp,f
swapf w_temp,w
bcf INTCON,RBIF
retfie
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;===============Декодирование=========================
_Code
movlw TEST ;Загрузка в w b'11000000'
andwf TEMP,w ;TEMP & b'11000000'-> w
call _Takt ;Это 0 или 1 или ошибка
rlf TEMP,f
rlf TEMP,f
return

;==========Декодирование одного такта======================
_Takt
movwf BUF ;Загрузка в BUF (INDF & b'11000000')
bcf bad

movlw ONE ;Это 1?
xorwf BUF,w
bz _One

movlw ZERO ;Это 0?
xorwf BUF,w
bz _Zero

goto _Bad ;Это ошибка !!!!

_One
retlw 1 ;Возвращает 1
_Zero
retlw 0 ;Возвращает 0
_Bad
bsf bad ;Возвращает ошибку
retlw 0


;****************************************************************************
_Delay_x10ms
movwf Count
movlw .248 ;246
movwf DELAYL
movlw .13 ;13
movwf DELAYH
call _Delay_Uni
retlw 0
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
_Delay100ms
movlw .10
call _Delay_x10ms
retlw 0
;***************************************************************************
;****************************************************************************
; ОСНОВНАЯ
;****************************************************************************
main
call INIT
call CLEAR

;goto int

BANK0
movf PORTB,w
bsf INTCON,GIE
_ready
bsf led
call _Delay100ms
bcf led
call _Delay100ms
goto _ready
;*****************************************************************************
;FIELD, TOGGLE, SYSTEM, COMND
END ; End of program


;=================Биты инициализации=======================================
INIT_OPT EQU B'10010010' ;OPTION - включены внешние подтягивающие резисторы
INIT_INT EQU B'00000000' ;INTCON

;==========================================================================
INIT_PORTA EQU B'11111' ;PORTA
INIT_PORTB EQU B'11111111' ;PORTB

;========================Комманды===========================================
SYS EQU .8 ;Код системы
ON EQU .16 ;Код включения
OFF EQU .17 ;Код выключения
LEDS EQU .13 ;Код управления светодиодами

;***************************************************************************
CBLOCK 0x0C
COUNT ; A counter, used multiple places
TOGGLE ; The RC5 Toggle bit
SYSTEM ; The RC5 System word
COMND ; The RC5 Command word
BIT_COUNT ; Counter for incoming bits
BYTE_COUNT ; Counter for buffer bytes
TEMP ; Used by PARSE to hold the 2-bit pattern
SERIAL_BUF ; Buffer for incoming bitstream
SERIAL_2
SERIAL_3
SERIAL_4
SERIAL_5
SERIAL_6
FIELD ; Temporary storage for field bit
DELAYL
DELAYH
COUNTERL
COUNTERH
TEMP_ROM_ADR
Call_Temp
Count
ENDC

;**********************************************************************
DATA_IN EQU 3 ; Input data from IR pickup

;======================================================================
ONE EQU B'00000001' ; 2-bit incoming pattern matches
ZERO EQU B'00000010'



Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru