Журнал РАДИОЛОЦМАН, апрель 2016
Витушкин Д. Ф., Узбекистан, Ташкент
Переходим к программному оформлению устройств.
Микроконтроллер сконфигурирован для работы от внутреннего тактового генератора с прерываниями от портов GP4 (детектор состояния линии), GP1 (детектор поднятия трубки телефона директора) и GP3 (детектор поднятия трубки телефона секретаря).
Алгоритм работы приставки «директор-секретарь» сводится к тому, что бóльшую часть времени контроллер находится в спящем режиме и просыпается при изменении состояния линии. Наличие звонка в линии определяется программно. С целью определения звонка производится замер числа прерываний от порта GP4 в течение 100 мс. По количеству определившихся переходов можно судить о наличии в линии звонка или его отсутствии. В течение первых трех звонковых посылок телефон директора принудительно отключен от линии, то есть, эти звонки принимаются только телефоном секретаря. По истечении трех посылок вызова телефон директора подключается к линии и начинает звонить, а телефон секретаря отключается. При параллельном занятии линии телефонами секретаря и директора (в том случае если директор снял трубку, а на линии в этот момент находился секретарь) устройство позволяет находиться обоим на линии в течение 10 с, после чего телефон секретаря принудительно отключается. Кроме того, при наборе номера с телефона секретаря в импульсном режиме телефон директора блокируется на время набора номера. Это исключает «подзвякивание» и занятие линии телефоном директора во время набора номера секретарем.
Особенности программы приставки «директор-секретарь» таковы, что в исходном состоянии подключаются телефоны директора и секретаря, разрешаются прерывания от детектора звонка и детекторов поднятия трубок ТА директора и секретаря, после чего контроллер уходит в сон:
START_
BSF GPIO,0 ; включаем ТА директора
BSF GPIO,5 ; включаем ТА секретаря
BSF STATUS, RP0 ; банк 1
MOVLW B'00011010' ; вкл. прерывание от GP1, GP3, GP4
MOVWF IOCB
BCF STATUS, RP0 ; банк 0
;******************ОЖИДАНИЕ******************
SLEEP
NOP
При изменении состояния портов GP1, GP3 или GP4 контроллер просыпается и обрабатывает прерывание:
; ВХОД В ПРЕРЫВАНИЕ ОТ ПОРТОВ
PER
MOVWF W_TEMP ; сохраняем значение W и STATUS
SWAPF STATUS,W
MOVWF STATUS_TEMP
MOVF GPIO,0
BCF INTCON,0 ; сбросим флаг прерывания от портов
INCF RING
SWAPF STATUS_TEMP,W ; восстанавливаем значение W и STATUS
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE
В подпрограмме нужно сохранить значения ключевых регистров – W и STATUS.
Выяснять, от какого источника пришло прерывание, здесь нецелесообразно, поскольку это делается в основном теле программы. Переменная RING является счетчиком числа прерываний. Каждый последующий вход в прерывание добавляет в нее единицу.
Затем запрещаются все прерывания, и определяется источник прерывания:
;************* ИЗМЕНЕНИЕ НА ДАТЧИКАХ ***********
BSF STATUS, RP0 ; банк 1
CLRF IOCB ; выкл. прерывания
BCF STATUS, RP0 ; банк 0
Далее реализован цикл общей длительностью 6 мс, в котором проверяется наличие на детекторе вызова лог «1», то есть, наличие на линии звонка:
MOVLW .5
MOVWF TEMP1
MOVLW .255
MOVWF TEMP2
BTFSC GPIO,4 ; "1" - звонок
GOTO $+.6
DECFSZ TEMP2
GOTO $-.3
DECFSZ TEMP1
GOTO $-.7
GOTO $+.8
Если звонок был определен, отключаются телефоны директора и секретаря, затем происходит переход на подпрограмму ANALIZ, где в цикле 100 мс происходит замер количества входов в прерывание по изменению состояния порта детектора вызова (GP4):
BCF GPIO,5 ; отключаем ТА секретаря
BCF GPIO,0 ; отключаем ТА директора
CALL ANALIZ ; проверяем наличие на линии звонка
MOVF RING,W
SUBLW .20 ; вычитаем W из константы
BTFSS STATUS, C ; если результат <0...
GOTO RING_ ; переходим на обработку звонка
Если звонок не был определен, происходит опрос датчиков состояния трубок телефонов директора и секретаря. При обнаружении поднятия трубки на ТА директора или секретаря происходит переход на блок обработки этих режимов. Если не было зафиксировано снятия трубок ни с ТА секретаря, ни с ТА директора, программа переходит на начальную точку работы:
BTFSS GPIO,1 ; "0" - трубка ТА директора снята
GOTO DIR
BTFSS GPIO,3 ; "0" - трубка ТА секретаря снята
GOTO SEK
GOTO START_
В подпрограмме ANALIZ происходит определение числа входов в прерывание от GP4 в течение 100 мс. Здесь очищается счетчик прерываний RING и разрешается прерывание от GP4. Далее следуют вложенные циклы общей длительностью 100 мс:
ANALIZ
;***ОПРЕДЕЛЕНИЕ НА ЛИНИИ ЗВОНКА В ТЕЧЕНИЕ 100 мс*****
CLRF RING
BSF STATUS, RP0 ; банк 1
BSF IOCB,4 ; вкл. прерывание от GP4 (наблюдаем за линией)
BCF STATUS, RP0 ; банк 0
MOVLW .200
MOVWF TEMP1
MOVLW .170
MOVWF TEMP2
DECFSZ TEMP2
GOTO $-1
DECFSZ TEMP1
GOTO $-5
BSF STATUS, RP0 ; банк 1
BCF IOCB,4 ; выкл. прерывание от GP4
BCF STATUS, RP0 ; банк 0
;******************************************
RETURN
В блоке работы с телефоном директора происходит отключение ТА секретаря, разрешение прерывания от GP1 (датчик состояния трубки ТА директора) и уход в сон. При возникновении прерывания от GP1 выполняется выход из сна, отработка прерывания и цикл задержки на 100 мс (PAUSE). По истечении этого времени проверяется состояние GP1: если шлейф ТА окажется замкнут (лог. «0»), что будет соответствовать импульсному набору номера, произойдет переход в начало блока DIR. Если же шлейф окажется разорван, можно считать, что директор положил трубку, и произойдет переход на исходную точку всей программы (START_):
;*******ОБРАБОТКА ИМПУЛЬСНОГО НАБОРА********
;**********ПРИЕМ ВХОДЯЩЕГО ВАЗОВА***********
;**************ТА ДИРЕКТОР******************
DIR:
BCF GPIO,5 ; отключаем ТА секретаря
BSF STATUS, RP0 ; банк 1
MOVLW B'00000010' ; вкл. прерывание от GP1
MOVWF IOCB
BCF STATUS, RP0 ; банк 0
;******************ОЖИДАНИЕ******************
SLEEP
NOP
;*************ИЗМЕНЕНИЕ НА ДАТЧИКАХ***********
BSF STATUS, RP0 ; банк 1
CLRF IOCB ; выкл. прерывания
BCF STATUS, RP0 ; банк 0
CALL PAUSE
BTFSS GPIO,1 ; "0" - трубка ТА директора снята
GOTO $-.11
GOTO START_
Блок работы с телефоном секретаря состоит из двух частей. В первом блоке происходит 5-секундная задержка перед включением ТА директора. Эта задержка необходима для возможности импульсного набора номера ТА секретаря (чтобы в этот момент линия не шунтировалась аппаратом директора, если он поднимет трубку во время набора). При обнаружении импульсного набора (аналогично описанному выше алгоритму) выдержка паузы увеличится еще на 5 с. Если секретарь уложит трубку, программа перейдет на начальную точку работы (START_):
;*******ОБРАБОТКА ИМПУЛЬСНОГО НАБОРА********
;**************ТА СЕКРЕТАРЬ*****************
SEK:
BCF GPIO,0 ; отключаем ТА директора
MOVLW .16
MOVWF TEMP1
MOVLW .255
MOVWF TEMP2
MOVLW .255
MOVWF TEMP3
BTFSC GPIO,3 ; "1" - трубка ТА секретаря уложена
GOTO $+.8
DECFSZ TEMP3
GOTO $-.3
DECFSZ TEMP2
GOTO $-.7
DECFSZ TEMP1
GOTO $-.11
GOTO $+.6
CALL PAUSE
BTFSC GPIO,3 ; "1" - трубка ТА секретаря уложена
GOTO START_
BTFSS GPIO,3 ; "0" - трубка ТА секретаря поднята
GOTO SEK
По истечении 5 с импульсного набора после последней набранной цифры следует второй блок работы с ТА секретаря: включается ТА директора и разрешается прерывание от детекторов поднятия трубок обоих телефонов. Далее, при возникновении прерывания, определяется его источник. Если один из абонентов уложил трубку на ТА, происходит переход на начальную точку программы. В противном случае можно считать, что оба абонента находятся на линии. Далее формируется цикл общей длительностью 10 с, в котором поочередно опрашиваются детекторы состояния трубок ТА директора и секретаря. При обнаружении лог. «1» на одном из детекторов (один из абонентов положил трубку), происходит переход на начальную точку программы. Если же по истечении 10 с оба абонента остаются на линии, происходит принудительное отключение ТА секретаря и переход на начальную точку программы (START_):
;**********ПРИЕМ ВХОДЯЩЕГО ВЫЗОВА***********
;**************ТА СЕКРЕТАРЬ*****************
SEK_:
BSF GPIO,0 ; включаем ТА директора
BSF STATUS, RP0 ; банк 1
MOVLW B'00001010' ; вкл. прерывание от GP1, GP3
MOVWF IOCB
BCF STATUS, RP0 ; банк 0
;******************ОЖИДАНИЕ******************
SLEEP
NOP
;*************ИЗМЕНЕНИЕ НА ДАТЧИКАХ***********
BSF STATUS, RP0 ; банк 1
CLRF IOCB ; выкл. прерывания
BCF STATUS, RP0 ; банк 0
CALL PAUSE
BTFSC GPIO,3 ; "1" - трубка ТА секретаря уложена
GOTO START_
BTFSC GPIO,1 ; "1" - трубка ТА директора уложена
GOTO SEK_
;******* ДИРЕКТОР И СЕКРЕТАТЬ НА ЛИНИИ ********
MOVLW .23
MOVWF TEMP1
MOVLW .255
MOVWF TEMP2
MOVLW .255
MOVWF TEMP3
BTFSC GPIO,3 ; "1" - трубка ТА секретаря уложена
GOTO START_
BTFSC GPIO,1 ; "1" - трубка ТА директора уложена
GOTO SEK_
DECFSZ TEMP3
GOTO $-.5
DECFSZ TEMP2
GOTO $-.9
DECFSZ TEMP1
GOTO $-.13
BCF GPIO,5 ; отключаем ТА секретаря
GOTO START_
В блоке обработки вызова производятся селекция вызывных посылок, их подсчет и включение (либо отключение) ТА для приема вызова. Изначально включен ТА секретаря и отключен ТА директора. Включение и отключение производятся при нулевом значении счетчика TEMP4 (проверяется через STATUS, Z). Распознавание вызывной посылки происходит в уже описанной подпрограмме ANALIZ с вычитанием полученного значения RING из константы. При успешном результате (посылка вызова опознана) происходит возврат на подпрограмму ANALIZ, и так повторяется до тех пор, пока вызывная посылка не прекратится. После чего произойдет декремент счетчика TEMP4 (при достижении нулевого результата дальнейшее декрементирование будет запрещено) и переход на цикл ожидания вызова длительностью 5 с. В этом цикле происходит ожидание поступления вызывной посылки (также через подпрограмму ANALIZ). Аналогичным образом здесь поочередно опрашиваются детекторы поднятия трубки обоих аппаратов на предмет наличия лог. «0» (трубка поднята). При обнаружении поднятия трубки происходит переход на блок обработки соответствующего абонента (DIR либо SEK_). Если вызывная посылка не придет в течение 5 с, программа возвращается в начальную точку (START_), в противном случае произойдет переход на участок, в котором при обнулении TEMP4 ТА секретаря будет отключен, а ТА директора включен. Далее снова повторяются циклы обработки вызывной посылки, паузы и т. д.:
;*************ОБРАБОТКА ЗВОНКА ***********
RING_:
MOVLW .3
MOVWF TEMP4
;ОЖИДАНИЕ ПОДНЯТИЯ ТРУБКИ В ТЕЧЕНИЕ ЗВОНКА
;ВКЛЮЧЕНИЕ ТА ДИРЕКТОРА ПОСЛЕ 3-х ПОСЫЛОК ВЫЗОВА
BCF GPIO,0 ; отключаем ТА директора
BSF GPIO,5 ; включаем ТА секретаря
MOVF TEMP4,W
BTFSC STATUS, Z ; =0...
BSF GPIO,0 ; включаем ТА директора
MOVF TEMP4,W
BTFSC STATUS, Z ; =0...
BCF GPIO,5 ; отключаем ТА секретаря
CALL ANALIZ
MOVF RING,W
SUBLW .20 ; вычитаем W из константы
BTFSS STATUS, C ; если результат <0...т.е. звонок определен
GOTO $-4 ; ожидание окончания звонка
MOVF TEMP4,W
BTFSC STATUS, Z ; =0...
GOTO $+2 ; ЗАПРЕЩАЕМ ВЫЧИТАНИЕ TEMP4
DECF TEMP4
;*******ОЖИДАНИЕ ЗВОНКА В ТЕЧЕНИЕ 5 С********
MOVLW .50
MOVWF TEMP5
CALL ANALIZ
MOVF RING,W
SUBLW .20 ; вычитаем W из константы
BTFSS STATUS, C ; если результат <0...т.е. звонок определен
GOTO $-.21
BTFSS GPIO,1 ; "0" - трубка ТА директора снята
GOTO DIR
BTFSS GPIO,3 ; "0" - трубка ТА секретаря снята
GOTO SEK_
DECFSZ TEMP5
GOTO $-.10
GOTO START_
Несмотря на бурное развитие сотовых технологий, домашний телефон и по сей день остается надежным и сравнительно дешевым средством связи. Одно только «но» – установить его себе домой или в организацию остается большой проблемой. И дело тут не в отсутствии номерных емкостей на современных электронных АТС, а в нехватке абонентских линий. Потому то, наверное, и сегодня все еще можно встретить сблокированные абонентские линии, имеющие два разных номера, но подключенные к одной и той же телефонной паре.
Следующее устройство, собранное по той же схеме, что и предыдущее, но имеющее другую программную «начинку», способно сделать из одного телефона два.
Устройство позволяет двум абонентам, подключенным к одному и тому же телефонному номеру осуществлять исходящие и принимать входящие звонки с сохранением конфиденциальности разговора.
При исходящей связи приставка работает как простой блокиратор спаренных телефонов, а при входящей селекция вызова производилась по принципу «набрал, дождался первого гудка, сбросил и снова набрал».
Начальная часть программы аналогична описанной выше программе для приставки «Директор-секретарь». Отличия заключаются в блоке обработки входящих и исходящих вызовов на телефон секретаря «SEK», а так же в блоке обработки входящего вызова «RING». Поскольку в данном устройстве абоненты не имеют никаких приоритетов друг перед другом, связь организуется по принципу «кто первым снял трубку, тот и получил возможность соединения»: блоки работы с ТА директора и ТА секретаря аналогичны и соответствуют описанному выше блоку «DIR».
Блок обработки входящего вызова «RING» работает следующим образом. При поступлении первой посылки вызова оба аппарата будут отключены от линии. При поступлении второй посылки вызова в течение 5 с после окончания первой к линии будет подключен ТА директора, который начнет принимать входящий вызов. Данный процесс изображен на Рисунке 9.
![]() |
Рисунок 9. |
При поступлении второй вызывной посылки с интервалом более 5 с после первой, в течение 10 с, что эквивалентно отбою и повторному вызову, к линии будет подключен ТА секретаря, который начнет принимать входящий вызов (Рисунок 10).
![]() |
Рисунок 10. |
Блок обработки звонка состоит из двух подболоков. В первом подблоке происходит отключение телефонов обоих абонентов, ожидается окончание первой посылки вызова, выдерживается пауза в 5 с для определения появления (или отсутствия) очередной посылки вызова в течение этого времени, и тут же проверяется занятие линии телефоном директора. Если занятие произошло, программа переходит на блок работы с ТА директора (DIR). При появлении посылки вызова в течение 5 с после окончания первой к линии подключается телефон директора, программа переходит в точку ожидания окончания посылки и т. д. По приходу второй посылки вызова телефон директора подключается к линии и начинает звонить. По окончании вызова, если абонент не ответил, или вызывающий абонент прервал звонок после второй (либо последующей) посылки вызова, происходит опрос состояния выходного порта , нагруженного на ключ ТА директора
. Если выходной порт (GPIO,0) находится в состоянии лог. «1», т.е. телефон директора уже подключен к линии, программа переходит на начальную точку работы:
;*************ОБРАБОТКА ЗВОНКА ***********
RING_:
BCF GPIO,0 ; отключаем ТА директора
BCF GPIO,5 ; отключаем ТА секретаря
;**********ПЕРВАЯ ПОСЫЛКА ВЫЗОВА*********
CALL ANALIZ
MOVF RING,W
SUBLW .20 ; вычитаем W из константы
BTFSS STATUS, C ; если результат <0...т.е. звонок определен
GOTO $-4 ; ожидание окончания звонка
;*******ОЖИДАНИЕ ЗВОНКА В ТЕЧЕНИЕ 5 с********
MOVLW .50
MOVWF TEMP5
CALL ANALIZ
MOVF RING,W
SUBLW .20 ; вычитаем W из константы
BTFSS STATUS, C ; если результат <0...т.е. звонок определен
GOTO $+.6
BTFSS GPIO,1 ; "0" - трубка ТА директора снята
GOTO DIR
DECFSZ TEMP5
GOTO $-.8
GOTO $+3
BSF GPIO,0 ; включаем ТА директора
GOTO $-.18
BTFSC GPIO,0 ; если ТА директора включен
GOTO START_
GOTO $+.18
Если же звонок был прерван после первой посылки вызова (что соответствует алгоритму дозвона до секретаря) – телефон директора еще не подключен к линии, то есть, выходной порт (GPIO,0) находится в состоянии лог. «0», – выполняется переход на второй подблок, в котором происходит ожидание посылки вызова в течение 10 с. Если за это время посылка вызова не придет, программа перейдет на начальную точку работы. В противном случае к линии будет подключен ТА секретаря, который начнет принимать вызов. Далее, как и в предыдущем подблоке, после окончания вызывной посылки выдерживается 5-секундная пауза, где проверяется занятие линии телефоном секретаря. При появлении посылки в интервале этого времени процесс повторяется. При его отсутствии программа перейдет на начальную точку:
;**********ПОСЫЛКА ВЫЗОВА*********
;***********ПОСЛЕ ПАУЗЫ***********
CALL ANALIZ
MOVF RING,W
SUBLW .20 ; вычитаем W из константы
BTFSS STATUS, C ; если результат <0...т.е. звонок определен
GOTO $-4 ; ожидание окончания звонка
;*******ОЖИДАНИЕ ЗВОНКА В ТЕЧЕНИЕ 5 с********
MOVLW .50
MOVWF TEMP5
CALL ANALIZ
MOVF RING,W
SUBLW .20 ; вычитаем W из константы
BTFSS STATUS, C ; если результат <0...т.е. звонок определен
GOTO $-.11 ;
BTFSS GPIO,3 ; "0" - трубка ТА секретаря снята
GOTO SEK
DECFSZ TEMP5
GOTO $-.8
GOTO START_
;*******ОЖИДАНИЕ ЗВОНКА В ТЕЧЕНИЕ 10 с********
MOVLW .100
MOVWF TEMP5
CALL ANALIZ
MOVF RING,W
SUBLW .20 ; вычитаем W из константы
BTFSS STATUS,C ; если результат <0...т.е. звонок определен
GOTO $+.4
DECFSZ TEMP5
GOTO $-.6
GOTO START_
BSF GPIO,5 ; включаем ТА секретаря
GOTO $-.28