Статья №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».
Из неё видно, что при снятии трубки напряжение на линии падает, затем при наборе номера речевой ключ (РК) отключается, и модуляция импульсов происходит от нуля Вольт. Отсутствие «чистого нуля» в этом случае иногда приводит к сбоям в работе и неправильному соединению особенно, если на линии связи используется устаревшая отечественная АТС, речь о которых шла выше. После окончания набора цифры номера ключ РК включается вновь.
На Рис.2 представлена схема «тревожной кнопки», которая содержит микроконтроллер ATtiny2313. Контроллер через порт RS-232, состоящий из конвертера уровня напряжения DD3 (MAX3232) и разъёма DB-9F, может быть подключён к COM порту персонального компьютера (если COM порт отсутствует на вашем компьютере, то необходимо использовать переходник USB – RS-232). С помощью терминала Bascom вы сможете запрограммировать «тревожную кнопку» на передачу определенного телефонного номера.
Цепь сброса микроконтроллера при включении питания образована резистором 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.