Журнал Радио 10 номер 2000 год. ДОМАШНИЙ ТЕЛЕФОН

Журнал Радио 10 номер 2000 год. ДОМАШНИЙ ТЕЛЕФОН РАЗРАБОТКА ТЕЛЕФОННЫХ ПРИСТАВОК НА PIC-КОНТРОЛЛЕРАХ В. КУЛАКОВ, г. Ростов-на-Дону  Окончание. Начато cм в "Радио", 2000, ╧9

Зададим директивой #define символьные имена для используемых линий ввода/вывода и названия флагов (табл. 3).

В табл. 4 показана подпрограмма инициализации.


Теперь создадим так называемый цикл ожидания, т. е. тот код. который исполняется программой при уложенных трубках и при отсутствии сигнала вызова. Обычно задачей этого цикла является проведение инициализаций и мониторинг каких-либо входов. Применительно к нашей задаче программе необходимо отслеживать напряжение в линии, ожидая его падения при снятии трубки. Также необходимо сбросить все флаги, обнулить регистры Figure и Number_of_Figure и подать низкий уровень на вход С ключа К1. чтобы не замкнуть линию через резистор R3 (табл. 5).

Именно в этот цикл должна попадать программа при запуске, даже если ее исполнение началось со случайного адреса.

Если на Uline будет обнаружен низкий уровень, необходимо определить, действительно ли снята трубка или по линии передается сигнал вызова. Во время сигнала вызова на вход Uline будут поступать импульсы с частотой 25 Гц. Чтобы различить их, нужно убедиться, что в течение какого-то времени, большего нескольких периодов вызывного сигнала, на Uline подан низкий уровень. Согласно [1] "поднятием трубки" на телефоне считается замыкание линии на время более 250 мс. Напишем фрагмент программы, который отслеживает в течение 300 мс низкое напряжение на линии (табл. 6).

Этот фрагмент должен следовать непосредственно за предыдущим фрагментом.

Если на линии в течение 300 мс присутствует низкое напряжение, значит, снята трубка с какого-то телефона. Затем нужно проверить наличие низкого уровня на входе Itel , т. е. распознать, снята трубка с телефона, подключенного через устройство, или с аппарата, подключенного непосредственно к линии. Когда задействован "свой" телефон, программа должна перейти в режим считывания набираемого на нем номера, в противном случае набор номера следует заблокировать. Поэтому добавим к программе две строки:

btfsc Itel
call Block

Подпрограмма Block выполняет функцию блокировки набора номера. В наиболее простом виде алгоритм ее работы может выглядеть так: на выход Key выставляется высокий уровень и линия замыкается на резистор R3. Через какое-то время, например, через 1 с. на Key выставляется низкий уровень и через небольшую задержку (порядка 20 мс) проверяется. не уложена ли трубка. Если трубка не уложена, то опять на Key подается высокий уровень, и этот цикл повторяется. В противном случае выполняется оператор goto_begin, и программа начинает свою работу заново. Ассемблерный текст этой подпрограммы рассматривать не будем, так как она достаточно проста и особых комментариев не требует.


Далее считывают набираемый на телефонном аппарате номер. Как уже отмечалось выше, набор номера представляет собой серию импульсов, которые требуется пересчитать. Считывание набора номера будем производить по входу Itel, хотя можно и по Uline. Ассемблерный код этой части программы показан в табл. 7.

В цикле с меткой _dial_01 программа ожидает начала набора цифры. При этом она постоянно вызывает подпрограмму инициализации lnit и выставляет низкий уровень на затвор ключа К1. Это необходимо для избежания зависаний при запуске устройства или при сбоях от внешних помех. Если не обнулять выход Key, то может получиться так. что на нем окажется высокий уровень, линия замкнется на R3 и напряжение в ней упадет. В результате программа никогда не выйдет из этого цикла. Если не инициализировать регистр TRISB (что делается в подпрограмме lnit), то в результате сбоя линия Key может быть запрограммирована как вход, и ключ К1 откроется накопившимся зарядом на затворе, что опять приведет к зависанию программы. Чтобы избежать этого, подключают резистор сопротивлением порядка 200 кОм между затвором К1 и общим проводом.

После того, как на Itel появится высокий уровень, обнуляется счетчик принятых импульсов. Далее, при сброшенном флаге Supress, назначение которого будет пояснено ниже, вызывается подпрограмма Delay10 выполняющая задержку на 10 мс. Текст этой подпрограммы здесь не приводится, так как она достаточно проста. Это же касается и аналогичной подпрограммы задержки на 80 мс.

Затем проверим, выросло ли напряжение в линии. Если нет, то считается, что падение тока в телефоне вызвано падением тока в линии, а не работой номеронабирателя, и программа возвращается к метке _dial_0l. Иначе инициализируется счетчик, состоящий из регистров Counterl о и CounterHi, на время 400 мс. Если за это время высокий уровень на Itel не исчезнет, то можно считать, что трубку на телефоне уложили, и управление будет передано на начало, т. е. на метку _begin.

При появлении низкого уровня производится задержка на 10 мс для защиты от дребезга контактов номеронабирателя, а затем увеличивается счетчик принятых импульсов и инициализируется счетчик времени на 100 мс. По появлении нового импульса программа выполняет аналогичные действия, а если в течение 100 мс новый импульс не обнаружен, то считается, что набор цифры закончен и увеличивается счетчик принятых цифр.

Далее необходимо обработать принятую цифру. В нашем примере требуется запретить доступ к междугородной связи паролем. Предполагается, что на междугородную связь можно выйти набором цифры "8" сразу после снятия трубки. Фрагмент программы для этого случая показан в табл. 8.

Если флаги Supress и Parol сброшены, а после снятия трубки и набора первой цифры это действительно так. то программа проверяет набранную цифру на равенство восьмерке. В случае выполнения этого равенства флаги Supress и Parol устанавливаются. Установка флага Supress приводит к тому, что в момент размыкания линии номеронабирателем, к ней на 80 мс подключается резистор R3, в результате чего набор цифры в линию не пропускается. Однако у программы остается возможность пересчитывать импульсы набора после отключения резистора R3 от линии.

При совпадении введенной цифры пароля с заданной оба этих флага сбрасываются и контроллер перестает блокировать набор цифр. Если пароль набран неправильно, то сбрасывается только флаг Parol, а набор продолжает блокироваться до тех пор. пока не будет положена трубка телефона.

Диаграмма напряжения в телефонной линии при блокировке набора цифры "2" показана на рис. 6. В момент t происходит размыкание линии номеронабирателем. Затем на временном интервале t0 —t1 напряжение растет до тех пор, пока его не обнаружит контроллер. Далее, в момент t1. подключается резистор R3. В момент t2 импульс набора заканчивается, а в момент U отключается резистор R3.

Таким образом, в линию будут пропущены только короткие импульсы с момента размыкания линии до включения резистора R3. На большинство АТС эти импульсы влияния не окажут, однако на некоторых электронных телефонных станциях они могут восприниматься как набор номера. Для того чтобы избавиться от этих импульсов, можно блокировать набор не резистором, а стабилитроном. При этом алгоритм работы программы необходимо изменить так, чтобы стабилитрон подключался не на 80 мс. как резистор R3. а постоянно. В этом случае при разрыве линии во время набора ток будет течь через стабилитрон, а при замыкании — через телефон. Такой способ блокировки набора номера использован в коммутаторе, описанном в [2].

Рассмотрим теперь работу устройства, схема которого показана на рис. 7. Оно представляет собой блокиратор параллельного телефона с некоторым набором дополнительных сервисных функций. Блокиратор предназначен для подключения к одной линии двух телефонных аппаратов (ТА) с возможностью приоритета при снятии трубки на первом телефоне.

Приоритет для ТА 1 позволяет передать освобожденную линию этому телефону даже в том случае, если она занята другим телефонным аппаратом. При этом перед отключением абоненту ТА2 будет выдан предупреждающий сигнал и предоставлено время порядка 6...7 с для окончания разговора. Эта функция позволяет сделать максимально незаметным наличие второго телефона для владельца первого. Ее можно включить или отключить тумблером SA1. Тумблером SA2 можно задать такой режим работы ТА2 при входящем звонке, когда он начинает звонить после третьей посылки вызова.

Блокиратор выполнен на дешевом и имеющем минимальные габариты контроллере PIC12C508-04/P.

Оба телефонных аппарата подключены через токовые ключи VT1 и VT2. Каждый из телефонов контролируется по току с помощью оптопар U1.1 и U1.2. Сигнал входящего вызова отслеживается через делитель R4R5.

Тумблеры SA1 и SA2 включены таким образом, что их положение можно определить, подав на затворы транзисторов VT1 и VT2 низкий уровень. При этом на выходе системы контроля тока телефона при замкнутом тумблере будет низкий уровень, а при разомкнутом — высокий. Такое включение не требует отдельных выводов процессора и позволяет обойтись всего пятью имеющимися в наличии линиями контроллера на весь блокиратор.

Однако есть одна особенность, которая вызвала применение резисторов R9 и R10. При их отсутствии (т. е. при подаче сигналов непосредственно с коллекторов транзисторов оптопар на входы контроллера) в момент подключения устройства может возникнуть такая ситуация, когда, например, выводы GP2 и GP3 будут запрограммированы как выходы с сигналами нуля и единицы на каждом соответственно. Если при этом тумблер SA1 будет замкнут, то через диод VD3 потечет ток, который вследствие малой мощности источника питания не даст напряжению питания достигнуть требуемого уровня. Тактовый генератор не сможет запуститься, и устройство работать не будет. Этот ток должен быть ограничен, для чего и служат эти резисторы.

Программа блокиратора построена аналогично рассмотренной выше. В начальном цикле происходят инициализация и установка высокого уровня на затворы транзисторов VT1 и VT2. В этом цикле контролируется также состояние телефонов и проверяется наличие сигнала входящего вызова. После снятия трубки оба телефона отключаются на короткое время и определяется положение тумблеров SA1 и SA2. Их состояние запоминается в соответствующих флагах программы.

Затем программа входит в режим ожидания набора номера. При этом, если трубка снята с ТА2 и при замкнутом тумблере SA1. через небольшой интервал времени первый телефон подключается к линии. Это позволяет обеспечить функцию приоритета. В случае начала набора номера на ТА2 первый телефон будет опять отключен, чтобы избежать "подзвякивания" при наборе номера. После окончания набора последней цифры он будет подключен снова.

Если тумблер SA1 разомкнут, то ТА1 не подключится к линии и устройство будет работать как обычный блокиратор параллельного телефона.

В случае снятия трубки на ТА1 во время разговора по второму телефону устройство выдает короткий предупредительный сигнал подачей напряжения звуковой частоты на затвор VT2. Происходит отключение ТА1 и формируется задержка на 6...7 с, чтобы предоставить абоненту ТА2 возможность закончить разговор. После этого опять подается сигнал, ТА2 отключается и через 1 с линия передается первому телефону. Таким образом реализуется функция приоритета для первого телефона.

Входящий вызов обрабатывается программой следующим образом. При появлении высокого уровня на резисторе R5 программа считывает состояние тумблеров SA1. SA2 и при замкнутом SA2 отключает ТА2 от линии. Далее контроллер пересчитывает число периодов в посылке вызова. Если это число меньше заданного в одной из констант программы, то считается, что по линии прошла помеха, а не посылка вызова. Тогда выполнение программы начинается заново. Иначе содержимое счетчика посылок увеличивается, и программа ожидает снятия трубки с одного из телефонов или появления новой посылки вызова. Это происходит примерно в течение 8 с. Если за это время трубку не сняли и не поступила очередная посылка, то можно считать, что сигнал вызова закончен и исполнение программы начинается заново.

При обнаружении следующей посылки и когда число периодов в ней больше или равно заданному в константе программы, инкрементируется счетчик посылок. По достижении этим счетчиком состояния 3 (это число задается в разделе констант программы и может быть изменено) к линии подключается ТА2. в результате чего он тоже с каждой следующей посылкой будет выдавать сигнал вызова.

Цепь R13C2 задает частоту внутреннего генератора контроллера. При указанных на схеме номиналах она составляет 50 кГц ± 10 %. Светодиоды HL1 и HL2 индицируют занятый телефон, а с помощью HL3 можно определить полярность линии при подключении.

Блокиратор собран на печатной плате из одностороннего фольгированного стеклотекстолита (рис. 8).

При пропайке контроллера сторожевой таймер необходимо отключить.

Текст программы для устройства на рис. 7 можно найти на ftp сервере журнала "Радио" по адресу: ftp://ftp.paguo.ru/ats/block.asm.

ЛИТЕРАТУРА
1. Киалюк А. И. Справочник по устройству и ремонту телефонных аппаратов зарубежного и отечественного производства. — М.; Антелком. 1999.
2. Кулаков В. Телефонный микропроцессорный коммутатор 1x5 — Радио. 1999. ╧ 10. с 30-32.

Вернуться к содержанию журнала "Радио" 10 номер 2000 год







Рекомендуемый контент




Copyright © 2010-2017 housea.ru. Контакты: info@housea.ru При использовании материалов веб-сайта Домашнее Радио, гиперссылка на источник обязательна.