Я пытаюсь понять, есть ли гораздо более простой способ сделать это.То, что я делаю, - это создание четырех UART в микроконтроллере 8051, в котором для каждого UART отключена передача, и прием для каждого из них воспринимается через порты P0.0 - P0.3 соответственно через фототранзисторы (представьте здесь беспроводную связь).
Чтобы сделать эту вещь надежной, я чувствую, что мне нужно несколько раз выполнить выборку порта, чтобы получить правильные данные.Я верю в настройку 8051, если я использую аппаратный UART, он автоматически выбирает бит со скоростью 16x или 32x.
Мой нижеприведенный код хорошо выполняет выборку данных, но проблема в том, что онработает медленно, и почему-то я думаю, что может быть более быстрый способ выборки данных с помощью логических операторов какого-либо рода?
Это мой код:
SAMPLE equ P0 ;port to sample incoming data
MAJ equ 40h ;Where to store majority counts
MAJT equ 20h ;Majority track byte. Were interested in MSB
SCANRATE equ 4h ;# times to scan data before processing it
timer_interrupt:
mov A,SAMPLE ;get sample of data
mov R1,#MAJ
next:
rrc A ;get one bit of sampled data
jnc noincmaj
inc @R1 ;add 1 to that specific bit counter if bit=1
noincmaj:
jc incmaj
dec @R1 ;subtract 1 from that specific bit counter if bit=0
incmaj:
inc R1 ;use next bit counter#
cjne R1,#MAJ+4h,next
;loop ends when desired bit counter# is 5 (we only sample 4 bits)
djnz R7,noprocess
mov R0,#MAJ+3 ;Start at end of data since MSB feeds into value 1st
nextbit:
mov MAJT,@R0 ;Get count of bit counter
mov @R0,#0h ;and clear count
mov C,MAJT.7 ;If count < 1 then bit is set otherwise its cleared
rlc A ;shove result into resulting byte
dec R0 ;go to previous bit counter
cjne R0,#MAJ-1,nextbit ;continue until all bit counters are done
;Accumulator has scanned value
mov R7,#SCANRATE
noprocess:
reti
Это мой шаблон кодаидея, которую я хочу реализовать:
timer_interrupt:
mov R6,SAMPLE ;get sample of data
mov A,OLDDATA
; some_logical_operator_here_on_R6?
mov OLDDATA,A
djnz R7,noprocess
mov A,OLDDATA
;Accumulator has scanned value
mov R7,#SCANRATE
noprocess:
reti
Итак, мой вопрос заключается в том, чтобы с использованием кода, который занимает меньше тактов, чем первый, который я опубликовал, как я могу определить после сканирования SCANRATE, если после большинства сканированийконкретный бит в байте установлен или сброшен?
В качестве конкретного примера того, что я пытаюсь спросить, если SCANRATE равен 5, и значения, поступающие в следующем порядке:
01010101
11111111
11110000
00001111
11001100
Тогда я хочу, чтобы конечный результат (до установки R7) был:
11011101
Так какой же простой способ добиться этого для процессора 8051 без использования первого кода выше?