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