Рис.3.11
Индикатор цифровой АЛС324А.
Выводит на экран цифры в зависимости от сигналов на входах в
семисегментном коде. Состоит из семи светодиодов. Единица, пришедшая на вход,
приводит к свечению соответствующего сегмента.
Принцип работы программы основан на том, что с использованием
модифицированного кода Хемминга можно проводить проверку считанной информации
на наличие ошибок. Существует возможность исправить однократные ошибки и
обнаружить двойные. Программа управляет считыванием информации с порта, затем
заносит их в оперативную память. По нажатию кнопки начинается проверка
содержимого на наличие ошибок. На основе маскирования определенных бит и
контроля четности формируется четырехбитная характеристическая комбинация,
каждому значению которой соответствует свое решение. Таких решений в результате получается
четыре:
1. Нет ошибки. Программа просто начинает проверку следующего байта данных,
занесенных в ОЗУ.
2. Есть двойная ошибка, тогда выводится сообщение о двойной
ошибке в виде адреса, где она зафиксирована, но только с тем различием, что у
выводимого адреса будут обнулены четыре старших бита. То есть такое сообщение
об ошибке будет иметь вид 0ххх. Программа ждет нажатия кнопки для дальнейшей
работы.
3. Ошибка в контрольном бите. Исправляется с помощью заданной
маски. Номер ячейки выводится на индикаторы. Программа ждет нажатия кнопки для
дальнейшей работы.
3. Есть одиночная ошибка. Ее исправление начинается с
формирования маски, в которой все биты будут установлены в ноль и лишь один в
единицу. Как раз тот, что должен будет быть исправлен. Далее, с помощью
операции XOR (Исключающее ИЛИ) над содержимым ячейки
памяти и маской ошибка будет исправлена. Номер ячейки, в которой была ошибка,
выводится на индикаторы. Программа ждет нажатия кнопки для дальнейшей работы.
Адрес
|
Мнемонический код
|
Код
|
Комментарии
|
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
|
|
|
|
В ходе данной работы была
спроектирована микропроцессорная система для контроля переданной информации
использованием модифицированного кода Хемминга. Эта система собрана на базе
микропроцессорного комплекта КР580, а также некоторого числа дополнительных
элементов. Была разработана как аппаратная, так и программная часть системы.
Так как система состоит из интегральных микросхем, то она отличается малыми
размерами и высокой надежностью.
1. Абрайтис
В.Б. Микропроцессоры и
микропроцессорные комплекты интегральных микросхем: Справочник. В 2 т. /
Абрайтис В.Б., Аверьянов Н.Н., Белоус А.И. и др.; Под ред. В.А. Шахнова. - М.:
Радио и связь, 1988. - 368 с.
2. Горбунов
В.Л. Справочное пособие по микропроцессорам и микроЭВМ / В.Л. Горбунов, Д.И.
Панфилов, Д.Л. Преснухин. - М.: Высш. шк., 1988 . - 272 с.: ил.
3. Калабеков
Б. А. Микропроцессоры и их применение в системах передачи и обработки сигналов:
Учеб. Пособие для ВУЗов. — М.: Радио и связь, 1988.
4. Угрюмов
Е. Цифровая схемотехника
/ Е. Угрюмов – БХВ Санкт-Петербург, 2000 – 528с.