Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Samouchitel

.pdf
Скачиваний:
16
Добавлен:
13.02.2015
Размер:
3.65 Mб
Скачать

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

Напоминаю, что все регистры, находящиеся в области оперативной памяти, 8-битные, и поэтому они работают в числовом диапазоне от 00h до FFh (от .0 до .255).

В окне File Register Window, содержимое всех регистров отображается только в 16-ричной форме исчисления.

Таким образом, в окне File Register Window, можно отслеживать изменения содержимого всех регистров области оперативной памяти.

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

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

Пример: в регистр Sec, расположенный в области оперативной памяти, например, по адресу 0Сh, командой movwf Sec, из регистра W, копируется заранее заложенная в него (в W) константа, например .100.

Пусть до момента исполнения команды movwf Sec, в регистре Sec "лежало", например, число 0 (напоминаю, что любое число, до 9-ти включительно, можно указывать в команде без атрибутов систем исчисления).

При этом, в окне File Register Window, Вы увидите:

-До выполнения команды movwf Sec, в ячейке области оперативной памяти с адресом 0Ch, будет "лежать" число 00, выделенное синим цветом.

-В момент исполнения этой команды, число 00 заменится на число 64, которое будет выделено красным цветом (произошло изменение).

-Если, после этого, следующая команда программы не производит изменения содержимого регистра Sec, то после выполнения этой команды, число 64 изменит свой цвет с красного

на синий.

Почему 64, а не 100?

Вот Вам и типичный пример перевода чисел из одной системы исчисления в другую (из 10-чной в 16-ричную и наоборот).

Откройте, имеющуюся у Вас, таблицу перевода чисел из одной системы исчисления в другую и убедитесь, что числу .100 (10-чная система исчисления) соответствует число 64h (16-ричная система исчисления).

Если Вы хотите устранить этот "разнобой", то в командах программы, применяйте числа в 16-ричной системе исчисления. Это кому как удобнее.

Закройте окно File Register Window.

Щелкните по кнопке SFR. Откроется окно Special Function Register Window.

61

Если в предыдущем окне Вы видели содержимое всех регистров области оперативной памяти, в 16-ричной системе исчисления, то в этом окне Вы видите содержимое только регистров специального назначения, в трех системах исчисления.

Окно Special Function Regisrer Window можно использовать в качестве конвертора систем исчисления.

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

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

Восновном, они работают в окне File Register Window.

Выделение цветом, описанное выше, работает также и в окне Special Function Register

Window.

Закройте окно Special Function Register Window.

Щелкните по кнопке с нарисованными на ней очками. Откроется окно Add Watch Symbol. Если программист хочет выборочно видеть содержимое только тех регистров, которые его интересуют, то это как раз тот случай.

В окне Add Watch Symbol, Вы увидите список регистров специального назначения и "прописанных" регистров общего назначения, плюс регистр W.

Названия регистров расположены в алфавитном порядке. Например, нас интересует содержимое регистра PortB.

Для этого, в списке, нужно найти название регистра PortB и щелкнуть по строке с этим названием.

После этого кнопка Add (добавить) активизируется.

Затем, нужно щелкнуть по этой кнопке, а затем - по кнопке Close.

Окно Add Watch Symbol закроется, и Вы увидите, что в окне Watch (перед этим, оно было на заднем плане) "появятся начинка" регистра PortB.

62

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

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

В окне Watch, содержимое регистров отображается только в 16-ричной форме исчисления. Выделение цветом (см. выше) также работает.

Лично я, жму на кнопку с очками только в том случае, если мне нужно увидеть содержимое регистра W.

Содержимое остальных регистров можно увидеть в окне File Register Window.

Вы можете работать по-другому. Это личный выбор программиста. Зависит от привычки. При закрытии окна Watch, "программа спросит", нужно или не нужно сохранить файл с данными этого окна?

Жмите на No.

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

Режимы работы симулятора. Точки остановок.

В симуляторе, исполнение программы осуществляется в одном из двух основных режимов:

-в режиме пошагового исполнения программы,

-режиме автоматического исполнения программы. Органы управления:

Откройте проект Multi и обратите внимание на отдельную группу из 5-ти пиктограмм, с

красным и зеленым светофорами.

Четвертую слева пиктограмму (следы с желто-оранжевой полосой) можно проигнорировать (без нее вполне можно обойтись).

Остаются 4 кнопки (пиктограммы).

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

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

Почему?

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

Чтобы не случилось этого "конфуза", до этой "середины" необходимо сначала "дойти", то есть, полноценно исполнить все предшествующие команды программы.

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

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

Такая "привязка" может быть, а может и не быть.

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

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

63

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

Я, честно говоря, должным образом не оценил "глубинного смысла" того, что нарисовано на этой кнопке, и поэтому я буду ее называть кнопкой сброса программы на начало. Щелкните по этой кнопке (или нажмите клавишу F6 клавиатуры. Она дублирует эту кнопку). После этого, Вы увидите, что строка с командой goto Start, которая "дислоцируется" в конце "шапки" программы, выделится:

Обращаю Ваше внимание на то, что эта выделенная команда занимает нулевой адрес в памяти программ, в чем Вы можете убедиться, щелкнув по кнопке (пиктограмме) ROM. После этого, в окне Program Memory Window, Вы увидите, что строка, с командой goto Start, тоже выделилась.

Возьмите это на заметку и закройте окно Program Memory Window.

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

Больше эта кнопка ничего "делать не может".

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

Пошаговый режим исполнения программы применяется в тех случаях, когда нужно

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

Автоматический режим исполнения программы применяется для выхода на начало

этого "сектора", с быстрым, но неконтролируемым результатом исполнения всех предшествующих команд программы, а также для определения временных характеристик программы (при помощи секундомера. Об этом - ниже).

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

Эти "дела делаются" в пошаговом режиме, не спеша и основательно.

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

Точкой остановки считается, помеченная программистом, строка текста программы, содержащая команду, название подпрограммы, метку.

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

Теория теорией, но лучше поближе к практике.

Начну с пошагового режима.

Орган управления - кнопка пошагового исполнения программы, с нарисованными на ней следами (третья слева) или кнопка F7 клавиатуры.

Итак, после нажатия на кнопку сброса, рабочая точка программы установилась на начало программы (goto Start).

Один раз щелкните по кнопке пошагового исполнения программы.

В соответствии с исполненной командой goto Start, произойдет переход на начало ПП Start:

64

Щелкните еще раз.

Выделится строка следующей команды и т.д.

А теперь пощелкайте по "следам" (или понажимайте кнопку F7 клавиатуры, что одно и то же) "от души".

Вы увидите порядок исполнения программы.

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

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

Хоть сто раз подряд. Вы – "полный хозяин и диктуете свои условия".

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

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

Автоматический режим исполнения программы

Прежде чем работать в автоматическом режиме (в "автомате"), необходимо назначить точку

(точки) остановки.

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

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

Делается это так: щёлкните правой кнопкой мыши по строке подпрограммы Pause_2, например, с командой decfsz Sec,F (можно щёлкнуть по самой команде, можно по названию подпрограммы, а можно и по пустому месту, короче, в любом месте выбранной строки, до точки с запятой).

Появится окно со списком из четырех позиций:

Далее, левой кнопкой мыши, щёлкаете по самой верхней строке в этом списке (Break Point(s)

– назначение точки остановки).

65

Список "исчезнет", и все что находится в этой строке, выделится красным цветом ("индикатор" точки остановки).

Всё. Точка остановки выставлена, и Вы с комфортом можете ее наблюдать в тексте программы.

Сбросьте программу на начало (см. выше) и для того, чтобы запустить режим автоматического исполнения программы (берите на заметку), щёлкните по кнопке с зеленым светофором:

Запуск "автомата" можно произвести, если нажать на кнопку F9 клавиатуры.

На время отработки "автомата", самая нижняя строка окна MPLAB (в ее начале стоит Ln...) окрашивается в желтый цвет.

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

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

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

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

Потренируйтесь.

66

Несколько раз сбросьте и запустите автоматическое исполнение программы. Зачем этот "автомат" нужен? В чем преимущества?

Предположим, из всей программы, на данном этапе отладки, необходимо произвести отладку подпрограммы Pause_2.

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

Еще раз напоминаю, что в "автомате", программист не имеет возможности контролировать содержимое регистров. Эти "дела" делаются при пошаговом исполнении программы. Далее, можно капитально "просканировать" работу ПП Pause_2 в пошаговом режиме.

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

Снятие точки остановки.

В главном меню MPLAB, щелкните по слову Debug, а затем, в выпадающем списке, по строке Clear All Points (снять все точки остановки):

Появится окно с вопросом: "Вы действительно хотите удалить все точки остановки?" Щелкайте по Да.

После этого, со всех точек остановок снимается выделение красным цветом (точек остановок нет).

Еще один способ установки точек остановки:

Вглавном меню MPLAB, щёлкните по слову Debug, а затем по строке Break Settinds.

Откроется окно Break Point Settings.

Всписке этого окна, Вы увидите содержимое первого столбца текста программы, с которой происходит работа.

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

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

Вокне Break Point Settings, щёлкните по кнопке окошка Start.

Выпадет список. Щелкните, например, по строке Pause_1. Название Pause_1 "ушло" в окошко.

То же самое проделайте и с окошком End. Щелкните по кнопке Add.

В большом списке окна Break Point Settings появится строка с галочкой.

Если галочка установлена, то точка остановки активна, если не установлена, то пассивна.

67

Включение и выключение происходит при щелчке по квадратику с галочкой.

При снятии точек остановки (Debug Clear All Points), снимается только галочка. Чтобы, после этого, снова установить точку (точки) остановки, необходимо открыть окно Break Point Settings (см. выше) и установить в нем галочку (галочки).

Для того чтобы удалить строку с точкой остановки из большого списка, необходимо ее выделить, а затем щелкнуть по кнопке Remove.

Большой список может содержать несколько точек остановок (вплоть до суммарного количества подпрограмм и меток).

Кнопка с красным светофором (или клавиша F5 клавиатуры. Она ее дублирует) необходима для ручной остановки "автомата", и соответственно, пользоваться ей можно только в "автомате".

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

При работе в "автомате", если точек остановок не назначено, то в симуляторе "зависнет" любая программа.

Можете это проверить на практике, используя программу Multi.asm.

Работоспособная программа (или подпрограмма) может "зависнуть" в симуляторе, если ее

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

Такого рода имитация (MPLAB и это может) - предмет отдельного разговора, а пока просто примите сказанное к сведению.

Секундомер.

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

С учетом простоты этой программы, подобные расчеты, конечно же, можно произвести и на бумаге.

А если подпрограмма задержки имеет в своем составе "массивные врезки"? В этом случае, можно просто "утонуть" в громоздких и сложных расчетах.

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

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

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

Для вызова окна секундомера, нужно, в главном меню MPLAB, щёлкнуть по слову Window, а затем, в выпадающем списке, по строке Stopwatch.

Откроется окно Stopwatch. Это и есть секундомер:

В нем Вы увидите установленную ранее частоту кварца, кнопку Zero (сброс секундомера на ноль) и квадратик с надписью Clear On Reset, в котором можно либо поставить, либо не поставить галочку.

68

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

Лично у меня, она установлена, что советую и Вам. Сбросьте программу Multi.asm на начало.

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

Примечание: обозначение микросекунды выглядит как us потому, что в английском алфавите нет буквы "мю" (эта буква - греческая), а английская буква u наиболее к ней близка по написанию.

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

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

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

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

Сам по себе, этот процесс довольно-таки не сложен (нужно только "руку набить").

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

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

И т.д. Вариаций много.

Естественно, что в таких случаях, без "автомата" не обойтись.

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

Видеале, нужен комплексный подход.

"Самоучитель по программированию PIC контроллеров для начинающих" http://ikarab.narod.ru E-mail: karabea@lipetsk.ru

69

6. Что дальше?

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

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

Вдальнейшем это будет наверстано.

Если Вы хорошо потрудились, то к настоящему времени, у Вас должна сложиться более - менее целостная картина предмета обучения. Хотя бы в общем виде.

Внастоящее время, Ваши знания в области программирования ПИКов, вернее всего, технологичны и представляют собой набор достаточно разобщенных сведений.

Это вполне естественно и нормально.

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

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

Вэтом отношении, ничего лучшего, чем пример поэтапной разработки конкретного устройства на ПИКе, не существует.

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

Причем, это будет сделано нестандартно.

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

А ведь именно это и есть самое важное в процессе конструирования!!!

Мало того, я сознательно усложняю (для себя) задачу.

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

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

устройств является либо любимым занятием, либо жизненноважной необходимостью, либо и тем, и другим.

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

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

Я исхожу из того, что существуют устройства, которые совмещают в себе разнообразные базовые функции, и если на примере одного из таких устройств, подробно объяснить, как эти базовые функции реализуются на практике, то в процессе конструирования, такого рода знания могут быть использованы для решения широчайшего класса задач.

Вкачестве такого устройства я выбрал 3-х диапазонный частотомер с функцией цифровой шкалы.

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

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

На мой взгляд, это самый эффективный способ достижения поставленной цели.

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

70

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]