19. Редактор и симулятор



Автор: WildCat

Редактор кода и симулятор Bascom

Окно редактора Bascom используется для ввода и редактирования текста программы. Он имеет удобную подсветку синтаксиса:
- Зеленым обозначаются комментарии: это может быть любой текст после апострофа ( ' ). Используйте их, чтобы делать структуру программы понятной для всех. Вы потом себе сами спасибо скажете, открыв код через некоторое время.
- Красным обозначаются спецсимволы: *+-,./\:;<>=&^%#@~()[]|?!@{}
- Полужирным синим выделяются ключевые слова Bascom. Например, Waitms 500. Кстати, по этим словам доступна справка - нужно установить курсор на интересующее слово и нажать F1.
- Черным обозначаются переменные.

Эти цвета установлены по умолчанию, но их можно изменить в настройках Options/Environment (вкладка Font):




Bascom претендует на звание "умного" редактора. Это значит, что он осуществляет форматирование кода программы по мере его ввода, делая его более опрятным и удобочитаемым. Например, он делает каждое вводимое слово с заглавной буквы. Еще он убирает лишние пробелы и добавляет их там, где надо, делая текст более разреженным. Все это можно так же сменить в тех же настройках:



Достаточно убрать галки "Don't change case" и "Reformat Bas files". Последняя отменяет форматирование файлов сразу после открытия в редакторе.
Пока мы все еще копаемся в настройках среды (Environment), обратим внимание на вкладку "IDE":



Оказывается, Bascom сохраняет изменения, внесенные в код, перед каждым компилированием! Это достаточно неожиданное поведение для редактора. Вы не можете просто взять и поменять код, а затем скомпилировать его, посмотрев, что будет. После нескольких таких "посмотреть что будет" ваш код может быть необратимо изменен, и этого нельзя избежать, не закрыв полностью Bascom и отказавшись от сохранения изменений. Это ненужное и вредное поведение редактора нужно осознавать и принимать как должное. Конечно, можно отключить автосохранение, сняв галку "Autosave on compile", но перед каждой компиляцией вам придется заново указывать имя файла для сохранения!

Синтаксические ошибки в Bascom

Синтаксические ошибки сродни орфографическим ошибкам или опечаткам. Например, вы хотели набрать Config, но промахнулись по клавишам и набрали Confih. Bascom такого слова не знает и при компиляции выдаст ошибку. Большинство таких ошибок выявляются на стадии компиляции. Если таковые имеются, Bascom откажется создавать bin-файл и выдаст список ошибок в нижнем окошке. Давайте попробуем испортить уже знакомый нам ledflasher.bas:



Попробуем скомпилировать код, нажав F7. Компилятор нам скажет следующее:



Дважды кликнем на первой строке в окне отчета, и редактор выделит в верхнем окне соответствующую строку:



Это довольно удобно - перепрыгивать сразу на нужную строку, особенно если вы пишете большую и запутанную программу.
Первая строка гласит "Assignment error...". Мы забыли объявить переменную, а Bascom требует объявления каждой переменной, которую мы используем. Сейчас давайте просто удалим эту строку.
Вторая строка в отчете говорит нам "Unknown statement...". Опять же, мы промахнулись по клавишам и не набрали вторую "o" в слове Loop.
Последняя строка отчета возникла из-за того, что Bascom после слова Do ожидал увидеть слово Loop. Нам достаточно исправить 'Lop' на 'Loop' и обе ошибки исчезнут.
Такое случается часто, когда одна синтаксическая ошибка по цепочке вызывает несколько. Поэтому не все записи в отчете могут быть очевидны. Тут Bascom есть куда стремиться!
Перекомпилируем нашу программу и увидим, что на этот раз в ней нет ошибок.
Обратите внимание: Bascom выявляет синтаксические ошибки, но не логические! Поэтому если вы думаете, что компилятор не прав, сначала проверьте себя и свой код!

Симулятор Bascom

Перед использованием каких-то новых решений в коде, бывает полезно сначала проверить, насколько они хорошие. Симулятор позволяет вам пошагово проверить программу без программирования контроллера и использования железа вообще. Вы можете смотреть состояние портов ввода/вывода, значения переменных, аппаратных регистров и программной памяти. Также вы можете посмотреть, как контроллер взаимодействует с железом. Вы можете симулировать подключенный к МК индикатор, изменять состояние портов контроллера виртуальными кнопками, подводить нужное значение напряжения к АЦП и т.п.
Сначала давайте посмотрим, как мы можем симулировать работу светодиодной мигалки. Откроем все тот же ledflasher.bas и скомпилируем. Помимо .bin файла, компилятор создаст .dbg и .obj файлы, которые используются симулятором.
Запустим симулятор (F2):



В нижней части мы увидим окно с исходным кодом. В верхней части мы увидим кучу кнопочек для симуляции железа и вкладки, отображающие состояния переменных и регистров.
Когда мы запускаем симуляцию, мы можем видеть состояние портов ввода/вывода после каждой команды в программе. Чтобы отобразить "виртуальное железо", нажмем кнопку LCD. Появится дополнительное окно:



Появляется окно Hardware:



Теперь, если мы запустим программу на выполнение (F5), напротив текущей строки программы появится синяя стрелочка:



Обратите внимание, как включаются все вывода порта D после строки 'PortD = 255' и выключаются после строки 'PortD = 0'.
(Заметьте, что симулятор показывает 8 светодиодов для порта D, хотя в AT90S2313 наружу выведены только 7. Также заметьте, что симулятор показывает индикаторы состояния регистров ввода/вывода для текущей модели контроллера. Попробуйте сменить строку "$regfile = "2313def.dat" на "$regfile = "m128def.dat", перекомпилируйте, перезапустите симуляцию и нажмите кнопку LCD. В ATMega128 всего 7 регистров ввода/вывода!)

Мы можем остановить симуляцию кнопкой Stop program. Обычно запускать программу на произвол судьбы и следить за ней со стороны не очень удобно. Лучше пользоваться кнопкой Step into code (F8). Симулятор будет делать паузу после каждой строки, давая вам время рассмотреть, что происходит. Заметьте, что симулирование команды waitms 50 займет гораздо больше времени чем 50 мс. В общем, на таких командах симулятор работает слишком медленно. Вставьте директиву "$sim" после строки "$crystal = 4000000" и перекомпилируйте программу. Вы увидите, что все команды задержки будут пропущены. Но не забудьте убрать ее и перекомпилировать программу заново перед прошивкой контроллера! Если вы забудете сделать это, все задержки из конечной программы пропадут, и контролелр будет вести себя некорректно!

Работа с переменными

О переменных уже было сказано в главе 6, при необходимости обратитесь к ней.
Создадим новый проект и введем такую программу:

$regfile = "2313def.dat"

Dim Counter As Byte

Counter = 1

Do
  Counter = Counter + 1
Loop

End
Скомпилируем и запустим симулятор. В первой ячейке таблицы на вкладке Variables введем имя переменной Counter:



Щелкнем по Refresh variables. Это будет обновлять значения переменных в таблице по ходу выполнения программы. Будем давить по Step into Code и смотреть на значение переменной Counter:



Нажмем Run program (F5) и будем следить, как значение переменной увеличивается до 255, после чего она переполняется и становится равна 0.

Вкладка Locals может отображать значения переменных, которые используются локально в подпрограмме или функции.
Вкладка Interrupts показывает состояние прерываний. Вы можете принудительно вызвать внешнее прерывание на выводах Int0/Int1.



DECADALAB ALFA