Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Самоучитель по программированию PIC контроллеров для начинающих. Система команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
![]()
|
346 мкс. "Перебор ". Значит, значение константы нужно уменьшить Если уменьшить ее на 1, то есть, сделать равной .85, то время формирования отрицательного полупериода уменьшится на 4 мкс и составит 342 мкс Недобор " в 3 мкс устраняем добавлением трех NOP ов , либо сразу же после команды PortB,2 , либо сразу же после команды Можно также "врезать " эти NOP ы после команды или между командами и Sec А теперь "вспомните " (склероз выключен) отстроенный текст программы 117 Вот Вам и ответ на вопрос откуда что взялось В данном случае, я "врезал " ы после команды намой взгляд, так симпатичнее. Получилось то, что нужно 345 мкс (ранее проверено по секундомеру. Измеряем время положительного полупериода Сбрасывать программу на начало и снимать точки остановки ненужно Примечание:еслиВы "добирались " до команды PortB,2 в режиме пошагового исполнения программы (вспомните, что в этом случае, точку остановки устанавливать необязательно, то сделайте ее точкой остановки Если Вы "добирались " до команды в "автомате ", то она уже является точкой остановки (а иначе, в "автомате ", Вы бы до нее не "добрались ") и делать ничего ненужно Сбрасываем секундомер на ноль Щелкаем по кнопке с зеленым светофором и ждем окончания подсчета Получаем 353 мкс А нужно 344 мкс "Перебор " в 9 мкс Если уменьшить величину константы на 2 (минус х мкс, то опять будет "перебор ". Следовательно, необходимо уменьшить величину константы на 3, а "недобор " скомпенсировать добавлением трех NOP ов , что Вы и видите в тексте отлаженной программы Из этого следует общий принцип если существует "перебори нет возможности скомпенсировать его удалением, из текста программы, соответствующего количества команд ( бывают случаи, когда это возможно, то числовое значение константы изменяется таким образом, чтобы возник минимальный "недобор, который, в дальнейшем, компенсируется добавлением соответствующего количества NOP ов . Все, процесс отладки программы cus закончен Точки остановки можно снять Теперь нужно убрать "обманный " и "вернуть на свое бывшее место " команду Остается только проассемблировать текст программы (так как были внесены изменения, и после этого, как говорится, "со спокойной совестью ", можно открыть, созданный при этом ассемблировании , файл программы, в программе , обслуживающей Ваш программатор, и произвести "прошивку " ПИКа Описанный ранее, процесс предварительного, "грубого " расчета значений времязадающих констант и последующей отладки программы, достаточно прост, ноне все так просто А если ПП задержки имеет в своем составе "мощную врезку ", и даже "грубый " расчет времени отработки такой задержки вызывает существенные затруднения В этом случае, можно просто "утонуть в расчетах ", потратив на это уйму времени и сил Способ преодоления такого рода затруднений, как это не странно, достаточно прост Например , имеется 3- хразрядный счетчик с "массивной врезкой ", и у Вас , в связи с этим , возникли затруднения с предварительными расчетами числовых значений констант или Вам просто не хочется ими заниматься Что нужно делать в этом случае В старшем и среднем разрядах счетчика выставляем значения констант, из расчета формирования малого интервала времени Если разряд счетчика вычитающий, то выставляется константа, например, .02, а если суммирующий, то, например, .254. Это делается для удобства Чтобы в секундомере , подсчет времени происходил быстро и не нужно было бы долго ждать его конца Для младшего разряда счетчика (он " шустёр ), выставляем константу "от балды ", ноне максимальную Например , .10 (привязка к круглой цифре ". Для удобства. Выходим " на начало отсчета, назначаем "нижнюю " точку остановки, сбрасываем секундомер в ноль и запускаем "автомат ". Ждем окончания подсчета и смотрим на показания секундомера Например , получилось 1250 мкс В младшем разряде счетчика, увеличиваем значение константы с .10 до .11 . Делаем те же "манипуляции ". Получилось, например, 1353 мкс Вычисляем разницу 1373-1250=123 мкс 118 Вывод шаг" изменения константы младшего разряда составляет 123 мкс C ледовательно , полный цикл счета счетчика младшего разряда составляет 256 х 123=31488 мкс Это означает, что через каждые 31488 мкс, содержимое счетчика среднего разряда будет изменяться на единицу Следовательно , полный цикл счета счетчика среднего разряда составит 256 х 31488=8,060928 сек Это означает, что через каждые 8,060928 сек, содержимое счетчика старшего разряда будет изменяться на единицу Следовательно , полный цикл счета счетчика старшего разряда составит 256 х 8,060928=2063,5975 сек Это есть максимальное время задержки (грубая прикидка "). Например, требуется сделать "грубую прикидку " значений констант для вычитающего, трехразрядного счетчика, формирующего интервал времени 20 сек В старшем разряде, тройку назначать нельзя, так как будет "перебор ", а двойка будет в самый раз х сек Остаток 20-16,121856=3,878144 сек Руководствуясь таким же принципом, для среднего разряда счетчика, назначаем константу. х мкс сек Остаток 3,878144 сек- 3,873024 сек сек мкс. Для младшего разряда счетчика, назначаем константу .41 (с "недобором "): х мкс То, что сейчас проделано, называется разложением Итак , "грубая прикидка " значений констант, для формирования интервала времени величиной сек, дала следующие результаты - для старшего разряда .02 ( H ), - для среднего разряда .123 ( M ), - для младшего разряда .41 ( L ). Обращаю Ваше внимание на то, что это именно "грубая прикидка ". И не только по той причине, что в младшем разряде, константа назначена приблизительно, но и по причине того, что в состав "куска " программы, вовремя отработки которого формируется калиброванный интервал времени, могут входить команды, которые не имеют непосредственного отношения к подпрограмме задержки То есть, речь идет о сумме фактического времени отработки задержки и времени отработки этих команд Именно поэтому, в младшем разряде должен быть "недобор ". Вернемся к рассмотренному выше примеру при значении константы младшего разряда счетчика .10 и шаге в 123 мкс, счетчик должен показать 1230 мкс, но он показывает мкс (это пример того, что часто встречается. В чем дело Дело в том , что кроме ПП задержки , еще отрабатывается (в течение 20 мкс) и группа команд, которая не входит в ее полный цикл Такие "линейные вкрапления " могут быть "разбросаны " в различных местах "куска " программы, вовремя отработки которого формируется калиброванный интервал времени Утешает то, что в большинстве случаев, суммарное время отработки этих команд, по сравнению с временем отработки ПП задержки , мало Это позволяет достаточно точно "выйти в числовой сектор обстрела ". В нашем случае, если имеются такие "линейные вкрапления ", реальная величина калиброванного интервала времени может оказаться более чем 20 сек А может и не оказаться В любом случае, при помощи секундомера, можно соответствующим образом скорректировать числовые значения констант, начиная с младшего разряда, и максимально приблизиться к желаемому , используя NOP ы Во многих случаях, достаточно только скорректировать числовое значение константы младшего разряда В случае значительных расхождений между фактической и расчетной величинами, нужно замерить "шаги " констант среднего и / или старшего разряда и внести в расчеты соответствующие коррективы Просто нужна "тренировка ". 119 Когда Вы "набьете на этом деле руку ", все это будет происходить без " напряга ", хотя и будет занимать определенное время Главное - понимать смысл производимых действий Ну и "технологию " тоже Потренироваться можно, используя все туже программу cus Если у Вас есть желание, то попробуйте изменить величину трехсекундного интервала времени "выхода " сигнала тонального вызова в эфир , например, до 0,500000 сек. (или меньше) и максимально приблизиться к этому значению Большее время задавать ненужно (будете долго ждать конца счета. Попробуйте сами назначить точки остановки Не забудьте про "уловку ". Разбираем следующий случай в тексте программы имеется ошибка . Если это ошибка не функционального характера, то MPLAB обязательно на нее укажет Например , Вы забыли "прописать " регистра в тексте программы есть обращение к нему или допустили орфографическую ошибку при написании команды, или забыли указать место сохранения результата операции, или забыли указать номер бита, с которым производится действие, или орфография названия регистра, в рабочей части программы, не соответствует орфографии "прописанного " названия этого же регистра, или один столбец "наезжает " на другой, или Вы написали строку с комментариями и не поставили передней точку с запятой и т д В этом случае, после ассемблировании текста программы, Вы получите сообщения о всех допущенных ошибках, с указанием строк программы, в которых они допущены Двойной щелчок по строке с ошибкой , и курсор покажет Вам ту строку текста программы, в которой она допущена Эти ошибки нужно устранить и добиться безошибочного ассемблирования При этом, вовсе необязательно, за один "присест ", устранять все ошибки (если их много. Можно, не спеша и по очереди, разобраться с каждым сообщением об ошибке, производя ассемблирование после каждой такой "разборки " или после неудачной ее попытки, вплоть до устранения ошибки Пока все ошибки не будут устранены, дальнейшая работа с текстом программы просто не имеет смысла ( MPLAB "уйдет в отказ " и о создании HEX файла можно даже и не мечтать. Советую Вам попробовать внести в текст программы cus какие - нибудь ошибки, из списка тех, что указаны выше, и посмотреть , что из этого получится после ассемблирования Предположим , что все ошибки подобного рода устранены и получено сообщение о безошибочном ассемблировании После этого, "хлопать в ладоши ", вообще- то, рановато, так как далее предстоит "борьба " с ошибками функционального характера (естественно, при их наличии, что будет посерьезнее, чем ошибки в оформлении текста программы По той причине, что в этом случае, не поможет (ошибок функционального характера "он не видит "). Ошибки функционального характера возникают из- за непродуманности как блок- схемы в целом , таки способов реализации ее "квадратиков " и / или связей между ними Например , рабочая точка программы "зависла " в каком - то цикле и "не хочет из него выходить " даже при соблюдении всех условий, обеспечивающих такой выходили выполнение какой- то ПП игнорируется , несмотря на то, что она, по замыслу, должна исполняться и т д Такого рода ошибок может быть великое множество и "диапазон их причин простирается " от элементарной невнимательности, когда можно обойтись "малой кровью ", и до ошибок стратегического характера, когда нужно производить "капитальный ремонт " всей программы Суть поиска функциональных ошибок сводится к проверке исполнения программы (в симуляторе и / или в "железе "), с контролем соответствия фактических результатов, желаемым результатам В случае отсутствии такого соответствия, выявляется причина несоответствия и принимаются меры для его устранения Анализ текста программы на наличие или отсутствие ошибок функционального характера целесообразно начать с "прогонки " рабочей точки по всему полному циклу программы В этом случае, работа происходит по принципу "следопыта ". Первичная задача нужно "протащить " рабочую точку программы по полному циклу программы, начиная с первой ее команды, при настройках MPLAB по умолчанию 120 До возникновения первого затруднения Далее работа мозга и радость победы (в идеале. После устранения первого затруднения, рабочая точка программы "протаскивается " дальше, до возникновения второго затруднения И так далее До конца полного цикла программы (вернее, до "выхода на новый виток " полного цикла программы. Факт такого "протаскивания " рабочей точки программы по полному циклу односценарной программы, соответствует проверке работоспособности программы типа "грубо " и говорит о том , что программа "жизнеспособна ". После этого, можно приступить к более детальной проверке указанного выше соответствия После того, как программист убеждается в соответствии фактического алгоритма работы программы расчетному (задуманному им, можно перейти к отладке программы (если она требуется. Если программа имеет несколько сценариев работы ( многосценарная программа, то нужно "пройтись " по их максимально возможному количеству (в идеале, по всем ее сценариям. Работу подавляющего их большинства можно проверить, либо используя "уловки ", либо используя функции стимула, но встречаются и такие сценарии работы программы, которые, из- за сложности или невозможности имитации внешних воздействий, сложно или вообще невозможно проверить в симуляторе (надежда только на мозги и смекалку Тренируйте их. В этом случае, после каждого изменения текста программы, необходимо ее ассемблировать , зашивать " в реальный ПИК и смотреть, что из этого получится Есть такие "штуковины " под названием эмуляторы, но как глянешь на их цены, становится очень грустно Лучше представить себе, что их нет и полагаться на свое мастерство Обращаю Ваше внимание на то, что употребленное мной слово "затруднение ", вовсе не свидетельствует о наличии ошибки функционального характера Затруднение может быть связано с ней , но оно может быть также связано и с "уходом " рабочей точки программы в нежелательный сценарий работы программы Вспомните про то, как при отладке программы, рабочая точка программы "ушла в вечное кольцо " ПП PRD , и из - за этого нельзя было осуществить замер значений полупериодов В этом случае, никакой функциональной ошибки не было Просто внешнее воздействие было таким, что исполнение программы происходило по нежелательному сценарию Это вовсе не говорит о том , что этот нежелательный сценарий нежелателен вообще Проверить нужно и его , но только входе "прогонки ", осуществляемой именно для проверки этого сценария В зависимости от сложности программы (от количества сценариев ее исполнения, таких " прогонок " может быть достаточно большое количество, так что освоение их "технологии " свободная " рулёжка " сценариями программы) насущная необходимость Чем больше способов имитации внешних, управляющих сигналов знает программист, тем в меньшее количество "тупиков " он будет попадать Вот Вам и ответ на вопрос "Зачем нужны функции стимула и / или уловки "? Намой взгляд, эффективнее сконцентрировать внимание не на функциях стимула, а на "уловках ". Лично я, таки делаюДалее, по мере " подворачивания поводов ", я буду "выдавать на гора " другие разновидности "уловок ". В следующем разделе, тема " рулёжки " сценариями будет продолжена " Самоучитель по программированию PIC контроллеров для начинающих" http://ikarab.narod.ru E-mail: karabea@lipetsk.ru 121 10. Как отследить выполнение программы Важность этой работы очевидна "Набор " приемов отслеживания выполнения программы вовсе не является "резиновым ". Овладение " этими приемами, хотя и требует определенных усилий, но вовсе не является чем- то очень уж сложным Сознательно "манипулируя " этими приемами, можно составить четкое представление о том , исполняется ли программа в соответствии с задуманным алгоритмом ее работы или "где- то что- то пошло наперекосяк ", и по какой причине этот " перекосяк " произошел То есть, речь идет о сборе данных для последующего анализа причин " перекосяка ", с целью его устранения В ходе работ по отслеживанию выполнения программы, выявляются ошибки функционального характера, а по результатам их анализа, "по ним заказывается панихида ". Давайте с этим разбираться Отследить перемещение рабочей точки программы, по тексту программы, можно в текстовом редакторе MPLAB или в окне Program Memory вызывается кнопкой. В этом окне, все команды программы располагаются компактно, с указанием их порядковых номеров и адресов в памяти программно названий регистров Вы там не найдете (вместо них указаны их адреса в области оперативной памяти, все числа только в 16- ричной форме и комментариев нет В большинстве случаев, отслеживание движения рабочей точки производится в текстовом редакторе, так как это гораздо более комфортно, а окно Program Memory вызывается " тогда, когда нужно узнать порядковый номер той или иной команды или ее адрес в памяти программа также разложение (на команды) директив / макросов В окне Program Memory можно назначить точки остановки Технология этого назначения такая же, как и при назначении точек остановки в текстовом редакторе щелчок правой кнопкой мыши по строке с командой и выбор (щелчок левой кнопкой мыши) из списка строки Break После этого, выбранная строка (в окне Memory Window ) окрашивается в красный цвет, ив текстовом редакторе, Вы увидите тоже самое (как будто бы Вы назначили точку остановки в текстовом редакторе. Окно Function Register Window (кнопка. Это окно бывает полезным при работе с программами , которые управляются внешними сигналами Если Вы заранее не предприняли мер по установке необходимых Вам уровней этих внешних, управляющих сигналов (функции стимула не задействованы, тона момент начала исполнения программы, "тупо " выставит на этих выводах "свои " уровни (по умолчанию. Откройте программу сбрасывать ее на начало и исполнять ненужно, просто откройте и все ). Щелкните по кнопке |