Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Самоучитель по программированию PIC контроллеров для начинающих. Система команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
![]()
|
WDT опасаться ненужно Итак, мы дошли до конца полного цикла программы Остается только вставить в текст программы команду безусловного перехода на "новый ", полный цикл программы ( goto START ), чем и обеспечивается соблюдение "глобального " принципа : рабочая точка программы всегда должна находиться в движении . Текст программы всегда заканчивается директивой end для того, чтобы "знал ", что ниже этой директивы, текст программы "искать " ненужно Замечание по естественно, что длительность импульса, вырабатываемого (в нашем случае, 2,3 сек, можно уменьшить за счет уменьшения коэффициента деления предделителя Можно отключить предделитель от выхода (18- ти мс вполне достаточно) и даже вообще отключить (в битах конфигурации. Если имеется такое учебно- тренировочное желание, то нужно изменить числовое значение константы, записываемой в регистр OptionR или изменить числовое значение слова конфигурации Предполагаю , что после прочтения изложенной выше информации, возможно возникновение "неразберихи " в терминологии , связанной с такими понятиями как подпрограмма задержки, счетчик, "уход в вечное " кольцо и т д Все это, в своей основе, одно и то же, хотя, казалось бы, речь идет о выполнении разных функций И в самом деле, что общего между, например, ПП PAUSE_1 , ПП PRD и ПП CYCLE , кроме того, что все они - циклические Конструкции разные, и выполняемые функции также разные Однако , в основе "всего этого великолепия ", лежат такие понятия как "задержка " и "счетчик " сиамские близнецы "). Например, подпрограмму PRD можно классифицировать как подпрограмму задержки, с 105 выходом из нее по внешнему воздействию, но ее можно считать и счетчиком , который отсчитывает время, от момента очистки старшего разряда трехсекундного счетчика и до момента перехода с передачи на прием И первое , и второе "имеют право на жизнь ". Примерно тоже самое (с поправкой на специфику) можно сказать и о любых других циклических подпрограммах Такого рода классификация - процесс субъективный, и поэтому одну и ту же подпрограмму можно классифицировать по- разному Это зависит оттого, какое из двух этих восприятий наиболее удобно (кто- то видит счетчика кто- то видит задержку или их "гибрид "). Частенько из- за этого возникают " разнобои ", которые не способствуют взаимопониманию Конечно , если человек "упертый ", то он, через "пинки, синяки и шишки ", рано или поздно выработает в себе умение смотреть на любую циклическую подпрограмму с обеих точек зрения ( счетчик / задержка ), нос целью минимизации указанных выше "бяк ", выгоднее изначально разобраться с подобного рода "вещами " и не жалеть на это времени В качестве тренировки, попробуйте разглядеть в любой из циклических подпрограмм программы, одновременно, и устройство типа счетчика, и устройство , осуществляющее задержку Дополнение Какую именно группу команд считать подпрограммой - определяет программист Программист может видоизменить исходную подпрограмму так, что имама родная не узнает ", вплоть до того, что вообще лишить ее этого "статуса ", ив "статусе " группы команд, включить ее в состав другой подпрограммы Короче , "полная демократия ". Однако, существуют определенные правила, которых, сточки зрения "наведения элементарного порядка ", нужно придерживаться Если имеется группа команд с четко выраженной функциональностью, то прежде чем присваивать ей "статус " подпрограммы, нужно ответить на вопрос "Имеется ли в тексте программы хотя бы один переход на начало исполнения этой процедуры или таких переходов нет "?. Если хотя бы один такой переход есть, то этой группе команд присваивается "статус " подпрограммы, а если таких переходов нетто этого делать ненужно (хотя и можно ), так как "захламлять " текст программы неработающими названиями подпрограмм, нет смысла Например , 2- х разрядный счетчик, реализованный в программе cus , является функционально законченным устройством и ему , формально, вполне можно "присвоить статус " подпрограммы В этом случаев- м столбце текста программы, "прописывается " название подпрограммы ( например , XYZ ) XYZ decfsz Но это название не будет работать, так как в программе cus , отсутствует необходимость в безусловном переходе на XYZ Получается что- то типа "лишнего балласта ". А раз это так, то и незачем назначать такое неработающее название Что касается меток, то они применяются для того чтобы перейти на любую другую команду текста программы, которая не является первой командой подпрограммы Пример "манипуляций " сметкой (правда, их результат функционально "забракован ", нона "технологию " работы с метками это не влияет, был приведен выше Краткий , общий итог Выше описан процесс конструирования конкретного устройства на основе ПИКа Надеюсь на то, что после знакомства с этой информацией, Вы поняли, что если заранее определены исходные данные, то процесс составления программы не есть что- то суперсложное Изначально , с непривычки , некоторые из Вас могут с этим не согласиться, но после того, как Вы "набьете руку ", то сами удивитесь, как это, в сущности , относительно просто Добрый совет на данной стадии обучения, не стОит "стрелять из рогатки по медведю ". То есть, вовсе ненужно пытаться сразу же сконструировать что- то свое Для этого, как минимум, нужна "рогатина ", а еще лучше, "ружье ". 106 На первых порах, для приобретения "солидного инструментария " и его "шлифовки ", советую Вам обратить самое пристальное внимание на "разбор полетов ", а именно , на анализ текстов "чужих " программ То есть, программ для устройств с готовыми исходными данными (неопределенности отсутствуют. В этом , я, по мере своих возможностей, постараюсь эффективно Вам помочь В том смысле, что кроме подробного анализа текстов программ, я постараюсь показать, как именно происходит "борьба с неопределенностями ", вразумительное описание чего, по совокупности причин, является большой редкостью В конечном итоге, когда Вы "набьете руку " и займетесь практическим конструированием, центр сложности " несколько сместится, из "технологического сектора работы ", в "сектор работы по борьбе с неопределенностями ". До этого еще далековато Сейчас же, главная задача "прочувствовать (в том числе, и на уровне подсознания) правила игры ". Пока, в приложении к простым программам Ранее , входе работы над текстом программы, "механизм " визуального, Образного восприятия работы программы (не все в нашем деле определяется только прямолинейной логикой) был задействован как- то слабовато Теперь пора его "включить на полную мощность ". Речь идет о работе в симуляторе Кроме того, что Вы реально увидите, как рабочая точка программы движется по тексту программы (как исполняется программа и что при этом происходит в "недрах " ПИКа, Вы узнаете и то , что такое отладка программы " Самоучитель по программированию PIC контроллеров для начинающих" http://ikarab.narod.ru E-mail: karabea@lipetsk.ru 107 9. Работа в симуляторе Отладка программы О том , что такое симулятор , говорилось ранее Подошло время "привести этот мощнейший инструмент в полную боевую готовность ". Введение Для создания общего представления о том , зачем нужен симулятор , достаточно представить себе разницу, например, между счётами и компьютером Естественно , что бухгалтер, работающий на компьютере, сделает одну и ту же работу быстрее и качественнее , чем если бы он работал со счетами Не может также вызвать сомнения и то , что прежде чем быстро и качественно сделать работу, необходимо, сначала, хотя бы знать, "с какого бока подойти " к этому самому компьютеру, на что нажимать и что после этого будет происходить Первичное представление о работе в симуляторе можно составить, усвоив соответствующую информацию из раздела, посвященного MPLAB В дальнейшем , я исхожу из предположения, что эта информация Вами усвоена Руководствуясь принципом "от простого к сложному ", сначала рассмотрим случай программа, с которой работает симулятор , заведомо работоспособна. То есть, заданный разработчиком алгоритм ее работы, безошибочно выполняется. Обращаю Ваше внимание на то, что безошибочно выполняемый алгоритм работы программы означает только то, что выполнение программы происходит в строгом соответствии с блок - схемой программы, и все ее "квадратики ", в тексте программы, реализованы без ошибок функционального характера, ноне то, что эта программа, в части касающейся точного соблюдения, заданных разработчиком, временнЫх характеристик устройства, идеальна Например , имеется работоспособный частотомер, но из- за того, что в тексте программы неверно подобраны числовые значения времязадающих констант или использован кварц с номиналом частоты, отличающимся отрекомендованного, он будет "врать ". Если он "врет несильно, то можно "превратить " его в "полноценный " измерительный прибор, корректируя значение частоты кварцевого генератора А если он "врет сильно " и эта коррекция неэффективна А если , при переходе с одного интервала времени измерения на другой, существует большая разница в показаниях одного итого же значения частоты В этих случаях, нужно "лезть " в текст программы и корректировать значения времязадающих констант или "подгонять " время исполнения одного сценария работы программы под время исполнения другого сценария (я это называю "выравниванием сценариев "). Сделаем это, пока, теоретически ив общем виде, без "привязки " к какой - то конкретной программе Итак , "запускаем " и открываем проект с программой "врущего " частотомера Допустим , что перед нами текст программы, созданной под частотомер Естественно , что сначала, в тексте программы, нужно найти группы команд "закладки " соответствующих времязадающих констант, в регистры общего назначения, созданные и "прописанные " в "шапке " программы под это дело Эти группы команд - стандартные (о них говорилось выше пары команд movlw и movwf ) и поэтому обнаружить их не составляет большого труда Если имеются несколько отдельных констант и / или групп констант (такое бывает часто, то необходимо выяснить, в реализации каких именно функциональностей они задействованы, и анализируя текст программы, "отсеять " ненужные Кстати , то, что Вы сейчас читаете, это примитивный пример использования приемов программно- аппаратного анализа В части касающейся "тренировки мозгов ", такая работа не то что полезна, а исключительно полезна Естественно , что такого рода "манипуляции " предполагают наличие опыта Если он есть, и человек владеет приемами программно- аппаратного анализа, то даже при отсутствии комментариев к тексту "чужой " программы, в ней , по большому счету, можно "вычислить " все что угодно, и что - то целенаправленно изменить В конце концов, "материнскую " программу можно "перекроить так, что мама родная не узнает " или, на ее основе, создать нечто новое Именно к этому нужно всячески стремиться, и именно это является одним из главных признаков классного программиста, который, по определению (по умолчанию, является 108 хакером, "взломщиком " (или еще какой- нибудь "редиской "). Примечание этим "делам " будет посвящена целая книга Предположим , что место "закладки " констант обнаружено, и их числовые значения известны Если речь идет только об одной константе, то работаем только с ней А как быть, если их, например, 3 или 4 (кстати, программы под реальные частотомеры и другие более- менее сложные устройства, содержат примерно такое же количество констант, определяющих величину измерительного интервала времени В этом случае, нужно определить порядок старшинства В большинстве текстов программ, порядок старшинства стандартный, ион "привязан " к конкретным буквам Просто посмотрите на последние буквы названий регистров общего назначения, в которые записываются константы (вспоминайте HH, H, M, или нечто подобное. Например, регистры SecH и SecL программы cus Одиночная константа, в большинстве случаев, записывается в регистр общего назначения, название которого этих букв не содержит (например, регистр Sec программы cus ). Порядок старшинства можно также определить, анализируя положения регистров в группе команд счетчика (в сАмом верху – регистр самого младшего разряда , а в сАмом низу – регистр самого старшего разряда. Зная порядок старшинства и оценивая величину погрешности в показаниях частотомера, можно определиться, в каком (каких) из этих разрядов следует произвести числовую коррекцию константы (констант. Если погрешность в показаниях частотомера маленькая, то можно откорректировать только числовое значение константы младшего разряда, а если она значительна, то вдобавок к этому , придется корректировать и числовые значения констант более старших разрядов "Технология " такой коррекции очень проста в текстовом редакторе MPLAB, одно число заменяется на другое, после чего производится ассемблирование Возникает вопрос " В какую сторону производить изменения в сторону увеличения или в сторону уменьшения "? Предположим, что частотомер показывает значение частоты меньшей, чем истинное и "врет " несильно Следовательно, нужно изменить числовое значение константы младшего разряда В какую сторону Прежде чем ответить на этот вопрос, нужно кое с чем разобраться Предположим , что обнаружены "места закладки " констант трех разрядов ( H, M, L ). Запоминаем названия регистров общего назначения, в которые "закладываются " эти константы, и ищем , в тексте программы, команды, которые обращаются к содержимому этих регистров Это неизбежно приведет к обнаружению (идентификации) группы команд трехразрядного счетчика, в состав которой будут входить команды incfsz или / и decfsz В данном случае (нужно увеличить интервал времени измерения, нужно посмотреть, какая именно, из этих двух команд, обращается к содержимому регистра общего назначения самого младшего разряда ( L ). Если это команда (в большинстве случаев, то величину константы младшего разряда счетчика нужно увеличивать, а если incfsz , то уменьшать Если для того чтобы устранить погрешность показаний частотомера, диапазона изменений значения константы счетчика младшего разряда недостаточно, то нужно изменить значение константы счетчика среднего разряда ( M ). Если и это не приводит к успеху , то нужно изменить значение константы счетчика старшего разряда ( H ). Если корректируется числовое значение константы, например, счетчика среднего разряда ( коррекция типа "грубо "), тов большинстве случаев, после нее, необходимо произвести коррекцию числового значения константы счетчика младшего разряда (коррекция типа "точно "). В большинстве случаев (ноне во всех, "манипуляций " с числовыми значениями констант счетчиков среднего и младшего разрядов, оказывается достаточным Если требуется сформировать калиброванный интервал времени с максимально возможной точностью (с точностью до 1- го машинного цикла, а "шаг " изменения константы счетчика младшего разряда этого сделать не позволяет (вспомните, что минимальный цикл ПП задержки составляет 3 м ц ., а для подпрограмм с "врезками ", он еще больше, то нужно либо 109 врезать ", в текст программы, один или несколько NOP ов , либо "вырезать ", из текста программы, один или несколько NOP ов (если они имеются в наличии ). Эти NOP ы "врезаются ", в текст программы, либо до группы команд счетчика, либо после нее ( то есть, в непосредственной близости от этой группы команд. Посмотрите в текст программы cus В группах команд, формирующих время отрицательного и положительного полупериодов, Вы увидите группы NOP ов Это как раз то, о чем шла речь Точную калибровку можно обеспечить и путем изменения времени отработки одного цикла ПП задержки Например , можно увеличить его с 3- хм ц, до 4- х или 5- ти (и т д ) м ц Иногда это помогает, нов большинстве случаев, нужен комплексный подход То , что Вы прочитали, есть теория одного из вариантов отладки программы (вернее, взлома ", с последующей отладкой, для случая, когда необходимо только изменить временнЫе характеристики устройства или "подогнать " их, в процессе конструирования, под задуманное Как это делается на практике А вот так Отладка временных характеристик устройства, обслуживаемого программой cus В отличие от теоретического случая, описанного выше, в программе cus, "взламывать " что- то совсем ненужно, так как в "конструкции " этой программы, никаких "секретов " нет (я надеюсь на это. То есть, "вычислять места закладок " констант и определять "конструкцию " счетчиков, в которых они используются, ненужно Если предположить, что программа cus работоспособна (атак оно и есть ) и величину трехсекундного интервала времени корректировать ненужно (его корректировать ненужно, то ее отладка сводится к точной коррекции значений интервалов времени отрицательного и положительного полупериодов Они должны быть одинаковыми (форма сигнала - "меандр ") и равными 345 мкс или 345 машинным циклам (кварц 4 мГц. Откройте проект (любой или. Ранее говорилось, что в состав симулятора входит секундомер Это как раз тот случай, когда он архинужен Чтобы что- то им измерить, нужно знать что измерять (количество машинных циклов формирования полупериодов) и определить "границы " замеров Если не сделать последнего, то можно просидеть перед компьютером хоть целый день, таки не дождавшись конца подсчета Таким образом, речь идет о назначении точек остановок Технически , назначить их очень просто (об этом говорилось ранее. Сложность заключается в том , какие именно команды назначать точками остановок |