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

Рис.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 |