|
Отладка программы
Интерактивная симуляция в программе 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 иллюстрирует, в основном, что есть множество
дополнительных функций. Очень рекомендуем, чтобы вы заглянули в раздел «Отладка на
уровне исходного кода» позже в этом документе, чтобы ознакомиться со все этим детальнее.
|
|
|