Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Самоучитель по программированию PIC контроллеров для начинающих. Система команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
Скачать 3.49 Mb.
|
SFR Откроется окно Function Register в котором Вы увидите эту настройку по умолчанию В основном , в регистры специального назначения записаны нули, за исключением 4- х регистров , строки которых окрашены в красный цвет Во всех битах регистра TrisB записаны единицы, следовательно, на момент начала исполнения программы, все выводы порта B "виртуального " ПИКа работают на вход Если эти состояния не изменить программными средствами (имеется ввиду и программа , с которой происходит работа, и, то они такими и останутся То же самое относится и к регистру TrisA С поправкой на то, что в трех его старших битах, по умолчанию, выставлены нули В регистре Option выставлены все единицы Чем руководствовались при этом разработчики, остается только гадать Это просто нужно "принять как данность ". В регистре Status , биты 3 и 4 установлены в 1, что соответствует, якобы, прохождению сброса по включению питания (якобы " потому, что ПИК "виртуальный "). Если сбросить программу на начало, тов окне Function Register ничего не изменится, за исключением того, что красное выделение пропадет 122 Из оставшихся настроек "по умолчанию ", прежде всего, необходимо обратить внимание на нули в регистрах PortA и PortB Ранее мы уже сталкивались стем, что из- за этого возникали затруднения (переход в "ненужный " сценарий работы программы) при отладке программы cus По этой же причине, они могут возникать и при отладках других программ Вывод из этого простой если в результате исполнении команд, обращающихся к регистрам PortA или PortB, возникнут затруднения с переходом в нужный сценарий работы программы, то необходимо открыть окно Function Register Window , посмотреть на содержимое этих регистров (на момент исполнения команды) и сделать соответствующие выводы. Что касается остальных регистров, то нужно учесть, что если к их содержимому, походу исполнения программы, не было обращений, тов них таки останутся нули (за исключением флагов. Примечание : это не относится к регистру PCL , так как его содержимое, походу исполнения программы, постоянно изменяется По ходу исполнения программы, содержимое задействованных в программе регистров специального назначения, естественно, будет изменяться Таким образом, можно отследить все изменения, происходящие сих содержимым При этом, строки, в которых находятся регистры, содержимое которых, в результате исполнения текущей команды, изменилось, выделяются красным цветом, что удобно сточки зрения акцентирования внимания на произошедших изменениях Так как содержимое регистров специального назначения удобнее всего воспринимать в бинарном виде, то окно Function Register может оказаться весьма полезным Но основным, "рабочим " окном является окно Register Window (кнопка. Оно удобно тем, что в нем можно "оптом " отследить все изменения, происходящие как с содержимым регистров специального назначения, таки с содержимым регистров общего назначения (контролируется вся область оперативной памяти. Если Вы сравните содержимое регистров специального назначения, расположенных в этом окне, с содержимым регистров специального назначения, расположенных в окне Special Function Register Window (с учетом перевода чисел из одной системы исчисления в другую ), то обнаружите полное соответствие, причем, в интервале времени от открытия проекта и до сброса программы на начало, содержимое указанных выше, 4- х регистров специального назначения, будет также выделено красным цветом (после сброса программы на начало, красное выделение снимается. Это полное соответствие наблюдается и по ходу исполнения программы Обычно , в течение основной части времени отслеживания работы программы, пользуются окном Register Window (оно более информативно, а окно Special Function Register открывают по мере необходимости (а можно открыть оба, и не закрывать их до конца работы. Неудобство применения окна Register связано стем, что названия регистров специального назначения в нем не указываются (указываются адреса, и это , на первых порах, может вызвать затруднения в ориентации , что совсем не "смертельно ". Держите перед глазами распечатку области оперативной памяти, и со временем, Вы просто запомните "где что лежит " ив дальнейшем, сможете обходиться без нее Что касается названий и адресов регистров общего назначения (их присваивает программист, то для каждой программы они различны В распечатке области оперативной памяти, эти названия можно вписать в соответствующие прямоугольники, и при возникновении необходимости в "привязке " содержимого регистров, к названиям регистров, просто свериться с этой распечаткой По ходу исполнения программы, содержимое таблицы окна Register Window , в части касающейся задействованных в программе регистров, будет меняться Если происходит изменение содержимого любого из этих регистров, то результат этого изменения выделяется красным цветом Если после исполнения следующей команды, изменения этого содержимого не происходит, то красный цвет меняется на синий 123 Таким образом, можно комфортно отследить изменения, происходящие в области оперативной памяти и их соответствие задуманному Так как в, содержимое регистров общего назначения нулевого банка дублируется ( отображается ) в первом банке, тона последние 4 строки таблицы окна Register можно не обращать внимания, а оставить только 1- ю строку 1- го банка (с регистрами специального назначения. Лично я, изменяю размер этого окна таким образом, чтобы нижняя граница окна MPLAB " наехала " на эти 4 строки окна Register и закрыла их Так оно занимает меньше места Что касается кнопки с очками , то "жать " на нее имеет смысл только в том случае, если необходимо отследить содержимое регистра (в других окнах, содержимое регистра W не отслеживается. В этом окне, конечно же, можно отследить содержимое и всех остальных регистров, но удобнее это сделать в окне File Register Window К помощи этой кнопки можно обратиться в случае , если необходимо сохранить содержимое выбранных из списка регистров (в тот или иной момент исполнения программы, в виде отдельного файла Может быть, для кого- то это и окажется полезным, но лично у меня , никогда не возникало такой потребности Если возникает потребность в отслеживании содержимого регистра, то он заносится в окно Watch (как это делается, описывалось ранее. Если предельно уменьшить размеры этого окна, то оно получается очень компактными "малогабаритным ". По этой причине, его можно один раз открыть и не закрывать до конца работы А теперь , на практике, отследим выполнение " учебно - тренировочной " программы cus Откройте любой из проектов cus_1 или cus_2 Сначала будем работать с отлаженной программой (команда PRD на nop не заменялась. Примечание для краткости, в дальнейшем , я буду заменять названия окон названиями кнопок, при помощи которых они открываются - Program Memory Window на, - File Register Window на, - Special Function Register Window на, - Watch - без изменения "Наводим порядок на рабочем месте ". Если "лист " текстового редактора раскрыт полностью, то уменьшите его размеры, отодвинув к центру правый и нижний срезы этого "листа " на 1 - 2 см В этом случае, всегда будут видны "краешки " других открываемых нами окон (если они неактивны и находятся за "листом " текстового редактора) и проблем сих "активацией " не будет ( просто так удобнее. Открываем окно RAM и перемещаем его в правый нижний угол окна MPLAB " Цепляемся " за верхний срез окна RAM и двигаем его вниз до тех пор, пока нижние 4 строки таблицы перестанут быть видны Создаем окно, "заложив " в него регистр W Размещаем это окно выше окна (нижний срез окна - "впритык " к верхнему срезу окна, и правый срез окна "двигаем вправо до упора ". Цепляемся " за верхний левый угол окна Watch и уменьшаем его размер до минимально возможного Получилось так 124 А можно итак Или так 125 Прожиточный минимум " выставлен Остальные окна можно открывать по мере необходимости Активация окон происходит обычным для Виндов способом, то есть, щелчком в любом месте окна Естественно , что детально отследить работу программы можно только при пошаговом ее исполнении Поэтому щелкаем по кнопке со следами или жмем сброс программы на начало. Для краткости, "привяжемся " к кнопке F7 клавиатуры Итак , жмем на F7 и переходим на первую команду ПП START То , что рабочая точка программы "встала " на команду IntCon , означает то, что исполнилась не эта команда, а предшествующая , то есть, команда START (та, что в "шапке " программы. Смотрим в окна RAM и Watch Изменилось только содержимое регистра с адресом 02h (содержимое выделилось красным цветом. Смотрим в распечатку области оперативной памяти поэтому адресу расположен счетчик команд (регистр, и его содержимое изменилось сна, то есть, произошел переход рабочей точки программы на вторую команду программы, а предшествующая ( первая ) команда была исполнена По причине того, что походу исполнения программы, содержимое регистра PCL последовательно изменяется, я не буду "заострять " Ваше внимание на его содержимом Регистр PCL задействуется всегда (при выполнении любой программы, и его содержимое всегда окрашено в красный цвет (сами ответьте на вопрос почему. Итак, исполнилась команда Смотрим в распечатку команд команда goto выполняется за 2 м ц . (можете вызвать секундомер и проверить ) и при этом, никаких операций с содержимым регистров не производится (эта команда не меняет их содержимого и на состояния флагов не влияет. Поэтому неудивительно, что кроме изменения показаний счетчика команд, никаких других изменений, в открытых нами окнах, не произошло Нажимая F7, выполняем команду Рабочая точка программы "перескочила " на команду clrwdt, и содержимое регистра, с 126 адресом 03h, окрасилось в красный цвет (изменение сна. Смотрим в распечатку области оперативной памяти Этот адрес имеет регистр Status Смотрим в распечатку команд При исполнении команды должен установиться флаг нулевого результата ( Z ), что и произошло Проверяем : 18h= 00011000 , Все правильно 2- й бит (или бит 2) регистра, с названием Z , установился в 1. Вопрос "Почему содержимое регистра (адрес 0Bh) не окрасилось в красный цвет, ведь сего содержимым производилась операция Ответ : потому , что в результате инициализации "виртуального " ПИКа (по умолчанию, в этом регистре "выставлен " 0, а при сбросе нуля в ноль получается ноль Это называется подтверждением ранее установленного состояния То есть, в конечном итоге, изменения содержимого регистра IntCon не произошло, а значит и выделения красным цветом не будет Нажимая на, выполняем команду clrwdt Ничего не изменилось, кроме показания счетчика команд Эта команда управляет аппаратной "начинкой " ПИКа, а если конкретно, то сторожевым таймером, и устанавливает (в единицы) биты (флаги) регистра с названиями -TO и -PD (см распечатку команд. Но эта установка уже была произведена ранее По умолчанию То есть, ив этом случае, имеет место быть подтверждение ранее установленного состояния Выполняем команду (далее, это словосочетание означает нажатие / отжатие F7 ) bsf Содержимое регистра Status изменилось сна. Все правильно в 5- м бите регистра (выбор банка) установилась 1 (выбор 1- го банка. Выполняем команду .65 Теперь " покраснела " строка в окне Watch То есть, произошла запись числа .65 в аккумулятор (в регистр. Переводим десятичное число .65 в 16- ричное и получаем 41h. Сверяемся это число и записалось (правда, буквы h нет, но она подразумевается. Выполняем команду TrisB " Покраснело " содержимое регистра TrisB, и в него , из регистра, скопировалось (именно скопировалось , а не вырезалось см регистр) число 41h. Переводим число 41h в бинарную форму Получается 01000001 Все правильно 0- й и 6- й биты установлены в 1 ( выводы RB0 и RB6 работают "на вход ", а остальные , "на выход "). Следующие две команды выполняются аналогично, только число .143 копируется , из регистра W, в регистр OptionR Убедитесь в правильности их выполнения самостоятельно Так же самостоятельно убедитесь в том , что после исполнения команды в 5- м бите регистра 1 сменилась на 0 (выбор 0- го банка. С учетом этого, проверка исполнения следующих 4- х команд не должна вызвать у Вас затруднений Разница только в том , что константы (через) записываются не в регистры специального назначения, а в регистры общего назначения (и, адреса которых (0Dh и 0Eh) Вы найдете в "шапке " программы В ходе исполнения этой группы команд, Вы увидите, что содержимое регистра (адрес) изменится, и далее , походу исполнения программы, в нем будет что- то подсчитываться Хотя , в данном случае, то что он считает, "по барабану " (в программе не задействован, нос познавательной точки зрения, разобраться с этим стОит Настройки TMR0 производятся с помощью битов регистра OptionR В него мы записали число .143 ( 10001111) 5- й бит этого регистра установлен в 0, следовательно, на вход TMR0 подан внутренний тактовый сигнал (называется. То есть, будет считать количество машинных циклов На работу программы cus это никоим образом не влияет, но если кому- то из Вас не нравится "лишняя точка отвлечения внимания ", то от входа, можно отключить сигнал внутреннего такта и подключить вход TMR0 к внешнему такту, то есть, к выводу RA4/TOCKI 127 В данном случае, к выводу RA4/TOCKI , источник внешнего такта не подключен А раз это тактов нули, и его содержимое, походу исполнения программы, меняться не будет (можете проверить. Для того чтобы это сделать, в команде movlw нужно заменить константу .143 на константу .175 Почему .175 ? Ответьте на этот вопрос самостоятельно Если Вы внесли, в текст программы, это изменение, то естественно, что после этого необходимо произвести ассемблирование и снова исполнить программу так, как описано выше А еще лучше произвести ассемблирование , после чего закрыть проект (с сохранением изменений, затем вновь открыть этот проект, и только после этого снова исполнить программу так, как описано выше Именно в последнем случае Вы увидите, в регистре TMR0, нули , а в первом случаев нем может зафиксироваться число, отличное от нуля (результат предшествующего " гуляния " рабочей точки по программе. Такого рода "хождения по мукам " полезны тем, что помогают понять следующее настройкой "виртуального" ПИКа, по умолчанию, является настройка MPLAB на момент открытия проекта, а не настройка по сбросу программы на начало, после того, как рабочая точка программы "погуляла " по программе Работаем дальше "Упираемся " в команду btfsc PortB,0 Команда btfsc является командой ветвления, следовательно, нужно определиться, по какому из двух сценариев исполнения программы двигаться далее То есть, нужно посмотреть, в каком состоянии, перед исполнением этой команды, находится бит регистра PortB Для этого нужно открыть окно, найти в нем регистр PortB и посмотреть на состояние этого бита В данном случае, по умолчанию, он установлен в 0 (функции стимула не используются. После этого, окно SFR можно закрыть (а можно и оставить Это кому как нравится. Вывод : после исполнения команды PortB,0 , "ухода в вечное кольцо " ПП START не произойдет То есть, после исполнения команды PortB,0 , будет исполнена команда Входе работы по отслеживанию правильности исполнения программы, программист может проверить как правильность исполнения этого сценария, таки правильность исполнения другого сценария В идеале , нужно "прогнать " рабочую точку программы по всем сценариям программы Предположим , что необходимо проверить правильность исполнения указанного выше сценария То есть, ноль, в нулевом бите регистра, который MPLAB выставила по умолчанию, в данном случае, устраивает Выполняем команду Рабочая точка программы переместилась на команду Смотрим в окно RAM Изменений нет (кроме, так как значение нулевого бита считывалось, а не записывалось. Перед выполнением команды ветвления PortB,6 , необходимо произвести проверку, аналогичную описанной выше После этого, выясняется следующее с учетом текущего значения |