ЭУМК по дисциплине "Проектирование проблемно-ориентированных вычислительных средств" › Теория › Тема 8. Блок многочастотного приемника сигналов для цифровой АТС

# Электронный учебно-методический
комплекс по дисциплине
"Проектирование проблемно-ориентированных вычислительных средств"

для специальности

1-40 02 02 «Электронные вычислительные средства»

Оглавление | Программа | Теория | Практика | Контроль знаний | Об авторах

8.5. Основные команды управления блоком МЧП
8.5.1. Команды управления блоком МЧП

Для управления работой блока БУК использует следующие основные команды:

- включить приемник;
- отключить приемник;
- сообщить результаты фильтрации.

Команда «Включить приемник»

15 12 | 11 8 | 7 0

Код команды 0001 | Код группы частот | Номер приемника

По этой команде ЦПС выполняет следующие действия:

- Настраивает заданный приемник на фильтрацию указанной группы частот;
- Устанавливает в нуль счетчик длительности выделенных частот;
- Немедленно начинает анализ частот на указанном приемнике.

Команда «Отключить приемник»

15 12 | 11 8 | 7 0

Код команды 0010 |  | Номер приемника

По этой команде ЦПС прекращает фильтрацию частот на указанном приемнике и сбрасывает в нуль счетчик длительности и код выделенных частот. Для выключения приемника может быть использована также и команда "Включить приемник" с нулевым значением в поле "Код группы частот".
Команда «Сообщить результаты фильтрации»

15 12 | 11 8 | 7 0

Код команды 0011 |  | Номер приемника

По этой команде ЦПС записывает в выходной порт информацию о выделенных частотах и длительности их приема в формате

15 8 | 7 0

Счетчик длительности | Код частот

В разрядах 15 - 8 указывается время устойчивого приема частот или время отсутствия частот, если ЦПС не может произвести фильтрацию частот. Время указывается в миллисекундах в интервале от 12 до 252. При превышении максимального значения в счетчике длительности будет находиться значение 255.
В разрядах 7 - 0 указывается код частот, полученный в результате фильтрации.
Код частот может принимать следующие значения:

- нуль - отсутствие частот ("тишина");
- положительный - код частоты или комбинации частот;
- отрицательный - недопустимая комбинация частот.

Результат фильтрации частот должен быть прочитан БУК из регистра данных. Данные будут достоверны только при наличии единицы в 7-м бите регистра состояния.
Для отладочных и служебных целей используются следующие дополнительные команды:

- прочитать память данных;
- записать в память данных;
- прочитать память программ;
- запустить программу пользователя;
- остановить программу и перезапустить блок.

На время выполнения всех команд работа основной программы приостанавливается.
Команда «Прочитать память данных»

15 12 | 11 0

Код команды 1000 | Количество читаемых слов - 1

По этой команде ЦПС выполняет следующие действия:

- Ожидает и вводит начальный адрес памяти;
- Читает содержимое первой ячейки памяти и записывает его в регистр данных;
- Ожидает чтения регистра данных БУКом, читает содержимое следующей ячейки и записывает его в регистр данных;
- Повторяет предыдущий пункт, пока не будут прочитаны все ячейки памяти в регистр данных;
- Завершает выполнение команды и возвращает управление в основную программу.
- После записи в регистр данных команды БУК должен проверить 6-й бит регистра состояния и при появлении в нем единицы записать в регистр данных адрес памяти (память адресуется только словами).
- Считываемые из памяти данные должны быть прочитаны в БУК из регистра данных только при установленном в единицу 7-ом бите регистра состояния. Все данные должны быть приняты в БУК, иначе команда не будет завершена.

Команда «Записать в память данных»

15 12 | 11 0

Код команды 1001 | Количество записываемых слов - 1

По этой команде ЦПС выполняет следующие действия:

- Ожидает и вводит начальный адрес памяти;
- Ожидает и вводит данные для первой ячейки памяти и записывает их в память;
- Ожидает и вводит данные для следующей ячейки памяти и записывает их в память;
- Повторяет предыдущий пункт, пока не будут приняты и записаны в память все данные;
- Завершает выполнение команды и возвращает управление в основную программу.
- После записи в регистр данных команды БУК должен проверить 6-й бит регистра состояния и при появлении в нем единицы записать в регистр данных адрес памяти.
- Записываемые в память данные должны быть записаны БУК в регистр данных только при установленном в единицу 6-ом бите регистра состояния. Все данные должны быть переданы БУК, иначе команда не будет завершена.

Команда «Прочитать память программ»

15 12 | 11 0

Код команды 1100 | Количество читаемых слов - 1

По этой команде ЦПС выполняет те же действия, что и по команде "Прочитать память данных", только информация берется из памяти программ.
Команда «Запустить программу пользователя»

15 12 | 11 0

Код команды 1101 |

По этой команде ЦПС выполняет следующие действия:

- Ожидает и вводит начальный адрес программы;
- Передает управление подпрограмме по указанному адресу;
- Если программа пользователя завершается командой возврата, то после ее выполнения произойдет завершение выполнения команды и возврат управления в основную программу, иначе будет выполняться программа пользователя.
- После записи в регистр данных команды БУК должен проверить 6-й бит регистра состояния и при появлении в нем единицы записать в регистр данных начальный адрес программы в памяти.

Команда «Остановить программу и перезапустить блок»

15 12 | 11 0

Код команды 1111 |

По этой команде ЦПС прерывает выполнение текущей программы и передает управление по адресу вектора прерывания по сбросу ЦПС.
Эта команда выполняет программный сброс ЦПС (без перезагрузки программы из флэш-памяти). Данная команда, как и все остальные команды, может быть выполнена только при разрешенном прерывании INT0.

8.5.2. Программное обеспечение блока МЧП
Распраделение памяти

Нулевая страница памяти данных “System Page in dma” (адреса 60h…7Fh) используется для хранения ряда переменных.
В разделе “Internal memory map of dma” описано распределение памяти данных и задание основных параметров.
Программный модуль загружается с адреса 80h. При этом внутренняя память включена одновременно в память программ и данных. С этого адреса начинается секция векторов прерываний “.vectors”.
Из всех векторов прерываний используются только следующие:
RESET - переход по сбросу системы на начало программы _c_int00;
int0 - переход к подпрограмме дешифрации и обработки команд после записи команды из БУКа в регистр данных COMM;
dmac4 - устанавливает в единицу бит FLAG(0) при достижении конца буфера при приеме данных из ИКМ тракта через последовательный порт и прямой доступ в память;
dmac5 - установка начального адреса передающего буфера buf_trn для синхронизации приема и передачи данных по ИКМ трактам после первого заполнения приемного буфера.
В конце таблицы векторов прерывания находится ячейка IDN, в которую записывается код версии ПО после его загрузки из флэш-памяти.
За таблицей векторов прерываний с адреса 100h расположена аналогичная таблица команд. Для каждой команды в соответствие с ее кодом отводится четыре ячейки памяти, Для большинства команд в этих ячейках расположены команды перехода на соответствующую подпрограмму и выделения младшего байта команды:
NCOM - пустая, неиспользуемая команда;
RECON - команда «Включить приемник»;
RECOF - команда «Отключить приемник»;
RECTST - команда «Сообщить результаты фильтрации»;
OUTDAT - команда «Прочитать память данных»;
INPDAT - команда «Записать в память данных»;
OUTDAT - команда «Прочитать память программ»;
RUNPRG - команда «Запустить программу пользователя»;
HALT - команда «Остановить программу и перезапустить блок».
По команде «Включить приемник» в буфер каналов s_dat по коду группы в соответствие с таблицей tab_gr со смещением ikm_stp, умноженным на номер канала, записываются данные о канале в следующем формате:
adr_prg - адрес программы обработки определенного числа частот (из tab_gr);
adr_cof - адрес таблицы коэффициентов фильтров для группы (из tab_gr);
aver0 - ячейка для подсчета полной мощности сигнала в канале (0);
aver1 - ячейка для подсчета мощности 1-й частоты в канале (0);
. . .
aver8 - ячейка для подсчета мощности 8-й частоты в канале (0);
cnt&cod_c - время и текущий принимаемый код (0);
cnt&cod_o - время и предыдущий принятый код (0);
scnt - счетчик приема тишины в канале (0).
По команде «Отключить приемник» в буфер соответствующего канала записывается адрес пустой подпрограммы fr0prg.
По команде «Сообщить результаты фильтрации» из буфера каналов в соответствие с номером опрашиваемого канала из ячейки cnt&cod_c информация записывается в регистр данных модуля.
Сразу же за таблицей команд расположена подпрограмма дешифрации и обработки команд, подпрограммы выполнения отдельных команд и обработки прерываний. За ними с адреса 280h расположена служебная программа, которую необходимо запустить перед загрузкой программы из БУКа.
В конце постоянной служебной части находятся несколько команд обработчика команды HALT, непосредственно за которыми с адреса 300h расположена основная программа, начинающаяся с инициализации (точка входа _c_int00). Именно эта часть программы и может быть перезагружена.

Алгоритм выделения частот
Начальная установка включает в себя сброс всех прерываний, установку указателя стека на a_stack, установку адреса таблицы векторов на RESET, установку ST0 (ARP=0, DP=0) и ST1 (SXM=1 – расширение знака, FRCT=1 – умножение дробей, ASM=1 – сдвиг при записи на 1 влево).
При инициализации выполняется сброс двух последовательных портов, устанавливаются 3 такта ожидания для портов ввода-вывода (SWWSR), коэффициент умножения частоты на 10 (CLKMD), и инициализируются некоторые переменные.
После этого выполняется инициализация последовательных портов на ввод и вывод данных:

- размер принимаемого кадра 32 слова по 8 бит (RCR1);
- ввод с преобразованием A-law (RCR2);
- размер передаваемого кадра 32 слова по 8 бит (XCR1);
- вывод байта без преобразования (XCR2);
- полярность импульсов синхронизации (PCR).

Затем выполняется инициализация каналов контроллера ПДП (DMA2, DMA3 – передача данных в ИКМ, DMA4, DMA5 – прием данных из ИКМ):

- начальный адрес в буфере-источнике (DMSRC2, DMSRC3);
- регистр-приемник данных (DMDST2, DMDST3);
- длина кольцевого буфера передатчика 64=32х2 слова (DMCTR2, DMMCR3);
- источник приращения адреса при передаче DMIDX1 (DMMCR2, DMMCR3);
- регистр-источник данных (DMSRC4, DMSRC5);
- начальный адрес в буфере-приемнике (DMDST4, DMDST5);
- длина кольцевого буфера приемника 64=32х2 слова (DMCTR4, DMMCR5);
- источник приращения адреса в приемнике DMIDX0 (DMMCR4, DMMCR5).

При этом передача выполняется из буфера buf_trn в регистры передатчиков DXR1 последовательных портов, а прием из регистров приемников DRR1 в буфер buf_rcv.
Данные от трактов ИКМ0 и ИКМ1 располагаются в соответствующих буферах, а начальные адреса буферов должны быть кратны 128 (80h). Адрес в буфере передатчике устанавливается с опережением, так как при приеме i-го канала должен передаваться также i-й канал, а записываться в регистр передатчика следующий i+1-канал.
Инициализация контроллеров ПДП заканчивается занесением 1 в DMIDX0, DMIDX1 и включением всех 4-х каналов. Работа контроллера ПДП начнется только после начала работы последовательного порта.
После этого проверяется содержимое ячейки IDN (после загрузки программы из флэш-памяти в ней ноль) и при неравенстве ее содержимого коду версии ПО выполняется очистка и выключение всех приемников, подсчет контрольной суммы программы в памяти и выдачи ее в порт данных.
Затем выполняется очистка области предыстории фильтров с записью в последнюю ячейку адреса начала буфера каждого канала, после чего сбрасывается триггер LOAD и гасится красный светодиод на панели блока.
Запуск последовательных портов выполняется путем установки битов запуска приема RunRcvr и передачи RunXmtr в соответствующих регистрах SPCR.
Сброс всех необработанных запросов на прерывания выполняется путем записи всех единиц в регистр с последующим разрешением трех типов прерываний, и общим разрешением прерывания.
Основной цикл программы начинается после установки длины программного кольцевого буфера (BK) равной 64=32×2 и загрузки начального адреса приемного буфера x_dat в регистр ar0.
Программа выделения частот запускается 64=2×32 раза в течение основного цикла длительностью 125 мкс, начинающегося с адреса nxtf. В начале цикла регистр ar_x загружается начальным адресом приемного буфера x_dat, регистр ar_s – начальным адресом буфера данных каналов s_dat и регистр ar_xy – последним адресом блока предыстории нулевого канала xy_dat+l_dat-1 (где l_dat – длина буфера предыстории одного канала). Здесь же загружается и регистр таймера tim (сторож).
Внутренний цикл (стартовая метка filtr) начинается с проверки заполнения очередной пары ячеек приемного буфера и вызова затем два раза программы выделения частот. Адрес программы для заданного числа частот берется из первой ячейки буфера данных соответствующего канала (смещение относительно s_dat), а из второй ячейки берется начальный адрес таблиц коэффициентов фильтров.
За время выполнения 32-х внутренних циклов во всех включенных каналах выполняется фильтрация, а в паре каналов с адресом буфера, совпадающим с ar0, дополнительно выполняется и анализ с получением нового кода. После этого содержимое ar0 увеличивается на 2 и управление передается в начало внешнего цикла на метку nxtf.
Имеется несколько подпрограмм для выделения частот:
fr0prg – подпрограмма выключенного канала;
fr1prg – подпрограмма для одночастотных групп;
fr2prg – подпрограмма для двухчастотных групп;
fr3prg – подпрограмма для трехчастотных групп;
fr6prg – подпрограмма для кода 2 из 6;
fr8prg – подпрограмма для DTMF.
Метки подпрограмм и коэффициентов фильтров сведены в таблицу tab_gr в соответствие с номером группы.
Для 3-х частотных групп и кода 2 из 6 пороговые уровни хранятся в таблицах fr3lv5, fr3lv6, fr6lev соответственно, а для остальных групп частот соответствующий порог хранится в конце таблицы коэффициентов фильтров. Возможные варианты формируемых кодов для 8-ми частотных групп находятся в таблицах fr6tab, fr8tab.
Подпрограммы выделения частот имеют следующую структуру (рис. 8.7.):

######

###### Рисунок 8.7 – Алгоритм подпрограммы выделения частот

Подпрограммы для обработки различного количества частот имеют практически одинаковую структуру, только подпрограммы для трех, двух и одной частоты более простые.
В начальной части программы выполняется сохранение некоторых регистров, установка размера кольцевого буфера (BK) для хранения принимаемых значений и задержки для входных данных (ar0), подаваемых на входы фильтров разной частоты (задержка тем больше, чем больше частота, на которую настроен фильтр).
Затем абсолютное значение принимаемого сигнала добавляется в ячейку aver0 (для каждого канала свой набор ячеек памяти для усреднения) и используется в дальнейшем для определения отсутствия сигнала в канале.
Дальше в подпрограммах выполняется фильтрация от одной до 8-ми частот, в зависимости от группы. Модуль выходного значения каждого из фильтров прибавляется в свою ячейку памяти (от aver1 до aver8).
После обработки последней частоты наращивается адрес буфера предыстории ar_xy и проверяется совпадение текущего адреса входного буфера ar_x (определяется номером канала) с адресом обрабатываемого канала ar0. За время приема одного отсчета для всех каналов выполняется детектирование только двух каналов (по одному для каждого ИКМ). Таким образом, изменение кода и счетчика в каждом канале происходит через 4 мс (1/8000Гц × 32 канала). Увеличение содержимого регистра ar0 на единицу выполняется в соответствие с частотой дискретизации. При несовпадении ar_x и ar0 происходит выход из подпрограммы.
При совпадении ar_x и ar0 выполняется детектирование кода. В первую очередь обнуляется аккумулятор В (код «тишины») и проверяется отсутствие сигнала в канале («тишина») путем сравнения среднего уровня мощности с порогом. При обнаружении «тишины» из счетчика scnt вычитается 1. Если число тактов тишины больше порога, то выполняется переход к сравнению кодов, а если равно – дополнительно еще и выполняется очистка предыстории. В противном случае выполняется поиск максимумов. Три самых больших действующих значения ищутся только в случае трех и более частот и сохраняются в следующих ячейках памяти FMAX, SMAX, TMAX (в порядке уменьшения амплитуды).
После нахождения максимумов первый (или единственный) из них сравнивается с порогом. При этом порог берется из таблицы коэффициентов фильтров (если он одинаковый для всех частот) или из таблиц fr_lev (если пороги разные). Если первый максимум меньше порога то это значит, что в сигнале нет анализируемых частот, и формируется код «тишины» и выполняется переход к сравнению кодов.
Если первый максимум (FMAX) больше порога, то для групп с одной частотой формируется код «1» (есть частота) и выполняется переход к сравнению кодов, а для остальных групп с порогом сравнивается второй максимум (SMAX).
Если второй максимум меньше порога, то по номеру первого максимума формируется или код выделенной частоты (если данная частота может быть одна), или код этой единственной частоты с признаком “ошибка, только одна частота” (к коду добавлены два старших бита «С0h»). Если второй максимум присутствует, то дополнительно может проверяться разность уровней двух частот и допустимость присутствия в коде этих двух частот (например, в коде 2 из 6 наличие частот 500Гц и 700Гц одновременно не допустимо).
При наличии двух допустимых частот выполняется проверка на превышение порога для третьего максимума (TMAX). Превышение порога третьим максимумом всегда соответствует ошибке, и к коду соответствующему двум первым частотам добавляется признак “ошибка, три частоты” (единица в старшем бите «80h»).
Если третий максимум не превышает порог, то в аккумуляторе В формируется код в виде суммы номеров максимумов (для групп с тремя частотами) или код берется из таблицы fr_tab, при этом номер строки и столбца в таблице задаются номерами максимумов ar_sm, ar_fm соответственно.
После формирования нового кода в аккумуляторе В выполняется его сравнение с текущим кодом cod_c (кодом, который был детектирован ранее, и который выдается по запросу в БУК). При этом перед сравнением кодов выполняется очистка области, в которой накапливались действующие значения для всех анализируемых частот.
Если новый код совпадает с текущим, то к счетчику текущего кода просто добавляется новая длительность в 4мс, проверяется переполнение счетчика (при переполнении, после длительности 252 будет записана длительность 255, которая больше не будет увеличиваться) и значение кода переписывается в выходной буфер для автоматической выдачи в ИКМ тракт. При сравнении кодов новый код с признаком “ошибка, 3 частоты” считается правильным, если он совпадает с текущим кодом.
Если новый код не совпал с текущим, то он сравнивается с предыдущим принятым кодом, который обычно совпадает с текущим, но только до тех пор, пока не будет принят новый код.
Если новый код не совпадает и с предыдущим, то это говорит о том, что в течение короткого интервала времени была какая-то помеха. В этом случае к текущему счетчику добавляется предыдущий счетчик, в качестве предыдущего значения берется значение из аккумулятора В, а в качестве предыдущего счетчика берется начальное значение 4мс. Таким образом, считается, что продолжается прием текущего кода.
Если новый код совпадает с предыдущим, то к счетчику предыдущего кода добавляется новая длительность в 4мс, проверяется достижение счетчиком порога (12 мс). Достижение предыдущим счетчиком порога говорит о том, что в течение последних 12мс принимается новый код и его значение и счетчик переписываются в соответствующие поля текущего кода и счетчика, а предыдущий счетчик обнуляется. При сравнении кодов предыдущий код с признаком “ошибка, 3 частоты” заменится на правильный, если он совпадет с принятым (находящимся в аккумуляторе В) кодом.

Оглавление | Программа | Теория| Практика | Контроль знаний | Об авторах
© БГУИР , 2012