mazur (01.03.2011 18:00, просмотров: 380) ответил mazur на Есть битовое поле. Скажем, 24 бита, то есть, 3 байта. И нужно проверить определенный бит. Когда писал проверочный код, это получилось 24 функции, которые отличались только номерами битов. Попытался возложить эту функцию микроконтроллеру.
Ну вроде решил.
;=========================================================================
;------------------------------ Алгоритм ---------------------------------
;---------------------------- Опрос входов -------------------------------
; 1. Считывание входов.
; 2. Сравнение текущего и предыдущего состояния входов. Если равно,
; то выход. Если не равно, то:
;а) Сохранение текущего состояния входов.
;б) Операция "Исключаещее или" над текущим и предыдущим состояниями
; входов.
;в) Сохранение результата операции.
;-------------------------------------------------------------------------
;---------------- Определение, на каком входе изменение ------------------
; 1. Считывание результата операции "Исключаещее или" над текущим и
; предыдущим состояниями входов.
; 2. Указатель на начало таблицы входов.
;=========================================================================
.equ DEBOUNCE_DELAY = 1 ; 20 ; ms
;-------------------------------------------------------------------------
;-------------------------------------------------------------------------
.equ INPUT_1 = 0b000000000000000000000001
.equ INPUT_2 = 0b000000000000000000000010
.equ INPUT_3 = 0b000000000000000000000100
.equ INPUT_4 = 0b000000000000000000001000
.equ INPUT_5 = 0b000000000000000000010000
.equ INPUT_6 = 0b000000000000000000100000
.equ INPUT_7 = 0b000000000000000001000000
.equ INPUT_8 = 0b000000000000000010000000
.equ INPUT_9 = 0b000000000000000100000000
.equ INPUT_10 = 0b000000000000001000000000
.equ INPUT_11 = 0b000000000000010000000000
.equ INPUT_12 = 0b000000000000100000000000
.equ INPUT_13 = 0b000000000001000000000000
.equ INPUT_14 = 0b000000000010000000000000
.equ INPUT_15 = 0b000000000100000000000000
.equ INPUT_16 = 0b000000001000000000000000
.equ INPUT_17 = 0b000000010000000000000000
.equ INPUT_18 = 0b000000100000000000000000
.equ INPUT_19 = 0b000001000000000000000000
.equ INPUT_20 = 0b000010000000000000000000
.equ INPUT_21 = 0b000100000000000000000000
.equ INPUT_22 = 0b001000000000000000000000
.equ INPUT_23 = 0b010000000000000000000000
.equ INPUT_24 = 0b100000000000000000000000
;-------------------------------------------------------------------------
;-------------------------------------------------------------------------
.equ _INPUT_1 = 0
.equ _INPUT_2 = 1
.equ _INPUT_3 = 2
.equ _INPUT_4 = 3
.equ _INPUT_5 = 4
.equ _INPUT_6 = 5
.equ _INPUT_7 = 6
.equ _INPUT_8 = 7
.equ _INPUT_9 = 8
.equ _INPUT_10 = 9
.equ _INPUT_11 = 10
.equ _INPUT_12 = 11
.equ _INPUT_13 = 12
.equ _INPUT_14 = 13
.equ _INPUT_15 = 14
.equ _INPUT_16 = 15
.equ _INPUT_17 = 16
.equ _INPUT_18 = 17
.equ _INPUT_19 = 18
.equ _INPUT_20 = 19
.equ _INPUT_21 = 20
.equ _INPUT_22 = 21
.equ _INPUT_23 = 22
.equ _INPUT_24 = 23
;-------------------------------------------------------------------------
;-------------------------------------------------------------------------
#define tab_in(x) byte3(x), byte2(x), low(x)
Table_Inputs:
.db tab_in(INPUT_1), _INPUT_1
.db tab_in(INPUT_2), _INPUT_2
.db tab_in(INPUT_3), _INPUT_3
.db tab_in(INPUT_4), _INPUT_4
.db tab_in(INPUT_5), _INPUT_5
.db tab_in(INPUT_6), _INPUT_6
.db tab_in(INPUT_7), _INPUT_7
.db tab_in(INPUT_8), _INPUT_8
.db tab_in(INPUT_9), _INPUT_9
.db tab_in(INPUT_10), _INPUT_10
.db tab_in(INPUT_11), _INPUT_11
.db tab_in(INPUT_12), _INPUT_12
.db tab_in(INPUT_13), _INPUT_13
.db tab_in(INPUT_14), _INPUT_14
.db tab_in(INPUT_15), _INPUT_15
.db tab_in(INPUT_16), _INPUT_16
.db tab_in(INPUT_17), _INPUT_17
.db tab_in(INPUT_18), _INPUT_18
.db tab_in(INPUT_19), _INPUT_19
.db tab_in(INPUT_20), _INPUT_20
.db tab_in(INPUT_21), _INPUT_21
.db tab_in(INPUT_22), _INPUT_22
.db tab_in(INPUT_23), _INPUT_23
.db tab_in(INPUT_24), _INPUT_24
.db 0xFF, 0xFF
;-------------------------------------------------------------------------
;-------------------------------------------------------------------------
Table_Bits:
.db 0b00000001, 0b00000010
.db 0b00000100, 0b00001000
.db 0b00010000, 0b00100000
.db 0b01000000, 0b10000000
;-------------------------------------------------------------------------
;-------------------------------------------------------------------------
.dseg
.equ INPUTS_BYTES_LENGHT = 3
INPUTS_PREV:
INPUTS_PREV_0:
.byte 1
INPUTS_PREV_1:
.byte 1
INPUTS_PREV_2:
.byte 1
INPUTS_CURRENT:
INPUTS_CURRENT_0:
.byte 1
INPUTS_CURRENT_1:
.byte 1
INPUTS_CURRENT_2:
.byte 1
INPUTS_FLAGS:
INPUTS_FLAGS_0:
.byte 1
INPUTS_FLAGS_1:
.byte 1
INPUTS_FLAGS_2:
.byte 1
INPUTS_CNT:
.byte 1
_PROCESS_INPUTS:
.byte 1
.equ _PROCESS_INPUTS_QUANTITY = 3
.equ _PROCESS_INPUTS_INIT = 0
.equ _PROCESS_INPUTS_NONE = 1
.equ _PROCESS_INPUTS_CHANGE = 2
Def_Flags INPUTS_CHANGE_FLG
.cseg
Process_Inputs:
Read_State _PROCESS_INPUTS,_PROCESS_INPUTS_QUANTITY
brlo Process_Inputs_0
rjmp Process_Errors
Process_Inputs_0:
case _PROCESS_INPUTS_INIT,Process_Inputs_Init
case _PROCESS_INPUTS_NONE,Process_Inputs_None
case _PROCESS_INPUTS_CHANGE,Process_Inputs_Change
ret
Process_Inputs_Init:
ldix SPI_RECEIVE_BUFFER
ldiy INPUTS_PREV
ldiz INPUTS_CURRENT
ldi CNT,INPUTS_BYTES_LENGHT
Process_Inputs_Init_Cycle:
st X+,RSER
st Y+,RSER
st Z+,RSER
dec CNT
brne Process_Inputs_Init_Cycle
Set_S_Timer ST_PROCESS_INPUTS,(1<<ST_BLOCK_FLG | 1<<ST_RERUN_FLG),DEBOUNCE_DELAY
Set_State _PROCESS_INPUTS,_PROCESS_INPUTS_NONE
Process_Inputs_None:
Check_S_Time_Out ST_PROCESS_INPUTS
sbrc r16,ST_TIME_OUT_FLG
ret
ldix SPI_RECEIVE_BUFFER
ldiy INPUTS_PREV
ldi CNT,INPUTS_BYTES_LENGHT
in r16,SREG
andi r16,0b11000010
sbr r16,1<<SREG_Z
mov RSREG,r16
Process_Inputs_None_Cycle_0:
ld r16,X+
ld r17,Y+
out SREG,RSREG
cpc r16,r17
in RSREG,SREG
dec CNT
brne Process_Inputs_None_Cycle_0
out SREG,RSREG
breq Process_Inputs_End
ldix SPI_RECEIVE_BUFFER
ldiy INPUTS_PREV
ldiz INPUTS_CURRENT
ldi CNT,INPUTS_BYTES_LENGHT
Process_Inputs_None_Cycle_1:
ld r16,X+ ; Считывание текущего состояния входов.
ld r17,Y ; Считывание предыдущего состояния входов.
eor r17,r16 ; Операция "Исключающее ИЛИ" над состояниями входов.
st Z+,r17 ; Запись результата операции.
st Y+,r16 ; Запись текущего состояния входов.
dec CNT
brne Process_Inputs_None_Cycle_1
Set_State _PROCESS_INPUTS,_PROCESS_INPUTS_CHANGE
Process_Inputs_End:
ret
Process_Inputs_Change:
Set_State _PROCESS_INPUTS,_PROCESS_INPUTS_NONE
cbr FLAGS,1<<INPUTS_CHANGE_FLG
ldix (INPUTS_CURRENTУM_BYTES_LENGHT)
ldiz (Table_Inputs*2)
Process_Inputs_Change_Cycle:
lpm r16,Z+
cp r16,RSER
lpm r16,Z
cpc r16,RSER
breq Process_Inputs_Change_End
sbiw ZL,1
ldi CNT,INPUTS_BYTES_LENGHT
in r16,SREG
andi r16,0b11000010
sbr r16,1<<SREG_Z
mov RSREG,r16
Process_Inputs_Change_Cycle_0:
lpm r16,Z+
ld r17,-X
out SREG,RSREG
cpc r16,r17
in RSREG,SREG
dec CNT
brne Process_Inputs_Change_Cycle_0
out SREG,RSREG
breq Table_Inputs_Equal
adiw ZL,1
adiw XL,INPUTS_BYTES_LENGHT
rjmp Process_Inputs_Change_Cycle
Table_Inputs_Equal:
lpm r16,Z
; mov r0,ZL
; mov r1,ZH
mov CNT,r16
andi CNT,7
lsr r16
lsr r16
lsr r16
ldix INPUTS_FLAGS
addw X,r16,RCLR
ld r16,X
ldiz (Table_Bits*2)
addw Z,CNT,RCLR
lpm r17,Z
and r16,r17
ld r16,X
brne Input_Pressed
or r16,r17
st X,r16
Process_Inputs_Change_End:
ret
Input_Pressed:
com r17
and r16,r17
st X,r16
ret
;=========================================================================