Главная страница
Навигация по странице:

  • Break Settings

  • START , либо вППPRD

  • ) "внутри"

  • START , нов результате следующей проверки, она обязательно "уйдет ввечное кольцо " ППPRD

  • " на команде, означает, что исполнилась предыдущая команда, а команда, на которой "

  • Debug

  • Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Самоучитель по программированию PIC контроллеров для начинающих. Система команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.


    Скачать 3.49 Mb.
    НазваниеСистема команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
    АнкорСамоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008).pdf
    Дата30.01.2017
    Размер3.49 Mb.
    Формат файлаpdf
    Имя файлаСамоучитель по программированию PIC контроллеров для начинающих .pdf
    ТипПрограмма
    #1195
    КатегорияПромышленность. Энергетика
    страница21 из 57
    1   ...   17   18   19   20   21   22   23   24   ...   57
    ?
    Для того чтобы не было проблем с
    назначением точек остановок, программист должен либо "свободно ориентироваться " в
    тексте программы, либо, как минимум, знать все "ключевые точки " этой программы
    Для программы, такими "ключевыми точками " являются команды PortB,2

    (начало формирования отрицательного полупериода) и PortB,2

    (начало формирования положительного полупериода.
    Примечание
    :
    еще одна команда PortB,2

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

    110
    Напоминаю
    Вам
    , что в
    обучающих целях, предполагается, что программа
    cus
    составляется "с чистого листа ". То есть, в
    регистр
    Sec
    , в
    обоих случаях (как при формировании отрицательного, таки при формировании положительного полупериодов, записываются ранее рассчитанные константы (грубо "), и
    NOP
    ы "точной " калибровки отсутствуют
    Сделаем так сначала, для уяснения "технологии " замеров, будем работать с
    полностью отработанным текстом программы, а
    затем
    , для иллюстрации процесса отладки, соответствующим образом изменим текст программы (
    уберем
    NOP
    ы и
    заменим значения констант на расчетные) и
    произведем
    , после этого, ее отладку
    Обратите внимание на то, что "ключевые команды " не являются первыми командами ни одной из подпрограмм, и
    они не помечены (меток нет. Следовательно, назначить их точками остановок, в
    окне
    Break Settings
    (вспоминайте
    Debug
    Break Settings...
    ) не получится (можете заглянуть в
    это окно и
    убедитесь в
    этом
    ). Таким образом, точки остановок будем назначать, щелкая по строкам с
    этими командами (кто забыл вернитесь назад и
    прочитайте
    , как это делается. Перед замером, все команды программы, находящиеся в
    тексте программы до первой точки остановки (верхней, желательно исполнить
    Итак
    , первую (верхнюю) точку остановки нужно выставить на команде Выставляем ее, щелкнув правой кнопкой мыши по строке с
    этой командой и
    выбрав
    , в
    выпадающем списке,
    Break
    : Содержимое строки окрасилась в
    красный цвет, и
    теперь видно, что эта команда является точкой остановки
    Теперь нужно "добраться " до этой команды, что предполагает исполнение всех предшествующих команд программы, начиная с
    первой команды
    ПП
    START
    Можно сделать это и
    вручную
    , щелкнув по кнопке сброса программы на начало, а
    затем
    , щелкая по кнопке со следами, а
    можно "добраться " до этой команды ив "автомате ", что гораздо быстрее
    Сделаем последнее Щелкаем по кнопке сброса программы на начало, после чего
    Вы увидите, что рабочая точка программы перешла на ее начало (
    goto START
    ). Вызываем окно секундомера (
    Window - Stopwatch
    ). Убедитесь, что в
    квадратике
    Clear On Reset
    , галочка установлена
    Секундомер должен показывать нули
    Щелкнув по кнопке с
    зеленым светофором, запускаем "автомат " (автоматическое исполнение программы.
    В
    идеале
    , через некоторое время, рабочая точка программы должна остановиться на назначенной нами точке остановки
    Во время отработки "автомата ", внизу окна
    MPLAB,
    должна высветиться желтая полоса, которая исчезнет в
    момент перехода рабочей точки программы на команду, назначенную точкой остановки (вернее, точкой конца замера.
    В
    данном случае, этого не происходит желтая полоса будет высвечиваться постоянно и
    также постоянно показания секундомера будут увеличиваться

    111 Можете даже и
    не надеяться на остановку, так как программа "зависла" в симуляторе
    То есть, рабочая точка программы "гоняет в
    ней по кольцу " и
    не может из него выйти, а
    соответственно
    , и "дойти " до точки остановки
    Так что, не все в
    этом деле так просто
    Давайте разбираться
    Вопрос
    : Каким образом преодолеть это затруднение и
    добраться до точки остановки "? Для этого, прежде всего, необходимо ответить на вопрос "Если программа обеспечивает нормальную работу реального устройства, то по каким ехидным причинам она зависла в
    симуляторе
    ?"
    Ответ
    :
    причина простая не сымитированы внешние воздействия
    То есть, либо на входе управления, либо на входе управления, либо в
    комплексе
    , установлен такой уровень (уровни, который "заводит " рабочую точку программы в "вечное кольцо " (либо в
    ПП
    START
    , либо в
    ПП
    PRD
    ). Поочередно пощелкайте по кнопкам с
    зеленым и
    красным светофором, ив большинстве случаев, Вы обнаружите остановившуюся рабочую точку программы (после щелчков по красному светофору) в
    подпрограмме
    PRD
    Вот
    Вам и
    то "место " программы, в
    котором рабочая точка "ушла в
    вечное кольцо ". Логически рассуждая далее, можно "вычислить " причину этого "конфуза ". Кстати, это архиполезно
    Кто желает, тот может это сделать прямо сейчас, "отложив дальнейшее чтение в
    сторону ". Причину, по которой рабочая точка программы "не может добраться " до точки остановки, можно обнаружить очень просто, даже не прибегая к
    приведенным выше рассуждениям
    Сбросьте программу на начало и
    перейдите к
    пошаговому ее исполнению
    То есть, пощелкайте по кнопке со следами (или по
    F7
    на клавиатуре. Одновременно следите за движением рабочей точки (то есть, за исполнением программы) в
    текстовом редакторе
    MPLAB
    Через несколько щелчков, Вы заметите, что после исполнения команды PRD
    , рабочая точка программы "улетит " в
    ПП
    PRD
    , в
    которой и "уйдет в
    вечное кольцо ". Такое может быть только в
    единственном случае когда на выводе
    RB6
    установлен
    0. Имейте ввиду мы работаем нес реальным (физическим) устройством, ас виртуальным. То есть, стем, что создано (
    просимулировано
    ) "внутри"
    MPLAB
    . Следовательно, "корень зла " нужно искать в
    симуляторе
    Давайте посмотрим, что, по умолчанию, выставлено симулятором на выводах порта
    В
    Сбросьте программу на начало
    Щелкните по кнопке
    SFR
    В
    окне
    Special Function Register обратите внимание на содержимое регистра
    PotrB
    по умолчанию выставлены все нули (это же относится и
    к
    PortA
    ).

    112
    И
    сразу же все "становится на свои места ": если 0- й
    и
    6- й
    биты регистра
    PortB
    равны
    0, то рабочая точка программы должна "проскочить " первую проверку (передача вкл
    /
    выкл
    ), не "
    закольцевавшись " в
    ПП
    START
    , нов результате следующей проверки, она обязательно "уйдет в
    вечное кольцо "
    ПП
    PRD
    , где и
    будет "гонять по кольцу до скончания века ", что мы и
    наблюдали
    Напрашивается естественный вывод необходимо каким- то образом, в 6- м
    бите регистра
    PortB,
    выставить единицу, и
    тогда все будет в
    порядке
    В
    MPLAB
    это вполне можно сделать, если задействовать так называемые функции стимула
    (
    асинхронный стимул, стимул порта ввода- вывода и
    стимул регистра
    На выбор. Это "вещь " конечно хорошая, ив будущем, я
    постараюсь объяснить, что это такое, но если сейчас я
    буду "
    забивать
    Вам этим голову ", то опасаюсь, что
    Вы просто запутаетесь и "отклонитесь от генеральной линии ", что совсем не есть хорошо
    Поступлю проще и
    эффективнее
    Помните
    , я
    ранее говорило том, что при работе в
    симуляторе
    , существуют некоторые
    "
    уловки
    "
    ? Они "обманывают " в том смысле, что позволяют обойтись без задействования функций стимула (подменяют " их.
    В
    данном случае (всяческих "уловок " много, команда, с
    которой начинается "бардак ", из текста программы исключается (блокируется. На практике, это делается так
    Проблемы создает команда Именно она направляет рабочую точку программы в "вечное кольцо ". Заменяем эту команду на команду
    nop
    Так как позднее, команду нужно будет опять "вернуть на свое место " (а, соответственно, убрать, то удобнее это сделать так непосредственно перед командой нужно поставить точку с
    запятой
    (после этого
    MPLAB
    перестает "видеть " эту команду) и
    пробелами сместить всю строку вправо (в "район " комментария, освободив "место " для команды, после чего, в
    том "месте ", где ранее "дислоцировалась " команда PRD

    , нужно "настучать " команду Позднее, все- равно "заставит " Вас проассемблировать текст программы, так что лучше сразу же после внесения изменения (любого) в
    текст программы (а мы его внесли, произвести ассемблирование
    Заодно
    , можно убедиться в
    отсутствии ошибок (Вы получите сообщение о
    безошибочном ассемблировании
    ).
    Внимание
    :
    после ассемблирования
    , точки остановки снимаются и
    их нужно переназначить (назначить по- новой. Что получилось
    А
    получилось то, что после выполнения команды PortB,6

    , рабочая точка программы, через
    , "встанет " на команду PortB,2
    , и
    ее "ухода, в
    вечное кольцо "
    ПП
    PRD,
    не

    113 произойдет
    А
    раз это так, то можно без проблем "добраться " до назначенной точки остановки
    Далее
    , возникает вопрос "Если команда
    goto
    исключена из текста программы, тоне отразится ли это назначениях калиброванных интервалов времени полупериодов"
    Ответ
    :
    в данном случае, не отразится
    Объяснение
    :
    не смотря на то, что 6- й
    бит регистра
    PortB
    установлен в 0, реально исполняется (имитируется) сценарий работы, для случая установки 6- го бита регистра
    PortB
    в
    1. Ив самом деле, рабочая точка программы переходит на команду через, но только этот
    nop
    не "виртуальный " (см объяснение работы команд ветвления, которое было дано ранее, а
    реальный
    Проще говоря, "виртуальный " заменен на реальный (что в
    лоб
    , что полбу, все едино "). Теперь можно, без проблем, "добраться " до назначенной точки остановки, как в "автомате ", таки пошагово исполняя программу (добираться " совсем недолго. Например, в "автомате ": сбросьте программу на начало и
    щелкните по кнопке с
    зеленым светофором
    После отработки "автомата ", Вы увидите, что рабочая точка программы "встала " на назначенную точку остановки (
    bcf PortB,2
    ), что и
    требуется
    : Итак, мы "вышли " на начало замера
    Посмотрите на показания секундомера
    Вы видите количество машинных циклов, отработанных от начала программы и
    до установки рабочей точки программы на верхнюю точку остановки (точку начала замера) и
    их перевод вовремя Теперь понаблюдайте, что происходит при пошаговом исполнении программы сбросьте программу на начало и
    пощелкайте по кнопке со следами или по клавише
    F7
    Обратите внимание на процесс счета машинных циклов секундомером
    Вы увидите, что при выполнении команд, исполняющихся за 1 м
    ц
    ., показание счетчика машинных циклов будет увеличиваться на 1, а
    при выполнении команд, исполняющихся зам ц, показание счетчика будет увеличиваться на 2.
    В
    будущем
    , если у
    Вас возникнут затруднения в
    определении количества машинных циклов исполнения той или иной команды или группы команд (что более актуально, то их можно устранить, пошагово исполняя команду (команды) и
    сверяясь с
    показаниями счетчика
    Обратите также внимание на то, что при пошаговом исполнении программы, установленные точки остановки игнорируются
    Это указывает на то, что точки остановки работают только в "автомате. Вывод описанный выше, простенький прием, позволяет отказаться от использования достаточно трудоемких функций стимула и
    существенно упростить "выход " рабочей точки программы на точку остановки
    Таким образом, производя несложные манипуляции (с учетом специфических особенностей той или иной команды, можно направить движение рабочей точки программы в
    нужный для программиста сценарий

    114 Естественно, что при этом нужно знать, как работает программа и
    четко представлять себе "механизм " работы той или иной команды (особенно, команд ветвления. Лично я, прибегаю к
    помощи функций стимула очень и
    очень редко ив основном, использую "уловки ".
    И
    это вовсе не есть проявление лени, а
    скорее всего наоборот
    Такого рода "тренировка извилины " исключительно полезна
    Еще раз напоминаю на команду, назначенную точкой остановки, можно "выйти " 2- мя способами Первый в
    режиме пошагового исполнения программы
    При этом, точка остановки не назначается (какой смысл Она не работает. Этот режим применяется при небольшом количестве команд, которые нужно отработать
    В
    случае
    , если эта группа команд "объемиста " или в
    ее состав входит (входят)
    ПП
    задержки со значительным временем задержки, то "выход " на точку остановки лучше делать в "автомате ". Второй в "автомате ".
    В
    этом случае, обязательно нужно назначить хотя бы одну точку остановки, но можно и
    больше
    Итак
    , мы "
    стоИм " на верхней точке остановки (
    bcf PortB,2
    ), то есть, на той команде, после исполнения которой начинается формирование отрицательного полупериода
    Обращаю
    Ваше внимание наследующий общий принцип то, что рабочая точка программы "

    стоИт
    " на команде, означает, что исполнилась предыдущая команда, а команда, на которой "
    стоИт
    " рабочая точка программы, еще не исполнена. Проще говоря, команда исполнится только тогда, когда рабочая точка программы "прыгнет " наследующую, после нее, команду
    Рассуждаем дальше начальная точка замера имеется, а
    конечной точки замера нет
    Вывод
    :
    значит
    , ее нужно назначить (диалектика …). Ей должна быть команда, после исполнения которой, 0 меняется на 1 (
    bsf PortB,2
    ). Правой кнопкой мыши, щелкаем по строке с
    этой командой и
    выбираем
    Break
    Итак
    , рабочая точка программы "
    стоИт " вначале отрицательного полупериода (на "верхней " точке остановки, а "нижняя " точка остановки установлена вначале положительного полупериода

    115
    А
    теперь все просто в
    окне секундомера, щелкаем по кнопке (сбрасываем показания секундомера в
    ноль
    ) и
    далее
    , по кнопке с
    зеленым светофором
    Дожидаемся установки рабочей точки программы на назначенную ранее точку остановки и снимаем показания секундомера
    В
    строке
    Time
    секундомера
    , Вы увидите величину интервала времени формирования отрицательного полупериода
    Если
    Вы сделаете этот замер в
    отработанном тексте программы, то увидите, что время формирования отрицательного полупериода точно равно расчетному (345 мкс, см. "вышележащую " картинку. Для того чтобы замерить величину интервала времени формирования положительного полупериода, нужно, не снимая точек остановок, просто обнулить секундомера затем еще раз щелкнуть по зеленому светофору и
    дождаться результата замера
    Но
    , как говорится, "легких путей нам ненужно" (в обучающих и
    тренировочных целях, и
    поэтому еще раз проделаем тоже самое, но со снятием точек остановок (
    Debug
    Clear All
    Points
    ). Устанавливаем точку остановки на команде В "автомате ", переходим на эту точку остановки
    Устанавливаем точку остановки на команде Сбрасываем секундомер на ноль (
    Zero
    ). Щелкаем по кнопке с
    зеленым светофором и
    ждем окончания процесса

    116 Смотрим на показания секундомера
    Величина интервала времени формирования положительного полупериода равна 344 мкс замер производится в
    окончательно отработанном тексте программы. Почему не 345 ?
    А
    для разнообразия
    В
    обучающе
    - тренировочных целях (для стимуляции мыслительной деятельности. Если требуется выставить 345 мкс, то нужно либо добавить еще один, например, после команды PortB,2

    (или перед командой .83

    ), либо вообще убрать все три
    NOP
    а и
    увеличить числовое значение константы с .83 до .84 (напоминаю, что один цикла
    ПП
    PAUSE_2
    отрабатывается за 4 мкс. Итак, на отлаженной программе, я
    показал
    Вам
    , как проверить числовые значения интервалов времени формирования отрицательного (нулевой уровень) и
    положительного
    (
    единичный уровень) полупериодов
    Отлаживать тут нечего, так как программа была ранее отлажена
    Теперь нужно понять, что такое отладка программы
    Предположим
    , что мы работаем с
    текстом программы, написанной "с чистого листа ". Чтобы перейти к
    такому тексту, нужно несколько видоизменить текст программы
    cus
    Вносим
    , оговоренные выше, изменения
    Уберите все
    NOP
    ы
    (6 штук, которые находятся после команд и можно или поставить передними точки с
    запятыми
    , или вообще убрать их из текста программы первое удобнее, а
    последнее нагляднее.
    В
    группах команд записи констант, замените .85 на .86 и .83 на .86 (напоминаю, что .86 это рассчитанное ранее значение. Изменения в
    текст программы внесены, следовательно, его нужно проассемблировать
    Делаем это и
    убеждаемся
    , что ошибок нет
    Итак
    , в
    обучающих целях, "забываем " про отлаженный текст программы, с
    которым работали ранее (что- то типа запланированного "склероза "). Перед нами текст программы "с чистого листа ". То есть, текст, в
    котором калибровочные константы, задающие значения интервалов времени формирования отрицательного и
    положительного полупериодов установлены "на глазок " (неточно.
    Задача
    :
    необходимо установить интервалы времени формирования отрицательного полупериода равным мкс, а
    положительного
    -
    344 мкс
    Все начинается с
    проверки фактических величин этих интервалов времени
    Это будут как бы "начальные точки отсчета ". Походу исполнения программы, первым формируется отрицательный полупериод, значит с
    него и
    нужно начать
    Предполагаю
    , что
    Вы изучили изложенную выше информацию и
    потренировались в
    установке и
    снятии точек остановки, а
    также и
    разобрались с
    секундомером
    После сброса программы на начало, "дойдите " до команды либо в
    режиме пошагового исполнения программы, либо в "автомате " (описано выше, и
    про "уловку " не забудьте. Лучше в "автомате " (быстрее. Итак, рабочая точка программы находится на команде PortB,2

    (начало формирования отрицательного полупериода. Вызываем секундомер и
    сбрасываем его на ноль "Начальная точка отсчета " имеется
    Назначаем точкой остановки команду PotrB,2

    (начало формирования положительного полупериода. Щелкаем по кнопке с
    зеленым светофором и
    ждем окончания процесса подсчета
    Смотрим на показания секундомера
    Они равны
    1   ...   17   18   19   20   21   22   23   24   ...   57


    написать администратору сайта