Цель
задачи:
1) получить основные навыки
работы с програмным эмулятором Visual
Micro Lab для AVR от компании Advanced
Micro Tools.
2)
ознакомиться со способом текстового
описания схемы эмулируемого устройства
- "обвески" МК.
Внешние компоненты, подключенные к
выводам МК описываются на SPICE подомном
языке реализованным компанией Advanced
Micro Tools в изучаемом эмуляторе.
3) проверить работу файла "прошивки"
work.hex полученного в Задаче
01 - на соответствие тому, что мы
ожидали при написании исходного текста
на языке Си.
Задание составлено на основе исходного
кода Си - программы из Application Note AVR031
"Getting Started with ImageCraft C for AVR" компании
Atmel.
Для задачи 02 необходимо:
-
Установленый в директорию по умолчанию (C:\VMLAB)
программный эмулятор МК AVR - Visual
Micro Lab
- распечатаный по-статейно ХЕЛП
эмулятора (или хотябы скомпилированый в
один файл) - это очень облегчит освоение
эмулятора.
- предварительно нужно изучить 6
примеров (step01_06) из папки C:\VMLAB\tutorial -
запустить эмулятор и открыть: "проект
- открыть проект" - файлы .prj
Посмотрите как происходит эмуляция
работы МК.
Очень
советую: распечатать
соответствующие небольшие текстовые
файлы-описания проектов step01.prj
- step06.prj
и "сшить" их скотчем в книжку с
распечатанным Хелпом - это УДОБНО!
Эти распечатки будут
вашим кратким справочником по Эмулятору.
- Файл work.hex - полученый в Задаче
01
- свободное
время и желание.
Кстати,
о птичках...
Эмулятор
v3.9 может работать с компилятором Си -
GCC
WinAVR используя
настоящую "обратную
связь"
- т.е. Вы
можете видеть как
программа "шагает" по исходному
тексту программы на Си.
Если что-то не
так, можно изменить код Си прямо в
эмуляторе и запустить
перекомпиляцию из эмулятора. об
этой возможности я уже упомянул
кратко на стр.
3 курса. Подробнее мы
рассмотрим ее позже.
С другими компиляторами,
генерирующими при компиляции файл .COFF,
можно
только видеть в эмуляторе
выполнение программы по тексту
исходника на Си.
Перекомпилировать отредактированный
текст программы на Си из эмулятора не
получится - нужно запускать
компиляцию из компилятора!
Можно исправить
некоторые
числовые значения в программе. НО!
НЕ стоит этого делать - в
эмуляторе вы будете гонять числа
не те что в вашей прошивке
- файл .hex! |
Я думаю для начала, стоит
освоить работу эмулятора и
компилятора по отдельности - что бы
четко понять: кто из них что делает
конкретно.
Когда это
станет ясно перейдем к
комбинированию. |
Работаем...
Файл проекта в эмуляторе Visual
Micro Lab - это обычный тестовый файл -
поэтому можно создать его в текстовом
редакторе не запуская пока сам эмулятор.
; Комментарии идут после
точки с запятой!
1) Давайте
опишем "железо" нашего проекта
; Файл-проект
.prj эмуляции программы
; из AN AVR031
;
; МК "прошит" файлом
полученым
; в задаче
01
;
; После запуска программы в
порт_B
; МК, выводятся
последовательно
; значения от 0 до 255 в
двоичном
; виде! не
горящими светодиодами !
; (практически начиная с
"1"), и далее
; опять с нуля и по кругу...
.MICRO "AT90S2313" ; Указали
МК
.POWER VDD=5 VSS=0 ; Питание
5 вольт и Земля 0
.CLOCK 4meg ;частота
кварца 4 МГц
.PROGRAM "work.hex" ; что
"прошито" в МК
; теперь подключим к битам
0_4
; (запись 0_4 означает: 0 1 2 3 и 4)
; порта B пять светодиодов:
УРА! эмулятор
v3.9 имеет 8 светодиодов!
можно увидеть весь байт!
|
D1 VDD PB0
; D1 - светодиод № 1
; VDD - в этом
эмуляторе светодиод
всегда
;
подключается одним
концом к питанию!
; а другим концом к ножке МК.
; D1 подключен к PB0 - бит 0 порта_B
; так же подключим еще 4
светодиода:
D2 VDD PB1
D3 VDD PB2
D4 VDD PB3
D5 VDD PB4
; Сигнал битов 5-7 порта_B
будем наблюдать
; в окне виртуального
осцилографа
; эмулятора - "Scope"
.PLOT V(PB5) V(PB6) V(PB7)
; означает:
Рисовать графики напряжения в
; перечисленных узлах
Все.. по 1) идем дальше...
2) Создайте
папку "work" в папке C:\VMLAB эмулятора.
3) Скопируйте
в нее файл work.hex полученый в первой
задаче и создайте в ней пустой текстовый
файл work.prj
4)
Запустите эмулятор и откройте Project >
Open Project, и в папке work выбирете - work.prj
> открыть.
На окно Mess... не обращайте внимания.
5) в окне work.prj наберите текст из п. 1)
6) В меню файл - сохраните все
7) в меню Project запустите Build - в
окне Mess... должно появиться сообщение
об успехе с незначительными помарками, и
загорится зеленый светофор - все готово
для запуска программы!
Если нет - проделайте все с
начала и повнимательнее!
я проверял все работает!
8) перед запуском программы,
откройте окна:
- виртуального осцилографа View > Scope
- панель управления-индикации View >
Control Panel - на ней находятся 5
светодиодов D1_D5
Разместите эти окна как вам удобно на
экране.
Не сворачивайте окно "Мессаг"
- оно будет выскакивать во время работы и
перекрывать другие окна - лучше сделайте
его низким и поместите внизу экрана.
9) Нажмите "светофор".
Программа запустится и остановиться - в
окне Месс.. появится сообщение.
Это эмулятор сообщает свое мнение "он
так бы не делал" - пилюем на
него и опять нажимаем на светофор
- теперь программа будет работать пока
мы ее не остановим.
Я не заметил даже при скорости эмуляции
в 1% , что в начале загораются все
светодиоды...
Эмуляторы
софтверные - ВСЕ работают
медленней реального МК, но "железный"
- быстрый эмулятор стоит реальных
денег!
На
качество эмуляции различие в
реальной скоростью не влияет -
конечно в окне "Scope" временные
промежутки реальные!
Скорость эмуляции
зависит от проворности вашего компьютера.
Я привожу данные для своего ПК: 1700
мГц 256 мБ ОС - WinMe.
|
мне удалось это увидеть только при пошаговом
прогоне программы (второй
кнопкой справа от светофора).
Нажимая эту кнопку вы идете на следующий
шаг программы - точнее на следующую
по ассемблерной программе инструкцию МК.
Сделайте глубокий рестарт (правой
кнопкой с круговой стрелкой)
программы и теперь нажимайте "кнопку
шагания" по программе - вы увидите, что
в некоторый момент загораются
все светодиоды!
10) Сделайте
еще раз глубокий рестарт программы и
запустите ее два раза светофором
на постоянную работу.
Важно:
глубокий рестарт программы
- МК "как бы" заново подали
напряжение питания - при этом в
регистрах будут значения в
соответствии с ДатаШит.
при
обычном рестарте программы -
счетчик команд устанавливается в
начальное состояние, но значения в
регистрах МК остаются такими как до
рестарта! |
Читайте двоичный код чисел отображаемый
НЕ ГОРЯЩИМИ светодиодами!
Вы убедитесь что
последовательно появляются числа 1,2,3,...
и так далее
Имейте ввиду, что включенному
светодиоду - соответствует низкий
уровень на соответствующем выводе МК!
МК работает в
соответствии с исходной программой
на Си.
Цель
задачи достигнута!
Неточность
Эмулятора - я ее заметил и написал
письмо разработчикам указав и на другие
неточности - они обещали исправить все в
следующих версиях но вот версия уж 3.7 а
исправлений нет! - ждемс!
Суть: Если вывести сигнал ножки к
которой подключен светодиод в окно Scope,
то мы увидим очень маленькое падение
напряжения на ножке МК при включении
светодиода, а оно должно быть минимум 2
вольта если допустить что светодиод
включен без резистора - при этом должен
быть показан большой ток потребления МК
- а этого не происходит.
С резистором в цепи диода напряжение
должно падать почти до нуля!
Кстати посмотрите, что эмулятор "видит"
в регистре PINх - физических значений
сигнала на ножках МК - очень интересно!
Да, видит он не то что былоб на ножках
реального МК при таком включении
светодиодов, и не то что можно увидеть в
окне виртуального осцилографа SCOPE (там
явно высокие уровни остаются и при
включении светодиодов)
Это надо учитывать при эмуляции
МК!
Решение
проблемы простое:
Подключить светодиоды не "по
инструкции эмулятора" а "как
правильно" т.е. через резистор!
подробней смотри
ниже! |
Пожалуйста
не ленитесь - выполните:
Упражнения по
Задачам 01 и 02 1)
Измените программу на Си так, чтобы
двоичный код показывали горящие
светодиоды, а видимый счет начинался с
нуля - т.е. при запуске программы все
светодиоды были бы выключены 65 мс. поверьте,
это не сложно но полезно сделать!
2) Измените файл проекта эмулятора и
напишите программу на Си - которая
переключает светодиод подключенный (без
резистора) к
выводу бит1 PORTB МК, а на вывод бит2 PORTB
выводит значение бит1 в регистре PINB.
Пожалуйста, постарайтесь
найти время и выполнить эти упражнения!
Это нужно ВАМ!
Решение проблемы правильной эмуляции
работы МК со светодиодами. По
инструкции Эмулятора светодиоды
подключаются так:
D1 VDD PB0
в реальных схемах светодиоды включают
последовательно с резистором:
D1 VDD D1_NODE
; Св. диод D1 подключить к +5 в
; и к узлу D1_NODE
R1 D1_NODE PB0 1K
; резистор R1 подключить к узлу
; D1_NODE и к выводу PB0 МК
; номинал резистора 1 кОм Теперь
светодиод подключен к "+" питания и
к резистору в 1 кОм, а другой конец
резистора подключен к ножке PB0 МК. Вы
можете скачать исправленный проект для
эмуляции z_02_work.zip
Некоторые пояснения по работе с
эмулятором.
Уанс мо...
1) ИЗУЧИТЕ
ВОЗМОЖНОСТИ ОКОН ЭМУЛЯТОРА!
2) ЧИТАЙТЕ Хелп ЭМУЛЯТОРА!
3)
УЧИТЕСЬ ПОДКЛЮЧАТЬ ВНЕШНИЕ
ЭЛЕМЕНТЫ к МК !!!
Делаем...
1) Распакуйте
файл z_02_work.zip
2) Откройте
файл проекта work.prj и "отБилдуйте"
его клавишей "F9" - должно появится
сообщение в окне "Мессаги" - олл
саксес мол...
3)
Запустите выполнение программы (двумя
пусками "светофора")
и дайте светодиоду D1 мигнуть пару-тройку
раз.
4) Остановите кнопкой "STOP"
5) Разверните окно "SCOPE" на весь
экран
6) установите горизонтльную развертку -
"Horiz./div" на 5 ms - это время между
точками сетки на экране.
Вертикальная
развертка в окне "Scope"
меняется в широких пределах и
позволяет довольно точно измерять
величину сигналов!
|
Давайте измерим период
переключения бит0 порта_B МК - PB0
мы планировали сделать его равным 65 ms!
1. Мышкой выбираем "Cursor" 1--- и
наводим крест-курсор на
"спад" 1-0 сигнала RB0 - наведите
поточней (курсор плохо виден) и щелкните
- появится белая вертикаль - начало
измеряемого промежутка времени
2. Мышкой выбираем "Cursor" 2- - и наводим
крест-курсор на
"фронт" 0-1 сигнала RB0 - и щелкаем
мышкой - появится вторая пунктирная
белая вертикаль - конец измеряемого
промежутка времени.
Будем в
дальнейшем называть переход
сигнала из логического уровня
"0" в лог. уровень "1" - Фронт
сигнала
а
переход из "1" в "0" - Спад
сигнала
|
В окне "Cursor delta time" читаем
результат - 65.6 ms
Давайте посчитаем точней
какой промежуток времени мы должны были
получить:
Частота кварца 4000000 гц - делим на 1024 (выбраный
нами коэф. деления для таймера) и делим
на 256 - столько таймер тикает между
переполнениями.
получили число 15,2587890625
столько раз в секунду переполниться
таймер.
Для получения периода возведем это
число в степень (-1) - получим 0,065536
секунды
или 65,536 мС - весьма близко к показанному
эмулятором!
но откуда взялись еще 64 мкС ?
МК делает большинство инструкций
АССЕМБЛЕРНЫХ за 250 нС (при частоте 4 мГц) -
т.е. у нас лишних 256 инструкций?!
На самом деле "лишних"
инструкций не выполнялось - например
изменение уровней на выводах МК тоже
занимает некоторое количество
инструкций, некоторые инструкции
занимают более одного машинного цикла
МК!
Точно
рассчитать время выполнения
процедур написанных на Си затруднительно!
На ассемблере можно изголиться - но
проверить придется симуляцией, и
подогнать Нопами (nop
- "Но оперейшн" - инструкция ни
чего не делающая - есть во всех
ассемблерах.
nop используют
как паузы в 1 клок процессора, для
точной подгонки различных событий
по времени, можно использовать nop в
коде Си как и другой ассемблерный
код в виде вставок:
например так: asm"nop";
Каждый
компилятор по своему компилирует
программу в код ассемблера.
И даже на одном
компиляторе при разных уровнях и
критериях оптимизации кода
можно получить разный ассемблерный
текст и соответственно время
выполнения процедур!
Критерии оптимизации компилятора -
например: "оптимизировать код
на скорость выполнения", или "на
минимальный по размеру код".
Мы работаем с
конкретным компилятором с
установками "по умолчанию"
|
Точней время можно
просчитать по листингу программы на
ассемблере - такой файл создает
компилятор при компиляции. Но если не
хочется разбираться с ассемблером то
проще отследить интервалы на эмуляторе.
Внимательно
смотрите меню View
- в нем особенно отмечу:
1 Ports
- что происходит в регистрах портов
2 Peripherals - Вся
переферия здесь. для нашего случая
смотрим таймер1
|
|