Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Самоучитель по программированию PIC контроллеров для начинающих. Система команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
![]()
|
MPLAB "ушел в отказ "). 57 Если Вы сделаете двойной щелчок по строке с ошибкой , то курсор покажет Вам эту строку в тексте программы Так как ошибка заключается в том , что после блокировки, регистр Sec перестал быть "прописанным " в "шапке " программы, то ошибочными будут считаться все строки программы, в которых упоминается регистр Sec Это и есть объяснение того, что в данном случае, количество ошибок равно четырем Уберите точку с запятой перед регистром Sec и после этого, еще раз проассемблируйте текст программы Вы получите сообщение о безошибочном ассемблировании Еще один случай Предположим , что Вы ошиблись при наборе текста программы и вместо команды (в подпрограмме) "настучали " decfsx (нажали, соседнюю с z, кнопку клавиатуры. Введите эту ошибку и затем проассемблируйте текст программы Вы получите сообщение о 2- х ошибках : грамматическая ошибка в слове команды и ошибка в подпрограмме Pause_1 (в которой находится ошибочная команда. Пощелкайте по сообщениям об ошибках, и Вы увидите, что в первом случае, MPLAB покажет на строку с ошибочной командой, а во втором случае, на строку, в которой находится название подпрограммы 58 Исправьте эту ошибку и проассемблируйте текст программы Вы получите сообщение о безошибочном ассемблировании Третий случай Например , Вы забыли указать номер бита, к которому обращается бит- ориентированная команда BCF при формировании нулевого уровня на выводе, и вместо bcf настучали " bcf Введите эту ошибку в текст программы и проассемблируйте его Вы получите сообщение об ошибке типа в функции отсутствует аргумент (то есть, чего- тоне хватает. Устраните ошибку и проассемблируйте текст программы Вы получите сообщение о безошибочном ассемблировании При проведении такого рода "экспериментов ", обратите внимание на изменение цвета полосы загрузочного индикатора, в конце процесса ассемблирования , с зеленого (все в норме ) на красный (в случаях наличия хотя бы одной ошибки. В случаях отсутствия ошибок, цвет полосы не меняется и после завершения процесса ассемблирования , остается зеленым Можно привести еще множество подобного рода примеров Если есть желание, то самостоятельно введите другие ошибки и посмотрите , какие сообщения Вам выдаст MPLAB Не забывайте только потом исправлять их Смысл сказанного выше : если в тексте программы допущена ошибка, то после завершения процесса ассемблирования , укажет на нее и подскажет тип ошибки. Устранением ошибок MPLAB не занимается, это личное дело программиста Обращаю Ваше внимание наследующее не всесилен Он не может обнаружить ошибки, связанные с неправильным замыслом программы и стратегией ее построения (функциональные ошибки. Это дело программиста MPLAB контролирует только "технологию " текста программы наличие или отсутствие грамматических ошибок, соблюдение или нет синтаксических правил написания программы, правил переходов, указания аргументов и т д Сообщение об отсутствии ошибок означает только соблюдение этих " технологических " правили не является гарантией реализации замыслов программиста По той простой причине, что "технология " может быть соблюдена, но при этом, замысел программы может быть "кривым " (наличие функциональных ошибок. Пример функциональной ошибки "несанкционированный уход " рабочей точки программы в "вечное кольцо ", без возможности из него выйти (зависание "глюк "). Таким образом, для того чтобы создать "полноценную ", рабочую программу, программист должен реализовать "жизнеспособный ", стратегическо - тактический замысел программы, при условии соблюдения всех "технологических " правил ее составления Пока мы занимаемся только "технологией ", так как без нее невозможна реализация любого 59 замысла Если кто- то из Вас "рвется в бой " (в смысле желания побыстрее перейти к творчеству ), то советую "обуздать свои порывы " и заняться , пусть и не самой интересной, но абсолютно необходимой, рутинной работой, а иначе Вам гарантирован повышенный процент неудач Разбираемся с симулятором Прежде всего, симулятор позволяет заглянуть в "начинку " ПИКа и увидеть , что там происходит при выполнении команд программы При этом следует четко осознавать, что программист будет видеть "начинку " нереального ПИКа, а того "виртуального " (как бы, "идеального ") ПИКа, который создается в (в ее симуляторе ). Если выбран, то Вашему вниманию и будет предоставлена "начинка " виртуального " PIC16F84A , работающая по всем законам реального PIC16F84A Если реальный ПИК нужно "прошить " в программаторе , то "виртуальный " ПИК "прошивается " автоматически При ассемблировании И какого - то внешнего устройства, типа программатора, для этого ненужно Всимуляторе, имитируется вся "начинка " ПИКа, с наглядным показом того, что в ней происходит походу отработки программы В нем можно сымитировать и внешнее воздействие Это позволяет обнаруживать и устранять ошибки (в том числе и функциональные ), а также производить отладку как составных частей программы, таки всей программы Короче , "палочка - выручалочка ". Таким образом, сначала решаются "технологические " задачи, а когда они решены ( сообщение о безошибочном ассемблировании ), программист, с помощью симулятора , может проверить соответствие замысла программы тому, что желаемо Если с этим все в порядке , то можно произвести отладку ее характеристик (например, временных Если это необходимо. В подавляющем большинстве случаев, программа, прошедшая через "горнило " симулятора (" прогнанная " через него во всех возможных режимах, будет нормально работать ив реальном ПИКе Давайте заглянем в "начинку " "виртуального " PIC16F84A Программа Multi.asm проассемблирована Это означает то, что в "виртуальный " ПИК уже "зашита " программа Multi и с ней можно работать в симуляторе Обратите внимание на группу из 4- х кнопок в правой части строки с пиктограммами Это кнопки с надписями ROM, RAM, и кнопка с нарисованными на ней очками Если проект Multi у Вас не открыт, то откройте его Ассемблирования производить ненужно (если последнее ассемблирование было безошибочными после него в текст программы не вносились изменения Если это не так, то проассемблируйте текст программы, можно даже по принципу "на всякий случай "). Щелкните по кнопке ROM Откроется окно Memory Window (содержимое памяти программ 60 В нем : й столбец : номера ячеек памяти программ, в 10- чной системе исчисления 2- й столбец : адреса ячеек памяти программ, в 16- ричной системе исчисления 3- й столбец : пока (да и потом тоже) нам ненужен Не обращайте на него внимания 4- й , й и й столбцы : собственно говоря, сама программа в "чистом " виде (полное разложение на команды, то есть, без всего того, что расположено правее точек с запятой То , что Вы видите, есть содержимое памяти программ, с указанием адресов и порядковых номеров команд рабочей части программы Напоминаю , что в части касающейся директив, исполняемых в рабочей части программы, в память программ "закладываются " не они, а их разложения на команды Хотя , в рабочей части программы, директивы и не используются, но напомнить об этом нелишне Пояснение:в память программ ПИКов "закладываются " не команды на языке ассемблера машинные коды этих команд И слава Богу , что "ограждает нас от этой напасти "... После "прошивки " реального PIC16F84A, в его памяти программ, именно по этим адресами в такой же последовательности (по направлению сверху вниз, будут располагаться машинные коды команд программы Multi.asm В окне ROM , можно определить, какое именно количество ячеек памяти программ занимает программа (в данном случае, 20) и каков объем памяти программ используемого ПИКа (в данном случае, 1024 ячейки. Закройте окно Memory Щелкните по кнопке RAM Откроется окно Register Window В нем Вы видите область оперативной памяти По образу и подобию , имеющейся у Вас , распечатки области оперативной памяти Сравните эту распечатку (с учетом того, что в распечатке указаны не все регистры общего назначения) с содержимым окна Register В "глобальном смысле ", Вы увидите примерно одинаковую картину, только с различными , взаимно дополняющими друг друга, "формами наполнения ". Используя окно Register и распечатку области оперативной памяти (в комплексе, Вы можете свободно ориентироваться в области оперативной памяти Например , сверяясь с распечаткой области оперативной памяти, в окне File Register Вы сможете увидеть "числовую начинку " любого из регистров области оперативной 61 памяти Причем , по состоянию на момент завершения исполнения любой команды программы (!!!). Напоминаю, что все регистры, находящиеся в области оперативной памяти, 8- битные , и поэтому они работают в числовом диапазоне от 00h до FFh (от .0 до .255). В окне File Register Window , содержимое всех регистров отображается только в 16- ричной форме исчисления Таким образом, в окне Register Window , можно отслеживать изменения содержимого всех регистров области оперативной памяти. Обратите внимание наследующую особенность если после исполнения той или иной команды, произошло изменение содержимого того или иного регистра, то до момента исполнения следующей команды программы, это содержимое будет выделено красным цветом. Если таких изменений не происходит, то оно (содержимое) будет выделено синим цветом Таким образом, при пошаговом исполнении программы (об этом, позже, четко видно, содержимое какого именно регистра изменилось и как именно (в числовом эквиваленте ") оно изменилось Пример : в регистр, расположенный в области оперативной памяти, например, по адресу 0 С h, командой Sec , из регистра, копируется заранее заложенная в него (в) константа, например .100. Пусть до момента исполнения команды Sec , в регистре Sec "лежало ", например, число 0 (напоминаю, что любое число, до 9- ти включительно, можно указывать в команде без атрибутов систем исчисления. При этом, в окне File Register Вы увидите - До выполнения команды Sec , в ячейке области оперативной памяти с адресом 0Ch, будет "лежать " число 00, выделенное синим цветом В момент исполнения этой команды, число 00 заменится на число 64, которое будет выделено красным цветом (произошло изменение. - Если, после этого, следующая команда программы не производит изменения содержимого регистра, то после выполнения этой команды, число 64 изменит свой цвет с красного на синий Почему 64, а не 100? Вот Вам и типичный пример перевода чисел из одной системы исчисления в другую ( из 10- чной в 16- ричную и наоборот ). Откройте, имеющуюся у Вас , таблицу перевода чисел из одной системы исчисления в другую и убедитесь , что числу .100 (10- чная система исчисления) соответствует число 64h (16- ричная система исчисления. Если Вы хотите устранить этот "разнобой ", тов командах программы, применяйте числа в- ричной системе исчисления Это кому как удобнее Закройте окно Register Щелкните по кнопке SFR Откроется окно Function Register Window 62 Если в предыдущем окне Вы видели содержимое всех регистров области оперативной памяти, в 16- ричной системе исчисления, тов этом окне Вы видите содержимое только регистров специального назначения, в трех системах исчисления Окно Special Function Regisrer можно использовать в качестве конвертора систем исчисления В приложении к числам , зафиксировавшимся в регистрах специального назначения, на томили ином этапе пошагового исполнения программы Причем , для всех сразу Для начинающих, это окно может быть "палочкой - выручалочкой ". Программисты, которые "набили себе руку ", этим окном пользуются нечасто Восновном, они работают в окне File Register Выделение цветом, описанное выше, работает также ив окне Function Register Window. Закройте окно Function Register Щелкните по кнопке с нарисованными на ней очками Откроется окно Watch Если программист хочет выборочно видеть содержимое только тех регистров, которые его интересуют, то это как раз тот случай В окне Add Watch Вы увидите список регистров специального назначения и "прописанных " регистров общего назначения, плюс регистр W Названия регистров расположены в алфавитном порядке Например , нас интересует содержимое регистра PortB Для этого, в списке , нужно найти название регистра PortB и щелкнуть по строке с этим названием После этого кнопка (добавить) активизируется Затем , нужно щелкнуть по этой кнопке, а затем - по кнопке Close Окно Add Watch закроется, и Вы увидите, что в окне Watch (перед этим, оно было на заднем плане) "появятся начинка " регистра 63 Таким образом, пожеланию программиста, в окне Watch, можно сформировать список из любого количества задействованных в программе регистров (с целью дальнейшего контроля за их содержимым. Обратите внимание на то, что содержимое регистра W можно увидеть только в окне Watch ( естественно , после его выбора и добавления в рабочий список. В окне Watch , содержимое регистров отображается только в 16- ричной форме исчисления Выделение цветом (см выше) также работает Лично я, жму на кнопку с очками только в том случае, если мне нужно увидеть содержимое регистра W Содержимое остальных регистров можно увидеть в окне File Register Вы можете работать по- другому Это личный выбор программиста Зависит от привычки При закрытии окна, "программа спросит ", нужно или ненужно сохранить файл сданными этого окна Жмите на No Проще еще раз выбрать то, что нужно, чем "возиться " с открытием этого файла Режимы работы симулятора . Точки остановок. В симуляторе , исполнение программы осуществляется водном из двухосновных режимов - в режиме пошагового исполнения программы, - режиме автоматического исполнения программы . Органы управления Откройте проект Multi и обратите внимание на отдельную группу из 5- ти пиктограмм, с красным и зеленым светофорами Четвертую слева пиктограмму (следы с желто - оранжевой полосой) можно проигнорировать ( без нее вполне можно обойтись. Остаются 4 кнопки (пиктограммы. В большинстве случаев, отладка программы начинается с команды goto Start (нулевой адрес в памяти программ, иона происходит последовательно Это означает то, что в большинстве случаев (ноне во всех, нежелательно начинать отладку ( исполнение программы, например, с середины (условно) программы Почему ? Потому, что не будет отработана та часть программы, которая должна быть отработана "до того " (в ней могут формироваться данные, влияющие на ход дальнейшего исполнения программы, и по этой причине, можно банально "проколоться ". Чтобы не случилось этого "конфуза ", до этой "середины " необходимо сначала "дойти ", то есть, полноценно исполнить все предшествующие команды программы В частности , для этого и нужны режимы пошагового и автоматического исполнения программы Эти рассуждения относятся к случаям , когда нужно произвести отладку подпрограммы (или группы подпрограмм, находящейся внутри программы и "привязанной " к результату работы предшествующей части программы Такая "привязка " может быть, а может и не быть Если такая "привязка " есть, то см выше, а если ее нетто можно сразу, без отработки предшествующей части программы, "прыгать " на начало исполнения той подпрограммы, работу которой нужно отследить При этом применяется то, что я называю "уловками ", и о которых я расскажу позднее Для установки рабочей точки программы на начало программы (на команду Start ), 64 используется крайняя правая кнопка указанной выше группы пиктограмм Я , честно говоря, должным образом не оценил "глубинного смысла " того, что нарисовано на этой кнопке, и поэтому я буду ее называть кнопкой сброса программы на начало Щелкните по этой кнопке (или нажмите клавишу F6 клавиатуры Она дублирует эту кнопку. После этого, Вы увидите, что строка с командой goto Start , которая "дислоцируется " в конце "шапки " программы, выделится Обращаю Ваше внимание на то, что эта выделенная команда занимает нулевой адрес в памяти программ, в чем Вы можете убедиться, щелкнув по кнопке (пиктограмме) После этого, в окне Program Memory Window , Вы увидите, что строка, с командой goto Start, тоже выделилась Возьмите это на заметку и закройте окно Memory При нажатии на кнопку сброса программы на начало, Вы всегда будете наблюдать такую же "картину ". Больше эта кнопка ничего "делать не может ". Итак, мы "встали " на начало программы и теперь , в симуляторе , ее необходимо исполнить Исполнить программу можно или в пошаговом , или в автоматическом режиме (на выбор. Пошаговый режим исполнения программы применяется в тех случаях, когда нужно |