Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

МК51 (аналог intel 8051): как добавить бит четности? - Микроконтроллеры

agcombeferre Знаток (498), закрыт 7 лет назад
Здравствуйте!
В массиве 20Н-27Н РПД микроконтроллера МК51 подготовлены для
передачи семиразрядные сообщения. Подскажите, пожалуйста, как добавить в качестве восьмого разряда
каждого байта бит контроля четности.
Пишу на ассемблере в среде MCU 8051 CDE, если это важно.
Заранее спасибо за ответ, каким бы он ни был
Дополнен 7 лет назад
Я оформила лишь внешний цикл (задала счетчик):

ORG 0
MOV R0, #20h
M1: mov A, r0
inc r0
....
CJNE R0, #27h, M1;
jmp main
end

Многоточие - недостающая часть программы, над которой кумекаю.
Работать решила с аккумулятором, чтобы внешний цикл не зависел от значений, которые мне нужно получить в итоге, поэтому перемещаю значение регистра в него. Может быть, возможно организовать как бы "лесенку", которая перебирала бы число побитно, потом подсчитывала количество единичных битов в числе, а затем, в зависимости от того, четное количество единиц или нет, добавляла бы восьмым битом 1 в случае, если количество единиц четное число, или 0, если нечетное.
Спасибо, что откликнулись!
Лучший ответ
Лось Филаретовый Просветленный (20332) 7 лет назад


для получения бита четности 6 раз производится сдвиг и логическое ИСКЛЮЧАЮЩЕЕ ИЛИ с исходным сообщением. это общепринятый алгоритм.
потом полученный бит нечетности инвертируется и вдвигается в качестве младшего бита в исходное 7-ми разрядное сообщение.
Остальные ответы
Demon Мудрец (11364) 7 лет назад
свой код покажи, мы дополним
agcombeferreЗнаток (498) 7 лет назад
Я оформила лишь внешний цикл (задала счетчик):

ORG 0
MOV R0, #20h
M1: mov A, r0
inc r0
....
CJNE R0, #27h, M1;
jmp main
end

Многоточие - недостающая часть программы, над которой кумекаю.
Работать решила с аккумулятором, чтобы внешний цикл не зависел от значений, которые мне нужно получить в итоге, поэтому перемещаю значение регистра в него. Может быть, возможно организовать как бы "лесенку", которая перебирала бы число побитно, потом подсчитывала количество единичных битов в числе, а затем, в зависимости от того, четное количество единиц или нет, добавляла бы восьмым битом 1 в случае, если количество единиц четное число, или 0, если нечетное.
Спасибо, что откликнулись!
Demon Мудрец (11364) организовать как бы "лесенку", которая перебирала бы число побитно ДА , потом подсчитывала количество единичных битов в числе, а затем, в зависимости от того, четное количество единиц или нет, добавляла бы восьмым битом 1 в случае, если количество единиц четное число, или 0, если нечетное. ДА
East RX Просветленный (24495) 7 лет назад
На 8051, насколько я помню, как и на x86 есть флаг чётности (parity flag). Так что гораздо проще будет проверить этот флаг, вместо того, чтобы проверять и подсчитывать каждый бит. Тем более что он для этого и предназначен. Например, на x86 это можно сделать так:

test al, al ;проверяем AL
jnp not_p ;если PF не установлен, переходим далее
or al, 80h ;иначе устанавливаем восьмой бит
not_p: ...

Как это будет на 8051 я не помню, должно быть что-то вроде этого:
...
mov c, p ;скопировать parity flag в carry flag
jnc not_p
orl a, 80h
not_p: ...
Похожие вопросы