Программная реализация кодера и декодера БЧХ-кода (63,36), исправляющего ошибки кратности пять, для микроконтроллера МК51
Проектирование кодера и декодера циклического БЧХ-кода. Программа для кодирования и декодирования сообщений в БЧХ-коде. Метод декодирования и исправления ошибок, расчет вариантов их обработки. Эффективность использования микроконтроллеров с ядром MCS51.
Рубрика | Коммуникации, связь, цифровые приборы и радиоэлектроника |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 31.05.2014 |
Размер файла | 55,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Программная реализация кодера и декодера БЧХ-кода (63,36), исправляющего ошибки кратности пять, для микроконтроллера МК51
кодер циклический ошибка микроконтроллер
1. Кодер БЧХ
Для кодирования исходного сообщения в БЧХ-код (63,36) был выбран табличный полином, представление которого в 16-тиричной системе записывается
G(x) = 0x86E8113 (hex)
На рис.1 приведен алгоритм кодирования исходного сообщения в БЧХ код с использованием данного полинома. В тексте программы «БЧХ-кодера» описаны регистры, которые заносятся входные и выходные значения. В тексте программы описаны регистры, которые заносятся входные и выходные значения.
Размещено на http://www.allbest.ru/
Рис. 1. Алгоритм кодирования входного сообщения 36 бит в БЧХ-код
Программа для кодирования 36_бит сообщения в БЧХ-код
Программа для кодировании 36_бит сообщения циклическим; кодом - БЧХ кодом (63,36). Проверочный полином представлен
G(x) = 1033500423 (mod8) или G(x) = 0x86E8113(hex)
Кодировка происходит методом сдвига исходного кода на 27 позиций
Остаток от деления этого кода на заданный полином суммируется с исходным сдвинутым кодом, получая кодированное 63-бит сообщение в БЧХ-коде
Исходное сообщение записывается в регистрах bufer0 -bufer4 (первые 36-бит)
Выходное сообщение представляется в регистрах bufer0 - bufer7, а именно в первых 63-бит
bufer7 equ 20h
bufer6 equ 21h
bufer5 equ 22h
bufer4 equ 23h
bufer3 equ 24h
bufer2 equ 25h
bufer1 equ 26h
bufer0 equ 27h
temp3 equ 28h
temp2 equ 29h
temp1 equ 2ah
temp0 equ 2bh
count_bitCh equ 38h; счетчик разрядности числителя
count_bitZn equ 39h; счетчик разрядности знаменателя
count_takt equ 3ah; счетчик количества тактов для деления
temp_reg1 equ 3bh; регистр временных данных 1
temp_reg2 equ 3ch; регистр временных данных 2
Константы
polynom set 86e8113h; значение задающего полинома
Chislitel_bit set 64; разрядность числителя
Znamenatel_bit set 32; разрядность знаменателя
org 0; начало исполняемого кода программы.
sjmp START
Инициализация системных ресурсов микроконтроллера START: mov SP,#50h; стека по адресу 0х50; запись значения полинома в регистры temp3 - temp0
mov temp3,#high(polynom/10000h)
mov temp2,#low(polynom/10000h)
mov temp1,#high(polynom)
mov temp0,#low(polynom)
запись значения числителя в регистры bufer7 - bufer0
mov bufer7,#00h
mov bufer6,#00h
mov bufer5,#00h
mov bufer4,#08h
mov bufer3,#00h
mov bufer2,#00h
mov bufer1,#00h
mov bufer0,#00h
сдвиг влево исходного сообщения на 27 позиций
mov count_takt,#27
shift_left: acall shift_left_chislitel
djnz count_takt, shift_left
сохраним значение сдвинутого сообщения в стеке
push bufer0
push bufer1
push bufer2
push bufer3
push bufer4
push bufer5
push bufer6
push bufer7
----------------------------------------------------------------;
сохранение исходного сообщения в стеке acall DIV64_32mod2
извлечение исходного сообщения из стека
pop bufer7
pop bufer6
pop bufer5
pop bufer4
pop bufer3
pop bufer2
pop bufer1
pop bufer0
добавить остаток к подготовленному исходному сообщению
mov a,temp0
orl bufer0,a
mov a,temp1
orl bufer1,a
mov a,temp2
orl bufer2,a
mov a,temp3
orl bufer3,a
исходное сообщение закодировано, зациклить программу sjmp $
подпрограмма вычисления остатка от деления 64-х битового числителя на 32-х битовый знаменатель. Числитель должен быть записан предварительно в регистры bufer7 - bufer0 , а знаменатель в temp3 - temp0.
остаток от деления возвращается в регистрах temp3 - temp0 DIV64_32mod2:
вычисление разрядности числителя максимальное значение 64 - бита и выравнивание по старшему биту bufer 7,7
mov count_bitCh,#Chislitel_bit
count_bit_chislitel: jb bufer7.7, bits_chislitel_succefull
acall shift_left_chislitel
djnz count_bitCh, count_bit_chislitel
ajmp error; значение числителя равно нулю
shift_left_chislitel: clr c; подпрограмма сдвига 8-ми регистров в лево
mov a,bufer0
rlc a
mov bufer0,a
mov a,bufer1
rlc a
mov bufer1,a
mov a,bufer2
rlc a
mov bufer2,a
mov a,bufer3
rlc a
mov bufer3,a
mov a,bufer4
rlc a
mov bufer4,a
mov a,bufer5
rlc a
mov bufer5,a
mov a,bufer6
rlc a
mov bufer6,a
mov a,bufer7
rlc a
mov bufer7,a
ret; сдвиг влево на 1 такт выполнен
bits_chislitel_succefull:
вычисление разрядности знаменателя максимальное значение 32-бита и выравнивание по старшему биту temp3,7
mov count_bitZn,#Znamenatel_bit
count_bit_znamenatel: jb temp3.7,bits_znamenatel_succefull
clr c
mov a,temp0
rlc a
mov temp0,a
mov a,temp1
rlc a
mov temp1,a
mov a,temp2
rlc a
mov temp2,a
mov a,temp3
rlc a
mov temp3,a
djnz count_bitZn, count_bit_znamenatel
зациклиться, если неверное значение числителя или знаменателя error: sjmp $; значение числителя или знаменателя равно нулю
bits_znamenatel_succefull:
определение числа тактов деления:
(разрядность Числителя - разрядность Знаменателя)+1 результат в регистре разрядности числителя count_takt
clr C
mov a, count_bitCh
subb a,count_bitZn
jnc m2
cpl a
inc a
m2: mov count_takt,a
inc count_takt
деление числителя на знаменатель по модулю два
diviation: jnb buffer 7.7, shift_chsl
mov a,temp3
xrl bufer7,a
mov a,temp2
xrl bufer6,a
mov a,temp1
xrl bufer5,a
mov a,temp0
xrl bufer4,a
shift_chsl:acall shift_left_chislitel
djnz count_takt,diviation
вычисление числа сдвигов остатка для получения корректного результата
вычисление числа сдвигов знаменателя
mov a,#Znamenatel_bit
clr c
subb a, count_bitZn
mov count_bitZn,a
сдвиг остатка вправо на количество тактов равное полученному значению +1 числа тактов сдвига знаменателя
mov a, count_bitZn
inc a
mov count_bitCh,a
shft_rgt_ostk: clr c
mov a,bufer7
rrc a
mov bufer7,a
mov a,bufer6
rrc a
mov bufer6,a
mov a,bufer5
rrc a
mov bufer5,a
mov a,bufer4
rrc a
mov bufer4,a
djnz count_bitCh, shft_rgt_ostk
mov temp3,bufer7
mov temp2,bufer6
mov temp1,bufer5
mov temp0,bufer4
завершение операции поиска остатка от деления по модулю 2
ret
2. Декодер БЧХ
Декодер БЧХ кода работает следующим образом:
- Программа выполняет деление входного сообщения на заданный полином. Остаток от деления определяет наличие ошибки в этом сообщении.
- В таблицах остатков находятся значения остатков, определяющие положение корректирующего бита (вектора ошибки). Например, если остаток равен значению байтов в таблице ostatok_01 = 00h, 00h, 00h, 01h (здесь первый байт старший), значит, ошибка содержится в нулевом бите исходного сообщения. Если остаток, например равен значению в таблице ostatok_63 = 04h, 37h, 40h, 89h (здесь первый байт старший), значит неверный последний 63-й бит сообщения.
- Если в сообщении несколько ошибок, а данный код способен исправлять 5 ошибок, то остаток от деления будет равен сумме значений по модулю 2 байтов тех таблиц, которые указывают на ошибочные байты. Например: если в нулевом и 63-м бите ошибка, то остаток от деления будет равен сумме по модулю 2 таблиц ostatok_01 и ostatok_63.
- Таким образом, для определения ошибок программа сначала сравнивает каждую таблицу с остатком, таким образом, делая проверку 1 из 63 - одиночная проверка.
- Слаживая поочередно таблицы по две, по три, по четыре и наконец по пять таблиц, перебирая все возможные варианты находя вектор ошибки, сложение которого по модулю 2 исправляет ошибки в исходном сообщении. Если все варианты были просчитаны, а совпадения остатка с подготовленным значением путем модификации таблиц не было, значит ошибка была обнаружена, но не исправлена.
Всего возможных вариантов модификаций таблиц равняется:
Кратность ошибки |
Количество итераций обработки |
|
I |
63 |
|
II |
1953 |
|
III |
39711 |
|
IV |
595665 |
|
V |
7028847 |
|
всего |
7666239 |
Программа для декодирования 63_бит сообщения в БЧХ-коде
Программа проверки и исправления ошибок в сообщении, которое закодировано кодом циклическим БЧХ-кодом (63, 36). Проверочный полином представлен
G(x) = 1033500423(mod8) или G(x) = 0x86E8113(hex).
Размещено на http://www.allbest.ru/
Рис. 2. Алгоритм декодирования входного сообщения 63 бит в БЧХ-коде
Исходное кодовое сообщение 63 бита, предварительно закодированное кодом БЧХ полиномом G(x) = 0x86E8113(hex), записывается в регистры bufer0 - bufer7.
Регистры temp0 - temp7 содержат значение заданного полинома. Программа определяет наличие ошибки при наличии ненулевого остатка при делении исходного кодового сообщения 63 бита на заданный полином. Программа исправляет до пяти ошибок включительно. Исправленное значение заносится в регистры er_vector0 - er_vector7,а в порты Р0-Р3 значение первых четырех байт исправленного сообщения. Если ошибка была обнаружена но после обработки не была исправлена то в порты Р0 - Р3 записываются все нули
Если исходное сообщение было корректное, то значение исходного сообщения; записывается в регистры byte 0-byte 7. После отработки каждого события определения двойной ошибки(2-й подвектор)
reg_err27 equ 10h
reg_err26 equ 11h
reg_err25 equ 12h
reg_err24 equ 13h
reg_err23 equ 14h
reg_err22 equ 15h
reg_err21 equ 16h
reg_err20 equ 17h
дополнительные регистры для определения тройной ошибки (3-й подвектор)
регистры для ввода исходного сообщения для проверки
bufer7 equ 20h
bufer6 equ 21h
bufer5 equ 22h
bufer4 equ 23h
bufer3 equ 24h
bufer2 equ 25h
bufer1 equ 26h
bufer0 equ 27h
регистры содержащие значения контрольного полинома
temp3 equ 28h
temp2 equ 29h
temp1 equ 2ah
temp0 equ 2bh
байты контроля совпадения остатков
cntrl_byte3 equ 2ch
cntrl_byte2 equ 2dh
cntrl_byte1 equ 2eh
cntrl_byte0 equ 2fh
байты вектора ошибки (1-й подвектор)
er_byte7 equ 30h
er_byte6 equ 31h
er_byte5 equ 32h
er_byte4 equ 33h
er_byte3 equ 34h
er_byte2 equ 35h
er_byte1 equ 36h
er_byte0 equ 37h
count_bitCh equ 38h; счетчик разрядности числителя
count_bitZn equ 39h; счетчик разрядности знаменателя
count_takt equ 3ah; счетчик количества тактов для деления
temp_reg1 equ 3bh; регистр временных данных 1
temp_reg2 equ 3ch; регистр временных данных 2
qu 40h
reg_err46 equ 41h
reg_err45 equ 42h
reg_err44 equ 43h
reg_err43 equ 44h
reg_err42 equ 45h
reg_err41 equ 46h
reg_err40 equ 47h
дополнительные регистры для определения пятикратной ошибки (5-й подвектор)
reg_err57 equ 48h
reg_err56 equ 49h
reg_err55 equ 4ah
reg_err54 equ 4bh
reg_err53 equ 4ch
reg_err52 equ 4dh
reg_err51 equ 4eh
reg_err50 equ 4fh
регистры для хранения шумового вектора ошибок
er_vector7 equ 50h
er_vector6 equ 51h
er_vector5 equ 52h
er_vector4 equ 53h
er_vector3 equ 54h
er_vector2 equ 55h
er_vector1 equ 56h
er_vector0 equ 57h
Константы
polynom set 86e8113h; значение задающего полинома
Chislitel_bit set 64; разрядность числителя
Znamenatel_bit set 32; разрядность знаменателя
org 0; начало исполняемого кода программы.
sjmp START
Инициализация системных ресурсов микроконтроллера START: mov SP,#58h; стека по адресу 0х58
mov psw,#0
запись значения полинома в регистры temp3 - temp0
mov temp3,#high(polynom/10000h)
mov temp2,#low(polynom/10000h)
mov temp1,#high(polynom)
mov temp0,#low(polynom)
запись пользователем значения числителя в регистры bufer7 - bufer0
mov bufer7,#1ch;60h
mov bufer6,#00h;00h
mov bufer5,#00h;00h
mov bufer4,#00h;00h
mov bufer3,#02h;02h
mov bufer2,#1bh;1bh
mov bufer1,#0a0h;a0h
mov bufer0,#44h;44h
сохранение исходного сообщения в стеке
push bufer0
push bufer1
push bufer2
push bufer3
push bufer4
push bufer5
push bufer6
push bufer7
acall DIV64_32mod2
извлечение исходного сообщения из стека
pop bufer7
pop bufer6
pop bufer5
pop bufer4
pop bufer3
pop bufer2
pop bufer1
pop bufer0
проверка равен ли остаток нулю
clr a
orl a,temp3
orl a,temp2
orl a,temp1
orl a,temp0
jz NO_ERROR; переход на NO_ERROR если нет ошибок
ajmp DETECT_ERROR; переход на отработку ошибок
если не было ошибки вывести исходное значение в регистры byte0 - byte 7
NO_ERROR: mov R0,#bufer0; копируем побайтно регистры
mov R1,#byte0; bufer0 - bufer7 в регистры
acall save_r0_to_r1; byte0 - byte07 соответственно
sjmp $; зациклиться
подпрограмма вычисления остатка от деления 64-х битового числителя на 32-х битовый знаменатель. Числитель должен быть записан предварительно в регистры bufer7 - bufer0 , а знаменатель в temp3 - temp0.
остаток от деления возвращается в регистрах temp3 - temp0 DIV64_32mod2:
вычисление разрядности числителя максимальное значение 64 - бита и выравнивание по старшему биту bufer7,7
mov count_bitCh,#Chislitel_bit
count_bit_chislitel: jb bufer7.7,bits_chislitel_succefull
mov R0,#bufer0
acall shift_left8
djnz count_bitCh, count_bit_chislitel
ajmp error; значение числителя равно нулю
bits_chislitel_succefull:
вычисление разрядности знаменателя максимальное значение 32-бита; и выравнивание по старшему биту temp 3,7
mov count_bitZn,#Znamenatel_bit
count_bit_znamenatel: jb temp3.7, bits_znamenatel_succefull
clr c
mov a,temp0
rlc a
mov temp0,a
mov a,temp1
rlc a
mov temp1,a
mov a,temp2
rlc a
mov temp2,a
mov a,temp3
rlc a
mov temp3,a
djnz count_bitZn, count_bit_znamenatel
переход на отображение невозможности исправления ошибок значение числителя или знаменателя равно нулю и т.д.
error: ajmp error_not_detect
bits_znamenatel_succefull:
определение числа тактов деления:
(разрядность Числителя - разрядность Знаменателя)+1
результат в регистре разрядности числителя count_takt
clr C
mov a, count_bitCh
subb a,count_bitZn
jc error
mov count_takt,a
inc count_takt
деление числителя на знаменатель по модулю два
diviation: jnb bufer7.7, shift_chsl
mov a,temp3
xrl bufer7,a
mov a,temp2
xrl bufer6,a
mov a,temp1
xrl bufer5,a
mov a,temp0
xrl bufer4,a
shift_chsl:mov R0,#bufer0
acall shift_left8
djnz count_takt,diviation
вычисление числа сдвигов остатка для получения корректного результата вычисление числа сдвигов знаменателя
mov a,#Znamenatel_bit
clr c
subb a, count_bitZn
mov count_bitZn,a
сдвиг остатка вправо на количество тактов равное полученному значению +1; числа тактов сдвига знаменателя
mov a, count_bitZn
inc a
mov count_bitCh,a
shft_rgt_ostk: clr c
mov a,bufer7
rrc a
mov bufer7,a
mov a,bufer6
rrc a
mov bufer6,a
mov a,bufer5
rrc a
mov bufer5,a
mov a,bufer4
rrc a
mov bufer4,a
djnz count_bitCh, shft_rgt_ostk
результат деления записываем а регистры temp3 - temp0
mov temp3,bufer7
mov temp2,bufer6
mov temp1,bufer5
mov temp0,bufer4
завершение операции поиска остатка от деления по модулю 2 ret
обработка значения остатка и исправление ошибки
DETECT_ERROR: mov DPTR,#ostatok_01; установка начального адреса таблицы
I) обработка значений синдромов при единичной ошибке
mov temp_reg1,#63; число вариантов перебора
установка значения для анализа первого бита для сообщения
acall ini_first_error
mov R0,#er_byte0; копируем побайтно регистры
mov R1,#er_vector0; er_byte0 - er_byte7 в регистры
acall save_r0_to_r1; er_vector0 - er_vector7 соответственно
error1_detect: mov R0,#er_vector0; копируем побайтно регистры
mov R1,#byte0; byte0 - byte7 в регистры
acall save_r0_to_r1; er_vector0 - er_vector7
acall compare_rem; обращение на выполнение проверки
jnz next_proverka; продолжить если не определено
ajmp error_disable; ошибки обнаружены, исправление
next_proverka: mov R0,#er_vector0; сдвиг влево на 1 такт регистров
acall shift_left8; er_vector0 - er_vector7
djnz temp_reg1, error1_detect
конец обработки единичной ошибки
II) обработка значений синдромов при двойной ошибке acall ini_first_error;
установка 1-го подвектора ошибок
дублирование первого подвектора ошибок
mov R0,#er_byte0; копируем побайтно регистры
mov R1,#byte0; er_byte0 - er_byte7 в регистры
acall save_r0_to_r1; byte0 - byte7 соответственно формируем второй
подвектор ошибок
mov R0,#byte0; сдвинуть на один такт влево byte
acall shift_left8; регистры с меткой byte
дублируем второй подвектор ошибок
mov R1,#reg_err20; сохранить регистры byte0 - byte7
mov R0,#byte0; в регистрах reg_err20-reg_err27
acall save_r0_to_r1; соответственно
подготовка проверочного вектора сложением 1-го и 2-го подвекторов ошибок; полученное значение заносится в вектор ошибок для коррекции сообщения; вектор ошибок обозначен регистрами er_vector0 - er_vector7
proverka_2_63: mov a,er_byte0
orl byte0,a
mov er_vector0,byte0
mov a,er_byte1
orl byte1,a
mov er_vector1,byte1
mov a,er_byte2
orl byte2,a
mov er_vector2,byte2
mov a,er_byte3
orl byte3,a
mov er_vector3,byte3
mov a,er_byte4
orl byte4,a
mov er_vector4,byte4
mov a,er_byte5
orl byte5,a
mov er_vector5,byte5
mov a,er_byte6
orl byte6,a
mov er_vector6,byte6
mov a,er_byte7
orl byte7,a
mov er_vector7,byte7
acall compare_rem; обращение на выполнение проверки
jnz next_proverka_2; продолжить если не определено
ajmp error_disable; ошибки обнаружены, исправление
next_proverka_2: mov R0,#reg_err20; сдвиг байтов второго подвектора acall shift_left8;
mov R0,#reg_err20; сохранить регистры reg_err20-reg_err27
mov R1,#byte0; в регистрах byte0 - byte7
acall save_r0_to_r1; соответственно
mov a,byte7; проверка положения второго
cjne a,#80h,proverka_2_63; подвектора
mov R0,#er_byte0; сдвиг в лево байтов
acall shift_left8; первого подвектора
mov a,er_byte7; проверка положения первого подвектора
xrl a,#40h
jz _detect_er3; и выход если конечное
mov R0,#er_byte0; сохранить регистры er_byte0-er_byte7
mov R1,#byte0; в регистрах byte0 - byte7
acall save_r0_to_r1; соответственно
получение нового положения второго подвектора
mov R0,#byte0; сдвиг байтов второго подвектора
acall shift_left8
mov R1,#reg_err20; сохранить регистры byte0 - byte7
mov R0,#byte0; в регистрах reg_err20-reg_err27
acall save_r0_to_r1; соответственно
sjmp proverka_2_63; переход на новый цикл обработки
III) обработка значений синдромов при тройной ошибке _detect_er3: acall ini_first_error; установка 1-го подвектора ошибок; дублирование первого подвектора ошибок
mov R0,#er_byte0; копируем побайтно регистры
mov R1,#reg_err20; er_byte0 - er_byte7 в регистры
acall save_r0_to_r1; reg_err20 - reg_err27 соответственно
формируем второй подвектор ошибок mov R0,#reg_err20; сдвинуть на один такт влево reg_err20
acall shift_left8; регистры с меткой byte
формируем третий подвектор ошибок
mov R0,#reg_err20; сохранить регистры reg_err20 - reg_err27
mov R1,#reg_err30; в регистрах reg_err30-reg_err37
acall save_r0_to_r1; соответственно
mov R0,#reg_err30; сдвинуть на один такт влево reg_err20
acall shift_left8; регистры с меткой byte
дублируем третий подвектор ошибок
mov R0,#reg_err30; сохранить регистры reg_err30-reg_err37
mov R1,#byte0; в регистрах byte0 - byte7
acall save_r0_to_r1; соответственно
подготовка проверочного вектора сложением 1-го,2-го и 3-го подвекторов ошибок; полученное значение заносится в вектор ошибок для коррекции сообщения; вектор ошибок обозначен регистрами er_vector0 - er_vector7
proverka_3_63: mov a,er_byte0
orl a,reg_err20
orl byte0,a
mov er_vector0,byte0
mov a,er_byte1
orl a,reg_err21
orl byte1,a
mov er_vector1,byte1
mov a,er_byte2
orl a,reg_err22
orl byte2,a
mov er_vector2,byte2
mov a,er_byte3
orl a,reg_err23
orl byte3,a
mov er_vector3,byte3
mov a,er_byte4
orl a,reg_err24
orl byte4,a
mov er_vector4,byte4
mov a,er_byte5
orl a,reg_err25
orl byte5,a
mov er_vector5,byte5
mov a,er_byte6
orl a,reg_err26
orl byte6,a
mov er_vector6,byte6
mov a,er_byte7
orl a,reg_err27
orl byte7,a
mov er_vector7,byte7
acall compare_rem; обращение на выполнение проверки
jnz next_proverka_3; продолжить если не определено
ajmp error_disable; ошибки обнаружены, исправление
next_proverka_3: mov R0,#reg_err30; сдвиг байтов третьего подвектора
acall shift_left8;
mov R0,#reg_err30; сохранить регистры reg_err20-reg_err27
mov R1,#byte0; в регистрах byte0 - byte7
acall save_r0_to_r1; соответственно
mov a,byte7; проверка положения второго
cjne a,#80h,proverka_3_63; подвектора
mov R0,#reg_err20; сдвиг в лево байтов
acall shift_left8; первого подвектора
mov a,reg_err27; проверка положения второго подвектора xrl a,#40h
jz modif_vect3; и выход если конечное
формируем третий подвектор ошибок
mov R0,#reg_err20; сохранить регистры reg_err20 - reg_err27
mov R1,#reg_err30; в регистрах reg_err30-reg_err37
acall save_r0_to_r1; соответственно
mov R0,#reg_err30; сдвинуть на один такт влево reg_err20
acall shift_left8; регистры с меткой byte
дублируем третий подвектор ошибок
mov R0,#reg_err30; сохранить регистры reg_err30-reg_err37
mov R1,#byte0; в регистрах byte0 - byte7
acall save_r0_to_r1; соответственно
sjmp proverka_3_63
modif_vect3: mov R0,#er_byte0; сдвиг байтов 1-го подвектора
acall shift_left8;
mov a,er_byte7; проверка положения первого подвектора xrl a,#20h jz _detect_er4; и выход если конечное дублирование первого подвектора ошибок
mov R0,#er_byte0; копируем побайтно регистры
mov R1,#reg_err20; er_byte0 - er_byte7 в регистры
acall save_r0_to_r1; reg_err0 - reg_err7 соответственно
формируем второй подвектор ошибок
mov R0,#reg_err20; сдвинуть на один такт влево reg_err20
acall shift_left8; регистры с меткой byte
формируем третий подвектор ошибок
mov R0,#reg_err20; сохранить регистры reg_err20 - reg_err27
mov R1,#reg_err30; в регистрах reg_err30-reg_err37
acall save_r0_to_r1; соответственно
mov R0,#reg_err30; сдвинуть на один такт влево reg_err20
acall shift_left8; регистры с меткой byte
кодер циклический декодер ошибка
дублируем третий подвектор ошибок
mov R0,#reg_err30; сохранить регистры reg_err30-reg_err37
mov R1,#byte0; в регистрах byte0 - byte7
acall save_r0_to_r1; соответственно
ajmp proverka_3_63
IV) обработка значений синдромов при четверной ошибке _detect_er4: acall ini_first_error; установка 1-го подвектора ошибок; дублирование первого подвектора ошибок
mov R0,#er_byte0; копируем побайтно регистры
mov R1,#reg_err20; er_byte0 - er_byte7 в регистры
acall save_r0_to_r1; reg_err20 - reg_err27 соответственно
формируем второй подвектор ошибок
mov R0,#reg_err20; сдвинуть на один такт влево reg_err20
acall shift_left8; регистры с меткой byte
формируем третий подвектор ошибок
mov R0,#reg_err20; сохранить регистры reg_err20 - reg_err27
mov R1,#reg_err30; в регистрах reg_err30-reg_err37
acall save_r0_to_r1; соответственно
mov R0,#reg_err30; сдвинуть на один такт влево reg_err20
acall shift_left8; регистры с меткой byte
формируем четвертый подвектор ошибок
mov R0,#reg_err30; сохранить регистры reg_err30 - reg_err37
mov R1,#reg_err40; в регистрах reg_err40-reg_err47
acall save_r0_to_r1; соответственно
mov R0,#reg_err40; сдвинуть на один такт влево reg_err40
acall shift_left8; регистры с меткой byte
дублируем четвертый подвектор ошибок
mov R0,#reg_err40; сохранить регистры reg_err40-reg_err47
mov R1,#byte0; в регистрах byte0 - byte7
acall save_r0_to_r1; соответственно
подготовка проверочного вектора сложением 1-го,2-го,3-го и 4-го подвекторов ошибок, полученное значение заносится в вектор ошибок для коррекции сообщения; вектор ошибок обозначен регистрами er_vector0 - er_vector7
proverka_4_63: mov a,er_byte0
orl a,reg_err20
orl a,reg_err30
orl byte0,a
mov er_vector0,byte0
mov a,er_byte1
orl a,reg_err21
orl a,reg_err31
orl byte1,a
mov er_vector1,byte1
mov a,er_byte2
orl a,reg_err22
orl a,reg_err32
orl byte2,a
mov er_vector2,byte2
mov a,er_byte3
orl a,reg_err23
orl a,reg_err33
orl byte3,a
mov er_vector3,byte3
mov a,er_byte4
orl a,reg_err24
orl a,reg_err34
orl byte4,a
mov er_vector4,byte4
mov a,er_byte5
orl a,reg_err25
orl a,reg_err35
orl byte5,a
mov er_vector5,byte5
mov a,er_byte6
orl a,reg_err26
orl a,reg_err36
orl byte6,a
mov er_vector6,byte6
mov a,er_byte7
orl a,reg_err27
orl a,reg_err37
orl byte7,a
mov er_vector7,byte7
acall compare_rem; обращение на выполнение проверки
jnz next_proverka_4; продолжить если не определено
ajmp error_disable; ошибки обнаружены, исправление
next_proverka_4: mov R0,#reg_err40; сдвиг байтов четвертого подвектора
acall shift_left8;
mov R0,#reg_err40; сохранить регистры reg_err40-reg_err47
mov R1,#byte0; в регистрах byte0 - byte7
acall save_r0_to_r1; соответственно
mov a,byte7; проверка положения второго
cjne a,#80h,proverka_4_63; подвектора
mov R0,#reg_err30; сдвиг влево байтов
acall shift_left8; первого подвектора
mov a,reg_err37; проверка положения второго подвектора
xrl a,#40h
jz modif_vect4; и выход если конечное
формируем третий подвектор ошибок
mov R0,#reg_err30; сохранить регистры reg_err20 - reg_err27
mov R1,#reg_err40; в регистрах reg_err30-reg_err37
acall save_r0_to_r1; соответственно
mov R0,#reg_err40; сдвинуть на один такт влево reg_err20
acall shift_left8; регистры с меткой byte
дублируем третий подвектор ошибок
mov R0,#reg_err40; сохранить регистры reg_err30-reg_err37
mov R1,#byte0; в регистрах byte0 - byte7
acall save_r0_to_r1; соответственно
ajmp proverka_4_63
modif_vect4: mov R0,#reg_err20; сдвиг байтов 2-го подвектора acall shift_left8;
mov a,reg_err27; проверка положения первого подвектора
xrl a,#20h
jz modif_vect5; и выход если конечное
формируем третий подвектор ошибок
mov R0,#reg_err20; сохранить регистры reg_err20 - reg_err27
mov R1,#reg_err30; в регистрах reg_err30-reg_err37
acall save_r0_to_r1; соответственно
mov R0,#reg_err30; сдвинуть на один такт влево reg_err20
acall shift_left8; регистры с меткой byte
формируем четвертый подвектор ошибок
mov R0,#reg_err30; сохранить регистры reg_err30 - reg_err37
mov R1,#reg_err40; в регистрах reg_err40-reg_err47
acall save_r0_to_r1; соответственно
mov R0,#reg_err40; сдвинуть на один такт влево reg_err40
acall shift_left8; регистры с меткой byte
дублируем четвертый подвектор ошибок
mov R0,#reg_err40; сохранить регистры reg_err40-reg_err47
mov R1,#byte0; в регистрах byte0 - byte7
acall save_r0_to_r1; соответственно
ajmp proverka_4_63
modif_vect5: mov R0,#er_byte0; сдвиг байтов 1-го подвектора acall shift_left8; mov a,er_byte7; проверка положения первого подвектора xrl a,#10h jz _detect_er5; и выход если конечное дублирование первого подвектора ошибок
mov R0,#er_byte0; копируем побайтно регистры
mov R1,#reg_err20; er_byte0 - er_byte7 в регистры
acall save_r0_to_r1; reg_err20 - reg_err27 соответственно
формируем второй подвектор ошибок
mov R0,#reg_err20; сдвинуть на один такт влево reg_err20
acall shift_left8; регистры с меткой byte
формируем третий подвектор ошибок
mov R0,#reg_err20; сохранить регистры reg_err20 - reg_err27
mov R1,#reg_err30; в регистрах reg_err30-reg_err37
acall save_r0_to_r1; соответственно
mov R0,#reg_err30; сдвинуть на один такт влево reg_err20
acall shift_left8; регистры с меткой byte
формируем четвертый подвектор ошибок
mov R0,#reg_err30; сохранить регистры reg_err30 - reg_err37
mov R1,#reg_err40; в регистрах reg_err40-reg_err47
acall save_r0_to_r1; соответственно
mov R0,#reg_err40; сдвинуть на один такт влево reg_err40
acall shift_left8; регистры с меткой byte
дублируем четвертый подвектор ошибок
mov R0,#reg_err40; сохранить регистры reg_err40-reg_err47
mov R1,#byte0; в регистрах byte0 - byte7
acall save_r0_to_r1; соответственно
ajmp proverka_4_63
V) обработка значений синдромов при пятерной ошибке_detect_er5: acall ini_first_error; установка 1-го подвектора ошибок;
дублирование первого подвектора ошибок
mov R0,#er_byte0; копируем побайтно регистры
mov R1,#reg_err20; er_byte0 - er_byte7 в регистры
acall save_r0_to_r1; reg_err20 - reg_err27 соответственно
формируем второй подвектор ошибок
mov R0,#reg_err20; сдвинуть на один такт влево reg_err20
acall shift_left8; регистры с меткой byte
формируем третий подвектор ошибок
mov R0,#reg_err20; сохранить регистры reg_err20 - reg_err27
mov R1,#reg_err30; в регистрах reg_err30-reg_err37
acall save_r0_to_r1; соответственно
mov R0,#reg_err30; сдвинуть на один такт влево reg_err30
acall shift_left8; регистры с меткой byte
формируем четвертый подвектор ошибок
mov R0,#reg_err30; сохранить регистры reg_err20 - reg_err27
mov R1,#reg_err40; в регистрах reg_err30-reg_err37
acall save_r0_to_r1; соответственно
mov R0,#reg_err40; сдвинуть на один такт влево reg_err40
acall shift_left8; регистры с меткой byte
формируем пятый подвектор ошибок
mov R0,#reg_err40; сохранить регистры reg_err40 - reg_err47
mov R1,#reg_err50; в регистрах reg_err50-reg_err57
acall save_r0_to_r1; соответственно
mov R0,#reg_err50; сдвинуть на один такт влево reg_err50
acall shift_left8; регистры с меткой byte
дублируем пятый подвектор ошибок
mov R0,#reg_err50; сохранить регистры reg_err50-reg_err57
mov R1,#byte0; в регистрах byte0 - byte7
acall save_r0_to_r1; соответственно
подготовка проверочного вектора сложением 1-го, 2-го, 3-го, 4-го и 5-го подвекторов ошибок, полученное значение заносится в вектор ошибок для коррекции сообщения. Вектор ошибок обозначен регистрами er_vector0 - er_vector7
proverka_5_63: mov a,er_byte0
orl a,reg_err20
orl a,reg_err30
orl a,reg_err40
orl byte0,a
mov er_vector0,byte0
mov a,er_byte1
orl a,reg_err21
orl a,reg_err31
orl a,reg_err41
orl byte1,a
mov er_vector1,byte1
mov a,er_byte2
orl a,reg_err22
orl a,reg_err32
orl a,reg_err42
orl byte2,a
mov er_vector2,byte2
mov a,er_byte3
orl a,reg_err23
orl a,reg_err33
orl a,reg_err43
orl byte3,a
mov er_vector3,byte3
mov a,er_byte4
orl a,reg_err24
orl a,reg_err34
orl a,reg_err44
orl byte4,a
mov er_vector4,byte4
mov a,er_byte5
orl a,reg_err25
orl a,reg_err35
orl a,reg_err45
orl byte5,a
mov er_vector5,byte5
mov a,er_byte6
orl a,reg_err26
orl a,reg_err36
orl a,reg_err46
orl byte6,a
mov er_vector6,byte6
mov a,er_byte7
orl a,reg_err27
orl a,reg_err37
orl a,reg_err47
orl byte7,a
mov er_vector7,byte7
acall compare_rem; обращение на выполнение проверки
jnz next_proverka_5; продолжить если не определено
ajmp error_disable; ошибки обнаружены, исправление
next_proverka_5: mov R0,#reg_err50; сдвиг байт пятого подвектораacall shift_left8;
mov R0,#reg_err50; сохранить регистры reg_err40-reg_err47
mov R1,#byte0; в регистрах byte0 - byte7
acall save_r0_to_r1; соответственно
mov a,byte7; проверка положения второго
cjne a,#80h,proverka_5_63; подвектора
mov R0,#reg_err40; сдвиг в лево байтов
acall shift_left8; первого подвектора
mov a,reg_err47; проверка положения четвертого подвектора
xrl a,#40h
jz modif_vect6; и выход если конечное
формируем пятый подвектор ошибок
mov R0,#reg_err40; сохранить регисты reg_err40 - reg_err47
mov R1,#reg_err50; в регистрах reg_err50-reg_err57
acall save_r0_to_r1; соответственно
mov R0,#reg_err50; сдвинуть на один такт влево reg_err50
acall shift_left8; регистры с меткой byte
дублируем пятый подвектор ошибок
mov R0,#reg_err50; сохранить регистры reg_err50-reg_err57
mov R1,#byte0; в регистрах byte0 - byte7
acall save_r0_to_r1; соответственно
ajmp proverka_5_63
modif_vect6: mov R0,#reg_err30; сдвиг влево байтов
acall shift_left8; первого подвектора
mov a,reg_err37; проверка положения третьего подвектора
xrl a,#20h
jz modif_vect7; и выход если конечное
формируем четвертый подвектор ошибок
mov R0,#reg_err30; сохранить регистры reg_err20 - reg_err27
mov R1,#reg_err40; в регистрах reg_err30-reg_err37
acall save_r0_to_r1; соответственно
mov R0,#reg_err40; сдвинуть на один такт влево reg_err40
acall shift_left8; регистры с меткой byte
формируем пятый подвектор ошибок
mov R0,#reg_err40; сохранить регистры reg_err40 - reg_err47
mov R1,#reg_err50; в регистрах reg_err50-reg_err57
acall save_r0_to_r1; соответственно
mov R0,#reg_err50; сдвинуть на один такт влево reg_err50
acall shift_left8; регистры с меткой byte
дублируем пятый подвектор ошибок
mov R0,#reg_err50; сохранить регистры reg_err50-reg_err57
mov R1,#byte0; в регистрах byte0 - byte7
acall save_r0_to_r1; соответственно
ajmp proverka_5_63
modif_vect7: mov R0,#reg_err20; сдвиг в лево байтов
acall shift_left8; второго подвектора
mov a,reg_err27; проверка положения второго подвектора
xrl a,#10h
jz modif_vect8; и выход если конечное
формируем третий подвектор ошибок
mov R0,#reg_err20; сохранить регистры reg_err20 - reg_err27
mov R1,#reg_err30; в регистрах reg_err30-reg_err37
acall save_r0_to_r1; соответственно
mov R0,#reg_err30; сдвинуть на один такт влево reg_err30
acall shift_left8; регистры с меткой byte
формируем четвертый подвектор ошибок
mov R0,#reg_err30; сохранить регистры reg_err20 - reg_err27
mov R1,#reg_err40; в регистрах reg_err30-reg_err37
acall save_r0_to_r1; соответственно
mov R0,#reg_err40; сдвинуть на один такт влево reg_err40
acall shift_left8; регистры с меткой byte
формируем пятый подвектор ошибок
mov R0,#reg_err40; сохранить регистры reg_err40 - reg_err47
mov R1,#reg_err50; в регистрах reg_err50-reg_err57
acall save_r0_to_r1; соответственно
mov R0,#reg_err50; сдвинуть на один такт влево reg_err50
acall shift_left8; регистры с меткой byte
дублируем пятый подвектор ошибок
mov R0,#reg_err50; сохранить регистры reg_err50-reg_err57
mov R1,#byte0; в регистрах byte0 - byte7
acall save_r0_to_r1; соответственно
ajmp proverka_5_63
modif_vect8: mov R0,#er_byte0; сдвиг байтов 1-го подвектора
acall shift_left8;
mov a,er_byte7; проверка положения первого подвектора
xrl a,#08h
jz error_not_detect; и выход если конечное
дублирование первого подвектора ошибок
mov R0,#er_byte0; копируем побайтно регистры
mov R1,#reg_err20; er_byte0 - er_byte7 в регистры
acall save_r0_to_r1; reg_err20 - reg_err27 соответственно
формируем второй подвектор ошибок
mov R0,#reg_err20; сдвинуть на один такт влево reg_err20
acall shift_left8; регистры с меткой byte
формируем третий подвектор ошибок
mov R0,#reg_err20; сохранить регистры reg_err20 - reg_err27
mov R1,#reg_err30; в регистрах reg_err30-reg_err37
acall save_r0_to_r1; соответственно
mov R0,#reg_err30; сдвинуть на один такт влево reg_err30
acall shift_left8; регистры с меткой byte
формируем четвертый подвектор ошибок
mov R0,#reg_err30; сохранить регистры reg_err20 - reg_err27
mov R1,#reg_err40; в регистрах reg_err30-reg_err37
acall save_r0_to_r1; соответственно
mov R0,#reg_err40; сдвинуть на один такт влево reg_err40
acall shift_left8; регистры с меткой byte
формируем пятый подвектор ошибок
mov R0,#reg_err40; сохранить регистры reg_err40 - reg_err47
mov R1,#reg_err50; в регистрах reg_err50-reg_err57
acall save_r0_to_r1; соответственно
mov R0,#reg_err50; сдвинуть на один такт влево reg_err50
acall shift_left8; регистры с меткой byte
дублируем пятый подвектор ошибок
mov R0,#reg_err50; сохранить регистры reg_err50-reg_err57
mov R1,#byte0; в регистрах byte0 - byte7
acall save_r0_to_r1; соответственно
ajmp proverka_5_63
Зациклить программу в этом месте и записать в порты р0 - р3 все нули если ошибка была обнаружена но не исправлена
error_not_detect: mov p0,#0
mov p1,#0
mov p2,#0
mov p3,#0
sjmp $
ini_first_error: mov er_byte0,#01h
mov er_byte1,#0
mov er_byte2,#0
mov er_byte3,#0
mov er_byte4,#0
mov er_byte5,#0
mov er_byte6,#0
mov er_byte7,#0
ret
compare_rem: acall clr_ctrl_byte
mov count_takt,#63
mov temp_reg2,#00;начальный адрес смешения в таблице
compare_loop:clr c; сдвиг вектора ошибки на один такт вправо
mov a,byte7
rrc a
mov byte7,a
mov a,byte6
rrc a
mov byte6,a
mov a,byte5
rrc a
mov byte5,a
mov a,byte4
rrc a
mov byte4,a
mov a,byte3
rrc a
mov byte3,a
mov a,byte2
rrc a
mov byte2,a
mov a,byte1
rrc a
mov byte1,a
mov a,byte0
rrc a
mov byte0,a
jnc table_vect; если младший бит 0, то не читать таблицу
чтение таблицы
mov a,temp_reg2
movc a,@a+DPTR
xrl cntrl_byte3,a
inc temp_reg2
mov a,temp_reg2
movc a,@a+DPTR
xrl cntrl_byte2,a
inc temp_reg2
mov a,temp_reg2
movc a,@a+DPTR
xrl cntrl_byte1,a
inc temp_reg2
mov a,temp_reg2
movc a,@a+DPTR
xrl cntrl_byte0,a
inc temp_reg2
sjmp table_ok
table_vect: mov a,temp_reg2; увеличить смещение таблицы на 4
add a,#4
mov temp_reg2,a
table_ok: djnz count_takt, compare_loop
сравниваем полученный остаток из таблиц с остатком от деления
mov a,temp3
xrl cntrl_byte3,a
mov a,temp2
xrl cntrl_byte2,a
mov a,temp1
xrl cntrl_byte1,a
mov a,temp0
xrl cntrl_byte0,a
проверка равны ли (т.е значение байтов сntrl_byte равно 0)
clr a
orl a,cntrl_byte3
orl a,cntrl_byte2
orl a,cntrl_byte1
orl a,cntrl_byte0
востановление байта ошибок
ret; возвращает " 0 " в аккумуляторе если вектор ошибок верен
таблицы остатков - синдромов от деления, номер таблицы - порядковый номер разряда, начиная с 1, на ошибку которого указывает синдром;
Таблицы представлены старшим байтом в левой части, для наглядности
ostatok_синдомы ошибок для битов 0 -26
ostatok_01: db 00h, 00h, 00h, 01h; коррекция бита 0
ostatok_02: db 00h, 00h, 00h, 02h; коррекция бита 1
ostatok_03: db 00h, 00h, 00h, 04h; коррекция бита 2
ostatok_04: db 00h, 00h, 00h, 08h; коррекция бита 3
ostatok_05: db 00h, 00h, 00h, 10h; коррекция бита 4
ostatok_06: db 00h, 00h, 00h, 20h; коррекция бита 5
ostatok_07: db 00h, 00h, 00h, 40h; коррекция бита 6
ostatok_08: db 00h, 00h, 00h, 80h; коррекция бита 7
ostatok_09: db 00h, 00h, 01h, 00h; коррекция бита 8
ostatok_10: db 00h, 00h, 02h, 00h; коррекция бита 9
ostatok_11: db 00h, 00h, 04h, 00h; коррекция бита 10
ostatok_12: db 00h, 00h, 08h, 00h; коррекция бита 11
ostatok_13: db 00h, 00h, 10h, 00h; коррекция бита 12
ostatok_14: db 00h, 00h, 20h, 00h; коррекция бита 13
ostatok_15: db 00h, 00h, 40h, 00h; коррекция бита 14
ostatok_16: db 00h, 00h, 80h, 00h; коррекция бита 15
ostatok_17: db 00h, 01h, 00h, 00h; коррекция бита 16
ostatok_18: db 00h, 02h, 00h, 00h; коррекция бита 17
ostatok_19: db 00h, 04h, 00h, 00h; коррекция бита 18
ostatok_20: db 00h, 08h, 00h, 00h; коррекция бита 19
ostatok_21: db 00h, 10h, 00h, 00h; коррекция бита 20
ostatok_22: db 00h, 20h, 00h, 00h; коррекция бита 21
ostatok_23: db 00h, 40h, 00h, 00h; коррекция бита 22
ostatok_24: db 00h, 80h, 00h, 00h; коррекция бита 23
ostatok_25: db 01h, 00h, 00h, 00h; коррекция бита 24
ostatok_26: db 02h, 00h, 00h, 00h; коррекция бита 25
ostatok_27: db 04h, 00h, 00h, 00h; коррекция бита 26
ostatok_синдомы ошибок для битов 27 -62
ostatok_28: db 00h, 6Eh, 81h, 13h; коррекция бита 27
ostatok_29: db 00h, 0DDh, 02h, 26h; коррекция бита 28
ostatok_30: db 01h, 0BAh, 04h, 4Ch; коррекция бита 29
ostatok_31: db 03h, 74h, 08h, 98h; коррекция бита 30
ostatok_32: db 06h, 0E8h, 11h, 30h; коррекция бита 31
ostatok_33: db 05h, 0BEh, 0A3h, 73h; коррекция бита 32
ostatok_34: db 03h, 13h, 0C7h, 0F5h; коррекция бита 33
ostatok_35: db 06h, 27h, 8Fh, 0EAh; коррекция бита 34
ostatok_36: db 04h, 21h, 9Eh, 0C7h; коррекция бита 35
ostatok_37: db 00h, 2Dh, 0BCh, 9Dh; коррекция бита 36
ostatok_38: db 00h, 5Bh, 79h, 3Ah; коррекция бита 37
ostatok_39: db 00h, 0B6h, 0F2h, 74h; коррекция бита 38
ostatok_40: db 01h, 6Dh, 0E4h, 0E8h; коррекция бита 39
ostatok_41: db 02h, 0DBh, 0C9h, 0D0h; коррекция бита 40
ostatok_42: db 05h, 0B7h, 93h, 0A0h; коррекция бита 41
ostatok_43: db 03h, 01h, 0A6h, 53h; коррекция бита 42
ostatok_44: db 06h, 03h, 4Ch, 0A6h; коррекция бита 43
ostatok_45: db 04h, 68h, 18h, 5Fh; коррекция бита 44
ostatok_46: db 00h, 0BEh, 0B1h, 0ADh; коррекция бита 45
ostatok_47: db 01h, 7Dh, 63h, 5Ah; коррекция бита 46
ostatok_48: db 02h, 0FAh, 0C6h, 0B4h; коррекция бита 47
ostatok_49: db 05h, 0F5h, 8Dh, 68h; коррекция бита 48
ostatok_50: db 03h, 85h, 9Bh, 0C3h; коррекция бита 49
ostatok_51: db 07h, 0Bh, 37h, 86h; коррекция бита 50
ostatok_52: db 06h, 78h, 0EEh, 1Fh; коррекция бита 51
ostatok_53: db 04h, 9Fh, 5Dh, 2Dh; коррекция бита 52
ostatok_54: db 01h, 50h, 3Bh, 49h; коррекция бита 53
ostatok_55: db 02h, 0A0h, 76h, 92h; коррекция бита 54
ostatok_56: db 05h, 40h, 0EDh, 24h; коррекция бита 55
ostatok_57: db 02h, 0EFh, 5Bh, 5Bh; коррекция бита 56
ostatok_58: db 05h, 0DEh, 0B6h, 0B6h; коррекция бита 57
ostatok_59: db 03h, 0D3h, 0ECh, 7Fh; коррекция бита 58
ostatok_60: db 07h, 0A7h, 0D8h, 0FEh; коррекция бита 59
ostatok_61: db 07h, 21h, 30h, 0EFh; коррекция бита 60
ostatok_62: db 06h, 2Ch, 0E0h, 0CDh; коррекция бита 61
ostatok_63: db 04h, 37h, 40h, 89h; коррекция бита 62
clr_ctrl_byte: mov cntrl_byte3, #0; подпрограмма очистки
mov cntrl_byte2,#0; контрольных байтов
mov cntrl_byte1,#0; сравнения остатка и полученного значения
mov cntrl_byte0,#0; при модификации таблицы
ret
подпрогрмма сдвига 8-ми байтов влево на 1 такт
shift_left8: clr c
mov a,@R0;1
rlc a
mov @R0,a
dec R0
mov a,@R0;2
rlc a
mov @R0,a
dec R0
mov a,@R0;3
rlc a
mov @R0,a
dec R0
mov a,@R0;4
rlc a
mov @R0,a
dec R0
mov a,@R0;5
rlc a
mov @R0,a
dec R0
mov a,@R0;6
rlc a
mov @R0,a
dec R0
mov a,@R0;7
rlc a
mov @R0,a
dec R0
mov a,@R0;8
rlc a
mov @R0,a
ret
подпрограмма копирования 8-ми байтов которые расположены подряд; начинается со старшего адреса расположение пар байтов
save_r0_to_r1: mov count_takt,#8
r0_to_r1: mov a,@R0
mov @R1,a
dec R0
dec R1
djnz count_takt, r0_to_r1
ret
исправленное значение сообщения находятся в регистрах er_byte7 - er_byte0
error_disable: mov a,bufer7
xrl er_vector7,a
mov a,bufer6
xrl er_vector6,a
mov a,bufer5
xrl er_vector5,a
mov a,bufer4
xrl er_vector4,a
mov a,bufer3
xrl er_vector3,a
mov a,bufer2
xrl er_vector2,a
mov a,bufer1
xrl er_vector1,a
mov a,bufer0
xrl er_vector0,a
mov p3,er_vector7; запись в порт Р3 по исправлению ошибок
mov p2,er_vector6; запись в порт Р2 по исправлению ошибок
mov p1,er_vector5; запись в порт Р1 по исправлению ошибок
mov p0,er_vector4; запись в порт Р0 по исправлению ошибок
sjmp $
Вывод
Как видно из таблицы расчета вариантов обработки ошибок, данный метод декодирования и исправления ошибок является ресурсоемким, поэтому для реализации данного метода необходимо использовать более мощные микроконтроллеры, например с архитектурой RISC и с как можно большей разрядностью, желательно 32 бита. Наиболее эффективно для микроконтроллеров с ядром MCS51 данным методом исправлять единичные и двойные ошибки, так как максимальное время на исправление пяти ошибок в старших разрядах исходного сообщения, занимает более 5-ти часов машинного времени при тактовой частоте микроконтроллера 12 МГц.
Поэтому данная программа для декодирования БЧХ-кода имеет скорее всего чисто теоретическое причинение для ознакомления с принципом кодирования и декодирования. Для практического применения рекомендуется выбирать либо другие алгоритмы кодирования - декодирования, например циклического сдвига, либо ставить акцент на более мощные микроконтроллеры или схемы ПЛИС.
Размещено на Allbest.ru
...Подобные документы
Количество поверочных элементов. Выбор образующего полинома. Построение матрицы синдромов для однократной ошибки. Схема кодера циклического кода. Оценка вероятности обнаруживаемой ошибки на выходе системы передачи. Алгоритм построения дешифратора.
контрольная работа [3,6 M], добавлен 03.12.2010Представление информационной части кодовой комбинации виде полинома. Разрешенные кодовые комбинации циклического кода. Обнаружение ошибок при циклическом кодировании. Основные функциональные узлы кодирующих устройств. Выполнение операций декодирования.
лабораторная работа [511,6 K], добавлен 15.12.2013Нахождение двоичного циклического кода Хэмминга, обеспечивающего передачу сообщений в системе связи с заданной вероятностью выдачи ложного сообщения. Структурная схема алгоритма расчета кода, листинг программы. Функциональные схемы кодера и декодера.
курсовая работа [713,7 K], добавлен 11.02.2011Декодирование циклического кода с обнаружением ошибок. Способы декодирования с исправлением ошибок и схемная реализация декодирующих устройств. Коды Рида-Соломона являются недвоичными циклическими кодами. Синдром образцов ошибок с ненулевым коэффициентом.
реферат [175,0 K], добавлен 11.02.2009Классификация систем синхронизации, расчет параметров с добавлением и вычитанием импульсов. Построение кодера и декодера циклического кода, диаграммы систем с обратной связью и ожиданием для неидеального обратного канала, вычисление вероятности ошибок.
курсовая работа [611,4 K], добавлен 13.04.2012Понятие о циклических кодах, их делимость без остатка на некоторый выбранный полином. Структурные схемы кодера и декодера циклического кода по заданному производящему полиному. Определение состояния ячеек памяти, обнаружение ошибки в кодовой комбинации.
лабораторная работа [69,1 K], добавлен 13.04.2013Устройство защиты от ошибок на основе системы с обратной связью. Выбор корректирующего кода в системе с РОС. Временные диаграммы работы системы. Расчет вероятностей выпадения, вставок и стираний. Проектирование структурных схем кодера и декодера.
курсовая работа [813,6 K], добавлен 12.01.2013Схема модулятора и демодулятора для передачи данных по каналу ТЧ. Проектирование синхронизатора и расчет его параметров. Метод коррекции фазо-частотной характеристики канала ТЧ. Разработка системы кодирования/декодирования циклического кода.
курсовая работа [305,1 K], добавлен 22.10.2011Методы декодирования, используемые при избыточном кодировании. Правило декодирования с обнаружением ошибок. Обнаруживающая способность кода. Показатели эффективности помехоустойчивого кода. Передача сообщений по двоичному симметричному каналу без памяти.
курсовая работа [155,6 K], добавлен 20.11.2012Сущность кода Хэмминга. Схемы кодирующего устройства на четыре информационных разряда и декодера. Определение числа проверочных разрядов. Построение корректирующего кода Хэмминга с исправлением одиночной ошибки при десяти информационных разрядах.
курсовая работа [1,1 M], добавлен 10.01.2013Цифровые методы передачи информации. Цели кодирования сообщений. Классификация двоичных кодов. Принципы обнаружения и исправления ошибок кодами. Блок хранения данных на микросхемах К555ИР8. Принципиальная электрическая схема блока хранения данных.
реферат [616,0 K], добавлен 08.04.2013Представление и классификация кодов, построение кода с заданной коррекцией. Характеристика корректирующих кодов (код Хемминга, код БЧХ). Разработка схемотехнической реализации кодера и декодера. Выбор способа представления информации в канале передачи.
курсовая работа [131,1 K], добавлен 02.01.2011Структурная схема системы передачи данных. Принципиальная схема кодера и декодера Хэмминга 7,4 и Манчестер-2, осциллограммы работы данных устройств. Преобразование последовательного кода в параллельный. Функциональная схема системы передачи данных.
курсовая работа [710,0 K], добавлен 19.03.2012Использование помехоустойчивого кодирования в системах передачи информации. Построение структурной схемы восьмиразрядного микроконтроллера M68HC11. Разработка алгоритма кодирования и декодирования информации. Подключение внешних портов ввода/вывода.
курсовая работа [1,7 M], добавлен 05.09.2014Выбор метода модуляции, разработка схемы модулятора и демодулятора для передачи данных, расчет вероятности ошибки на символ. Метод синхронизации, схема синхронизатора. Коррекция фазо-частотной характеристики канала. Система кодирования циклического кода.
контрольная работа [294,2 K], добавлен 12.12.2012Проектирование устройства преобразования цифровой информации в аналоговую и наоборот для цифрового магнитофона. Описание используемых интегральных микросхем. Разработка структурной и принципиальной схемы цифрового канала звукозаписи без кодера и декодера.
курсовая работа [1,8 M], добавлен 18.10.2010Принципы формирования линейных кодов цифровых систем передачи. Характеристика абсолютного и относительного биимпульсного кода, а также кода CMI. Выбор конкретного помехоустойчивого кода, скорость его декодирования и сложность технической реализации.
лабораторная работа [37,4 K], добавлен 21.12.2010Методы помехоустойчивого кодирования и декодирования информации с помощью линейных групповых кодов. Принципы построения и функционирования кодирующих и декодирующих устройств этих кодов. Способы их декодирования с учетом помех различной кратности.
лабораторная работа [39,2 K], добавлен 26.09.2012Методы кодирования и декодирования циклических кодов, метод кодирования и декодирования сверточных кодов, формирование проверочных разрядов. Изучение обнаруживающей и исправляющей способности циклических кодов, исследование метода коммутации.
лабораторная работа [709,6 K], добавлен 26.08.2010Исследование основных принципов цифровой системы передачи непрерывных сообщений с импульсно-кодовой модуляцией по каналу с шумом. Расчет источника сообщения, дискретизатора, кодера, модулятора, канала связи, демодулятора, декодера, фильтра-восстановителя.
курсовая работа [545,1 K], добавлен 10.05.2011