Вы находитесь на странице: 1из 12

6/4. Работа модуля TMR2 в автономном режиме.

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

Считаю нужным сделать некоторые пояснения по стратегии текущей работы.


Тем из Вас, кто “хоть каким-то боком приложился” к “легендарному” модулю CCP
(захват – сравнение – ШИМ), не нужно объяснять понятийную проблемность “въезда” в
его работу.
При этом, очень многие “наступают на грабли”, пытаясь сразу и в комплексе понять
то, что сначала нужно понять по частям.
Дело в том, что модуль CCP “представляет из себя ценность” только в “связке” с
модулями TMR1 или TMR2 (работают совместно), и по этой простой причине, попытка
“въезда” в работу модуля CCP, без предварительных, детальных разбирательств с
модулями TMR1 и TMR2, чем-то напоминает ситуацию из басни Крылова про Моську и
слона.
А если серьезно, то принцип “от простого к сложному” просто игнорируется.
Поэтому, “удар в челюсть” - закономерный итог.
Именно с целью недопущения подобного конфуза, я, пока, сознательно “обхожу
стороной модуль CCP” (упоминаю “вскользь”).
Дойдет дело и до него, родимого, но к моменту начала его “штурма”, в руках должен
быть “пулемет”, а не “рогатка”, иначе, как минимум, неприятности будут обеспечены.
И еще один нюанс: функциональности модулей TMR1 и TMR2 позволяют им работать
“самим по себе” (автономно), то есть, без “привязки” к модулю CCP.
Пример такой автономной работы был приведен в предыдущем подразделе: модуля
CCP “даже и на горизонте не видно”.
Это есть мой “камень в огород” весьма распространенного стереотипа, который вольно
или не вольно сложился в головах многих людей - модули TMR1 и TMR2, якобы,
только обеспечивают работу модуля CCP.
Да, обеспечивают, и это важно, но на этом “свет клином не сошелся”.
Есть и другие варианты их применения, без “связки” с модулем CCP.
Вывод: сначала нужно как следует “въехать” в модули TMR1 и TMR2, а только
после этого - в модуль CCP.
В соответствии с этой стратегией, на данном этапе работы, нужно выяснить
функциональность и понять принцип работы модуля TMR2.

Ниже Вы видите структурную схему модуля таймера TMR2.


Она более развернутая, чем в даташите PIC16F628A (стр. 53).
В ней устранена ошибка (вместо регистра TMR2, указан TMR1), и ликвидировано
соединение модуля TMR2 с модулем SSP (в PIC16F628A, модуля SSP нет).

1
Модуль TMR2 имеет в своем составе два 8-битных регистра: регистр TMR2 и регистр
PR2.
В оба этих регистра можно как записывать числа, так и считывать из них числа
(доступны для записи/чтения).
Основное различие между ними состоит в том, что регистр TMR2 тактируется
(считает), а регистр PR2 не тактируется (не считает).
Регистр TMR2, через предделитель, тактируется внутренним тактом ПИКа с частотой
Fт.= Fкв./4.
Внутренний такт ПИКа подключен к входу предделителя всегда, и отключить его
нельзя.
По этой причине, “связка” “предделитель – регистр TMR2” считает внутренний такт
ПИКа в течение всего времени работы модуля TMR2.
Естественно, что, при таком “раскладе”, регистр TMR2 будет считать синхронно с
внутренним тактом ПИКа.
Предделитель может работать с одним из коэффициентов деления: 1:1, 1:4 и 1:16.
Например, при Fкв. = 4 Мгц. и Кдел. предделителя 1:1, период такта равен 1 мкс.,
при Fкв. = 4 Мгц. и Кдел. предделителя 1:4, период такта равен 4 мкс.,
при Fкв. = 4 Мгц. и Кдел. предделителя 1:16, период такта равен 16 мкс.
Регистр PR2, в отличие от регистра TMR2, не считает импульсы.
В него только можно или записать число, или считать из него число (“своей” динамики
нет).
Это означает то, что имеет место быть простейшая, стандартная, однобайтная ячейка
оперативной памяти (“защелка”), в которую, по ходу работы (обычно, в ПП START),
записывается некое число.
Другого просто не дано, так как данные “правила игры” не позволяют “покуситься” на
что-то более сложное.
После этого, “автоматически”, в голову приходит мысль о том, что в регистр PR2
“закладывается” некий числовой “эталон”, на который и “должен ориентироваться”
регистр TMR2, работающий в динамическом режиме.
А если это так, то обязательно должно быть устройство сравнения двух однобайтных
чисел.
Есть такое? Так точно.
Это устройство называется “цифровой компаратор” (см. рис. 1).
Если кто-то из Вас более детально захочет разобраться (аппаратно) с этой
“штуковиной”, то обратите внимание на “ширпотребовскую” м/схему 555СП1.
Правда, она предназначена для сравнения не двух 8-битных, а двух 4-битных слов, но
на смысл это не влияет.
Кроме того, в 1-м разделе “Самоучителя по программно – аппаратному анализу”,
“расписана” программная реализация более сложного (“многосекторного”), чем тот, о
котором идет речь, цифрового компаратора.
Последнее не относится к предмету данного разговора (речь идет об аппаратных, а не
о программных “делах”), но напомнить, на мой взгляд, будет не лишним.
В данном же случае, имеет место быть способ аппаратной реализации простейшего,
цифрового компаратора, работающего с двумя однобайтными словами.
Логика его работы очень проста: сигнал управления на выходе этого цифрового
компаратора имеет место быть только в случае равенства числовых значений слов,
поданных на его входы.
В остальных случаях, сигнала управления нет.
Аппаратно реализуемый цифровой компаратор, в отличие от программно реализуемого
цифрового компаратора, практически мгновенно “откликается” на событие совпадения
чисел (задержка порядка наносекунд), но разработчики “затянули” выработку сигнала
управления на 1 машинный цикл (для Fкв. = 4 Мгц., 1 м.ц. = 1 мкс.), и поэтому
содержимое регистра TMR2 сбрасывается в 0 не в том машинном цикле, в котором
происходит совпадение чисел, а в следующем, после него, машинном цикле.
Напоминание: модуль TMR2 работает только в синхронном режиме.
Таким образом, речь идет о “завязке” регистров TMR2 и PR2 друг на друга (через
компаратор), то есть, о наличии обратной связи выхода цифрового компаратора
на управляющий вход регистра TMR2.
В данном случае, это вход сброса в ноль содержимого регистра TMR2.
2
А теперь давайте представим себе то, что, предварительно, в регистр PR2 записано
число, например, .100, и в результате предыдущего сброса, в регистре TMR2
установился 0.
Так как, во время работы модуля TMR2, такт не прерывается, то, после сброса в 0, с
учетом выставленного в предделителе Кдел., регистр TMR2 начнет считать от нуля.
Предположим, что выставлен Кдел. предделителя равный 1.
В этом случае, приращения TMR2 будут происходить каждый машинный цикл.
Следовательно, числовое значение содержимого регистра TMR2 начнет увеличиваться с
каждым машинным циклом (только инкремент).
Как только регистр TMR2 досчитает до .100, произойдет совпадение числовых значений
содержимого регистров TMR2 и PR2.
Цифровой компаратор “засечет” это совпадение, и, в следующем машинный цикле,
“выдаст” сигнал управления EQ, который есть не что иное, как сигнал переполнения
регистра TMR2, и одновременно, он же, является сигналом сброса в 0 содержимого
этого же регистра.
Вот Вам и типичная обратная связь.
Содержимое регистра TMR2 сбрасывается в 0, и далее, многократно повторяется
сказанное выше.
Это приводит к тому, что, на внутренней “линии” EQ, из-за наличия указанной выше
обратной связи, будет формироваться импульсная последовательность, состоящая из
коротких, управляющих импульсов, причем, величина периода этой импульсной
последовательности будет определяться числовым значением байта, записанного в
регистр PR2.
Именно поэтому регистр PR2 называют регистром периода.
Эти короткие импульсы можно рассматривать как некие “метки” периода.
Примечание: в данном случае, слово “переполнение” указывает не на факт перехода
от числа .255 к числу .0, в пределах одного регистра, а на факт перехода от
предустановленного (в регистре PR2) числа, к числу .0, в целом “комлексе” устройств
(2 регистра и компаратор).
Таким образом, функциональность модуля таймера TMR2 состоит в “жестком” и
максимально точном задании желаемого периода импульсной последовательности
Ради этого и “льется кровь”.
Все остальное (“обслуга”) “прилеплено” к этому “важняку”.
Это нужно хорошенько запомнить, так как модуль таймера TMR2 используется в
работе модуля CCP, при задании величины периода сигнала ШИМ.
“Разборки” с этим будут позже, а сейчас нужно выяснить, можно ли использовать
модуль таймера TMR2 автономно, то есть, без задействования модуля CCP?
Этот вопрос “порождает” следующий: “Как вывести наружу результат”?
И в самом деле, единственное, что можно каким-то образом “вывести наружу”, так это
сигнал, формируемый на выходе выходного предделителя (см. рис. 1), но к этому
выходу не подключен вывод порта.
Вместо этого, имеет место быть управление флагом прерывания по переполнению
модуля TMR2 (бит №1 регистра PIR1 с названием TMR2IF).
В данном случае, в зависимости от выставленного коэффициента деления выходного
делителя, можно поднимать флаг TMR2IF (и “уходить” в прерывание по переполнению
TMR2, если оно разрешено) не по каждому импульсу переполнения регистра TMR2,
который выдается компаратором на внутреннюю “линию” EQ (он же - сигнал сброса
регистра TMR2), а по каждому, например, 3-му, 10-му, 6-му (и т.д., зависит от
выставленного Кдел.) импульсу переполнения (“через раз – два – три” и т.д.).
Это, при условии “ориентации” на флаг TMR2IF, расширяет диапазон значений
периодов, которые способен сформировать модуль TMR2 (в сторону увеличения).
Что означает фраза “при условии ориентации на флаг TMR2IF”?
Дело в том, что при совместной работе модулей TMR2 и CCP, если прерывания по
переполнению TMR2 не нужны (выключены), что и имеет место быть в большинстве
случаев, выходной делитель оказывается как бы лишним.
В даташите PIC16F628A, по этой причине, он даже не указан на “структурной схеме
модуля CCP в ШИМ режиме” (см. стр. 63), а внизу дана сноска на то, что выходной
делитель может быть задействован для реализации второстепенных функций.

3
А вот при автономной работе модуля TMR2, выходной делитель игнорировать нельзя,
так как единственный сигнал, который можно “вывести наружу”, снимается с его
выхода.
Для реализации этого “вывода наружу” (на вывод порта), в простейшем случае, нужно
организовать циклический опрос состояния флага TMR2IF с ветвлением на 2 сценария,
но таким способом качественно “вывести наружу” результат работы модуля TMR2 не
представляется возможным, так как, в идеале, такие проверки нужно организовывать
каждый машинный цикл, что есть полный бред.
В противном случае, при наличии равномерной импульсной последовательности на
внутренней “линии” EQ (или на выходе выходного делителя), импульсная
последовательность, “выведенная наружу”, будет неравномерна (“гуляющий” период),
что “и даром не нужно”.
“Приплыли”?
А вот и нет.
Если, с задействованием проверок состояний флага TMR2IF, наблюдается
“неравномерный Гитлер капут”, то с “уходом” в прерывания по переполнению TMR2,
все “мягко и пушисто”.
И в самом деле, как только сформируется активный перепад на выходе выходного
предделителя, флаг TMR2IF поднимется и произойдет “уход” в ПП прерывания (если
прерывания по переполнению TMR2 разрешены).
То есть, имеет место быть “жесточайшая привязка” (без фазовых “гуляний”) к сигналу
переполнение EQ (при Кдел. выходного делителя = 1) или к его “производной” (при
Кдел. выходного делителя = 2 … 16).
Если прерывания по переполнению TMR2 разрешены, и в выходном делителе
выставлен Кдел = 1, то флаг TMR2IF будет подниматься по факту появления, на
“линии” EQ, каждого импульса переполнения.
Обращаю Ваше внимание на то, что флаг TMR2IF относится к флагам 2-й группы,
следовательно, перед выходом из ПП прерывания, его нужно программно сбросить в
0.
Таким образом, с помощью модуля таймера TMR2, можно организовать
периодические “уходы” в ПП прерывания.
А вот это уже серьезно и перспективно, так как такого рода “инструментарий”
существенно упрощает решение обозначенной выше задачи.
В “основном теле” программы могут “делаться базовые дела”, а ПП прерывания может
“обслуживать” эти “базовые дела”.
Например, в ПП прерывания, могут считываться данные с датчиков, производиться
числовая коррекция, какие-то математические операции с числами, результаты которых
в дальнейшем будут использованы в “основном теле программы” и т.д. и т.п.
Вариантов - “тьма” и фантазии “развернуться” есть где.
Напоминаю, что каждый такой “уход” сопровождается остановкой исполнения программы
в ее “основном теле”, а после возврата, “жизнь продолжается снова” (от команды,
следующей после команды, во время исполнения которой произошло прерывание), но
только с внесением неких “корректирующих поправок”.
Можно ли “провернуть” такую “комбинацию” с модулями TMR0 или TMR1?
Можно, но, при прочих, равных условиях, их возможности, по как можно более точной
калибровке величины периода прерываний, существенно меньше, чем у модуля TMR2.
Это связано с отсутствием, в модулях TMR0 и TMR1, “связки” регистр периода -
компаратор и с меньшими “шаговыми возможностями” их предделителей, по
сравнению с “шаговыми возможностями” “связки” из двух делителей модуля TMR2.
Если величина периода “ухода” в прерывания не критична (“плюс – минус два лаптя”),
то можно воспользоваться и модулями TMR0 или TMR1, но если нужна как можно
более точная калибровка (“подгонка”) этой величины периода под желаемое, то модули
TMR0 или TMR1, в большинстве случаев, не подходят для этой “ювелирной” работы.
А вот модуль TMR2 - “в самый раз”.
Итак, “контуры добычи обозначены” и “глаз на нее охотник положил”.
Начинается “преследование добычи”, с целью “произведения меткого выстрела” и
дальнейшего “охотничьего пиршества”.

4
По-моему, совершенно очевидно, что предделитель и выходной делитель введены в
состав модуля TMR2 для расширения диапазона его “периодных” возможностей, в
сторону увеличения периода.
Это их единственная функция, и никаких других “таинств” в них искать не нужно.
Почему “в сторону увеличения периода”?
Потому, что на практике это наиболее востребовано.
Какую максимальную периодичность прерываний способен обеспечить модуль таймера
TMR2?
Считаем.
256 (количество числовых состояний регистра TMR2) х 16 (max Кдел. предделителя) х
16 (max Кдел. выходного делителя) = 65536 – 1 = 65535 х Тмц., где Тмц -
длительность машинного цикла.
Например, при Fкв. = 4 Мгц. и максимальном значении Кдел. делителей, максимальный
период равен 65535 мкс.
Сразу обращаю Ваше внимание на то, что “выше этого потолка не прыгнешь” (ниже -
нет проблем), так как возможности модуля TMR2 этим исчерпываются.
Но и эта “цифирка” - “ого – го”, так как время исполнения 65535-ти машинных циклов,
это достаточно приличный интервал времени.
Если нужно получить большее значение периодичности ухода в прерывания, то нужно
применить модуль TMR1 (Tmax = 65536 х 8 = 524288 – 1 = 524287 м.ц.), но в этом случае,
с калибровкой величины периода (под желаемое) возможны проблемы (может повезти,
а может и не повезти) и нужно “подстраиваться” под возможности модуля TMR1.
Предположим, что модуль TMR2 обеспечил величину периода “ухода” в прерывания,
например, 1000 м.ц.
Это означает то, что во время исполнения программы, через каждые 1000 м.ц., “тупо”
будет осуществляться “уход” в ПП прерывания.
Но ведь для того чтобы со следующим прерыванием не было проблем, нужно, до
момента возникновения этого “следующего” прерывания, вернуться из предыдущего
прерывания.
Возврат происходит в самом конце ПП прерывания.
Закономерно “вскакивает” вопрос о длительности исполнения ПП прерывания.
Элементарный здравый смысл подсказывает, что длительность исполнения ПП
прерывания должна быть меньше длительности 1000 м.ц., иначе будет “глюк”.
На сколько меньше?
Имеется “основное тело” программы и ПП прерывания.
Рабочая точка программы “должна сделать свои дела” в обеих этих “местах”.
Если руководствоваться коммунистическим принципом равенства и братства, то нужно
поделить 50% на 50% (условно).
То есть, в течение первых 500 м.ц. после возникновения прерывания, отрабатывается
ПП прерывания, после чего происходит возврат рабочей точки программы в “основное
тело” программы, и остальные 500 м.ц. отрабатываются в нем.
Только вот в технике коммунистические принципы, в абсолютном большинстве случаев,
не соблюдаются.
В основном (но не во всех случаях), рабочая точка программы находится в ПП
прерывания в течение достаточно короткого интервала времени, а остальную
(основную) часть времени (до следующего прерывания) она “скачет” в “основном теле”
программы.
Вопрос этот “скользкий”, так как может быть и наоборот (зависит от конкретной
задумки программы), но так или иначе, должен соблюдаться принцип типа “и волки
сыты, и овцы целы”, при условии: длительность отработки ПП прерывания не должна
быть близкой к интервалу времени между двумя соседними прерываниями (“перекрытие
кислорода” для “основного тела” программы), а тем более, его превышать.
Если, в части касающейся прерываний, нужно обеспечить надежную и качественную
работу устройства, то это условие должно соблюдаться не только в рассматриваемом
случае, но и вообще при работе с периодическими прерываниями, сформированными
какими угодно способами.
Сбросы.
1. При любом виде сброса ПИКа (POR, BOR, сброс по переполнению WDT, сброс по
сигналу MCLR),
5
- в регистре TMR2 устанавливается 0,
- в предделителе и выходном делителе устанавливается 0,
- в регистре PR2 устанавливается FFh.
Что касается последнего, то после любого вида сброса, в регистре PR2, ноль
устанавливать нельзя, так как это может привести к формированию “паразитных”
импульсов на “линии” EQ, которые не желательны.
А при установке FFh “все мягко и пушисто”, так как, после сброса, “паразитных”
импульсов не будет, и импульс на “линии” EQ будет сформирован, как минимум, через
255 машинных циклов.
Кстати, этого времени вполне достаточно для того чтобы перевести модуль TMR2 в
рабочий режим.
2. При записи в регистр T2CON,
- в предделителе и выходном делителе устанавливается 0.
3. При записи в регистр TMR2,
- в предделителе и выходном делителе устанавливается 0.
Примечание: запись в регистр T2CON не приводит к сбросу регистра TMR2.

Общий итог.
При автономной работе модуля таймера TMR2 (не в составе модуля CCP), с его
помощью, можно организовать периодический “уход” в ПП прерывания, с
возможностью как можно более точной калибровки величины интервала
времени между двумя соседними прерываниями (периода прерываний).
Длительность отработки ПП прерывания не должна быть близкой к
интервалу времени между двумя соседними прерываниями, а тем более, его
превышать.
Эти два предложения я окрасил в цвет “пролитой крови” с намеком на то, что “идет
кровавая битва” и “враг” еще очень силен.
А если серьезно, то подобного рода “глобальные” формулировки (“палочки –
выручалочки”) нужно хорошенько прочувствовать (заложить в подсознание) и
“намертво” запомнить.
Они того стоят, так как, по своей сути, являются своеобразным “интеллектуальным
кастетом”, с помощью которого, “в рукопашной схватке, проламываются черепа вражин”,
коих в бурной жизни конструктора предостаточно.
Конечно же, крайне желательно, чтобы в наличии было умение обращаться с этим
“кастетом”, плюс “физподготовка”, но это дело наживное.

Теперь не мешало бы, учебно – тренировочно,


применить полученные знания на практике, то
есть, “сваять” какую-нибудь простенькую,
учебную программку, после “въезда” в
которую, техническая сторона принципа
периодического “ухода” в прерывания и его
преимущества, были бы ясны и понятны.
“Не мудрствуя лукаво”, я просто “сваял”
новый (для себя) тип автоколебательного
мультивибратора.
Может быть, такое утверждение и звучит не
скромно. Может быть, “в природе это уже
существует”, но лично мне, это абсолютно “по
барабану”, так как такой “штуковины” я не
встречал, и она, с нуля, “родилась” в моем
“буйном воображении”.
В конце концов, и по человеческим, и по
творческим меркам, даже “изобретение
велосипеда” во сто крат более ценно, чем
купленный в магазине “автомобиль”.

6
Жизнь конструктора (творца) устроена так, что сначала проходит этап “изобретений
велосипедов” (“открытий Америк” и т.д.), а затем бац, и “ваяется” то, чего нигде нет и
от чего, даже у скептиков, “отвисает челюсть” и “округляются глаза”.
Надеюсь, что Вы этот намек поняли.
“Новорожденная” программа называется TMR2.asm (прилагается).
Принципиальная схема, “обслуживающая” эту программу, изображена на рис. 2.
Она настолько проста, что особых пояснений не требуется, за исключением того, что,
если будет применен не пъезоэлектрический, а электродинамический излучатель, то
нужно защитить оконечный каскад защелки вывода RA0 от перегрузки по току, путем
включения, в разрыв цепи, обозначенный красным крестиком, токоограничительного
резистора.

;********************************************************************************
; TMR2.asm АВТОКОЛЕБАТЕЛЬНЫЙ МУЛЬТИВИБРАТОР
; УЧЕБНАЯ ПРОГРАММА
; "Иллюстрирует" принцип работы программы с периодическими (через калиброванные
; интервалы времени) "уходами" в прерывания по переполнению TMR2.
; Используется PIC16F628A.
; Задействован модуль TMR2, который работает в автономном режиме
; (модуль CCP не используется).
;********************************************************************************
; Эта программа входит в состав 6-го раздела "Практикума по конструированию
; устройств на PIC контроллерах".
; Корабельников Евгений Александрович, г.Липецк.
; http://ikarab.narod.ru karabea@lipetsk.ru
;********************************************************************************
; Частота кварца 4000 кГц.
; Период "уходов" в прерывания 1000 мкс.
; Форма сигнала - меандр.
;----------------------------
; Объем программы: 26 команд.
;********************************************************************************
LIST p=16F628A ; Установка типа микроконтроллера.
__CONFIG 03F21H ; Бит защиты выключен, WDT выключен,
; стандартный генератор XT.
;================================================================================
; "Прописка" регистров специального назначения.
;================================================================================
Status equ 03h ; Регистр выбора банка.
TrisA equ 05h ; Регистр выбора направлений работы
; выводов порта A.
PortA equ 05h ; Регистр управления защелками порта A.
IntCon equ 0Bh ; Регистр прерываний.
PIE1 equ 0Ch ; Регистр периферийных прерываний - банк 1.
CMCON equ 1Fh ; Регистр управления модулем компараторов.
T2CON equ 12h ; Регистр управления модулем TMR2.
PR2 equ 12h ; Регистр PR2 модуля TMR2 - банк 1.
PIR1 equ 0Ch ; Регистр флагов прерываний от периферийных
; модулей.
;================================================================================
; "Прописка" регистров общего назначения.
;================================================================================
Sec equ 70h ; Счетчик времени.
;================================================================================
; Присваивание битам названий.
;================================================================================
RP0 equ 5 ; Бит выбора банка.
TMR2IF equ 1 ; Флаг прерывания по переполнению TMR2.
;================================================================================
; Определение места размещения результатов операций.
;================================================================================
F equ 1 ; Результат направить в регистр.
;================================================================================
org 0 ; Начать выполнение программы с нулевого

7
; адреса PC.
goto Start ; Переход в ПП Start.
org 4 ; Начать исполнение ПП прерывания c команды,
; которая, в PC, имеет адрес 04h.
;********************************************************************************

;================================================================================
; Подпрограмма прерывания.
;================================================================================
; Формирование на выводе RA0 единичного уровня.
;----------------------------------------------
bsf PortA,0 ; RA0 --> 1.
;----------------------------------------------
; Фиксация единичного уровня на выводе RA0.
;----------------------------------------------
movlw .166 ; Стандартный,
movwf Sec ; однобайтный,
Pause decfsz Sec,F ; вычитающий
goto Pause ; счетчик.
;----------------------------------------------
; Формирование на выводе RA0 нулевого уровня.
;----------------------------------------------
bcf PortA,0 ; RA0 --> 0.
bcf PIR1,TMR2IF ; Сброс флага прерывания
; по переполнению TMR2.
retfie ; Выход из ПП прерывания.
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;================================================================================
; "Основное тело" программы.
;================================================================================
; Подготовительные операции.
;------------------------------------
Start movlw 7 ; Выключение модуля
movwf CMCON ; компараторов.
movlw b'00000101' ; Модуль TMR2 включен с Кдел. предделителя=4
movwf T2CON ; и Кдел. выходного делителя=1.

bsf Status,RP0 ; Переход в 1-й банк.


clrf TrisA ; Все выводы порта А работают на выход.
movlw .249 ; Запись времязадающей
movwf PR2 ; константы в регистр PR2.
movlw b'11000000' ; Глобальное разрешение прерываний и
movwf IntCon ; разрешение прерываний от периферийных
; модулей.
movlw b'00000010' ; Разрешение прерываний
movwf PIE1 ; по переполнению TMR2.
bcf Status,RP0 ; Переход в 0-й банк.
;------------------------------------
; "Вечное кольцо".
;------------------------------------
goto $ ; Из этого "мертвяка" можно периодически
; "вырваться" только в ПП прерывания.
;********************************************************************************
end ; Конец программы.

Темно – синим цветом выделено относящееся к модулю TMR2.


Темно – красным цветом выделено относящееся к выбору прерывания по
переполнению TMR2.
Стратегия программы.
С помощью модуля TMR2, задается период “ухода” в прерывания по переполнению
TMR2.
В данном случае он равен 1000 мкс.

8
После возникновения прерывания по переполнению TMR2, рабочая точка программы
“улетает” в подпрограмму прерываний, в которой происходит формирование текущего
импульса.
После окончания его формирования, происходит возврат рабочей точки программы в
“основное тело” программы, где она и будет “мотать круги” до возникновения
следующего прерывания по переполнению TMR2.

Работа программы.
Программа начинается с подготовительных операций, которые производятся только на
первом “витке” полного цикла программы.
Банк устанавливать не нужно, так как по умолчанию выставлен 0-й банк, и работа
начинается в нем.
Сначала отключается модуль компараторов.
Остальные незадействованные в программе модули отключены по умолчанию.
Далее производится настройка регистра T2CON, который управляет модулем TMR2.
Она очень простая.
Главное - знать, что выставлять.
Формула для расчета:
Tп = (PR2 + 1) х Tмц х Кпд х Квд
Tп - время периода.
PR2 - число, которое записано в регистре PR2.
Tмц - длительность одного машинного цикла: Tмц = 1/(Fкв/4).
Кпд - коэффициент деления предделителя.
Квд - коэффициент деления выходного делителя.
Следовательно:
PR2 = (Tп / Tмц х Кпд х Квд) – 1
Tп = 1000 мкс.
Тмц = 1 мкс.
Квд = 1.
Кпд принимаем равным 4.
Тогда PR2 = (1000 / 1 х 4 х 1) – 1 = 249.
Эти же формулы применяются и при расчете периода ШИМ (при работе “связки” CCP
- TMR2), только в них отсутствует Квд.
Объяснение этому простое - выходной делитель не принимает участия в
формировании периода ШИМ.
Откуда взялась единица (та, которая вычитается)?
А это поправка на то, что содержимое регистра TMR2 сбрасывается в 0 не в том
машинном цикле, в котором происходит совпадение чисел, а в следующем, после него,
машинном цикле.
Таким образом, в управляющий регистр T2CON нужно записать число 00000101
(естественно, модуль TMR2 нужно включить), что и имеет место быть.
Кроме того, после перехода в 1-й банк (регистр PR2 “лежит” в 1-м банке), в регистр
PR2 нужно записать число .249, что также имеет место быть.
Так как под “пищалку” задействуется вывод RA0, то его нужно настроить на работу “на
выход”.
Я просто сбросил в ноль все содержимое регистра TrisA.
Так как “дело движется к концу” подготовительных операций, то нужно разрешить
прерывания по переполнению TMR2 (эти “дела” обычно делаются в самом конце
подготовительных операций).
Модуль TMR2 это периферийный модуль, значит сначала, в регистре IntCon, нужно
глобально разрешить все прерывания (предварительно) и прерывания от периферийных
модулей (также предварительно), а после этого, разрешить конкретный вид
периферийных прерываний.
В данном случае, разрешаются прерывания по переполнению TMR2.
Затем происходит переход в 0-й банк, после чего рабочая точка программы
“закольцовывается в вечном, мертвом кольце” (goto $).
Но в данном случае, слово “мертвое” не вполне корректно, так как, при возникновении
периодических прерываний (результат работы модуля TMR2), рабочая точка программы
также периодически “отлучается” из этого “кольца” (с периодическим возвратом).
9
Предположим, что произошло прерывание по переполнению TMR2, и рабочая точка
программы “сиганула” на начало ПП прерывания.
Почему, в начале и в конце ПП прерывания, нет процедур сохранения/восстановления
содержимого регистров W и Status?
А зачем они нужны?
В указанном выше “мертвом кольце”, с ними не производится никаких действий.
Вот я их, “без зазрения совести”, и “выкинул” (“отряд совсем не заметил потери
бойца”).
Перестраховка с установкой нулевого банка тоже не нужна, так как, перед “уходом” в
“вечное кольцо”, был установлен 0-й банк и смены банка не производится.
Примечание: в других, более сложных случаях, процедуры сохранения/восстановления
содержимого регистров W и Status и “банковская перестраховка” могут оказаться
нужными.
Следовательно, сразу же можно “брать быка за рога”, то есть, начать формирование
импульса для “пищалки”, что и имеет место быть (bsf PortA,0).
В данном случае, импульс формируется простейшим и незамысловатейшим способом
(даже и комментировать не буду).
В данном случае - длительность этого импульса (точки остановки на bsf PortA,0 и
bcf PortA,0) равна 500 мкс.
Далее, необходимо сбросить поднявшийся (при “уходе” в прерывание) флаг TMR2IF
(bcf PIR1,TMR2IF) и вернуться, из прерывания, в “основное тело” программы (retfie).
Остальной “временной хвостик” (до следующего прерывания) будет отработан в
“основном теле” программы.
Таким образом, в данном случае, на выводе RA0, формируется меандр с частотой
1 Кгц.
А теперь давайте сравним полученный результат с работой программы Multi.asm.
В программе Multi.asm, изменение длительности импульса приводит и к
изменению частоты, и к изменению скважности.
В программе TMR2.asm, изменение длительности импульса не приводит к
изменению частоты (периода), а приводит только к изменению скважности.
Частоту (период) сигнала, присутствующего на выводе RA0, задают
настройки модуля TMR2, и она не зависит от длительности импульса.
Согласитесь со мной, что второе гораздо удобнее первого.
Что такое изменение длительности импульсов, при неизменном периоде их
следования?
Правильно. Широтно – импульсная модуляция или манипуляция.
С целью обозначения максимально четких “правил игры”, нужно определиться с
терминологией.
Понятие “широтно – импульсная модуляция” я буду применять в тех случаях, когда
шириной импульсов управляет аналоговый сигнал, в том числе и в виде результата
аналого – цифрового преобразования (“мать” - аналоговый сигнал).
Понятие “широтно – импульсная манипуляция” я буду применять в тех случаях,
когда шириной импульсов управляет все остальное, то есть, “матери”, в виде
аналогового сигнала (или какого-то “аналоговоизменяющегося” параметра), нет.
Например, длительность импульсов изменяется по закону, сформированному
программным способом, без задействования чего-либо, подпадающего под понятие
“аналоговый”.
Есть и “гибридные” случаи.
При этом, каждый волен “обозвать сие гибридное “действо” либо так, либо эдак
(вольному воля).
В рассматриваемом же случае, меняя, тем или иным программным способом, значения
константы, записываемой в регистр Sec, можно программно изменять скважность.
Следовательно, речь идет о широтно – импульсной манипуляции.
Диапазон изменения скважности можно расширить, применив вместо 1-байтного
счетчика, 2-байтный счетчик.

О расширении функциональности программы TMR2.asm


Программа TMR2.asm проверена в “железе”.

10
На экране осциллографа наблюдается четко засинхронизированный меандр с частотой
1 Кгц.
Это свидетельствует о том, что сигнал является непрерывным и фазовых ошибок нет.
Положительной особенностью устройства является раздельная установка периода
(настройка модуля TMR2) и скважности (задание величины задержки) генерируемого
сигнала.
Программу TMR2.asm можно рассматривать как универсальную “заготовку” программы с
периодическими “уходами” в прерывания по переполнению модуля TMR2, работающего
в автономном режиме.
Почему?
Потому, что, вместо “вечного кольца”, можно “влепить” циклическую процедуру любой
сложности и любого объема (с учетом “потолка” памяти программ применяемого ПИКа).
Естественно, что в этом случае, циклическая процедура должна быть “адаптирована”
под специфику описанного выше принципа.
Мало того, и в ПП прерывания можно “влепить” нечто оччччень отличное от того, о
чем шла речь.
После подобного рода “катаклизмов”, программа может сильно, функционально
измениться, то есть, она, при наличии желания и вожделения, может быть
переориентирована, с решения “детской” задачи типа “моргалка – пищалка”, на решение
более серьезных задач типа “ого-го” или “фантастишь”.
Русский вывод: “мал клоп, да вонюч”.
Примечание с “программным уклоном”: для понятия истинного, глубинного смысла этого
вывода, нужно “инвертировать в нем все биты” (что не говори, а русская душа -
загадка).

Вот так, “тихим сапом” (“по пластунски”), с применением “элементов коварства” и


“фомки”, выяснено, почему, при работе модуля CCP в режиме ШИМ, задействуется
модуль TMR2, и “каким боком он (TMR2) к нему (CCP) прилепился”.
А заодно и выяснены возможности “автономного плавания” модуля TMR2.
Теперь, “находясь во всеоружии”, и с “хорошо прикрытым задом”, смело можно “идти в
лобовую атаку” на модуль CCP.
Да и “воздушная поддержка” имеется - “эскадрилья летающих коров с полным
боекомплектом” (кто-нибудь со стороны прочитает, точно подумает, что это писал
псих).
Вот “выпью боевые 100 граммов”, “выдвину челюсть”, и вперед.
По сравнению с “морской пехотой”, любой CCP (а также и прочие “ЁКЛМН”) - “пацан”.
То что Вы прочитали, есть обычная “тренировка” в “настройке внутренних функций”.
Лично я, ей занимаюсь очень часто (нужно быть в форме).
Очень полезная, настроечная процедура.
Всячески рекомендую Вам нечто подобное. Срабатывает на все сто.
Как такое “задирание хвоста” уживается с “убийственной” логикой?
А вот так и уживается. Молча.
Оно (“задирание”) есть следствие внутренне обоснованной уверенности в своих силах и
психологический “залог” успеха.
При таком “раскладе”, “внутренний цензор” совсем не донимает, “кислород не
перекрывает” и можно спокойно и эффективно работать, плюс, получать удовольствие
от работы.
“Имеющие уши, да услышат”.
Пошел “терзать” модуль CCP.

11
"Практикум по конструированию устройств на PIC контроллерах"      http://ikarab.narod.ru       E-mail: karabea@lipetsk.ru

12

Оценить