Файл: Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 16.06.2025

Просмотров: 3601

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

хакером, "взломщиком" (или еще какой-нибудь "редиской"). Примечание: этим "делам" будет посвящена целая книга.

Предположим, что место "закладки" констант обнаружено, и их числовые значения известны. Если речь идет только об одной константе, то работаем только с ней.

А как быть, если их, например, 3 или 4 (кстати, программы под реальные частотомеры и другие более-менее сложные устройства, содержат примерно такое же количество констант, определяющих величину измерительного интервала времени)?

Вэтом случае, нужно определить порядок старшинства.

Вбольшинстве текстов программ, порядок старшинства стандартный, и он "привязан" к конкретным буквам.

Просто посмотрите на последние буквы названий регистров общего назначения, в которые записываются константы (вспоминайте: HH, H, M, L или нечто подобное).

Например, регистры SecH и SecL программы cus.

Одиночная константа, в большинстве случаев, записывается в регистр общего назначения, название которого этих букв не содержит (например, регистр Sec программы cus). Порядок старшинства можно также определить, анализируя положения регистров в группе команд счетчика (в сАмом верху – регистр самого младшего разряда , а в сАмом низу – регистр самого старшего разряда).

Зная порядок старшинства и оценивая величину погрешности в показаниях частотомера, можно определиться, в каком (каких) из этих разрядов следует произвести числовую коррекцию константы (констант).

Если погрешность в показаниях частотомера маленькая, то можно откорректировать только числовое значение константы младшего разряда, а если она значительна, то вдобавок к этому, придется корректировать и числовые значения констант более старших разрядов. "Технология" такой коррекции очень проста: в текстовом редакторе MPLAB, одно число заменяется на другое, после чего производится ассемблирование.

Возникает вопрос: "В какую сторону производить изменения: в сторону увеличения или в сторону уменьшения"?

Предположим, что частотомер показывает значение частоты меньшей, чем истинное и "врет" не сильно.

Следовательно, нужно изменить числовое значение константы младшего разряда.

Вкакую сторону?

Прежде чем ответить на этот вопрос, нужно кое с чем разобраться. Предположим, что обнаружены "места закладки" констант трех разрядов (H, M, L).

Запоминаем названия регистров общего назначения, в которые "закладываются" эти константы, и ищем, в тексте программы, команды, которые обращаются к содержимому этих регистров.

Это неизбежно приведет к обнаружению (идентификации) группы команд трехразрядного счетчика, в состав которой будут входить команды incfsz или/и decfsz.

Вданном случае (нужно увеличить интервал времени измерения), нужно посмотреть, какая именно, из этих двух команд, обращается к содержимому регистра общего назначения самого младшего разряда (L).

Если это команда decfsz (в большинстве случаев), то величину константы младшего разряда счетчика нужно увеличивать, а если incfsz, то уменьшать.

Если для того чтобы устранить погрешность показаний частотомера, диапазона изменений значения константы счетчика младшего разряда не достаточно, то нужно изменить значение константы счетчика среднего разряда (M).

Если и это не приводит к успеху, то нужно изменить значение константы счетчика старшего разряда (H).

Если корректируется числовое значение константы, например, счетчика среднего разряда (коррекция типа "грубо"), то в большинстве случаев, после нее, необходимо произвести коррекцию числового значения константы счетчика младшего разряда (коррекция типа "точно").

Вбольшинстве случаев (но не во всех), "манипуляций" с числовыми значениями констант счетчиков среднего и младшего разрядов, оказывается достаточным.

Если требуется сформировать калиброванный интервал времени с максимально возможной точностью (с точностью до 1-го машинного цикла), а "шаг" изменения константы счетчика младшего разряда этого сделать не позволяет (вспомните, что минимальный цикл ПП задержки составляет 3 м.ц., а для подпрограмм с "врезками", он еще больше), то нужно либо

108


"врезать", в текст программы, один или несколько NOPов, либо "вырезать", из текста программы, один или несколько NOPов (если они имеются в наличии).

Эти NOPы "врезаются", в текст программы, либо до группы команд счетчика, либо после нее (то есть, в непосредственной близости от этой группы команд).

Посмотрите в текст программы cus.

В группах команд, формирующих время отрицательного и положительного полупериодов, Вы увидите группы NOPов.

Это как раз то, о чем шла речь.

Точную калибровку можно обеспечить и путем изменения времени отработки одного цикла ПП задержки.

Например, можно увеличить его с 3-х м.ц., до 4-х или 5-ти (и т.д) м.ц. Иногда это помогает, но в большинстве случаев, нужен комплексный подход.

То, что Вы прочитали, есть теория одного из вариантов отладки программы (вернее, "взлома", с последующей отладкой), для случая, когда необходимо только изменить временнЫе характеристики устройства или "подогнать" их, в процессе конструирования, под задуманное.

Как это делается на практике? А вот так:

Отладка временных характеристик устройства, обслуживаемого программой cus

В отличие от теоретического случая, описанного выше, в программе cus, "взламывать" что-то совсем не нужно, так как в "конструкции" этой программы, никаких "секретов" нет (я надеюсь на это).

То есть, "вычислять места закладок" констант и определять "конструкцию" счетчиков, в которых они используются, не нужно.

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

Они должны быть одинаковыми (форма сигнала - "меандр") и равными 345 мкс. или 345 машинным циклам (кварц 4 мГц.).

Откройте проект cus (любой: cus_1 или cus_2).

Ранее говорилось, что в состав симулятора входит секундомер. Это как раз тот случай, когда он архинужен.

Чтобы что-то им измерить, нужно знать что измерять (количество машинных циклов формирования полупериодов) и определить "границы" замеров.

Если не сделать последнего, то можно просидеть перед компьютером хоть целый день, так и не дождавшись конца подсчета.

Таким образом, речь идет о назначении точек остановок. Технически, назначить их очень просто (об этом говорилось ранее).

Сложность заключается в том, какие именно команды назначать точками остановок?

Для того чтобы не было проблем с назначением точек остановок, программист должен либо "свободно ориентироваться" в тексте программы, либо, как минимум, знать все "ключевые точки" этой программы.

Для программы cus, такими "ключевыми точками" являются команды bcf PortB,2 (начало формирования отрицательного полупериода) и bsf PortB,2 (начало формирования положительного полупериода).

Примечание: еще одна команда bcf PortB,2 , расположенная ниже, по причинам, указанным в предыдущем разделе, к этим "ключевым точкам" не относится.

И в самом деле, если необходимо измерить время формирования полупериода, его нужно мерить от перепада до перепада.

Итак, точки остановки четко определены. Это команды bcf PortB,2 и bsf PortB,2.

Перед началом практической работы, необходимо уяснить следующую,"техническую деталь". Если в ходе работы над текстом программы (любой), появляется необходимость в его редактировании, а после этого редактирования, нужно сохранить в проекте исходный (начальный) текст программы, то при закрытии проекта, когда Вам будет предложено ответить на вопрос: Сохранить изменения или нет?, необходимо нажать на No.

109


Напоминаю Вам, что в обучающих целях, предполагается, что программа cus составляется "с чистого листа".

То есть, в регистр Sec, в обоих случаях (как при формировании отрицательного, так и при формировании положительного полупериодов), записываются ранее рассчитанные константы ("грубо"), и NOPы "точной" калибровки отсутствуют.

Сделаем так: сначала, для уяснения "технологии" замеров, будем работать с полностью отработанным текстом программы, а затем, для иллюстрации процесса отладки, соответствующим образом изменим текст программы (уберем NOPы и заменим значения констант на расчетные) и произведем, после этого, ее отладку.

Обратите внимание на то, что "ключевые команды" не являются первыми командами ни одной из подпрограмм, и они не помечены (меток нет).

Следовательно, назначить их точками остановок, в окне Break Settings (вспоминайте: DebugBreak Settings...) не получится (можете заглянуть в это окно и убедитесь в этом).

Таким образом, точки остановок будем назначать, щелкая по строкам с этими командами (кто забыл вернитесь назад и прочитайте, как это делается).

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

Итак, первую (верхнюю) точку остановки нужно выставить на команде bcf PortB,2 Выставляем ее, щелкнув правой кнопкой мыши по строке с этой командой и выбрав, в выпадающем списке, Break :

Содержимое строки окрасилась в красный цвет, и теперь видно, что эта команда является точкой остановки.

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

Можно сделать это и вручную, щелкнув по кнопке сброса программы на начало, а затем, щелкая по кнопке со следами, а можно "добраться" до этой команды и в "автомате", что гораздо быстрее.

Сделаем последнее:

Щелкаем по кнопке сброса программы на начало, после чего Вы увидите, что рабочая точка программы перешла на ее начало (goto START).

Вызываем окно секундомера (Window - Stopwatch).

Убедитесь, что в квадратике Clear On Reset , галочка установлена. Секундомер должен показывать нули.

Щелкнув по кнопке с зеленым светофором, запускаем "автомат" (автоматическое исполнение программы).

Видеале, через некоторое время, рабочая точка программы должна остановиться на назначенной нами точке остановки.

Во время отработки "автомата", внизу окна MPLAB, должна высветиться желтая полоса, которая исчезнет в момент перехода рабочей точки программы на команду, назначенную точкой остановки (вернее, точкой конца замера).

Вданном случае, этого не происходит: желтая полоса будет высвечиваться постоянно и также постоянно показания секундомера будут увеличиваться:

110


Можете даже и не надеяться на остановку, так как программа "зависла" в симуляторе. То есть, рабочая точка программы "гоняет в ней по кольцу" и не может из него выйти, а соответственно, и "дойти" до точки остановки.

Так что, не все в этом деле так просто. Давайте разбираться.

Вопрос: "Каким образом преодолеть это затруднение и добраться до точки остановки"? Для этого, прежде всего, необходимо ответить на вопрос: "Если программа обеспечивает нормальную работу реального устройства, то по каким ехидным причинам она зависла в симуляторе?"

Ответ: причина простая не сымитированы внешние воздействия.

То есть, либо на входе управления RB0, либо на входе управления RB6, либо в комплексе, установлен такой уровень (уровни), который "заводит" рабочую точку программы в "вечное кольцо" (либо в ПП START, либо в ПП PRD).

Поочередно пощелкайте по кнопкам с зеленым и красным светофором, и в большинстве случаев, Вы обнаружите остановившуюся рабочую точку программы (после щелчков по красному светофору) в подпрограмме PRD.

Вот Вам и то "место" программы, в котором рабочая точка "ушла в вечное кольцо". Логически рассуждая далее, можно "вычислить" причину этого "конфуза".

Кстати, это архиполезно. Кто желает, тот может это сделать прямо сейчас, "отложив дальнейшее чтение в сторону".

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

То есть, пощелкайте по кнопке со следами (или по F7 на клавиатуре).

Одновременно следите за движением рабочей точки (то есть, за исполнением программы) в текстовом редакторе MPLAB.

Через несколько щелчков, Вы заметите, что после исполнения команды goto PRD, рабочая точка программы "улетит" в ПП PRD, в которой и "уйдет в вечное кольцо".

Такое может быть только в единственном случае: когда на выводе RB6 установлен 0.

Имейте ввиду: мы работаем не с реальным (физическим) устройством, а с

"виртуальным". То есть, с тем, что создано (просимулировано) "внутри" MPLAB.

Следовательно, "корень зла" нужно искать в симуляторе.

Давайте посмотрим, что, по умолчанию, выставлено симулятором на выводах порта В. Сбросьте программу на начало. Щелкните по кнопке SFR.

В окне Special Function Register Window, обратите внимание на содержимое регистра PotrB по умолчанию выставлены все нули (это же относится и к PortA).

111