Вы вошли на сайт, как Гость
Регистрация

Отладка программы

Интерактивная симуляция в программе Proteus VSM
(Отладка программы)

Симуляция схемы

Чтобы симулировать схему, поместите указатель мышки на кнопку Play панели анимации в левом нижнем углу экрана и нажмите её. Панель состояния покажет время активности анимации. Вы должны также отметить, что один из светофоров зелёный, тогда как другой красный, и логическое состояние выводов должно быть видно на схеме. Вместе с тем, вы заметили, что состояние светофоров не меняется. Это произошло из-за преднамеренной ошибки, которую мы сделали в коде. На этом этапе самое время отладить программу, чтобы избавиться от проблемы.

Режим отладки

Чтобы убедиться, что мы находимся в режиме отладки схемы, мы остановим текущую симуляцию. Сделав это (кнопка Stop на панели анимации) вы можете начать отладку, нажав клавиши CTRL+F12. Появятся два всплывающих окна — одно показывает текущие значения регистров, а другое исходный код программы. Если нет, их можно активировать из меню Debug, как и остальные информационные окна.

Нам также хотелось бы активировать Watch Window, в котором можно увидеть изменение в состоянии переменных. Полное описание этих возможностей вы найдёте в разделе, озаглавленном «Watch Window — окно наблюдения». Сконцентрируемся сейчас на окне Source, обратив внимание на красную стрелку слева. Это, вместе с подсвеченной строкой, показывает текущую позицию счётчика программы. Чтобы задать здесь точку останова (breakpoint), нажмите правую клавишу мышки (точка останова всегда устанавливается на подсвеченной строке) и из выпадающего меню выберите Toggle (Claear/Set) Breackpoint. Если вы хотите очистить точку останова, вы можете сделать это повторив операцию, но мы пока её оставим.

Задание точек останова

Взглянув на программу, можно заметить, что цикл возвращается к себе. Неплохо бы было установить точку останова в начале цикла, до того как мы стартуем. Вы можете сделать это подсветив линию (по адресу 000E) мышкой и затем нажав F9. Затем нажмите F12, чтобы запустить программу. Вы должны увидеть сообщение на панели состояния (Status Bar), показывающее, что цифровая точка останова достигнута и адрес программного счётчика ( Program Counter, PC). Это относится к адресу первой точки останова, которую мы задали. Список ключей отладки есть в разделе Debug основного меню, но для большей части работы мы используем клавишу F11 для пошагового прохождения программы. Нажмите клавишу F11 и заметьте, что красная стрелка слева перемещается к следующей инструкции. Все, что мы реально сделали — это выполнили команду «clrw», а затем остановились. Вы можете проверить это, взглянув на регистр W в окне регистров (PIC CPU Registers) и увидев, что регистр обнулился. Все, что нам сейчас нужно сделать, это определить, что мы предполагаем должно произойти при выполнении следующей инструкции, а затем проверить, так ли это? Например, следующая инструкция должна переместить содержимое регистра «W» в PORTA. То есть, порт А должен очиститься. Выполним эту инструкцию и проверим окно регистров, убедимся, что это так. Продолжая выполнение, пока не будет достигнута второй точки останова, можно отметить, что оба порта были очищены и готовы для вывода (как это диктуется регистром TRISB), и что переменная state корректно установлена в 0. Поскольку далее следует функция вызова (call), мы должны выбрать шаг через функцию (Stepping Over, нажатием клавиши F10), но для полноты мы пройдём через все инструкции. Нажатие клавиши F11 в этом месте заставляет «нас» перепрыгнуть на первую выполняемую строку функции getmask. Передвигаясь вперёд, мы увидим, что операция move успешна, и что мы «приземлились» в нужном месте для добавления маски в нашу таблицу обозрения. Когда мы вернёмся в основную программу, мы получим маску, которую и предполагали. Шагая дальше и записывая маску в порт, мы увидим правильный результат на схеме. Следующий шаг увеличит на единицу state, это тоже успешно, о чем свидетельствует окно наблюдения, где значение регистра «W» увеличивается на 1. Следующий шаг приводит нас к инструкции, выполняющей возврат state в ноль, когда она увеличивается больше 3. Это, как можно видеть в окне наблюдения, не выполняется, хотя должно бы. Переменная state остаётся со значением 1 для маски, которая должна быть правильно установлена при следующем выполнении цикла.

Поиск ошибки

Завершение расследования показывает, что проблема обнаруживается при операции AND с 4 вместо 3. Мы хотели бы, чтобы состояния были 0, 1, 2, 3 и любое из них, когда AND 4, даёт ноль. Вот почему при запуске симуляции состояние светофоров не меняется. Решение простое — заменить проблемную инструкцию AND со state с 4 на 3. Это будет означать, что когда state будет увеличиваться до 3, и когда регистр «W» увеличится до 4, переменная state будет обнуляться. Альтернативное решение — просто проверить в этом случае регистр «W», и когда он станет равен 4, обнулить его. Этот короткий пример отладки в Proteus VSM иллюстрирует, в основном, что есть множество дополнительных функций. Очень рекомендуем, чтобы вы заглянули в раздел «Отладка на уровне исходного кода» позже в этом документе, чтобы ознакомиться со все этим детальнее.