При перепаде на высокий уровень, если прерывание не замаскировано и разрешено, произойдет сохранение счетчика команд в стеке, и микропроцессор начнет работу с ячейки 003С(16). В эту ячейку следует записать инструкцию перехода на начальный адрес основной программы, которая будет считывать входной отсчет из порта А, обрабатывать его согласно алгоритму фильтрации и выводить в порт В. Основная программа должна отработать до прихода в порт А очередных данных, а до этого не прерываться. Первое обеспечивается эффективностью алгоритма и быстродействием программы. Второе – хранением высокого уровня на входе RST 7.5 триггером, поэтому ложная импульсная помеха, попавшая на этот вход во время выполнения программы, не прервет и не перезапустит ее. Но чтобы обеспечить возможность нового запуска программы при приходе очередных данных, необходимо сбросить триггер, что осуществляется переустановкой маски, описанной выше. Кроме того, необходимо записать исходное число 50FFв указатель стека, так как при каждом прерывании в стек записывается счетчик команд, а указатель стека дважды декрементируется, что в конечном итоге приведет к достижению им рабочей области и засорению ее неверной информацией. Завершается основная программа командой HLT, и процессор ожидает поступления на вход RST 7.5 очередного положительного перепада.
3. Разработка конкретных алгоритмов работы устройства
Как уже оговаривалось, при рестарте микропроцессор начинает исполнять инструкции, находящиеся в области векторов прерываний ПЗУ в зависимости от типа рестарта. При включении питания исполняется команда, записанная в ячейке с адресом 0000(16), а при аппаратном прерывании RST 7.5. - начальный адрес 003С(16). В эти ячейки следует поместить команды безусловного перехода на определенный адрес JMP. В первом случае ссылка осуществляется на программу инициализации, во втором – на основную программу обработки оцифрованного сигнала. Обе программы ориентировочно небольшие по сравнению с размером ПЗУ ( 2кбайт ), поэтому их можно рассредоточить в адресном пространстве. Например, программу инициализации поместить с адреса 0200(16), а основную программу – начиная с адреса 0500(16). Тогда ориентировочная карта памяти выглядит следующим образом:
0000 | JMP 0200 |
0001 | |
… | |
003C | JMP 0500 |
003D | |
… | |
0200 | Инициализация |
0201 | … |
… | |
0500 | Осн. программа |
0501 | … |
… | |
5000 | ОЗУ |
5001 | |
… | |
7001 | Порт А |
7002 | Порт В |
7003 | |
… |
ПЗУ, ОЗУ и порты ввода-вывода имеют одно адрестое пространство, поэтому обращение к ним можно производить с помощью одних и тех же инструкций: LDA (загрузка ) и STA (запоминание). При этом данные соответственно загружаются в аккумулятор и копируется из него.
Алгоритм программы инициализации имеет следующий вид:
Основная программа должна начинаться с загрузки в аккумулятор входного отсчета из порта А. Входные данные, получаемые от АЦП, представлены в беззначном коде (минимальное число 00000000(2), максимальное 11111111(2)). Чтобы перейти к рабочему коду процессора – дополнительному, достаточно прибавить к входному число 80(16) = 10000000(2), это эквивалентно отсечению постоянной составляющей. Далее предстоит умножение числа на коэффициенты и суммирование согласно выражению (1). Для этих целей необходимо хранить предыдущие отсчеты в памяти ОЗУ. Возможен следующий вариант организации оперативной (рабочей) памяти:
Отсчет*0.4 | *коэффиц. | Адрес(16) |
Xi-4 | 0.1 | 5000 |
Xi-3 | 1 | 5001 |
0.65 | 5002 | |
0.1 | 5003 | |
1 | 5004 | |
0.65 | 5005 | |
0.1 | 5006 | |
Xi-1 | 1 | 5007 |
0.65 | 5008 | |
0.1 | 5009 | |
Xi | 1 | 500А |
0.65 | 500В | |
0.1 | 500С |