Курсовая работа: Реализация устройства контроля переданной информации с использованием модифицированного кода Хемминга

Рис.3.11
Индикатор цифровой АЛС324А.
Выводит на экран цифры в зависимости от сигналов на входах в
семисегментном коде. Состоит из семи светодиодов. Единица, пришедшая на вход,
приводит к свечению соответствующего сегмента.
4. КАРТА ПАМЯТИ
Адрес |
Назначение адреса |
0000h – 07D0h |
ПЗУ |
0000h – 0083 |
область ПЗУ, занимаемая программой |
В000h – В7D0h |
ОЗУ |
5. ПРИНЦИП РАБОТЫ ПРОГРАММЫ
Принцип работы программы основан на том, что с использованием
модифицированного кода Хемминга можно проводить проверку считанной информации
на наличие ошибок. Существует возможность исправить однократные ошибки и
обнаружить двойные. Программа управляет считыванием информации с порта, затем
заносит их в оперативную память. По нажатию кнопки начинается проверка
содержимого на наличие ошибок. На основе маскирования определенных бит и
контроля четности формируется четырехбитная характеристическая комбинация,
каждому значению которой соответствует свое решение. Таких решений в результате получается
четыре:
1. Нет ошибки. Программа просто начинает проверку следующего байта данных,
занесенных в ОЗУ.
2. Есть двойная ошибка, тогда выводится сообщение о двойной
ошибке в виде адреса, где она зафиксирована, но только с тем различием, что у
выводимого адреса будут обнулены четыре старших бита. То есть такое сообщение
об ошибке будет иметь вид 0ххх. Программа ждет нажатия кнопки для дальнейшей
работы.
3. Ошибка в контрольном бите. Исправляется с помощью заданной
маски. Номер ячейки выводится на индикаторы. Программа ждет нажатия кнопки для
дальнейшей работы.
3. Есть одиночная ошибка. Ее исправление начинается с
формирования маски, в которой все биты будут установлены в ноль и лишь один в
единицу. Как раз тот, что должен будет быть исправлен. Далее, с помощью
операции XOR (Исключающее ИЛИ) над содержимым ячейки
памяти и маской ошибка будет исправлена. Номер ячейки, в которой была ошибка,
выводится на индикаторы. Программа ждет нажатия кнопки для дальнейшей работы.
6. ЛИСТИНГ ПРОГРАММЫ
Адрес |
Мнемонический код |
Код |
Комментарии |
0000 |
MVI A, 89h |
3E |
заносим упр. слово в аккумулятор |
0001 |
|
89 |
|
0002 |
OUT 3h |
D3 |
отправляем 89 (10001001) в РУС |
0003 |
|
03 |
|
0004 |
LXI D,B000h |
11 |
Задаем начальное значение регистровой паре, содержащей
адрес ячейки памяти |
0005 |
|
00 |
|
0006 |
|
B0 |
|
0007 |
LXI B,7D0h |
01 |
Задаем начальное значение регистровой паре, содержащей
счетчик |
0008 |
|
D0 |
|
0009 |
|
07 |
|
000A |
IN 2h |
DB |
Прием сигнала от кнопки для начала записи
последовательности байт в ОЗУ |
000B |
|
02 |
|
000C |
m1: IN A5h |
DB |
Начало цикла, записывающего в ОЗУ принимаемую с порта
информацию |
000D |
|
A5 |
|
000E |
STAX D |
12 |
Запись содержимого аккумулятора в ячейку памяти, адрес
которой хранится в DE |
000F |
INX D |
13 |
Выбираем адрес следующей ячейки |
0010 |
DCX B |
0B |
Счетчик записанных байт уменьшаем |
0011 |
JNZ m1 |
C2 |
Если записаны не все 2000 байт, то переходим на следующий
оборот цикла |
0012 |
|
0C |
|
0013 |
|
00 |
|
0014 |
LXI D, AFFFh |
11 |
Задаем начальное значение регистровой паре, содержащей
адрес ячейки памяти |
0015 |
|
FF |
|
0016 |
|
AF |
|
0017 |
LXI B,7D1h |
01 |
Задаем начальное значение регистровой паре, содержащей
счетчик |
0018 |
|
D1 |
|
0019 |
|
07 |
|
001A |
m2: IN 2h |
DB |
Прием сигнала от кнопки для начала проверки |
001B |
|
02 |
|
001C |
m7: DCX B |
0B |
Уменьшаем регистр-счетчик |
001D |
JZ m11 |
CA |
Если обработаны все занесенные в память байты, то переход
на завершение программы |
001E |
|
83 |
|
001F |
|
00 |
|
0020 |
INX D |
13 |
Выбор следующей ячейки памяти изменением регистра,
содержащего адрес |
0021 |
LDAX D |
1A |
Запись байта информации в аккумулятор из ячейки по адресу
из DE |
0022 |
ANI 78h |
E6 |
Используем маску для отделения бит, важных для составления
и анализа первого синдрома |
0023 |
|
78 |
|
0024 |
JPO m3 |
E2 |
Если количество бит, выставленных в единицу – четное, то
ошибки в анализируемых битах нет |
0025 |
|
29 |
|
0026 |
|
00 |
|
0027 |
MVI Н,4h |
26 |
Выполняется только тогда, когда есть ошибка. Запись в Н
100b |
0028 |
|
04 |
|
0029 |
m3:LDAX D |
1A |
Запись байта информации в аккумулятор из ячейки по адресу
из DE |
002A |
ANI 66h |
E6 |
Используем маску для отделения бит, важных для составления
и анализа второго синдрома |
002B |
|
66 |
|
002C |
JPO m4 |
E2 |
Если количество бит, выставленных в единицу – четное, то
ошибки в анализируемых битах нет |
002D |
|
33 |
|
002E |
|
00 |
|
002F |
MVI A, 2h |
3E |
Начало участка, выполняемого только тогда, когда есть
ошибка. Запись в (А) 10b |
0030 |
|
02 |
|
0031 |
ADD H |
84 |
Прибавляем регистр H к (А) |
0032 |
MOV H,A |
67 |
Заносим в регистр Н результат суммирования. Т.е. в Н
оказывается х10b |
0033 |
m4:LDAX D |
1A |
Запись байта информации в аккумулятор из ячейки по адресу
из DE |
0034 |
ANI 55h |
E6 |
Используем маску для отделения бит, важных для составления
и анализа третьего синдрома |
0035 |
|
55 |
|
0036 |
JPO m5 |
E2 |
Если количество бит, выставленных в единицу – четное, то
ошибки в анализируемых битах нет |
0037 |
|
3D |
|
0038 |
|
00 |
|
0039 |
MVI A, 1h |
3E |
Начало участка, выполняемого только тогда, когда есть
ошибка. Запись в (А) 1b |
003A |
|
01 |
|
003B |
ADD H |
84 |
Прибавляем регистр H к (А) |
003C |
MOV H,A |
67 |
Заносим в регистр Н результат суммирования. Т.е. в Н
оказывается хх1b |
003D |
m5:LDAX D |
1A |
Запись байта информации в аккумулятор из ячейки по адресу
из DE |
003E |
ANI FFh |
E6 |
Операция И по результатам которой производится проверка
четности. Реализация проверки по контрольному биту |
003F |
|
FF |
|
0040 |
JPO m6 |
E2 |
Если количество бит, выставленных в единицу – четное, то
ошибки в анализируемых битах нет |
0041 |
|
47 |
|
0042 |
|
00 |
|
0043 |
MVI A, 8h |
3E |
Начало участка, выполняемого только тогда, когда есть
ошибка. Запись в (А) 1000b |
0044 |
|
08 |
|
0045 |
ADD H |
84 |
Прибавляем регистр H к (А) |
0046 |
MOV H,A |
67 |
Заносим в регистр Н результат суммирования. Т.е. в Н
оказывается 1хххb |
0047 |
m6: MOV A, H |
7C |
Заносим в регистр А результат предыдущих проверок. |
0048 |
CPI 0h |
FE |
Сравнение с нулем. В регистре Н может оказаться 0 только,
если ошибки нет |
0049 |
|
00 |
|
004A |
JZ m7 |
CA |
Если ошибки нет, то переход на анализ следующего байта |
004B |
|
1C |
|
004C |
|
00 |
|
004D |
CPI 8h |
FE |
Значение регистра Н от 1h до 7h говорит, что зафиксирована двойная ошибка |
004E |
|
08 |
|
004F |
JP m8 |
F2 |
Если в ходе сравнения вычитанием получилось положительное
число, значит двойной ошибки нет. Переход к исправлению одинарной. |
0050 |
|
5D |
|
0051 |
|
00 |
|
0052 |
MOV A,D |
7A |
Заносим в регистр А старший байт адреса |
0053 |
ANI 0Fh |
E6 |
С помощью операции И обнуляем четыре старших бита |
0054 |
|
0F |
|
0055 |
OUT 0h |
D3 |
Вывод содержимого А на индикаторы, предназначенные для
отображения старшей части адреса |
0056 |
|
00 |
|
0057 |
MOV A,E |
7B |
Заносим в регистр А младший байт адреса |
0058 |
OUT 1h |
D3 |
Вывод содержимого А на индикаторы, предназначенные для
отображения младшей части адреса |
0059 |
|
01 |
|
005A |
JMP m2 |
C3 |
Переход на запрос продолжения обработки данных,
поступивших в ОЗУ |
005B |
|
1A |
|
005C |
|
00 |
|
005D |
m8: CPI 8h |
FE |
Значение регистра Н 1000b говорит,
что зафиксирована ошибка в контрольном бите |
005E |
|
08 |
|
005F |
JNZ m9 |
C2 |
Если ошибка не в контрольном бите, то одинарная ошибка в
одном из оставшихся семи битах. Переход к его исправлению |
0060 |
|
6D |
|
0061 |
|
00 |
|
0062 |
XRI 80h |
EE |
Исправление в контрольном бите |
0063 |
|
80 |
|
0064 |
MOV A,D |
7A |
Заносим в регистр А старший байт адреса |
0065 |
OUT 0h |
D3 |
Вывод на индикаторы старшего байта адреса |
0066 |
|
00 |
|
0067 |
MOV A,E |
7B |
Заносим в регистр А младший байт адреса |
0068 |
OUT 1h |
D3 |
Вывод на индикаторы младшего байта адреса |
0069 |
|
01 |
|
006A |
JMP m2 |
C3 |
Переход на запрос продолжения обработки данных,
поступивших в ОЗУ |
006B |
|
1A |
|
006C |
|
00 |
|
006D |
m9: SUI 8h |
D6 |
Вычитая 1000b, преобразуем
содержимое регистра к номеру бита, где зафиксирована ошибка |
006E |
|
08 |
|
006F |
MOV H,A |
67 |
Содержимое аккумулятора переносим в Н |
0070 |
MVI A, 80h |
3E |
Записываем в А байт, который будет использоваться для
коррекции ошибки |
0071 |
|
80 |
|
0072 |
m10: RAL |
17 |
Сдвигаем единицу столько раз, сколько указано в Н |
0073 |
DCR H |
25 |
|
0074 |
JNZ m10 |
C2 |
|
0075 |
|
72 |
|
0076 |
|
00 |
|
0077 |
MOV H,A |
67 |
Переносим в Н получившуюся маску для исправления ошибки |
0078 |
LDAX D |
1A |
Заносим в А подлежащий исправлению байт |
0079 |
XRA H |
AC |
С помощью операции XOR исправляем
ошибку |
007A |
MOV A,D |
7A |
Заносим в регистр А старший байт адреса |
007B |
OUT 0h |
D3 |
Вывод на индикаторы старшего байта адреса |
007C |
|
00 |
|
007D |
MOV A,E |
7B |
Заносим в регистр А младший байт адреса |
007E |
OUT 1h |
D3 |
Вывод на индикаторы младшего байта адреса |
007F |
|
01 |
|
0080 |
JMP m2 |
C3 |
Переход на запрос продолжения обработки данных,
поступивших в ОЗУ |
0081 |
|
1A |
|
0082 |
|
00 |
|
0083 |
m11: NOP |
00 |
Конец программы |
0084 |
|
|
|
0085 |
|
|
|
0086 |
|
|
|
0087 |
|
|
|
0088 |
|
|
|
0089 |
|
|
|
008A |
|
|
|
008B |
|
|
|
008C |
|
|
|
008D |
|
|
|
008E |
|
|
|
008F |
|
|
|
0090 |
|
|
|
ЗАКЛЮЧЕНИЕ
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 |