На рис. 3 изображена блок-схема процедуры инициализации для генерации DTMF-сигналов. Чтобы синтезировать две частоты, используются счётчики таймера-порта Timer Port и 8-битного таймера. Каждый из них представляет собой программируемый счётный регистр, необходимый для точного синтеза требуемых частот. Если счётчики таймера-порта каскадированы в один 16-битный таймер и тактируются от системной частоты MCLK, то частоты верхнего диапазона могут быть сформированы с высокой точностью. При возникновении прерывания соответствующий выход переключается, и оба 8-битных счётных регистра перезагружаются. Загружаемые значения хранятся в двух переменных в ОЗУ с целью экономии внутренних регистров для других задач.
Частоты нижнего диапазона генерируются 8-битным таймером. Так как счётный регистр этого таймера имеет разрядность 8 бит, только каждое третье прерывание приводит к смене уровня на требуемом выходном выводе, позволяя генерировать этим же счётчиком частоты.
Два выхода таймера - порта используются для формирования двух меандров разной частоты.
Процедура инициализации выполняется только один раз. После её завершения, шестнадцатеричное значение передаваемого символа читается из глобальной переменной в ОЗУ. После того, как две частоты, формирующие верхний и нижний тона DTMF, сгенерированы из двух таблиц, требуется только инициализация и запуск обоих таймеров. Длительность посылки контролируется путём подсчёта полупериодов «нижней» частоты и считывается из дополнительной таблицы. По завершении этой процедуры производится возврат к функции поллинга. Соответствующие подпрограммы обработки
482 Библиотека Компэла