Муфты электромонтажные от производителя Fucon

Приставка для обратной переадресации входящего звонка

Microchip PIC12F629

Журнал РАДИОЛОЦМАН, декабрь 2015

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

Приставка для обратной переадресации входящего звонка

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

Спорить с тем фактом, что мобильная связь все больше вытесняет обычную проводную фиксированную телефонию, сложно. Однако цены на исходящие звонки с сотовых телефонов неоправданно завышены. И многие абоненты, имеющие возможность воспользоваться проводным телефоном, часто перезванивают на мобильные своим друзьям и знакомым с целью экономии. Недаром в народе появилась фраза «Скинуть гудок». Это делается в том случае, когда у абонента недостаточно средств на счете, и он хочет поговорить за счет входящего звонка. У меня появилась идея «автоматизировать» эту процедуру за счет применения небольшой приставки, подключаемой параллельно телефонному аппарату. Основой приставки, схема которой приведена на Рисунке 1, послужил микроконтроллер младшего семейства MicrochipPIC12F629.

Устройство работает по принципу: позвонил, дождался первого гудка и сбросил. При поступлении такого входящего вызова контроллер устройства начинает набирать в линию заранее запрограммированный номер и затем выдает в линию сигнал, имитирующий вызывные гудки частотой 425 Гц длительностью 1 с и интервалом повторения 4 с. Одновременно с этим приставка информирует о вызове сигналом пьезоизлучателя. Абонент мобильного телефона, ответивший на вызов, слышит у себя в трубке сигнал КПВ (контроль посылки в линию) и ожидает ответа абонента стационарного телефона, который, услышав сигнал приставки, снимает трубку с аппарата, после чего происходит соединение.

Приставка для обратной переадресации входящего звонка
Рисунок 1.

Устройство питается от гальванического элемента G1, в качестве которого можно использовать три таблеточные батарейки LR44 (AG3 BUTTON CELL) либо малогабаритный аккумулятор на напряжение 3 … 5 В. В дежурном режиме аккумулятор подзаряжается малым током (порядка 50 мкА) от параметрического стабилизатора на диоде VD5, резисторе R1, стабилитроне VD6 и емкости C2. Ключ D2 подключает нагрузочный резистор к линии. Порты контроллера GP4 и GP5 формируют DTMF посылки для набора номера в линию и сигнал КПВ (только GP4). Эти сигналы суммируются на резисторах R7, R8 и подаются на базу транзистора VT1, на котором дополнительно усиливаются и подаются в линию. На делителе из резисторов R2, R3 и стабилитрона VD7 построен детектор состояния линии. В его функции входит отслеживание линии на предмет ее занятости и наличия на ней частоты вызывного сигнала. Делитель настраивается таким образом, чтобы при занятии линии телефонным аппаратом (параллельно с приставкой) падение напряжение в его средней точке было равно уровню «лог. 0» микроконтроллера.

После диодного моста форма вызывного сигнала несколько меняется и приобретает вид, показанный на Рисунке 2.

Приставка для обратной переадресации входящего звонка
Рисунок 2.

Если анализировать наличие звонка по сигналу с делителя напряжения линии, можно увидеть, что полный период колебания 25 Гц четыре раза проходит через линию отсечки делителя. Таким образом, в течение 100 мс анализа состояния линии при наличии в ней звонкового тока будет зарегистрировано (100/40)×4 = 10 переходов или, при реализации прерывания, 10 прерываний (Рисунок 3). Это и будет являться признаком того, что по линии передается сигнал вызова.

Приставка для обратной переадресации входящего звонка
Рисунок 3.

Основную часть времени микроконтроллер приставки находится в режиме сна. При изменении напряжения в линии контроллер просыпается по прерыванию от порта, то есть, по изменению уровня напряжения на детекторе состояния линии, и производит опрос линии в течение 100 мс для определения звонка. Если звонок в линии обнаружен, то приставка проверяет выдержку паузы между первой и второй посылкой вызова. Если вторая посылка вызова придет менее чем через 5 с после первой, звонок игнорируется, и приставка никак себя не проявляет. Если же после первой посылки вызова в течение 5 с не было зафиксировано повторения звонка, приставка занимает линию и производит набор номера тональным способом. Через 3 с она начинает посылать в линию имитацию сигналов КПВ, а также звуковой сигнал в пьезоизлучатель. При этом отслеживается состояние линии на предмет подъема трубки на параллельном аппарате. Если подъем трубки произошел, приставка прекращает подачу сигналов и освобождает линию. Если трубку никто не поднял, приставка продолжает оповещать абонентов в течение 30 с, после чего уходит в отбой. По окончании разговора напряжение на линии восстанавливается. Приставка вновь производит опрос для обнаружения звонка, проверяет состояние линии и, если звонок не обнаружен, уходит в отбой…

О программе

Микроконтроллер синхронизируется внутренним тактовым генератором. Реализованы три прерывания, которые используются по мере необходимости: от двух таймеров TMR0 и TMR1 и от порта GP0 – детектора состояния линии. Бóльшую часть времени контроллер находится в спящем режиме и просыпается при изменении состояния линии. Наличие звонка в линии определяется программно. Как было описано выше, производится замер прерываний в течение 100 мс. По количеству определенных переходов можно судить о наличии в линии звонка или его отсутствии.

Для разрешения прерываний от таймеров и от периферии необходимо настроить регистр INTCON. Это можно сделать сразу в подпрограмме инициализации:

movlw B'10001000' movwf INTCON ; разр. прер. по переполн. таймера TMR0

Здесь установлен бит разрешения глобальных прерываний, прерывания от таймера TMR0 и прерываний от портов. В прерываниях от таймера TMR1 используется регистр PIE1.

movlw B'00000001' movwf PIE1 ; разр. прер. по переполн. таймера TMR1

Непосредственно разрешить прерывания от конкретного порта можно в регистре IOCB. При этом нужно помнить, что IOCB находится в первом банке памяти! Это удобно делать в подпрограмме:

ANALIZ
*** ОПРЕДЕЛЕНИЕ НА ЛИНИИ ЗВОНКА В ТЕЧЕНИЕ 100 мс ***
clrf RING
bsf STATUS, RP0 ; банк 1
bsf IOCB,0 ; вкл. прерывание от GP0 (наблюдаем за линией)
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,0 ; выкл. прерывание от GP0
bcf STATUS, RP0 ; банк 0

Данная подпрограмма разрешает прерывания от порта GP0, задерживая выполнение на время порядка 100 мс. Для реализации задержки используются вложенные циклы.

Обработку прерываний от таймеров можно продемонстрировать следующей подпрограммой:

; ФОРМИРОВАНИЕ СИГНАЛА "7" 852 Гц х 1209 Гц
N_7
movlw .90
movwf TEMPL
movwf TMR0
movlw .146
movwf TEMPH
movwf TMR1L
movlw .255
movwf TMR1H
bcf INTCON,2
bcf PIR1,0
bsf INTCON,5
bsf INTCON,6
call ZAD
return

Биты INTCON,5 и INTCON,6 разрешают прерывания от таймеров, а биты INTCON,2 и PIR1,0 являются флагами прерываний от этих таймеров. При обработке прерываний они должны быть сброшены программно.

При обнаружении прерывания производится вход в подпрограмму обработки прерываний. Поскольку подпрограмма обрабатывает все прерывания (и от таймеров, и от портов), необходимо дополнительно опросить служебные регистры для определения конкретного источника. Первым делом необходимо сохранить контекст при выходе из прерывания, то есть значения регистров W и STATUS.

Если определено прерывание от порта, то необходимо прочитать порт, чтобы исключить несоответствие и сбросить флаг прерывания:

; ВХОД В ПРЕРЫВАНИЕ ОТ ПОРТА GP3 И ПО ПЕРЕПОЛНЕНИЮ ТАЙМЕРОВ
PER
movwf W_TEMP ; сохраняем значение W и STATUS
swapf STATUS,W
movwf STATUS_TEMP
btfsc INTCON,0 ; если прерывание от порта
goto WWWW
btfsc PIR1,0
goto WWW
bcf INTCON,2
btfsc PIR1,0
bcf PIR1,0
movfw TEMPL
movwf TMR0
btfss GPIO,4 ; если порт в "0"
goto $+2
goto $+3
bsf GPIO,4 ; уст. в "1"
goto $+2
bcf GPIO,4 ; уст. в "0"
goto WWWWW
WWW
bcf PIR1,0
btfsc INTCON,2
bcf INTCON,2
movfw TEMPH
movwf TMR1L
movlw .255
movwf TMR1H
btfss GPIO,5 ; если порт в "0"
goto $+2
goto $+3
bsf GPIO,5 ; уст. в "1"
goto $+2
bcf GPIO,5 ; уст. в "0"
goto $+4
WWWW
movf GPIO,0
bcf INTCON,0 ; сбросим флаг прерывания от портов
incf RING
btfsc FLAG,0 ; если "1"
goto START1 ; трубка была снята, уходим в отбой
WWWWW
swapf STATUS_TEMP,W ; восстанавливаем значение W и STATUS
movwf STATUS
swapf W_TEMP,F
swapf W_TEMP,W
retfie

В этой подпрограмме также по разрешению нулевого бита регистра FLAG происходит принудительный переход в начальную точку программы.

Переменная RING – счетчик числа входов в прерывания, по ее значению определяется наличие либо отсутствие в линии звонка:

movf RING,W
sublw .7 ; вычитаем W из константы
btfss STATUS, C ; если результат <0
goto $+6 ; переходим на обработку звонка

Простая операция вычитания значения RING из константы 7 изменяет (или не изменяет) бит «С» регистра STATUS, после проверки которого осуществляется переход на ту или иную подпрограмму. В данном случае, при наличии в линии звонка после вычитания из числа 7 значения RING, примерно равного 10, получаем отрицательный результат, который обращает бит «С» в нуль.

Подпрограмма для определения длительности звонковых посылок выглядит следующим образом:

; *************** ПАУЗА В 5 СЕКУНД ***************
; В ТЕЧЕНИЕ ЭТОГО ВРЕМЕНИ ЗВОНКА БЫТЬ НЕ ДОЛЖНО
movlw .50
movwf TEMP3
call ANALIZ
movf RING,W
sublw .7 ; вычитаем W из константы
btfss STATUS, C ; если результат <0...т.е. звонок определен
goto IGNOR ; игнорируем звонок
decfsz TEMP3
goto $-.6
goto OTVET ; звоним обратно

Здесь организован цикл общей длительностью 5 с, внутри которого осуществляется вызов подпрограммы ANALIZ, с периодичностью в 100 мс опрашивающей линию для выявления наличия вызывного сигнала. Далее определяем ее наличие или отсутствие простым математическим действием (через STATUS). При этом если появление звонка произойдет внутри цикла (то есть, до истечения 5 с), производится переход на подпрограмму игнорирования. Если звонок не был обнаружен в течение всего цикла выполнения подпрограммы, происходит переход на подпрограмму ответного вызова. Ответный вызов происходит из следующего блока:

OTVET:
call NABOR
bsf FLAG,0 ; уст. признак ожидания снятия трубки
bsf STATUS, RP0 ; банк 1
bsf IOCB,0 ; вкл. прерывание от (GP0)
bcf STATUS, RP0 ; банк 0
call SOUND
bsf STATUS, RP0 ; банк 1
bcf IOCB,0 ; выкл. прерывание от (GP0)
bcf STATUS, RP0 ; банк 0
goto START1

Вначале следует подпрограмма набора номера в линию:

; НАБОР НОМЕРА
NABOR
bsf GPIO,2 ; занять линию
call ZAD
call ZAD
call N_7
call N_7
call N_7
call N_7
call N_7
call N_7
call N_7
return

Здесь происходит обращение к подпрограмме формирования двухчастотной посылки стандарта DTMF. В ознакомительной версии программы реализован набор только одной цифры – «7».

Далее программа устанавливает сигнальный бит в регистре FLAG (этим она дает возможность выхода из прерывания при занятии линии параллельным аппаратом при ответе), разрешает прерывания от порта и начинает генерировать сигналы в линию и пьезоизлучатель. Формирование частот для линии и пьезозлучателя реализовано без использования прерываний простыми вложенными циклами. Например:

; ФОРМИРОВАНИЕ СИГНАЛА "КПВ" 425 Гц длительностью 1 с
KPV
movlw 9 ; Длительность тона
movwf TEMP2 ;
movlw .100 ;
movwf TEMP3 ; 1 секунда
movlw .34 ; Длительность полупериода
movwf TEMP
movlw .10
movwf TEMP1
decfsz TEMP1
goto $-1
decfsz TEMP ; 1.168 миллисекунды
goto $-5
btfss GPIO,4 ; ЕСЛИ ПОРТ В "0"
goto $+2
goto $+3
bsf GPIO,4 ; УСТ. В "1"
goto $+2
bcf GPIO,4 ; УСТ. В "0"
decfsz TEMP3
goto $-.15
decfsz TEMP2
goto $-.19
bcf GPIO,4 ; уст. в "0"
return

Внутренним циклом формируется время одного полупериода рабочей частоты, внешними циклами – длительность сигнала. Аналогично задаются паузы для временных интервалов между сигналами:

; **************** ПАУЗА - 3 с ****************
PAUSE_3:
movlw .75
movwf TEMP
movlw .100
movwf TEMP1
movlw .130
movwf TEMP2
decfsz TEMP2
goto $-1
decfsz TEMP1
goto $-5
decfsz TEMP
goto $-.9
return

В заключение необходимо отметить, что для подключения подобных устройств к сетям ГТС требуется их обязательная сертификация. Поэтому материал предоставлен исключительно в ознакомительных целях.

Загрузки

  1. Исходный текст программы для приставки в MPLAB. Вариант для тонального набора
  2. Прошивка в формате hex. Вариант для тонального набора

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

Одиннадцатизначный номер, включая префикс выхода на межгород, код города и семизначный номер (например, 0-591-1343940), записывается, начиная с ячейки 0000h по 000Ah, включительно. Если необходимо внести, например, семизначный номер, его следует записывать в память, начиная с ячейки 0000h.

  1. Исходный текст программы для приставки в MPLAB. Вариант для импульсного набора
  2. Прошивка в формате hex. Вариант для импульсного набора
67 предложений от 34 поставщиков
Микропроцессор PIC, Ядро 8bit, 1.75K-Flash 64B-SRAM 128B-EPROM, 20MHz, 2.0V…5.5V, -40°C…85°CМикроконтроллеры PIC (Peripheral Interface Controller) - это программируемые ППЗУ, имеют малое энергопотребление,...
T-electron
Россия и страны СНГ
PIC12F629-I/P
1.04 ₽
ЗУМ-СМД
Россия
PIC12F629T-I/SN
Microchip
19 ₽
СЭлКом
Россия и страны СНГ
PIC12F629-I/P
Microchip
от 175 ₽
ТаймЧипс
Россия
PIC12F629-I/SNMIC
Microchip
по запросу
Электронные компоненты. Бесплатная доставка по России
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя
Фрагменты обсуждения:Полный вариант обсуждения »
  • Такой девайс может быть полезен, скажем в службе такси. Хотя стационарные телефоны все реже и реже используются. Еще плюс прибора, что нет внешнего питания. Лет 10 назад я себе подобную штуку делал. Только на AVR контроллере и телефоне Сименсе 55. Тогда это вещь была, а через пару лет никому не нужная ерунда, так как появились новые доступные девайсы