Главная » Статьи » Полезная информация |
В процессе написания программы часто необходимо проверить правильность работы алгоритма – глянуть на состояние регистров, узнать значение переменных или состояние портов вывода. Хотя сам для этих целей и использую Proteus, бывало такое, что его нет под рукой. И поэтому выручает симулятор, который включен в Bascom-AVR.
В качестве примера для симуляции взял программу с модуля дистанционного управления, описанного в прошлой статье. По алгоритму программа должна обрабатывать нажатие кнопки, висящей на прерывании INT1. При нажатии на кнопку изменяется (увеличивается) значение переменной Flag, значение которое может принимать эта переменная от 1 до 7, при достижении значения 8 переменная обнуляется. Пока переменная больше 0, на выводе PortD.4 находится высокий уровень напряжения (логическая единица).
Также по задумке, при значении переменной Flag больше 0, на одном из выходов PortB будет единичка. При каждом нажатии кнопки и увеличении переменной, эта единичка должна сдвигаться вправо – то есть при значении Flag=1 единица будет на PortB.7, при Flag=2 единица будет на PortB.6 и так далее, пока нажимая кнопку мы не достигнем значения Flag=8; а как писал выше, достигнув этого значения, переменная обнуляется и состояние выходов PortD.4 и PortB сбрасываются в ноль. При последующих нажатия кнопки все повторяется. Для понятия алгоритма можно посмотреть видео со статьи озвученной выше.
Итак, алгоритм есть, код написан и теперь необходимо проверить соответствие кода алгоритму - переходим к симуляции внутренними средствами Bascom-AVR.
Но есть один нюанс: для того чтобы симулятор нормально начал работать с программой, в нее необходимо добавить строку $sim. Она добавляется после директив типа: $regfile или $crystal.
После компиляции программы нажимаем кнопку F2, открывается окно симулятора:
В активной вкладке Variables (та, что подсвечена желтым) выбираются переменные, за которыми хотим понаблюдать, значения переменных будут отображаться в десятичном, шестнадцатеричном и двоичном представлении, в общем, все что нужно уже под рукой. Тут могут быть записаны не только переменные, но и порты, состояния которых нам интересны. В синей части окна, можно смотреть, что контроллер отправляет по UART во внешний мир, а также посылать ему команды, если такая функция предусмотрена в программе. Ниже, в белой части окна находится сама программа, в процессе симуляции можно наблюдать за выполнением программы по строкам. В столбце Variable выбираем из списка или пишем вручную имена переменных: Записали переменную и необходимые порты: Теперь нас интересует вкладка Interrupts:
Здесь можно вручную создавать условия прерывания, такие как внешние прерывания INT0 и INT1; прерывания по таймерам (OVF0 и OVF1 для Timer0 и Timer 1 соответственно); прерывания по UART (URXC - когда приходит символ, UDRE - когда символ из буфера данных переписан в буфер отправки, UTXC – возникает когда контроллер передал последний символ); прерывание от встроенного компаратора (ACI и OC1A); прерывание для захвата значения таймера (ICP).
Естественно, что количество и наличие возможных прерываний будет зависеть от модели использованного в проекте микроконтроллера.
В зависимости от того какие прерывания задействованы в программе активными будут только кнопки отвечающие за эти прерывания.
В программе, которую взял для примера задействовано внешнее прерывание кнопкой на INT1. А вот почему активным стоит еще и прерывание от Timer0 - OVF0? Дело в том, что Timer0 и его прерывание используется при работе инфракрасного датчика TSOP для организации стандарта RC5, чтобы ловить сигнал и генерировать необходимые тайминги.
Запустим симуляцию программы, нажимаем «Run program» или F5 и вызовем прерывание INT1, симитировав нажатие кнопки:
Перейдем во вкладку Variables и посмотрим значение переменной и портов вывода: Переменная Flag увеличилась и стала равна 1. На ноге PortD.4 появилась единичка (теперь пока переменная не обнулится единичка так и будет на этой ноге). На ноге PortB.7 также появился высокий уровень. Снова переходим во вкладку Interrupts и жмем кнопку прерывания INT1, смотрим как изменилась переменная и состояния портов: Значение переменной Flag увеличилось на 1, единичка на PortB сдвинулась вправо, а на ноге PortD.4 так и осталась единица. Двигаемся дальше а именно, жмем кнопку прерывания INT1 еще 5 раз пока переменная не примет значения 7:
На PortB единица сдвинулась до первого бита, а на ноге PortD.4 по-прежнему осталась единица. Все четко как и задумывалось. Теперь по сценарию финальный штрих: жмем кнопку прерывания еще один раз: переменная Flag обнулится, на портах PortB и PortD также будут нули:
Переменные ведут себя, как и было задумано. Убедившись в правильности кода, можно зашивать в микроконтроллер и уже проверять работу в железе или допиливать оставшуюся часть программы. Помимо этого Bascom способен засимулировать работу с алфавитно-цифровым жк-дисплеем, аналого-цифровым преобразователем, матрицей светодиодов, внутренним компаратором, матричной 4х4 клавиатурой и даже со сторожевым псом. Очень даже неплохо для бесплатной версии компилятора.
| |
Просмотров: 21807 | Комментарии: 2
| Теги: |
Всего комментариев: 2 | |
| |
Проекты [46] |
Как подключить [32] |
Инструменты [3] |
Полезная информация [18] |
Объявления [3] |