Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Самоучитель по программированию PIC контроллеров для начинающих. Система команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
Скачать 3.49 Mb.
|
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 мГц. Откройте проект (любой или. Ранее говорилось, что в состав симулятора входит секундомер Это как раз тот случай, когда он архинужен Чтобы что- то им измерить, нужно знать что измерять (количество машинных циклов формирования полупериодов) и определить "границы " замеров Если не сделать последнего, то можно просидеть перед компьютером хоть целый день, таки не дождавшись конца подсчета Таким образом, речь идет о назначении точек остановок Технически , назначить их очень просто (об этом говорилось ранее. Сложность заключается в том , какие именно команды назначать точками остановок |