Файл: Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 16.06.2025

Просмотров: 3631

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

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

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

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

Вы получите сообщение о безошибочном ассемблировании. Еще один случай.

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

Вы получите сообщение о 2-х ошибках: грамматическая ошибка в слове команды и ошибка в подпрограмме Pause_1 (в которой находится ошибочная команда).

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

57

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

Например, Вы забыли указать номер бита, к которому обращается бит-ориентированная команда BCF при формировании нулевого уровня на выводе RB0, и вместо bcf PortB,0 "настучали" bcf PortB.

Введите эту ошибку в текст программы и проассемблируйте его.

Вы получите сообщение об ошибке типа: в функции отсутствует аргумент (то есть, чего-то не хватает).

Устраните ошибку и проассемблируйте текст программы. Вы получите сообщение о безошибочном ассемблировании.

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

В случаях отсутствия ошибок, цвет полосы не меняется и после завершения процесса ассемблирования, остается зеленым.

Можно привести еще множество подобного рода примеров.

Если есть желание, то самостоятельно введите другие ошибки и посмотрите, какие сообщения Вам выдаст MPLAB.

Не забывайте только потом исправлять их.

Смысл сказанного выше: если в тексте программы допущена ошибка, то после завершения процесса ассемблирования, MPLAB укажет на нее и подскажет тип ошибки. Устранением ошибок MPLAB не занимается, это личное дело программиста

Обращаю Ваше внимание на следующее: MPLAB не всесилен.

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

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

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

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

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

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

Пока мы занимаемся только "технологией", так как без нее невозможна реализация любого

58


замысла.

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

Разбираемся с симулятором

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

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

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

Если реальный ПИК нужно "прошить" в программаторе, то "виртуальный" ПИК "прошивается" автоматически. При ассемблировании.

И какого-то внешнего устройства, типа программатора, для этого не нужно.

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

Внем можно сымитировать и внешнее воздействие.

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

Короче, "палочка - выручалочка".

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

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

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

Давайте заглянем в "начинку" "виртуального" PIC16F84A.

Программа Multi.asm проассемблирована. Это означает то, что в "виртуальный" ПИК уже "зашита" программа Multi и с ней можно работать в симуляторе.

Обратите внимание на группу из 4-х кнопок в правой части строки с пиктограммами.

Это кнопки с надписями ROM, RAM, SFR и кнопка с нарисованными на ней очками.

Если проект Multi у Вас не открыт, то откройте его.

Ассемблирования производить не нужно (если последнее ассемблирование было безошибочным и после него в текст программы не вносились изменения. Если это не так, то проассемблируйте текст программы, можно даже по принципу: "на всякий случай"). Щелкните по кнопке ROM. Откроется окно Program Memory Window (содержимое памяти программ).

59


В нем:

1-й столбец: номера ячеек памяти программ, в 10-чной системе исчисления. 2-й столбец: адреса ячеек памяти программ, в 16-ричной системе исчисления.

3-й столбец: пока (да и потом тоже) нам не нужен. Не обращайте на него внимания. 4-й, 5-й и 6-й столбцы: собственно говоря, сама программа в "чистом" виде (полное

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

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

Хотя, в рабочей части программы Multi.asm, директивы и не используются, но напомнить об этом не лишне.

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

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

В окне ROM, можно определить, какое именно количество ячеек памяти программ занимает программа (в данном случае, 20) и каков объем памяти программ используемого ПИКа (в данном случае, 1024 ячейки).

Закройте окно Program Memory Window.

Щелкните по кнопке RAM.

Откроется окно File Register Window.

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

Сравните эту распечатку (с учетом того, что в распечатке указаны не все регистры общего назначения) с содержимым окна File Register Window.

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

Используя окно File Register Window и распечатку области оперативной памяти (в комплексе), Вы можете свободно ориентироваться в области оперативной памяти. Например, сверяясь с распечаткой области оперативной памяти, в окне File Register Window, Вы сможете увидеть "числовую начинку" любого из регистров области оперативной

60


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

Напоминаю, что все регистры, находящиеся в области оперативной памяти, 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