На склад поступили жидко-кристаллические индикаторы и дисплеи от KSE

Приставки директор-секретарь и разветвитель линии 1х2. Часть 2

Журнал РАДИОЛОЦМАН, апрель 2016

Витушкин Д. Ф., Узбекистан, Ташкент

Часть 1

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Переходим к программному оформлению устройств.

Микроконтроллер сконфигурирован для работы от внутреннего тактового генератора с прерываниями от портов 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.

Приставки директор-секретарь и разветвитель линии 1х2
Рисунок 9.

При поступлении второй вызывной посылки с интервалом более 5 с после первой, в течение 10 с, что эквивалентно отбою и повторному вызову, к линии будет подключен ТА секретаря, который начнет принимать входящий вызов (Рисунок 10).

Приставки директор-секретарь и разветвитель линии 1х2
Рисунок 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

Загрузки

Электронные компоненты. Бесплатная доставка по России
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя