Статья №16

 

     Эта  статья  является  как  бы  обобщающей, то  есть  в  ней  подведены  итоги  по  возможностям  применения  Bascom  в  реальных  конструкциях.
     В  данной  статье  мы  опять  коснёмся  следующих  тем  при  программировании  в  среде  Bascom   микроконтроллеров  AVR:
-  Внешнее  прерывание  по  INT0;                                                                                              
- Механизм  антидребезга;                                                                                                           
- Работа  с  постоянной  памятью  EEPROM;                                                                             
- Работа  и  прерывание  Timer1 по  совпадению. 

     Устройство, на  примере  которого  будут  рассмотрены  вышеуказанные  вопросы, называется  «тревожная  кнопка». Оно  представляет  из  себя  прибор, который,  будучи  соединённым  с  телефонной  линией,  при  нажатии  кнопки  посылает  вызов  на  определённый  телефон. 
     В  принципе  данное  устройство  представляет  из  себя  усечённый  телефон  без  разговорной  части  и  с  возможностью  набора  только  одного  номера.
     Набор  номера  в  отличии  от  «тревожной  кнопки» ,описанной  в  статье  №13,  происходит  посредством  амплитудной  модуляции  телефонной  линии.
     Cледует  отметить, что  к  устройствам  для  набора  номера  (номеронабирателям)  предъявляются  довольно  жёсткие  требования. Это  связано  со  спецификой  используемых  в  данном  регионе  автоматических  телефонных  станций  (АТС), в  том  числе  и  устаревших  моделей  типа  АТС-54, АТСК  и.т.д.:
- частота  создаваемых  импульсов  должна  находиться  в  пределах   10+/- 1 Гц;                                                                                                                              
-  период  повторения  95 -105 мс;                                                                                              
- межсерийная  пауза   не  менее  640 мс;                                                                                
- отношение  времени  замыкания  к  времени  замыкания  импульсного  ключа  (отношение  длительности  сигнала  лог.1  к  лог.0)  не  должно  выходить  за  пределы  1,3 – 1,9.
     При  снятии  трубки  питание  на  линии  абонента  падает  с  60  до  5 -15 Вольт. При  этом  сопротивление   телефонного  аппарата  (ТА)  при  рабочем  токе  35 мА  должно  составлять  150 – 600 Ом. Сопротивление  линии  при  замкнутом  импульсном  ключе  номеронабирателя  должно  быть  <= 50 Ом.
     На  Рис.1a  представлена  временная  диаграмма  работы  кнопочного  номеронабирателя  при  наборе  цифры  «5».
 
    
 
Рис.
1- Диаграммы сигналов
 
Из  неё  видно, что  при  снятии  трубки  напряжение  на  линии  падает, затем  при  наборе  номера  речевой  ключ  (РК)  отключается, и  модуляция  импульсов  происходит  от  нуля  Вольт. Отсутствие  «чистого  нуля»  в  этом  случае  иногда  приводит  к  сбоям  в  работе  и  неправильному  соединению особенно, если  на  линии  связи  используется  устаревшая   отечественная  АТС, речь  о  которых  шла  выше. После  окончания  набора  цифры  номера  ключ  РК  включается  вновь.
      На  Рис.2  представлена  схема  «тревожной  кнопки», которая  содержит  микроконтроллер  ATtiny2313. Контроллер  через  порт  RS-232, состоящий  из  конвертера уровня  напряжения  DD3  (MAX3232)  и  разъёма  DB-9F, может  быть  подключён  к  COM  порту  персонального  компьютера  (если  COM  порт  отсутствует  на  вашем  компьютере, то  необходимо  использовать  переходник  USB – RS-232).  С  помощью  терминала  Bascom  вы  сможете  запрограммировать  «тревожную  кнопку»  на  передачу  определенного  телефонного  номера.
 
 Рис.2 - Схема тревожной кнопки
 
     Цепь  сброса  микроконтроллера  при  включении   питания  образована  резистором  R2  и  конденсатором  С7.  Питание  устройства  осуществляется  с  телефонной  линии  через  диодный  мост  VD1 – VD4  и  источник  тока, созданного  на  одном  из  полевых  транзисторов  сборки  DA2  (IRF7103), резисторе  R10  и  диоде  VD5. Подобные  источники  тока  нашли  широкое  применение  как  в  отечественных,  так  и  зарубежных  ТА. Напряжение  питания  стабилизируется  стабилитроном  VS1 (КС147В)  в  пределах  4,7 – 5В и сглаживается  электролитическим  конденсатором  СЕ1  (100,0 х 16В)  во  время  модуляции  телефонной  линии. Следует  отметить, что данное  устройство  имеет  и  резервный  источник  питания  для  увеличения  надёжности  срабатывания.
     Импульсный  ключ  собран  на  спаренных  полевых  транзисторах  сборки  DA1  (IRF7103), к  истоку  которых  подключён  резистор  R8  (33 Ом)  (другой  конец  резистора  подключён  к  GND), и  который  служит  для  защиты  ИК  от  перегрузки  по  току.
     Разговорный  ключ, имитирующий  снятие  телефонной  трубки,  выполнен  на  втором  полевом  транзисторе  сборки  DA2  (IRF7103)  и  нагружен  на  резистор  R11  (300 Ом).  Данный  резистор  имитирует  сопротивление разговорного  узла  ТА.
     Устройство  работает  следующим  образом. В  дежурном  режиме  микроконтроллер  (DD1)  находится  в  спящем  режиме  (Sleep)  и  имеет  минимальное  потребление  энергии. При  нажатии  кнопки  «тревога»  (S2)  на  выводе  INT0  (PORTB.2)  происходит  перепад  напряжения, который  вызывает  прерывание  и  выводит  контролер  в  активный  режим. 
     Работа  «тревожной  кнопки»  происходит  согласно  диаграммам  Рис.1.  Передача  номера  происходит  четыре  раза  с  интервалом  5  секунд. Далее  устройство  снова  переходит  в  спящий  режим.
     Поскольку  спящий  режим  микроконтроллера – Idle  (а  не  Powerdown) ,  то  внешние  прерывания, UART  и  прерывания  по  таймеру  счётчику  продолжают  работать. Поэтому  прерывание  по  приёму  также  выводит  контроллер  из  режима  Sleep. Это  позволяет  задавать  телефонный  номер  с  терминала  Bascom,  используя  функцию  «Эхо». 
     В  начале  необходимо  задать  количество  цифр  в  номере:

“Enter  sum.  DATA  NUMBER”…

     Далее  последовательно  вводится  каждая  цифра  номера  после  надписей:

“WRITE  NUMBER:” (такой – то)                                                                                        
“Enter  NUMBER =”…

     Следует  отметить, что  максимальное  количество  цифр  номера, заложенное  в  программе  равно  11, однако  это  значение  всегда  можно  легко  изменить.
     Программа  устройства  «тревожная  кнопка»   состоит  из  основного  цикла, в  котором  проверяется  бит  «С». Если  он  равен  0, то  микроконтроллер  переходит  в  спящий  режим – Idle. Если  С=1, то программа  переходит  к  передаче  телефонного  номера. 
     Значение  С=1  задаётся  при  обработке  внешнего  прерывания  INT0  (Achtung).
     Модуляция  телефонной  линии  осуществляется  с  помощью  работы  Timer1, который  сконфигурирован  следующим  образом:

Config  Timer1 = Timer, Prescale = 1024, Compare A = Toggle, Clear  Timer = 1

     Данная  конфигурация  таймера – счётчика  была   описана  в  предыдущей  статье  (№15), поэтому  мы  не  будем  останавливаться  здесь  на  этом  подробно. Необходимо  отметить  только  то, что  частота  отсчётов  Timer1  выбрана,  исходя  из  требований, предъявляемых   к  номеронабирателям  ТА:  длительность  импульсов – 50 мс, частота – 10 Гц. При  тактовой  частоте  контроллера  4МГц  коэффициент/тактовая частота=1024/4000000=0,256  мс, т.е.  количество  импульсов,  которое  таймер  сделает  за  50 мс, будет  равно 50/0,256=195. Данное  число  записывается  в  регистр  сравнения  Compare1A.  
     Переход  к  следующему  отсчёту  происходит  при  обработке  прерывания  таймера  по  совпадению  (Pulse). Переключение  вывода  ОС1А  происходит  благодаря  функции  Toggle.
     Задание  цифр  передаваемого  номера  происходит  в  подпрограмме  обработки  прерываний  по  приёму  UART  (RxD). Здесь  происходит  запись  номера  в  энергонезависимую  память  микроконтроллера  (EEPROM):

Writeeeprom  A(n), Number

     Считывание  значений  цифр  номера  происходит  в  основной  программе  при  помощи  команд:

$data                                                                                                                                                 
Readeeprom  A(n), Number

     Задание  пространства  в  EEPROM  для  записи  и  считывание  данных  должно  осуществлятся  в  основной  программе  сразу  же  за  определением  постоянных
$eeprom                                                                                                                                 
Number:                                                                                                                                              
Data  17%
     То  есть  запись  и  чтение  данных  будет  происходить  в  EEPROM  с  ячейки  с  адресом  17%. Более  подробно  работа  с  энергонезависимой  памятью  микроконтроллеров  AVR  описана  в  статье  №3.
     Устройство  имеет  механизм  антидребезга. Дребезг  при  нажатии  кнопки  «тревога»  (75 мс)  подавляется  с  помощью  команд:

Config  Debounce = 75

     Дребезг  при  отпускании  данной  кнопки  (75 мс)  подавляется  после  входа  в  подпрограмму  обработки  прерывания  по  INT0  (Achtung)  c  помощью  команды:

Waitms 75                                 ’задержка  75  миллисекунд

     Текст  программы  “Achtung”  с  подробными  комментариями  приводится  ниже:

$regfile = "attiny2313a.dat"       'настройки микроконтроллера
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32

Config Portd.6 = Output            'cветодиод
Config Portb.1 = Output            'имитатор снятия трубки (разговорный ключ)
Config Portb.3 = Output            'ключ  импульсный
Config Pind.0 = Input              'RXD
Config Portd.1 = Output            'TXD
Config Int0 = Falling              'внешнее прерывание - по спаду импульса
Config Debounce = 75               '   механизм антидребезга
'коэфф.деления частоты=1024,ОС1А переключается при совпадении, таймер ‘очищается
Config Timer1 = Timer , Prescale = 1024 , Compare A = Toggle , Clear Timer = 1
Stop Timer1                        'останов таймера
Timer1 = 0                         'сброс таймера

Dim Z As Byte                      'объявление переменных
Dim I As Byte
Dim J As Byte
Dim N As Byte
Dim B As Byte
Dim A(11) As Byte                  'макс. кол-во цифр в номере =11
Dim C As Bit
Dim K As Bit

Const X = 193

$eeprom                            'подготовка пространства памяти для записи номера
Number:
Data 17%

 C = 0                             'сброс байта режима Sleep

On Int0 Achtung                    'опред. подпрограмм обработки прерываний
On Urxc Rxd
On Timer1 Pulse

Enable Interrupts                  'разрешение прерываний
Enable Int0
Enable Urxc
Enable Timer1

Compare1a = X                      'запись в регистр совпадения

Do                                 'основной цикл
  If C = 1 Then                    'если выполнено условие,то вкл.светодиода и ‘переход к набору номера
  Set Portd.6                     ’включение  светодиода
  Goto M1                   ’переход к передаче номера
  Else                             'иначе режим "Sleep"
  Idle
  End If
Loop

Achtung:                           'обработка внешнего прерывания INT0
Waitms 75                          'задержка 75мс
C = 1                                ’установка бита режима Sleep
Return

Pulse:                             'обработка прерывания по совпадению Timer1
K = 1
Return

M1:                                'передача номера
For J = 0 To 3                     'цикл передачи номера телефона 4 раза
Reset Portb.3
For I = 1 To Z                     'цикл передачи номера
 Set Portb.1                       'имитация снятия тел. трубки
 Wait 1                            'задержка 1с
 $data
 Readeeprom A(n) , Number          'Извлечение из памяти  Кол -ва Отсчётов Таймера
  Reset Portb.1                    'отключение имитатора снятия трубки
 For N = 1 To A(n)                 'цикл отсчётов таймера (передача цифры номера)
  Start Timer1
 Do                                'цикл отсчётов таймера
  If K = 1 Then                    'условие при прерывании по совпадению (один отсчёт таймера завешён)
  K = 0
  Exit Do
  End If
 Loop
 Next N

  Stop Timer1                      'останов таймера
  Timer1 = 0                       ' очистка таймера для модуляции следующей цифры номера
  Waitms 100                       'задержка 100 мс межсерийная пауза
 Next I
Wait 5                             'задержка 5с между повторными наборами номера
C = 0                              'сброс бита перехода контроллера в режим "Sleep"
Next J

Rxd:                               'обраб. прерывания по приёму
 Stop Timer1                       'останов и очистка таймера
 Timer1 = 0
 Input "ENTER Sum.DATA NUMBER" , Z 'кол-во цифр в номере (масимальное=11)
 For N = 1 To Z
  Print "WRITE NUMBER:" ; N        'ввод цифры номера
  Input "ENTER NUMBER =" , B       'если цифра номера=0,то ввести 10
  If B = 0 Then
  B = 10
  End If
  A(n) = B * 2                     'кол-во отсчётов таймера для каждой цифры
  Writeeeprom A(n) , Number        'запись в энергонезависимую память
Next N
Return

End                                'end program
     

Программа находится в приложении 1.