ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
29 июня
241210 Топик полностью
mazur (01.03.2011 18:00, просмотров: 370) ответил 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 ;=========================================================================