Разработка программной и аппаратной поддержки к методическим указаниям Программирование микроконтроллеров
2.2. Аппаратные средства AVR.
Системный тактовый генератор.
AVR может использовать три различных источника системной частоты:
кварцевый или керамический резонатор, внешний тактовый сигнал или
встроенный RC-генератор (имеется не во всех моделях). Обычный диапазон
частот для AVR – от 0 до 16 МГц.
Кварцевый или керамический резонатор может быть подключен к AVR (см.
рис. 2.6). Если используется одна из этих схем, то не следует подключать
какие-либо другие устройства ни к одному из выводов XTAL.
а) б)
Рис. 2.6. Схемы подключения к AVR керамического и кварцевого резонаторов
а) без встроенных конденсаторов и б) со встроенными конденсаторами.
Также AVR может синхронизироваться внешним тактовым сигналом,
поступающим на вход XTAL1. Последний способ синхронизации – использование
встроенного RC-генератора. Такой генератор на данный момент есть только в
AT90S1200, он обеспечивает тактовую частоту 1 МГц. Этот режим задается при
помощи одного из битов конфигурации (fuse bit) только при параллельном
программировании МК.
Таймеры.
Источником сигнала переключения таймеров/счетчиков является либо
тактовая частота процессора, либо внешний синхросигнал. Тактовая частота
процессора может использоваться непосредственно или предварительно
делиться. Выбор источника сигнала и коэффициента деления производится с
помощью мультиплексора (см. рис. 2.8). Биты CSxn, управляющие
мультиплексором, расположены в регистре управления таймера TCCR0. В
AT90S8515, который содержит два таймерных блока, имеется два мультиплексора
– по одному на каждый блок. В AT90S1200 есть только один таймерный блок и
один мультиплексор. Содержимое таймера инкрементируется при поступлении
переднего фронта переключающего сигнала. Поэтому синхросигнал со внешнего
вывода МК поступает в мультиплексор в прямом и инвертированном. Значение
внешнего сигнала проверяется при поступлении переднего фронта тактового
сигнала процессора.
На рис. 2.7 показан Таймер 0 – простой 8-разрядный таймер, содержимое
которого может быть считано или записано. Отключение входного сигнала
происходит путем выбора «заземленного» входа при помощи мультиплексора. При
переполнении счетчика реализуется маскируемое прерывание.
Таймер 1 – более сложный 16-разрядный таймер. Он может выдавать на
выход импульсы и ШИМ-сигналы. Его большим достоинством является возможность
реализации дополнительных функций, таких как таймер событий.
Рис. 2.7. Структура таймера 0.
Сторожевой таймер.
Сторожевой таймер представляет собой отдельный таймер с собственной
частотой на 1 МГц, который при включении будет отсчитывать нужный интервал
времени. Если произойдет переполнение до того, как команда WDR сбросит
таймер в 0, то производиться перезапуск МК.
Сторожевой таймер включается при установке в 1 бита WDE в регистре
управления сторожевого таймера WDTCR. Содержимое битов WDPn этого регистра
определяет интервал времени до того, как сторожевой таймер произведет
перезапуск МК.
Устройство внешнего вывода.
Схема подключения внешнего вывода, показанная на рис. 2.8, дает
представление о его работе. С каждым набором линий («портом») связано три
адреса ввода/вывода, которые позволяют определять значения данных,
записанных в порт, направление передачи данных (1- вывод, 0 - ввод) и
реальное значение сигнала на внешнем выводе. Вследствие этого есть
возможность «подтянуть» выводы порта к высокому потенциалу для работы в
режиме ввода данных, и использовать состояние некоторых выводов в качестве
запросов прерываний.
Чтение данных может быть либо непосредственно с внешнего вывода, либо
с выхода регистра данных порта. Такая возможность является важной
особенностью работы порта. Если внешняя линия перегружена или случайно
закорочена на «землю», то состояние внешнего выхода никогда не будет
меняться. Поэтому в некоторых случаях очень важно иметь возможность
прочитать содержимое регистра порта и сравнить его с реальным состоянием
внешнего вывода.
Рис. 2.8. Схема внешнего вывода.
«Подтягивание» внешнего вывода к высокому потенциалу управляется не
отдельными битами регистра, а для этого используется специальная
комбинационная схема. Эта схема разрешает «подтягивание» только, когда
внешний вывод работает в режиме ввода данных, т.е. когда бит регистра
направления данных сброшен в 0, а бит регистра данных порта установлен в 1.
Аналоговый ввод/вывод.
Встроенный аналоговый компаратор напряжений дает возможность не только
сравнивать входное напряжение с опорным, но и измерять длительность
импульса при помощи встроенного таймера.[13] Выход компаратора (см. рис.
2.9.) будет находиться в состоянии 1, если значение напряжения на
положительном (не инвертирующем) входе AIN0 больше, чем на отрицательном
(инвертирующем) AIN1.
Рис. 2.9. Устройство компаратора напряжения.
Состояние может использоваться для реализации различных вариантов
запроса прерывания, которые задаются при помощи битов ACIS1 и ACIS0 (см.
таблицу 2.1.) в регистре прерывания и состояния аналогового компаратора
ACSR.
Таблица 2.1. Установки битов ACIS1 и ACIS0.
|ACIS1 |ACIS0 |Тип прерывания |
|0 |0 |Прерывание по переключению выхода компаратора |
|0 |1 |Зарезервировано |
|1 |0 |Прерывание по спадающему фронту (из 1 в 0) |
|1 |1 |Прерывание по нарастающему фронту (из 0 в 1) |
Определить текущее состояние выхода компаратора можно путем опроса
значения бита ACO в ACSR. Для уменьшения мощности потребления можно
отключить компаратор, установив в 1 бит ACD в регистре ACSR. Перед тем, как
включить или выключить компаратор, надо запретить все его прерывания путем
сброса в 0 бита ACIE в регистре ACSR, чтобы предотвратить возможность
поступления ложных запросов прерывания от компаратора.
В МК AT90S8515 к выходу компаратора можно подключить вход захвата
таймера. При этом можно зафиксировать момент изменения сигнала на выходе
компаратора, если в регистре ACSR бит ACIC установлен в 1. Такая
возможность позволяет измерять длительность сигнала, поступающего на
компаратор.
Конфигурирование МК
В AVR есть два типа битов, задающих конфигурацию МК. Биты
конфигурирования «fuses bits» (плавкие перемычки) используются для выбора
режима работы AVR, тогда как биты защиты «lock bits» используются для
запрещения доступа к памяти.
. Биты конфигурирования различны для разных типов AVR. В AT90S1200
установка в 1 бита RCEN подключает встроенный RC-генератор, при этом
внешние тактовые импульсы игнорируются. Когда бит SPIEN сброшен в 0,
разрешается программирование МК по последовательному интерфейсу через порт
SPI. Во всех этих моделях биты SPIEN и RCEN по умолчанию сброшены в 0.
МК AT90S8515 имеет биты SPIEN и FSTRT, которые позволяют при
использовании внешнего тактового генератора производить быстрое включение
МК без обычной задержки в 16мс.
Биты конфигурирования «fuses bits» могут быть установлены или сброшены
только при параллельном программировании.
Биты защиты «lock bits» используются для запрещения/разрешения доступа
к памяти программ в EEPROM, при этом достигаются свойства приведенные в
таблице 2.2.
Таблица 2.2. Режимы защиты и биты блокировки
|Биты блокировки |Тип защиты |
|Режим |LB1 |LB2 | |
|1 |1 |1 |Защита не установлена |
|2 |0 |1 |Дальнейшее программирование |
| | | |флэш-памяти запрещено |
|3 |0 |0 |Как режим 2, но запрещено и |
| | | |чтение |
Примечание: биты блокировки стираются только при полном
стирании памяти
Память данных EEPROM.
Операции чтения и записи области данных EEPROM довольно просты и
надежны. Обращение к EEPROM производится при помощи команд с индексной
адресацией, которые используют адрес, хранящийся в регистре EEAR.
Если EEPROM имеет емкость больше 256 байт, как у AT90S8515, то
используются два адресных регистра: EEARH для хранения старшей части адреса
и EEARL – для хранения младшей части. Эти регистры должны сохранять
правильный адрес до тех пор, пока не буде закончена операция чтения или
записи.
Запись в память данных EEPROM производится следующим образом:
1. Ожидание сброса в 0 бита EEWE в регистре управления EECR памяти
EEPROM;
2. Запись в EEAR нужного адреса;
3. Запись в регистр данных EEDR нужных данных;
4. Установка в 1 бита EEMWE в регистре EECR. (Бит EEMWE не
используется в AT90S1200);
5. В течении четырех тактов после установки бита EEMWE установить бит
EEWE в 1 для начала записи в EEPROM. Операция записи занимает от
2,5 до 4мс.
Бит EEMWE регистра EECR обеспечивает аппаратную блокировку записи для
того, чтобы уменьшить возможность случайного изменения EEPROM.
Чтение из EEPROM выполняется аналогичным образом.
1. Ожидание сброса в 0 бита EEWE в регистре управления EECR;
2. Запись в EEAR нужного адреса;
3. Установка в 1 бита EERE в регистре EECR;
4. Чтение данных из EEDR.
Операция записи должна быть закончена до того, как программа
произведет попытку чтения из EEPROM. После установки в 1 бита EERE
процессор переходит в состояние ожидания в течении двух тактов, пока данные
выбираются из EEPROM. Это означает, что выполнение команды
«SBI EECR, EERE», которая инициализирует операцию чтения, занимает не один
такт, а три.
Подключение питания и запуск.
Подключение питания к AVR осуществляется очень просто. Для этого
требуется напряжение +5В, шина «земля» развязывающий конденсатор. Все
модели имеют широкий диапазон напряжений питания 2,7 В – 6,0 В, что
позволяет легко реализовать батарейное питание, используя от 2 до 4 обычных
батареек или никель-кадмиевых элемента.
Что касается потребления энергии, то МК потребляют несколько мА в
рабочем режиме и несколько сотен мкА в режим ожидания (sleep mode).
Вывод RESET имеет внутреннее соединение с шиной питания через резистор
(«потягивания» к питанию), что избавляет от необходимости использования
внешнего соединения. В процессе отладки системы, когда надо постоянно
перезапускать МК и наблюдать за его поведением, все, что вам для этого
нужно – это простая кнопка, которая будет замыкать вывод RESET на землю
(см. рис. 2.10). В законченной системе вы можете оставлять вывод RESET не
подключенным.
Рис. 2.10. Запуск AVR при помощи внешнего выключателя.
Если во время выполнения программы на вход RESET поступит сигнал
низкого уровня длительность более двух тактов, то выполнение программы
сбрасывается в начальное состояние, а тактовый генератор продолжает
работать. Когда на этом выводе снова установиться высокий уровень,
выполнения программы начнется с нулевого адреса.
Программирование в системе.
Используя программирование по последовательному интерфейсу, можно
менять программу в памяти МК, уже установленного в готовую к применению
систему. Для этого плата с контроллером должна быть подключена к питанию и
генератору тактовых сигналов (см. рис. 2.11).
Рис. 2.11. Схеме подключения МК для программирования в системе.
На рис. 2.11 включены согласующие резисторы в линиях программирования,
чтобы быть уверенным, что если схема программирования подает на эти линии
сигналы, уровень которых отличается от того, который поступает на них от
других устройств системы, состояния выводов не изменяться и на них не
возникнет конфликт сигналов.
Для линии запуска используется другое подключение. Нормально на этой
линии поддерживается высокий уровень сигнала, а программатор может подать
на нее низкий, чтобы перевести МК в режим программирования по
последовательному интерфейсу. Управление состоянием линии RESET
осуществляется схемой, имеющий выход с открытым коллектором.
Эту схему можно использовать для программирования прикладной системы.
Надо соединить МК (сигналы «земля», RESET, MISO, MOSI и SCK) с
программатором при помощи 5-и контактного IDC-разъема.
2.3. Система команд микроконтроллера AVR
Микроконтроллеры AVR имеют очень широкий набор команд. Это позволяет
более просто произвести разработку компиляторов, что также означает, что
AVR может быть легко запрограммирован с использованием разнообразных
команд, упрощающих решение задачи.
Следует обратить внимание на следующие тонкости. Многие команды могут
обращаться только к 16-старшим РОН и не имеют доступа к 16-младшим.
Значения смещений и констант могут быть ограничены и оказаться не в том
диапазоне, который вы ожидали.
Существует различие между «полноценными» старшими моделями серии 8515
и младшими моделями серии 1200. Младшие модели МК реализуют часть полного
набора команд, в которых доступен только один индексный регистр Z. Хотя
при переносе программ с младших моделей на старшие вряд ли возникнут
проблемы, они весьма вероятны при обратном направлении переноса. Даже с
учетом всех этих предостережений AVR – это МК очень простой для
программирования благодаря богатству набора команд и особенностям его
структуры.
Для наглядности, в данном разделе приведем только некоторые примеры
команд. Но прежде чем приступить к изучению команд, целесообразно
рассмотреть различные способы адресации данных.
Способы адресации данных
Прямая адресация к Регистрам Общего Назначения
Основным способом доступа к данным является прямое (непосредственное)
обращение к РОН. На рис. 2.12 операнд команды содержится в регистре Rd, а
КОП обозначает часть слова команды, соответствующую Коду ОПерации, Обычно в
формате команды отводиться пять бит, которые позволяют адресоваться к
любому регистру.
Команды, оперирующие с двумя регистрами, действуют, в основном,
аналогичным образом. В этих командах регистр-приемник Rd (destination)
указывается перед регистром-источником Rr (resource), то есть является
первым параметром (см. рис. 2.13). Таким образом, команда:
ADD R0, R1
реально выполняется так: R0 = R0 + R1.
Рис. 2.12. Прямая адресация одного регистра.
Результат сохраняется в регистре Rd.
Рис. 2.13. Прямая адресация к двум РОН.
Прямая адресация к регистрам ввода/вывода.
На рис. 2.14 адрес операнда содержится в 6 битах слова команды (ячейка
Р).
Rd – определяет адрес регистра источника или регистра приемника. К примеру,
этот тип адресации могут использовать команды IN или OUT:
IN R0, SREG ;сохранить регистр состояния в регистре R0
OUT PORTB, R1 ;записать данные из регистра R1 в PORTB
Рис. 2.14. Прямая адресация регистров ввода/вывода.
Прямая адресация данных.
Рис.2.15. Прямая адресация данных.
Единое адресное пространство является пространством данных, включая
РОН, регистры ввода/вывода, внутренняя память и внешняя память (если есть).
16-разрядный адрес данных содержится в 16 младших разрядах 32-х разрядной
команды. Rd/Rr определяет адрес регистра источника или регистра приемника.
Такой тип адресации, к примеру, могут использовать команды LDS и STS:
LDS PORTB, R1 ;записать данные из регистра R1 в PORTB
STS PORTB, R1 ;записать данные из регистра R1 в PORTB
Косвенная адресация данных
Существует четыре типа косвенной адресации данных: простая, с
постинкрементом, с преддекрементом, со смещением. Для первых трех типов
косвенной адресации данных адрес операнда содержится в регистре X, Y или Z.
Для последнего типа (со смещением) адрес операнда вычисляется сложением
содержимого регистров Y или Z с шестью битами адреса, содержащимися в слове
команды. Сами же регистры остаются неизмененными.
Смысл косвенной адресации с постинкрементом (с преддекрементом)
заключается в следующем. После (до) выполнения операции регистр X, Y и Z
инкрементируется (декрементируется).
Рассмотрим некоторые примеры:
1) ST X, Rn ;поместить данные из Rn в по адресу указанному в регистре Х;
2) ST X+, Rn ;тоже что и в 1), но впоследствии X инкрементируется;
3) ST -X, Rn ;предварительно X декрементируется;
В предыдущих трех примерах вместо Х могут быть Y или Z.
4) STD Y+c, Rn ; к значению Y прибавляется константа смещения ’c’ и по
этому адресу записываются данные из Rn. Y при это остается неизменен.
Вместо Y может быть только Z.
Команды пересылки данных.
Пересылка данных из одного места в другое является для AVR очень
простой операцией, так как имеется очень большое количество команд,
предназначенных для выполнения этой задачи. Ни одна команда пересылки
данных не оказывает влияния на биты регистра состояния.
Команда LPM – загрузка данных из таблиц, хранящихся в памяти программ.
В этой команде младший бит индексного регистра Z используется для указания
байта, который будет читаться, если 0 – читается младший байт, 1 – старший.
Оставшиеся 14 байт используются для указания адреса слова.
Команда MOV – копирует содержимое одного РОН в другой. LDI – загружает
в один из 16 старших РОН байт, содержащийся в команде. IN и OUT – доступ к
регистрам ввода/вывода, начиная с нулевого адреса. Полный список всех
команд пересылки данных можно найти в ПРИЛОЖЕНИИ 1, Таблица А.3.
На рис.2.16 наглядно показано схематическое выполнение команды LPM.
Рис. 2.16. Команда LPM.
Команды арифметических и логических операций.
Основными арифметическими операциями являются сложение и вычитание
двух чисел. Эти команды по большей части очевидны. Сложение и вычитание
содержимого двух регистров производиться при помощи команд ADD и SUB.
Модификации этих команд, которые учитывают значение флага переноса,
позволяют выполнить операции над 8-, 16-, 24- и даже 32-разрядными числами
со знаком, хранящимися в регистрах.
Поясним функции флагов отрицательного результата N (negative),
переполнения V (overflow) и знака S (sign), так как они имеют некоторые
особенности и сложны для понимания при первоначальном знакомстве.
Флаг отрицательного результата N просто копирует значение бита 7
результата, который показывает, является результат положительным или
отрицательным числом.
Флаг переполнения V в регистре SREG указывает на переполнение во время
сложения или вычитания чисел со знаком. Рассмотрим пример:
ADD R1, R2
Флаг V будет установлен в 1, если в регистрах R1 и R2 содержаться
положительные числа, а результат их сложения окажется больше 127, или оба
числа отрицательны, а результат будет меньше –128. Рассмотрим пример с
конкретными значениями:
LDI R1, 100 ;100 = 0b01100100
LDI R2, 100 ;Занести 0b01100100 R1 и R2
ADD R1, R2 ;R1 = R1 + R2 = 200 = 0b11001000
Десятичное число 200 в двоичной записи имеет значение бита 7 равное
1, что указывает на получение отрицательного результата. Следовательно,
после выполнения операции сложения флаг N будет установлен в 1. Но в данном
случае вместе с флагом N будет так же установлен в 1 флаг V, указывая, что
произошло переполнение при обработке чисел со знаком.
Если содержимое R1 = R2 = - 100, то результатом сложения этих чисел
будет 0b00111000 в двоичной системе счисления, что является положительным
числом. При этом флаг N будет сброшен в 0,показывая, что результата
положителен, однако будет установлен флаг V, означающий, что на самом деле
это не так.
Использование флага S = N ^ V позволяет рассматривать результат как 9-
разрядное число со знаком, где старшим (знаковым) разрядом как раз и
является флаг S. Как было отмечено при описании флага V, он устанавливается
в 1, когда бит 7 результата имеет неправильное значение, то есть результат
не представлен правильным числом со знаком в дополнительном коде. Выполнив
операцию «ИСКЛЮЧИТЕЛЬНОЕ ИЛИ» над значением флага V и бита 7 результата,
который храниться в бите N, вы получите реальный знак результата. В первом
примере (100 + 100) происходит установка в 1 флагов V и N, в результате
флаг S будет равняться нулю (1 ^ 1 = 0). Во втором примере (- 100 - 100)
флаг N сбрасывается в 0, а флаг V устанавливается в 1, поэтому флаг S будет
равняться единице, указывая на то, что результат отрицательный.
Флаг S должен использоваться со старшим байтом числа. При операциях с
16-, 24- и 32-разрядными числами значение флага S надо проверять только
после завершения последней операции со старшим байтом числа. При операциях
с младшими байтами используется флаг переноса С, как обычно при выполнении
сложения и вычитания.
Команды ветвления
Команды относительного перехода RJMP и вызова подпрограммы RCALL
являются основными для изменения выполнения последовательности команд в МК.
При этом содержимое программного счетчика изменяется на величину смещения,
которое задается в 12 младших битах кода команды.
МК может выполнять команды ветвления по значению определенных битов в
регистре состояния SREG. Поскольку номер бита и его значение должны быть
указанны в коде команды, то диапазон возможных адресов перехода составляет
+/- 63 относительно текущего адреса. Это означает, что применение команд
условных ветвлений весьма ограничено, но эту проблему можно решить при
помощи ветвления к команде, которая затем выполнит необходимый безусловный
переход.
Еще один класс команд ветвления – это команды пропуска. После проверки
указанного условия, данные команды либо выполняют следующую команду, либо
пропускают ее.
Битовые команды и команды тестирования битов.
Команды сброса (очистки) и установки битов предназначены для
модификации регистров ввода/вывода. Но некоторые из них могут работать
только с частью регистров ввода/вывода. Это значит, что для некоторой части
регистров ввода/вывода вы должны сначала переписать их содержимое в РОН,
модифицировать, а затем снова сохранить в регистре ввода/вывода. Для
выполнения этой процедуры можно написать специальную макрокоманду (макрос).
Часто необходимо переслать бит из одного регистра или переменной в
другой. Это можно сделать следующим образом:
BST B,5 ;поместить бит 5 переменно В в бит Т регистра SREG
BLD A,2 ;сохранить бит Т регистра SREG в качестве бита А.2
Команда SWAP меняет местами старший и младший полубайт регистра. Это
полезно когда вы храните в регистре две цифры, а не одно восьмибитовое
число.
Команды сдвигов и циклических сдвигов LSL, LSR, ROL, ROR и ASR полезны
как для выполнения сдвигов данных в процессе их ввода вывода, так и для
проверки значения определенного бита в РОН без необходимости выполнения 8
отдельных операций тестирования битов. С помощью циклического сдвига можно
произвести индивидуальную проверку любого бита в заданном месте байта.
3. ПРОГРАММНОЕ И ИНСТРУМЕНТАЛЬНОЕ ОБЕСПЕЧЕНИЕ ПРОЦЕССА
ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ
3.1. Написание и отладка программного кода с помощью AVR Studio
Известные интегрированные среды разработки программ, повышающие
производительность труда программиста, позволяет избежать рутинной работы.
Интегрированные пакеты для разработки программ, выпускаемые разными
производителями, схожи между собой по функциям, по различным сервисным
возможностям, удобству работы и качеству генерируемого машинного кода.
Например пакет программ AVR Studio Version 3.53 (см. рис. 3.1.)
является интегрированной средой разработки (ИСР) для МК серии AVR.[16] Этот
программный продукт включает в себя:
. встроенный редактор текста, для набора исходного кода программы,
. транслятор с языка ассемблер,
. программный симулятор ЦПУ, памяти и устройств ввода/вывода
. поддержку внешних устройств, таких как – внутрисхемный эмулятор
(ВСЭ) ICEPRO, ICE200 и программатора типа AVRISP и STK500/501.
Рис. 3.1. Главное окно AVR Studio.
Компания Atmel распространяет данный продукт совершенно бесплатно, что
является огромным преимуществом в начале освоения программирования МК и
изучении его архитектуры.
Как и в реальной ИСР, здесь вы можете легко писать исходный текст
программы на ассемблере, подключить внешний компилятор для С, отлаживать
текст написанной программы используя встроенный программный симулятор или
подключить ВСЭ. И в конечном итоге вы можете запрограммировать свой МК
программатором AVRISP или STK500/501.
3.1.1. Обзор AVR Studio
Для установки AVR Studio требует Microsoft Windows 9x/NT/2000
Как уже говорилось, AVR Studio позволяет отслеживать код программы с
помощью внутрисхемного эмулятора или программного симулятора. Для
выполнения (отслеживания) кода программы она сначала должна быть
откомпилирована, чтобы сгенерировать объектный файла, который загружается в
AVR Studio.
Рис. 3.2. AVR Studio в процессе отладки исходного кода программы Ap1.asm.
Ключевое окно в AVR Studio является окно источника (Source window),
где отображается исходный код программы (см. рис. 3.2). Когда открывается
объектный файл, то автоматически создается окно источника. Оно показывает
выполняемый программный код и имеет название, соответствующее имени
открытого файла. Указатель программного счетчика (желтая стрелка () всегда
показывает на строчку, которая будет выполняться. Полоса статуса (Status
bar) указывает является ли исполнительное устройство ВСЭ или программным
симулятором. Окно источника дает информацию о логике программы. В
дополнении к этому, AVR Studio может показывать другие окна, которые
предоставляют пользователю достаточный контроль состояния каждого элемента
исполнительного устройства (ВСЭ или симулятор). Перечислим некоторые
доступные окна:
. Смотровое окно (Watch window) – показывает значения и адреса
определенных переменных.
. Окно РОН (Register window) – показывает состояние РОН. Регистры
могут быть изменены при остановке выполнения программы.
. Окно памяти (Memory window) – показывает содержимое памяти
программ, памяти данных, регистров ввода/вывода и содержимое
энергонезависимой памяти EEPROM. Ячейки памяти могут быть отражены
в различных форматах: шестнадцатеричном, десятичном или двоичном
формате или как ASCII символы. Содержимое памяти, также как и
регистры, может быть изменено по желанию при остановке программы.
. Окно регистров ввода/вывода (I/O window). Показывает содержимое
регистра состояния, таймеров, EEPROM регистров, портов ввода/вывода
и т.д.
. Окно процессора (Processor window). Показывает важную информацию о
выполнении программы включая Счетчик Команд (Program Counter),
Указатель Стека (Stack Pointer),флаги регистра состояния (Flags),
Счетчик Циклов (Cycle Counter) и др.
3.1.2. Создание нового проекта
Запустив AVR Studio в меню Project выберите пункт New. Как показано на
рис. 3.3, в появившемся диалоговом окне «Select project name» необходимо
будет ввести имя проекта (см. «Project name»), его местоположение
«Location» и тип проекта «Project type». Имя может быть любым стандартным
именем файла. Каталог можно написать в соответствующем текстовом поле или
выбрать из списка имеющихся папок, при нажатии кнопки справа с тремя
точками. Если каталога не существует, то он будет создан без всяких
напоминаний.
Рис. 3.3. Создание нового проекта.
Все файлы вашего проекта AVR Studio сохраняет в выбранном каталоге.
Тип проекта выбирают из следующих соображений:
. AVR Assembler: для компиляции кода текста проекта используется
встроенный транслятор. Не требует ни каких дополнительных настроек.
Мы будем использовать именно этот тип.
. Generic 3rd party C compiler: позволяет вручную настраивать AVR
Studio для использования внешних компиляторов.
После введения всех вышеперечисленных данных для продолжения нажмите
кнопку ‘OK’. Далее появится окно проекта, как показано на рис 3.4.
Рис. 3.4. Окно нового проекта.
В папках «Assembler Files» и «Other Files» хранятся файлы связанные с
вашим проектом. Но на рис. 3.4 они пока пустые.
Добавление ассемблерного файла в проект может быть реализовано
несколькими способами. Можно добавить существующий файл или создать новый.
Далее мы используем и тот, и другой способ.
Создадим новый файл исходного кода программы. Для этого с помощью
нажатия правой кнопки мыши на папке «Assembler Files» вызовем контекстное
меню, как показано на рис. 43 и выберем пункт «Add File…». Появиться окно
под названием «Add Files to Project». Убедитесь, что вы находитесь в
каталоге своего проекта. В этом каталоге как минимум должен быть файл
вашего проекта. В нашем случае это – "Demo_Project.apr". в текстовом поле
«File name:» введем имя нового файла – "LED_code.asm", и нажмем кнопку
«Open». Заметим, что расширение файла – asm следует ввести вручную, т.к.
автоматически оно не создастся. Если все сделано правильно, то создастся
файл с тем именем, который вы ввели.
Создание файла можно было осуществить с помощью контекстного подменю
«Create New File». Тогда появиться примерно такое же окно как на рис 3.3,
но под названием «Create new file». В это случае AVR Studio создает файл не
в указанной папке (Assembler или др.), а в корневой папке проекта (Target),
что бывает не всегда полезным.
В только что созданный файл добавьте следующий код программы:
;******************************************************
.include "8515def.inc"
.def temp = r16
rjmp RESET ; вектор прерывания по включению питания,
;сбросу RESET или от сторожевого таймера
RESET:
ldi temp,low(RAMEND) ;инициализируем указатель стека
out SPL,temp ;
ldi temp,high(RAMEND);
out SPH,temp ;
ser temp ;temp = 0xFF
out DDRB,temp ;конфигурируем порт В как выход
loop:
out PORTB,temp ;выводим temp в порт В
inc temp ;инкремент temp
rjmp loop ;переход на метку loop
;******************************************************
Теперь добавим в проект уже существующий файл. Для этого, во-первых,
скопируем файл "8515def.inc" в каталог нашего проекта (см. рис. 3.3.), т.е.
в D:\Project_files\AVRasm\ из подкаталога Appnotes, где находится AVR
Studio. Вернувшись в окно проекта проделаем знакомую уже нам операцию по
добавлению файла. На папке «Assembler Files» в контекстном меню выберем
пункт «Add File…». В появившемся диалоговом окне добавления файлов к
проекту выберем каталог нашего проекта, а из перечисленных файлов –
"8515def.inc" и нажмем «Open». Теперь окно проекта должно соответствовать
рис. 3.5.
Рис. 3.5. Окно проекта с рабочими файлами.
Посмотрев внимательно на рис. 3.5 можно заметить отличие иконок файлов
"8515def.inc" и "LED_code.asm". Дело в том, что когда мы добавляем первый
файл в новый проект, то AVR Studio помечает его как входной транслируемый
файл – «Assembler entry file». И при вызове встроенного транслятора
(ассемблера) будет компилироваться именно этот файл, помеченный красной
стрелкой вправо, а все остальные, помеченные синей стрелкой вниз – будут
игнорироваться. Вообще-то говоря файл "8515def.inc" добавлять в окно
проекта совершенно не обязательно. Это было сделано с целью обучения. Важно
чтобы этот файл был в том же каталоге, что и ассемблерный файл.
Рис. 3.6. Меню «Project».
Теперь самое время транслировать исходный код программы в объектный
код. Для этого существует несколько способов. Можно вызвать контекстное
меню и кликнуть мышью на «Assemble», как показано на рис. 3.5, или сделать
тоже самое через меню «Project» (см. рис. 3.6). А можно просто нажать «F7».
Появится окно «Project Output» с сообщением об успешной трансляции или
ошибках, если они имеются. Если вы еще не сохранили проект, то желательно
это сделать, выбрав через меню «Project» команду «Save» или на панели
инструментов нажать кнопку «Save all». Если трансляция прошла без ошибок,
то можно смело приступать к исполнению кода на встроенном симуляторе или
ВСЭ, если он имеется в наличии.
Заметим, что для создания hex файла, который необходим при прошивки
(программирование) кристалла, необходимо изменить установки проекта
(Project Settings…) см. рис. 3.5. и рис. 3.6. Для этого в появившемся окне
“AVR Assembler Options” установите “Output file format:” на “Intel Intellec
8/MDS (Intel Hex)”. Теперь каждый раз при вызове транслятора будет
создаваться выходной файл с расширением hex и файл с расширением eep, если
в коде программы есть сегмент EEPROM данных.
3.1.3. Исполнение программного кода
Для отладки программы или другими словами, для выполнения программного
кода в режиме симулятора необходимо, конечно же, чтобы программа
транслировалась без ошибок.
Рис. 3.7. Меню «Debug».
После успешной трансляции выберете из меню «Debug» команду «Trace
into» или нажмите «F11», как показано на рис. 3.7. Так как у нас нет ВСЭ,
то AVR Studio сама предложит определить соответствующий режим программного
симулятора (см. рис. 3.8). Появится окно «Simulator Options», в котором
необходимо будет выбрать тип устройства для симуляции. В данном примере это
AT90S8515. Изменять значения частоты и объема памяти нежелательно, так как
они установлены для выбранного устройства по умолчанию согласно техническим
параметрам МК. После нажатия кнопки «ОК», можно сказать, что все готово для
работы с кодом программы на симуляторе в пошаговом режиме или другом, каком
вы пожелаете.
Рис. 3.8. Окно опций программного симулятора.
Заметим, что теперь в окне исходного кода программы, слева на серой
полосе появилась желтая стрелка вправо, которая является указателем
программного счетчика. Она указывает на следующую инструкцию, которая будет
выполняться. Пример такой стрелки можно увидеть на рис. 3.8.
Рис. 3.9. Меню «View».
Окно регистров ввода/вывода.
Для более наглядного представления, что происходит с регистрами
Страницы: 1, 2, 3, 4
|