Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АКР_ПП.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
2 Мб
Скачать
☆
      1. Метод виправлення помилок з використанням матриці

За цим методом перевірка кодової комбінації на боці приймача виконується шляхом порівняння перевірочних розрядів кодової комбінації, що приймаються, і перевірочних розрядів, які обчислені на підставі прийнятих інформаційних. Їх сума за модулем 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