Бит большинства обнаружения в 8051 без потери тактов - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь понять, есть ли гораздо более простой способ сделать это.То, что я делаю, - это создание четырех 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 без использования первого кода выше?

...