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