- •1 Пояснювальна записка
- •1.1 Емуляція ділення цілих без знакових чисел
- •1.2 Десяткова корекція у мікро контролері ріс
- •1.2.1 Додавання у bcd – форматі
- •1.2.2 Віднімання у bcd – форматі
- •1.3 Циклічний надлишковий код, що коректує, 7,4 (crc3)
- •1.3.1 Зв’язок коректованої здатності коду з кодовою відстанню
- •1.3.2 Побудова циклічного надлишкового коду 7,4
- •Метод виправлення помилок з використанням матриці
- •1.4 Код Ріда – Соломона рс 31,16 (crc15)
- •2 Склад адмністративної контрольної роботи
- •2.1 Завдання №1
- •Приклад виконання варіанту №30
- •2.2 Завдання №2
- •2.3 Завдання №3
- •Приклад виконання варіанту №30
- •2.4 Завдання №4
- •Приклад виконання варіанту №30
Метод виправлення помилок з використанням матриці
За цим методом перевірка кодової комбінації на боці приймача виконується шляхом порівняння перевірочних розрядів кодової комбінації, що приймаються, і перевірочних розрядів, які обчислені на підставі прийнятих інформаційних. Їх сума за модулем 2 називається синдромом. Характерна особливість синдрому міститься в тім, що він не залежить від виду переданої інформації, а повністю визначається помилками, яки зіпсували прийняту комбінацію коду. Між комбінацією синдрому і комбінацією помилки, яка його викликала, немає взаємної відповідності – одному і тому ж синдрому відповідає 2k різних комбінацій помилок.
Оскільки синдром – сума за модулем 2 перевірочних розрядів кодової комбінації і перевірочних розрядів, які обчислені по прийнятим інформаційним символам, то він співпадає з комбінацією результатів перевірки на парність, які визначаються матрицею Н. Якщо перевірочний символ, який обчислений по інформаційним, позначити b’i , а перевірочний символ прийнятої кодової комбінації - bi, то синдром для коду (7,4) з перевірочною матрицею Н
набуде наступного вигляду:
де:
Таким чином, визначаємо синдром шляхом рішення рівнянь:
Якщо код використовується для виправлення помилок, то при декодуванні повинно бути раніше визначена відповідність між видом синдрому і вектором помилки, яка виправляється. Встановимо цю відповідність.
Таблиця 4 - Відповідність між видом синдрому і вектором помилки
Вектор |
Синдром |
1000000 |
101 |
0100000 |
111 |
0010000 |
110 |
0001000 |
011 |
0000100 |
100 |
0000010 |
010 |
0000001 |
001 |
Слід зазначити, помилку у векторі означає одиниця у відповідному біті.
Текст програми виявлення, виправлення помилки та обчислення синдромів:
;---------------------------------------------------------------------------------------------------------
w equ 0; приймач інформації регістр W
f equ 1; приймач інформації регістр R
;---------------------------------------------------------------------------------------------------------
r0 equ 0c; визначення
r1 equ 0d; адрес
r2 equ 0e; регістрового
r3 equ 0f; файлу
r4 equ 10; мікроконтролера
r5 equ 11; PIC 16C71
r6 equ 12
r7 equ 13
r8 equ 14
r9 equ 15
;---------------------------------------------------------------------------------------------------------
status equ 03; визначення прапорців
carry equ 0; carry та
zero equ 2; zero у регістрі status
;---------------------------------------------------------------------------------------------------------
port_b equ 06; визначення адреси порту В мікроконтролера
out equ 0; код ініціалізайії на виведення ліній порту В
;---------------------------------------------------------------------------------------------------------
packet1 equ 02; визначення значення молодшої тетради (low nibble) байту
packet2 equ 27; визначення значення старшої тетради (low nibble) байту
fatal_err equ 66; код фатальної помилки
;---------------------------------------------------------------------------------------------------------
polinom equ 0b; визначення значення поліному, що не приводиться для CRC3
no_error equ 0; код – помилки при передачі немає
serr6 equ 5; синдром помилки у біті 6 поля даних пакету
serr5 equ 7; синдром помилки у біті 5 поля даних пакету
serr4 equ 6; синдром помилки у біті 4 поля даних пакету
serr3 equ 3; синдром помилки у біті 3 поля даних пакету
serr2 equ 4; синдром помилки у біті 2 поля даних пакету
serr1 equ 2; синдром помилки у біті 1 поля даних пакету
serr0 equ 1; синдром помилки у біті 0 поля даних пакету
;---------------------------------------------------------------------------------------------------------
mask1_s1 equ 4; кодування
mask2_s1 equ 10; системи
mask3_s1 equ 20; лінійних
mask4_s1 equ 40; алгебраїчних
mask1_s2 equ 2; логічних
mask2_s2 equ 8; незалежних
mask3_s2 equ 10; рівнянь
mask4_s2 equ 20; для
mask1_s3 equ 1; подальшого
mask2_s3 equ 8; програмного обчислення
mask3_s3 equ 20; три бітного
mask4_s3 equ 40; синдрому S1S2S3 однократної помилки
;---------------------------------------------------------------------------------------------------------
vect_6 equ 40; вектор помилки для зіпсованого біту 6 поля даних пакету
vect_5 equ 20; вектор помилки для зіпсованого біту 5 поля даних пакету
vect_4 equ 10; вектор помилки для зіпсованого біту 4 поля даних пакету
vect_3 equ 8; вектор помилки для зіпсованого біту 3 поля даних пакету
vect_2 equ 4; вектор помилки для зіпсованого біту 2 поля даних пакету
vect_1 equ 2; вектор помилки для зіпсованого біту 1 поля даних пакету
vect_0 equ 1; вектор помилки для зіпсованого біту 0 поля даних пакету
;---------------------------------------------------------------------------------------------------------
bcf status,carry; скидання прапорця carry
movlw polinom; завантаження поліному, що не приводиться у
movwf r1; регістр R1
movwf r2; та регістр R2
movlw out; ініціалізація ліній порту В
tris port_b; на виведення
movlw packet1; завантаження пакету
movwf r0; з молодшою тетрадою у регістр R0
call verify; виклик процедури verify отримання залишку від ділення на поліном
movf r0,w; передача залишку від ділення на поліном у регістр W
sublw no_error; перевірка значення залишку на 0
btfsc status,carry; скидання прапорця carry
goto true_nibble_L; помилки немає – передача управлінняна мітку true_nibble_L
call corr1; помилка виявлена – виклик процедури corr1 корекції помилки
movwf r9; завантаження не існуючої комбінації у регістр R9
etc1 movwf r5; істинний або скоригований пакет 1
bcf status,carry; скидання прапорця carry
rrf r5,f; утворення
bcf status,carry; молодшої
rrf r5,f; тетради
bcf status,carry; у регістрі
rrf r5,f; R5
bcf status,carry; скидання прапорця carry
movlw polinom; завантаження поліному, що не приводиться у
movwf r1; регістр R1
movwf r2; та регістр R2
movlw packet2; завантаження пакету
movwf r0; із старшою тетрадою у регістр R0
call verify; виклик процедури verify отримання залишку від ділення на поліном
movf r0,w; передача залишку від ділення на поліном у регістр W
sublw no_error; перевірка значення залишку на 0
btfsc status,carry; скидання прапорця carry
goto true_nibble_H; помилки немає – передача управління на мітку true_nibble_H
movlw packet2; завантаження пакету із старшою тетрадою у регістр W
call corr2; помилка виявлена – виклик процедури corr2 корекції помилки
etc2 andlw 78; утворення
movwf r6; старшої
bcf status,carry; тетради
rlf r6,f; у регістрі
movf r6,w; R6
iorwf r5,w; конкатенація старшої і молодшої тетради у регістрі R5
movwf port_b; виведення істинного або скоригованого байту у порт В
goto finish
;---------------------------------------------------------------------------------------------------------
; процедура verify здійснює ділення поля даних пакету 1 на поліном, що не
; приводиться з метою фіксації факту виникнення помилки
;---------------------------------------------------------------------------------------------------------
verify movf r2,w;
movwf r1;
btfsc r0,6;
goto label1
btfsc r0,5
goto label2
btfsc r0,4
goto label3
btfsc r0,3
goto label4
verify_end return
label1 rlf r1,f
rlf r1,f
rlf r1,f
call xr
goto verify
label2 rlf r1,f
rlf r1,f
call xr
goto verify
label3 rlf r1,f
call xr
goto verify
label4 call xr
goto verify_end
;---------------------------------------------------------------------------------------------------------
; процедура xr здійснює додавання за модулем 2 поточного хначення пакету із
; значенням поліному, що не приводиться
;---------------------------------------------------------------------------------------------------------
xr movf r0,w
xorwf r1,w
movwf r0
return
;---------------------------------------------------------------------------------------------------------
; процедура corr1 здійснює обчислення синдрому однократної помилки
; відповідного біту згідно із закодованою системою лінійних незалежних
; рівнянь maskX_sY
;---------------------------------------------------------------------------------------------------------
corr1 bcf status,carry
movlw packet1
andlw mask1_s1
movwf r0
rrf r0,f
rrf r0,f
movlw packet1
andlw mask2_s1
movwf r1
rrf r1,f
rrf r1,f
rrf r1,f
rrf r1,f
movlw packet1
andlw mask3_s1
movwf r2
rrf r2,f
rrf r2,f
rrf r2,f
rrf r2,f
rrf r2,f
movlw packet1
andlw mask4_s1
movwf r3
rrf r3,f
rrf r3,f
rrf r3,f
rrf r3,f
rrf r3,f
rrf r3,f
movf r0,w
xorwf r1,w
xorwf r2,w
xorwf r3,w
movwf r4; перший біт S1 синдрому
bcf status,carry
movlw packet1
andlw mask1_s2
movwf r0
rrf r0,f
movlw packet1
andlw mask2_s2
movwf r1
rrf r1,f
rrf r1,f
rrf r1,f
movlw packet1
andlw mask3_s2
movwf r2
rrf r2,f
rrf r2,f
rrf r2,f
rrf r2,f
movlw packet1
andlw mask4_s2
movwf r3
rrf r3,f
rrf r3,f
rrf r3,f
rrf r3,f
rrf r3,f
movf r0,w
xorwf r1,w
xorwf r2,w
xorwf r3,w
movwf r0
rrf r0,f
rlf r4,f; другий біт S2 синдрому
bcf status,carry
movlw packet1
andlw mask1_s3
movwf r0
movlw packet1
andlw mask2_s3
movwf r1
rrf r1,f
rrf r1,f
rrf r1,f
movlw packet1
andlw mask3_s3
movwf r2
rrf r2,f
rrf r2,f
rrf r2,f
rrf r2,f
rrf r2,f
movlw packet1
andlw mask4_s3
movwf r3
rrf r3,f
rrf r3,f
rrf r3,f
rrf r3,f
rrf r3,f
rrf r3,f
movf r0,w
xorwf r1,w
xorwf r2,w
xorwf r3,w
movwf r0
rrf r0,f
rlf r4,f; третій біт S3 синдрому
movf r4,w
movwf r7; обчислений синдром S1S2S3 для пакету 1 у регістрі r7
sublw serr6
btfsc status,zero
goto v6
movf r4,w
sublw serr5
btfsc status,zero
goto v5
movf r4,w
sublw serr4
btfsc status,zero
goto v4
movf r4,w
sublw serr3
btfsc status,zero
goto v3
movf r4,w
sublw serr2
btfsc status,zero
goto v2
movf r4,w
sublw serr1
btfsc status,zero
goto v1
movf r4,w
sublw serr0
btfsc status,zero
goto v0
movlw fatal_err; виведення у порт В прапорця із значенням
movwf port_b; 66h, про те що трапилася фатальна помилка
goto finish
v6 movlw packet1
xorlw vect_6
return
v5 movlw packet1
xorlw vect_5
return
v4 movlw packet1
xorlw vect_4
return
v3 movlw packet1
xorlw vect_3
return
v2 movlw packet1
xorlw vect_2
return
v1 movlw packet1
xorlw vect_1
return
v0 movlw packet1
xorlw vect_0
return
;---------------------------------------------------------------------------------------------------------
; процедура corr1 здійснює обчислення синдрому однократної помилки
; відповідного біту згідно із закодованою системою лінійних незалежних
; рівнянь maskX_sY
;---------------------------------------------------------------------------------------------------------
corr2 bcf status,carry
movlw packet2
andlw mask1_s1
movwf r0
rrf r0,f
rrf r0,f
movlw packet2
andlw mask2_s1
movwf r1
rrf r1,f
rrf r1,f
rrf r1,f
rrf r1,f
movlw packet2
andlw mask3_s1
movwf r2
rrf r2,f
rrf r2,f
rrf r2,f
rrf r2,f
rrf r2,f
movlw packet2
andlw mask4_s1
movwf r3
rrf r3,f
rrf r3,f
rrf r3,f
rrf r3,f
rrf r3,f
rrf r3,f
movf r0,w
xorwf r1,w
xorwf r2,w
xorwf r3,w
movwf r4; перший біт S1 синдрому
bcf status,carry
movlw packet2
andlw mask1_s2
movwf r0
rrf r0,f
movlw packet2
andlw mask2_s2
movwf r1
rrf r1,f
rrf r1,f
rrf r1,f
movlw packet2
andlw mask3_s2
movwf r2
rrf r2,f
rrf r2,f
rrf r2,f
rrf r2,f
movlw packet2
andlw mask4_s2
movwf r3
rrf r3,f
rrf r3,f
rrf r3,f
rrf r3,f
rrf r3,f
movf r0,w
xorwf r1,w
xorwf r2,w
xorwf r3,w
movwf r0
rrf r0,f
rlf r4,f; другий біт S2 синдрому
bcf status,carry
movlw packet2
andlw mask1_s3
movwf r0
movlw packet2
andlw mask2_s3
movwf r1
rrf r1,f
rrf r1,f
rrf r1,f
movlw packet2
andlw mask3_s3
movwf r2
rrf r2,f
rrf r2,f
rrf r2,f
rrf r2,f
rrf r2,f
movlw packet2
andlw mask4_s3
movwf r3
rrf r3,f
rrf r3,f
rrf r3,f
rrf r3,f
rrf r3,f
rrf r3,f
movf r0,w
xorwf r1,w
xorwf r2,w
xorwf r3,w
movwf r0
rrf r0,f
rlf r4,f; третій біт S3 синдрому
movf r4,w
movwf r8; обчислений синдром S1S2S3 для пакету 1 у регістрі r8
sublw serr6
btfsc status,zero
goto v6_1
movf r4,w
sublw serr5
btfsc status,zero
goto v5_1
movf r4,w
sublw serr4
btfsc status,zero
goto v4_1
movf r4,w
sublw serr3
btfsc status,zero
goto v3_1
movf r4,w
sublw serr2
btfsc status,zero
goto v2_1
movf r4,w
sublw serr1
btfsc status,zero
goto v1_1
movf r4,w
sublw serr0
btfsc status,zero
goto v0_1
movlw fatal_err; виведення у порт В прапорця із значенням
movwf port_b; 66h, про те що трапилася фатальна помилка
movwf port_b
goto finish
v6_1 movlw packet2
xorlw vect_6
return
v5_1 movlw packet2
xorlw vect_5
return
v4_1 movlw packet2
xorlw vect_4
return
v3_1 movlw packet2
xorlw vect_3
return
v2_1 movlw packet2
xorlw vect_2
return
v1_1 movlw packet2
xorlw vect_1
return
v0_1 movlw packet2
xorlw vect_0
return
;-------------------------------------------
true_nibble_L movlw packet1
goto etc1
true_nibble_H movlw packet2
goto etc2
finish
end
