Программирование и комп-ры

Разработка программной и аппаратной поддержки к методическим указаниям Программирование микроконтроллеров


                Министерство ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

                   Воронежский Государственный Университет
                            Физический факультет



|                                       |“К ЗАЩИТЕ ДОПУЩЕНА”                 |
|№______________________                |Зав. кафедрой физики полупроводников|
|кафедральной регистрации               |                                    |
|                                       |и микроэлектроники                  |
|                                       |проф. __________ Петров Б.К.        |
|                                       |“____”__________2002 г.             |



  УДК.681.3                                    КОРОБКОВ Георгий Николаевич


                     РАЗРАБОТКА ПРОГРАММНОЙ И АППАРАТНОЙ

                     ПОДДЕРЖКИ К МЕТОДИЧЕСКИМ УКАЗАНИЯМ

                    «ПРОГРАММИРОВАНИЕ МИКРОКОНТРОЛЛЕРОВ»


              Магистерская диссертация по направлению «Физика»



                                            Научный руководитель
                                            доц. ___________ Клюкин В.И.



                                ВОРОНЕЖ 2002


                                   РЕФЕРАТ

  УДК. 681.3                                   КОРОБКОВ Георгий Николаевич
РАЗРАБОТКА ПРОГРАММНОЙ  И  АППАРАТНОЙ  ПОДДЕРЖКИ  К  МЕТОДИЧЕСКИМ  УКАЗАНИЯМ
«ПРОГРАММИРОВАНИЕ  МИКРОКОНТРОЛЛЕРОВ».   –   Магистерская   диссертация   по
направлению «Физика», Воронеж, ВГУ,  2002.  –  93  с.,  илл.  45,  табл.  4,
прилож. 5, библ. 21 назв.

      В   настоящее   время   микроконтроллеры   принимают    все    большее
распространение. Однако, информации по  вопросам  обучения  программированию
микроконтроллеров  в  соединении  с  внешними  исполнительными   бывает   не
достаточно.
      В работе рассмотрены архитектура, аппаратные  и  программные  средства
распространенных и недорогих микроконтроллеров фирмы ATMEL  серии  AVR  типа
AT90S1200,   AT90S2313,   AT90S4414    и    AT90S8515.    Анализ    методики
программирования в  интегрированной  среде  разработке  позволил  объединить
практические    рекомендации    с    некоторыми    особенностями    обучения
программирования микроконтроллеров. На основании  этого  предложен  алгоритм
обучения.
      Предложен макет программатора, который позволяет, как программировать,
так и обучать этому процессу. Приведен набор  типовых  задач  которые  могут
быть реализованы на вспомогательных платах внешних  устройств,  подключаемых
к программатору через соответствующие порты.
      Так же приведены решения четырех типовых задач по  работе  с  памятью,
индикацией, устройство  «кодовый  замок»  и  устройство  измерителя  частоты
звукового диапазона. В приложениях приведены тексты  программ  и  справочные
данные на рассмотренные AVR микроконтроллеры.
                                 СОДЕРЖАНИЕ

ВВЕДЕНИЕ    4


1. ОСНОВЫ АРХИТЕКТУРЫ МИКРОКОНТРОЛЛЕРОВ 6

  1.1. ОСНОВНЫЕ ТИПЫ МИКРОКОНТРОЛЛЕРОВ И ИХ АРХИТЕКТУРА  6
  1.2. Аппаратные средства   10
    1.2.1. Запуск микроконтроллера      10
    1.2.2. Тактирование и командные циклы     10
    1.2.3. Программный счетчик и АЛУ    11
    1.2.4. Подпрограммы и функции 13
    1.2.5. Ввод/вывод данных 17
  1.3. Инструментальные и программные средства разработки и отладки 20
  1.4. Основные типы интерфейсов МК.    27
    1.4.1. Подключение переключателей и подавление «звона» контактов.     27
    1.4.2. Световая индикация.    28
    1.4.3. Ввод с матричной клавиатуры. 30

2. ОСОБЕННОСТИ ПОСТРОЕНИЯ И ФУНКЦИОНИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ ФИРМЫ ATMEL
СЕМЕЙСТВА AVR    32

  2.1. Архитектура микропроцессорного ядра AVR-микроконтроллеров    32
  2.2. Аппаратные средства AVR.   41
  2.3. Система команд микроконтроллера AVR    49

3. ПРОГРАММНОЕ И ИНСТРУМЕНТАЛЬНОЕ ОБЕСПЕЧЕНИЕ ПРОЦЕССА ПРОГРАММИРОВАНИЯ
МИКРОКОНТРОЛЛЕРОВ      56

  3.1. Написание и отладка программного кода с помощью AVR Studio   56
    3.1.1. Обзор AVR Studio  57
    3.1.2. Создание нового проекта      58
    3.1.3. Исполнение программного кода 62
  3.2. Анализ методики реализации разработки программного обеспечения     69
    3.2.1. Классификация вариантов заданий    69
    3.2.2. Рассмотрение типовых примеров      73
  3.3. Описание макета программатора.   77
ЗАКЛЮЧЕНИЕ  80
БИБЛИОГРАФИЧЕСКИЙ СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 81
ПРИЛОЖЕНИЕ 1 Инструкции процессоров AVR.     83
ПРИЛОЖЕНИЕ 2. Таблица регистров микроконтроллера AT90S1200    88
ПРИЛОЖЕНИЕ 3. Программа для измерителя звуковой частоты  89
ПРИЛОЖЕНИЕ 4. Программа для устройства «кодовый замок»   91
ПРИЛОЖЕНИЕ 5. Основные характеристики

микроконтроллеров AVR  93


                                  ВВЕДЕНИЕ


      Можно считать что микроконтроллер (МК) – это компьютер, разместившийся
в одной микросхеме. Отсюда и его основные  привлекательные  качества:  малые
габариты;  высокие  производительность,  надежность   и   способность   быть
адаптированным для выполнения самых различных задач.
      Микроконтроллер помимо центрального процессора (ЦП) содержит память  и
многочисленные устройства  ввода/вывода:  аналого-цифровые  преобразователи,
последовательные  и  параллельные  каналы   передачи   информации,   таймеры
реального   времени,   широтно-импульсные   модуляторы   (ШИМ),   генераторы
программируемых импульсов и т.д. Его основное назначение –  использование  в
системах  автоматического   управления,   встроенных   в   самые   различные
устройства: кредитные карточки, фотоаппараты, сотовые телефоны,  музыкальные
центры,  телевизоры,  видеомагнитофоны  и  видеокамеры,  стиральные  машины,
микроволновые  печи,  системы  охранной  сигнализации,   системы   зажигания
бензиновых  двигателей,  электроприводы  локомотивов,  ядерные  реакторы   и
многое, многое  другое.  Встраиваемые  системы  управления  стали  настолько
массовым явлением, что фактически сформировалась  новая  отрасль  экономики,
получившая название Embedded Systems (встраиваемые системы).
      Достаточно   широкое   распространение   имеют   МК    фирмы    ATMEL,
функциональные  возможности  которых  охватывают  все  перечисленные  задачи
[1,2].
      Применение МК можно разделить на два этапа: первый – программирование,
когда пользователь разрабатывает программу и прошивает ее непосредственно  в
кристалл, и второй – согласование спроектированных исполнительных  устройств
с запрограммируемым МК. Значительно облегчают отладку  программы  на  первом
этапе – симулятор, который наглядно моделирует  работу  микропроцессора.  На
втором  этапе  для  отладки  используется  внутрисхемный  эмулятор,  который
является  сложным  и  дорогим  устройством,  зачастую  недоступным  рядовому
пользователю.
      В тоже время в литературе  мало  уделено  внимания  вопросам  обучения
программированию  некоторых  недорогих   МК,   в   сочетании   с   реальными
исполнительными устройствами.
      Разработка макета программатора отличающегося простотой,  наглядностью
и  низкой   себестоимостью,   становиться   необходимой   как   для   самого
программирования кристаллов, так и для наглядного  обучения  широкого  круга
пользователей основам программирования МК.



                   1. ОСНОВЫ АРХИТЕКТУРЫ МИКРОКОНТРОЛЛЕРОВ


1.1. ОСНОВНЫЕ ТИПЫ МИКРОКОНТРОЛЛЕРОВ И ИХ АРХИТЕКТУРА

      Если представить все типы современных микроконтроллеров (МК), то можно
поразиться  огромным  количеством  разнообразных  приборов   этого   класса,
доступных потребителю. Однако все эти приоры можно  разделить  на  следующие
основные типы:
      . Встраиваемые (embedded) 8-разрядные МК;
      . 16- и 32-разрядные МК;
      . Цифровые сигнальные процессоры.
      Промышленностью выпускаются очень  широкая  номенклатура  встраиваемых
МК. В них все необходимые ресурсы (память, устройства ввода-вывода  и  т.д.)
располагаются на одном кристалле  с  процессорным  ядром  [3].  Если  подать
питание и тактовые импульсы на соответствующие входы МК, то  можно  сказать,
что он как бы «оживет» и с ним можно  будет  работать.  Обычно  МК  содержат
значительное число вспомогательных устройств, благодаря чему  обеспечивается
 их включение в реальную систему с  использованием  минимального  количества
дополнительных компонентов. В состав этих МК входят:
      . Схема начального запуска процессора (Reset);
      . Генератор тактовых импульсов;
      . Центральный процессор;
      . Память программ (E(E)PROM) и программный интерфейс;
      . Средства ввода/вывода данных;
      . Таймеры, фиксирующие число командных циклов.
      Общая  структура  МК  показана  на  рис.  1.1.  Эта   структура   дает
представление о том, как МК связывается с внешним миром.
      Более  сложные  встраиваемые  МК  могут  дополнительно   реализовывать
следующие возможности:
      . Встроенный монитор/отладчик программ;
      . Внутренние средства программирования памяти программ (ROM);
      . Обработка прерываний от различных источников;
      . Аналоговый ввод/вывод;
      . Последовательный ввод/вывод (синхронный и асинхронный);
      . Параллельный ввод/вывод (включая интерфейс с компьютером);
      . Подключение внешней памяти (микропроцессорный режим).
      Все эти возможности значительно увеличивают гибкость применения  МК  и
делают более простым процесс разработки систем на и основе.



                    Рис. 1.1. Структура микроконтроллера.
         Некоторые  МК  (особенно  16-  и  32-разрядные)  используют  только
внешнюю память, которая включает в себя как память  программ  (ROM),  так  и
некоторый объем памяти данных (RAM), требуемый для данного  применения.  Они
применяются в системах, где требуется большой объем памяти  и  относительное
не большое количество устройств  (портов)  ввода/вывода.  Типичным  примером
применения такого МК с внешней памятью  является  котроллер  жесткого  диска
(HDD) с буферной кэш-памятью, который обеспечивает промежуточное хранение  и
распределение больших объемов данных (порядка нескольких мегабайт).  Внешняя
память дает возможность такому микроконтроллеру  работать  с  более  высокой
скоростью, чем встраиваемый МК.
         Цифровые сигнальные процессоры (DSP) – относительно новая категория
процессоров. Назначение DSP состоит в том, чтобы получать текущие данные  от
аналоговой  системы,  обрабатывать  данные  и  формировать   соответствующий
отклик в реальном масштабе времени.  Они  обычно  входят  в  состав  систем,
используясь в качестве устройств  управления  внешним  оборудованием,  и  не
предназначены для автономного применения.

Система команд.

      В зависимости от числа используемых кодов операций системы  команд  МК
можно разделить на две группы: CISC и RISC.  Термин  CISC  означает  сложную
систему команд и  является  аббревиатурой  английского  определения  Complex
Instruction  Set  Computer.  Аналогично  термин  RISC  означает  сокращенную
систему команд и происходит от английского Reduce Instruction Set  Computer.
Систему команд МК 8051 можно отнести к  типу  CISC.  Однако,  не  смотря  на
широкую распространенность  этих  понятий,  необходимо  признать,  что  сами
названия не отражают главного различия между системами команд CISC  и  RISC.
Основная идея RISC архитектуры –  это  тщательный  подбор  таких  комбинаций
кодов операций, которые можно было  бы  выполнить  за  один  такт  тактового
генератора.  Основной  выигрыш  от  такого  подхода   –   резкое   упрощение
аппаратной  реализации   ЦП   и   возможность   значительно   повысить   его
производительность.
      Очевидно,  что  в  общем  случае  одной  команде  CISC   соответствует
несколько команд RISC. Однако обычно выигрыш от повышения  быстродействия  в
рамках RISC перекрывает потери от  менее  эффективной  системы  команд,  что
приводит к более высокой эффективности RISC систем в целом  по  сравнению  с
CISC.
      Однако  в  настоящее  время  грань  между  CISC  и  RISC  архитектурой
стремительно  стирается.  Например,  МК  семейства  AVR  фирмы  Atmel  имеют
систему команд из  120  инструкций,  что  соответствует  типу  CISC.  Однако
большинство из них выполняется за один такт,  что  является  признаком  RISC
архитектуры.  Сегодня  принято  считать,  что  признаком  RISC   архитектуры
является выполнение команд за один такт тактового генератора.  Число  команд
само по себе значения уже не имеет.

Типы памяти МК.

      Можно выделить три основных вида памяти, используемой в МК:
      а) память программ;
      б) память данных;
      в) регистры МК.
      Память программ представляет собой постоянную память,  предназначенную
для  хранения  программного  кода  и  констант.  Эта  память   не   изменяет
содержимого в процессе выполнения  программы.  Память  данных  предназначена
для хранения переменных в ходе выполнения программы. Регистры МК – этот  вид
памяти включает внутренние регистры процессора и  регистры,  которые  служат
для управления периферийными устройствами.
      Для хранения программ обычно служит один из видов  постоянной  памяти:
ROM  (масочные  ПЗУ),   PROM   (однократно   программируемые   ПЗУ),   EPROM
(электрически программируемые ПЗУ с ультрафиолетовым стиранием)  или  EEPROM
(ПЗУ с электрической записью и  стиранием,  к  этому  виду  также  относятся
современные  микросхемы  Flash-памяти).  Все  эти   виды   памяти   являются
энергонезависимыми – это означает, что содержимое памяти  сохраняется  после
выключения питания МК.
      Многократно  программируемые  ПЗУ  –  EPROM  и  EEPROM   (Electrically
Erasable  Programmable  Memory)   подразделяются   на   ПЗУ   со   стиранием
ультрафиолетовым (УФ) облучением (выпускаются в корпусах с окном),  и  МК  с
электрически перепрограммируемой памятью, соответственно.
       В  настоящее  время  протоколы  программирования  современной  EEPROM
памяти позволяют выполнять программирование  МК  непосредственно  в  составе
системы, где он работает. Такой способ программирования получил  название  –
ISP  (In  System  Programming).  И  теперь  можно   периодически   обновлять
программное обеспечение МК без удаления из платы. Это дает огромный  выигрыш
на начальных  этапах  разработки  систем  на  базе  МК  или  в  процессе  их
изучения,  когда  масса  времени  уходит  на   многократный   поиск   причин
неработоспособности  системы  и  выполнение  последующих  циклов   стирания-
программирования памяти программ.
      Функционально  Flash-память  мало  отличается  от   EEPROM.   Основное
различие состоит в способности  стирания  записанной  информации.  В  памяти
EEPROM стирание производится отдельно для каждой ячейки, а  во  Flash-памяти
стирание осуществляется целыми блоками.
      ОЗУ (RAM) –  оперативное  запоминающее  устройство,  используется  для
хранения данных. Эту  память  называют  еще  памятью  данных.  Число  циклов
чтения  и  записи  в  ОЗУ  неограниченно,  но  при  отключение  питания  вся
информация теряется.


1.2. Аппаратные средства


1.2.1. Запуск микроконтроллера

      Во  многих  приложениях  используется  батарейное  питание  МК,  а   в
некоторых случаях применяются даже  конденсаторы  большой  емкости,  которые
обеспечивают сохранение работоспособности  при  кратковременных  отключеньях
питания.  Поэтому  проблема   энергопотребления  (энергосбережения)   весьма
актуальна для МК. Так как практически все  современные  МК  производятся  по
КМОП технологии, то они потребляют значительно меньше  мощности,  чем  ранее
выпускавшиеся биполярные или n-МОП – микроконтроллеры.

Сброс в начальное состояние.

      На  рис.  1.3.  изображена  схема  сброса.  Эту  схему  лучшего  всего
использовать в случаях, когда гарантированно поддержание напряжения  питания
в  рабочем  диапазоне.  Кнопка  RESET  используется  в  процессе  разработки
устройств для сброса МК в начальное состояние. (См. рис. 1.2. )



                           Рис. 1.2. Схема RESET.

1.2.2. Тактирование и командные циклы

      Существует три способа задания тактовой частоты МК.  Первый  способ  –
использование  кварцевого  резонатора.   Второй   способ   синхронизации   –
использования RC  генератора.  Третий  способ  синхронизации  –  это  подача
тактовых импульсов от внешнего генератора. С его помощью можно задать  любую
частоту синхронизации.
      Следует  обратить  внимание  на  то,  что  командные  циклы  и   такты
синхронизации не одно и тоже. Командный цикл состоит  обычно  из  нескольких
тактов, которые необходимы процессору для выполнения команды. На  рис.  1.3,
показан командный цикл, состоящий из четырех тактов.



                 Рис. 1.3. Командный цикл и машинные такты.
      В  течении  командного  цикла   микропроцессор   или   микроконтроллер
выполняет   необходимые   операции,   используя   тактовые    сигналы    для
синхронизации этих операций. Некоторые команды требуют для выполнения  более
одного командного цикла.

1.2.3. Программный счетчик и АЛУ

      Программный  счетчик  (Program  Counter)  или  счетчик   команд   (СК)
используется  для  указания   следующей   команды   выполняемой   программы.
Реализация этой функции значительно усложняется, когда необходимо  сохранить
содержимое СК при вызове подпрограмм и  обработке  запросов  прерывания  или
обеспечить  ветвление   программы.   СК   представляет   собой   счетчик   с
параллельным  вводом/выводом.  В  процессорах  с  Принстонской  архитектурой
содержимое СК поступает оп шине данных в схему управления памятью,  указывая
адрес считываемой  команды.  Часто  СК  входит  в  состав  схемы  управления
памятью – это позволяет избежать передачи адреса по внутренней шине  данных.
Важные  особенности  функционирования  СК  –  параллельная  загрузка  нового
содержимого, поступающего с  шины  данных,  возможность  сброса  (возврат  к
адресу первой команды программы), реализация инкремента.  В  8-разрядных  МК
разрядность СК обычно больше, чем 8 бит. При загрузки в  СК  нового  адреса,
он поступает по  шине  данных  частями  по  8-бит,  что  требует  выполнения
дополнительных  машинных  циклов.  Чтобы  сократить   время   загрузки   СК,
некоторые МК имеют команды  ветвления,  при  которых  загружается  только  8
младших разрядов адреса, а  старшие  разряды  остаются  без  изменения.  При
выполнении такой команды достаточно передать  по  шине  данных  только  один
байт,  тогда  как  для  загрузки  полного  16-разрядного  адреса   требуется
пересылка двух байт.
      После   чтения   очередной   команды   содержимое   СК   увеличивается
(инкрементируется), чтобы обеспечить переход  к  адресу  следующей  команды.
Если выполняется вызов подпрограммы  или  происходит  прерывание,  то  адрес
возврата (текущее состояние СК) может быть сохранен в стеке  без  выполнения
дополнительных  тактов  для  инкремента  содержимого  СК.  В  работе  с   МК
необходимо следить, чтобы значение СК не вышло за пределы  памяти  программ.
Так  как  это  может  привести  к   выполнению   неопределенных   команд   и
непредсказуемому результату.
      Арифметико-логическое устройство  (АЛУ)  процессора  используется  для
выполнения всех математических операций в программе. Это  операции  включают
сложение,  вычитание,  логическое  И,  логическое  ИЛИ,  сдвиг   содержимого
регистров и  установку  содержимого  регистра  состояния  в  соответствии  с
полученным результатами. АЛУ не используется при чтении  или  записи  данных
или команд, оно служит только для обработки данных.
      АЛУ можно представить как аппаратный блок,  который  обрабатывает  два
слова данных (операнды) и сохраняет полученный  результат  (см.  рис.  1.4).
Как вводятся операнды  в  АЛУ  и  куда  поступает  результат  –  зависит  от
конкретного типа МК. В этом состоит одно из основных различий между  разными
типами процессоров и системами команд. Некоторые МК  выбирают  один  операнд
из регистра-аккумулятора и сохраняют результат также в аккумуляторе.  Другие
МК позволяют использовать различные источники операндов и  места  размещения
результатов.



                          Рис. 1.4. Структура АЛУ.
      АЛУ обычно работает только с положительными целыми числами. Однако при
выполнении вычитания получаются отрицательные числа, если вычитаемое  больше
уменьшаемого.   Для   представления   отрицательных    чисел    используется
дополнительный код – «дополнение до  двух».  Это  необходимо  учитывать  при
знакомстве с работой АЛУ.
      Вместо  вычитания  одного  числа  из  другого,  происходит  добавление
отрицательного числа:
                              А – В = А + (-В),
      где отрицательное число (-В)  представляется  в  дополнительном  коде.
Чтобы  получить   дополнительный   код   отрицательного   двоичного   числа,
необходимо инвертировать значение каждого бита, а затем прибавить единицу:
        -В = ( В ^ 0хff ) + 1, где ^ - операция «исключительное или».
      Сложность АЛУ во многом определяет сложность всего МК в  целом.  Часто
над созданием АЛУ работает группа  разработчиков,  сравнимая  по  составу  с
той,   которая   работает   над   остальной   частью   микропроцессора   или
микроконтроллера.  От  того,  как  работает  АЛУ,  зависит  функционирование
процессора, входящего в состав МК, а значит и всего МК в целом.

1.2.4. Подпрограммы и функции

      При вызове подпрограммы или функции требуется сохранить содержимое  СК
для  того,  чтобы  команда  возврата  могла  вернуть   управление   исходной
программе. Это  может  выполняться  автоматически  путем  сохранения  адреса
возврата в сетке. При возврате к исходной  программе  адрес  извлекается  из
стека и загружается в СК. Вызов функции  может  быть  реализован  в  МК,  не
имеющих стека, путем использования индексного регистра для  эмуляции  стека.
Если нельзя  непосредственно  загрузить  в  стек  содержимое  СК,  то  адрес
возврата к исходной программе можно сохранить в эмулированном стеке.
      Иногда приходится передавать  функции  некоторые  параметры.  Один  из
самых  эффективных  и  часто  встречаемых  способов  передачи  параметров  в
функцию – это поместить их в стек  перед  вызовом  функции.  В  подпрограмме
можно загрузить  индексный регистр значения указателя стека и таким  образом
получить доступ к параметрам.
      Другим способом передачи параметров является их сохранение в регистрах
процессора или в памяти данных в качестве специальных  переменных.  Передача
параметров  через  регистры  сокращает  число   регистров,   доступных   при
выполнении функции. Сохранение же параметров в виде  специальных  переменных
уменьшает объем  памяти,  доступной  для  использования  программой.  Данное
ограничение  может  быть  весьма  существенно  для   МК.   Обычно   значения
возвращаемых  параметров  загружаются  в  регистры  процессора,   т.к.   это
наиболее быстрый и эффективный способ передачи данных.

Прерывания.

      Прерывание  –  это   запуск   специальной   подпрограммы   (называемой
«обработчиком  прерывания»  или   «программой   обслуживания   прерывания»),
который  вызывается  сигналом   аппаратуры.   На   время   выполнения   этой
подпрограммы  реализация  текущей  программы  останавливается(см.  рис.1.5).
Термин «запрос на прерывание» (interrupt request) используется  потому,  что
иногда программа отказывается подтвердить прерывание и выполнить  обработчик
прерывания немедленно.



                      Рис. 1.5. Выполнение прерываний.
      МК может не реагировать на прерывания, пока не  завершится  выполнение
текущей  задачи  –  этот   реализуется   путем   запрещения   (маскирования)
обслуживания запроса прерывания. После решения задачи возможен один из  двух
вариантов: сброс маски и разрешение обслуживания прерывания, что приведет  к
вызову обработчика прерывания, или анализ  значения  битов,  указывающих  на
поступление запросов  прерывания  и  непосредственное  выполнение  программы
обслуживания  без  вызова  обработчика  прерывания.  Такой  метод  обработки
прерывания  используется,  когда   требуется   обеспечить   заданное   время
выполнения основной программы,  так  как  любое  пребывание  может  нарушить
реализацию необходимого интерфейса.
      Обработчик всегда обеспечивает следующую последовательность действий:
     1. Сохранить содержимое регистров контекста.
     2. Сбросить контроллер прерываний и оборудование, вызвавшее запрос.
     3. Обработать данные.
     4. Восстановить содержимое регистров контекста.
     5. Вернуться к прерванной программе.
      Регистры контекста –  это  регистры,  определяющие  текущее  состояние
выполнения основной программы. Обычно к их относят СК, регистры состояния  и
аккумулятор. Другие регистры МК, такие как индексные  регистры,  могут  быть
использованы в процессе обработки прерывания, поэтому  их  содержимое  также
необходимо сохранить. Все остальные  регистры  являются  специфическими  для
конкретного типа МК и его применения.
      После  сброса  в  исходное  состояние  контроллер   прерываний   готов
воспринимать  следующий  запрос,  а  оборудование,  вызывающее   прерывание,
готово  посылать  запрос,  когда  возникают  соответствующие  причины.  Если
поступит  новый  запрос  прерывания,  то  регистр  маскирования   прерываний
процессора  предотвратит  обработку   прерывания,   но   регистр   состояния
прерываний  зафиксирует  этот   запрос,   который   будет   ожидать   своего
обслуживания.  После  завершения  обслуживания  текущего  прерывания   маска
прерывание  будет  сброшена,  и  вновь  поступивший   запрос   поступит   на
обработку.
      Вложенные прерывания сложны  некоторым  типам  МК,  которые  не  имеют
стека.  Эти  прерывания  так  же  могут  вызывать  проблемы,   связанные   с
переполнением стека.
      Иногда МК может быстро  отреагировать  на  запрос  прерывания,  приняв
необходимые данные, которые будут потом использованы после  решения  текущей
задачи. Это  реализуется  путем  сохранения  поступивших  данных  в  массиве
памяти и последующей их обработки, когда выполнение исходной программы  буде
завершено. Такой способ обслуживания  является  хорошим  компромиссом  между
немедленной полной обработкой прерывания, которая  может  потребовать  много
времени,  и  игнорированием  прерывания,  что  может   привести   к   потере
информации о событии, вызвавшем прерывание.
      При обработке прерывания содержимое регистра состояния обычно  (но  не
всегда) автоматически сохраняется вместе с содержимым  СК  перед  обработкой
прерывания.  Это  избавляет  от  необходимость  сохранять   его   в   памяти
программными   средствами   с   помощью   команды   пересылки,    а    затем
восстанавливать  при   возврате   к   исходной   программе.   Однако   такое
автоматическое сохранение реализуется не во всех типах МК.
      Если содержимое регистра состояния сохраняется перед началом обработки
прерывания,  то  по  команде  возврата   производится   его   автоматическое
обновление. Если  содержимое  других  регистров  изменяется  при  выполнении
обслуживания прерывания, то оно также должно  быть  сохранено  в  памяти  до
изменения и восстановлено перед возвратом в основную программу.
      «Вектор прерывания» – это адрес, который загружается в СК при переходе
к  обработчику  прерывания.  Существует  несколько  типов  векторов.  Адрес,
который загружается в СК при запуске МК (RESET) называется «вектор  сброса».
Для различных прерываний могут быть  заданы  различные  вектора.  Но  иногда
различным  прерываниям  назначается  один  вектор.  Это  не  должно  вызвать
проблем при работе с МК, так как чаще всего он исполняет  одну  единственную
программу. В МК, где аппаратная часть хорошо известна, не должно  возникнуть
каких либо проблем при совместном использовании векторов прерываний.
      В заключении можно добавить, что системные подпрограммы –  это  своего
рода программные прерывания,  которые  с  помощью  специальных  процессорных
команд имитируют аппаратные прерывания.  Они  располагаются  в  произвольном
месте  памяти,  или  могут  требовать  для  обращения  к  ним  межсегментных
переходов.

Таймеры.

      Таймеры  в  микропроцессорных  системах  используются  не  только  для
обеспечения заданной задержки, но  и  для  решения  гораздо  более  широкого
круга задач. Обычно для переключения таймера  используют  тактовые  импульсы
процессора.  Загрузив  в  таймер  начальное  значение,   можно   отсчитывать
определенные интервалы времени,  фиксируя  окончание  интервала  по  моменту
переполнения  таймера.  Часто  перед   таймером   включают   предварительный
делитель  тактовой  частоты,  чтобы  иметь  возможность  отсчитывать   более
длинные  интервалы  времени.  Делитель  обеспечивает  инкремент  содержимого
таймера после поступления определенного числа тактовых импульсов.
      Их можно использовать для точного формирования  временных  интервалов,
подсчета  импульсов   на   выходах   МК,   формирования   последовательности
импульсов, тактирования приемопередатчика  последовательного  канала  связи.
Таймеры/счетчики способны вырабатывать запросы прерываний, переключая ЦП  на
их  обслуживание   по   событиям   и   освобождая   его   от   необходимости
периодического опроса состояний таймеров. Поскольку основное  применение  МК
находят  в  системах  реального  времени,   таймеры/счетчики   являются   их
обязательным элементом. В некоторых модификациях  число  таймеров  достигает
32.

1.2.5. Ввод/вывод данных

      Основной интерфейс между МК и внешними устройствами реализуется  через
параллельные порты ввода/вывода. Во многих  МК  выводы  этих  портов  служат
также  для  выполнения  других  функций,  например   последовательного   или
аналогового ввода/вывода.
      Во многих МК отдельные выводы портов могут быть  запрограммированы  на
ввод или вывод данных. Необходимо обратить особое внимание на то, при  вводе
данных считывается значение сигнала, поступающего на  внешний  вывод,  а  не
содержимое триггера данных. Если к внешнему выводу подключены выводы  других
устройств, то они могут установить свой уровень выходного  сигнала,  который
будет считан вместо ожидаемого значения  данных,  записанных  в  триггер.  В
некоторых  МК  существует   возможность   выбора   между   чтением   данных,
установленных на выходе триггера или на внешнем выводе.
      Когда на шину необходимо вывести «0» или «1»,  то  сначала  записывают
соответствующее значение в  триггер  данных,  а  затем  с  помощью  триггера
управления  на  выходе  устанавливается  необходимый   уровень   потенциала.
Триггер  управления  разрешает  вывод  данных  на  шину.  В  современных  МК
обеспечивается индивидуальный доступ  к  триггерам  данных  и  управления  с
помощь адресной шины.
      Внешний  вывод  может  быть  также  использован  для  подачи   запроса
прерывания. Это обычно реализуется, когда вывод работает в режиме ввода.
      Наиболее  распространенный  вид  связи  между  различными  электронно-
вычислительными системами – это последовательный обмен. В этом  случае  байт
данных передается по единственному  проводу  бит  за  битом  с  обеспечением
синхронизации между приемником и источником данных.  Очевидное  преимущество
последовательной передачи данных состоит в том, что она  требует  небольшого
количества линий связи.
      Существует множество стандартных последовательных протоколов  передачи
данных. В  некоторых  МК  эти  протоколы  реализуются  внутренними  схемами,
размещенными на  кристалле,  что  позволят  упростить  разработку  различных
приложений.

Аналоговый компаратор.

      Часто в МК встраивается аналоговый компаратор  напряжений.  Компаратор
представляет  собой  простую  схему,   которая,   которая   сравнивает   два
напряжения. Обычно один сигнал называют входным,  а  другой  опорным.[7]  На
выходе устанавливается «1», если  входное  напряжение  больше,  чем  опорное
(см.  рис.  1.6).  этот  способ  наиболее  удобно   использовать   в   таких
устройствах,  как  термостаты,  где  необходимо  контролировать   достижение
определенного  уровня  измеряемой  величины,  которая   задается   значением
входного напряжения.



        Рис. 1.6. Сигналы на входе и выходе аналогового компаратора.

Программирование устройств.

      Программирование устройств, в том  числе  и  микроконтроллеров  обычно
происходит следующим образом. В регистр программатора загружается  значение,
которое необходимо разместить  по  определенному  адресу,  затем  включается
схема, которая пересылает содержимое этого  регистра  по  заданному  адресу,
проходит   некоторое    время    ожидания,    пока    завершиться    процесс
программирования  выбранной  ячейки  памяти   и,   на   конец,   выполняется
верификация,   т.е.   проверяется   правильность    записанного    значения.
Программирование всего устройства  может  занять  от  нескольких  секунд  до
нескольких   минут   в   зависимости   от   размера   памяти   и   алгоритма
программирования.
      Часто оборудования для программирования оказывается  слишком  дорогим,
особенно для радиолюбителей и предприятий малого  бизнеса.  Но  в  некоторых
случаях  для  программирования  требуется   весьма   простое   и   доступное
оборудование. К  примеру,  некоторые  модели  PIC  и  AVR  микроконтроллеров
программируются  очень  легко.  Существует  также  устройства,  которые   не
требуют оборудования для программирования, на пример, МК  Basic  STAMP,  или
имеют встроенный аппаратно-программный блок,  избавляющий  от  необходимости
использования внешнего оборудования, кроме источника повышенного  напряжения
для программирования, как МК 68НС05.
      Очень   важный   аспект,   касающийся   программирования    устройств,
заключается  в  том,  что  может  ли  устройство  быть  запрограммировано  в
системе.  Это  называется  внутрисистемное  программирование  (ВСП)   –   от
английского In-System  Programming  (ISP).  Если  МК  допускает  возможность
такого программирования, то это означает, что он может быть  смонтирован  на
плату с пустой памятью программ, которая затем может быть  запрограммирована
без какого либо влияния на  остальные  компоненты  схемы.  Это  может  стать
важным обстоятельством при выборе МК.  Использование  ВСП  избавляет  МК  от
необходимость покупать специальный программатор, дает возможность  обновлять
программное обеспечения без  изменения  расположенных  на  плате  аппаратных
средств и позволяет производителям создавать запас готовых изделий,  которые
могут легко модифицироваться в соответствии с поступающими заказами.

Безопасность памяти программ.

      Для многих приложений желательно защитить программный код,  записанный
в МК. Чтобы обеспечить такую  возможность  многие  МК  содержат  специальные
средства для предотвращения считывания  хранящихся  в  них  программ.  Часто
такая  возможность  реализуется  путем  установки   определенного   значения
конфигурационного бита в процессе программирования.  Обычно  значения  этого
бита можно  изменить  только  в  процессе  перепрограммирования  содержимого
памяти МК, например при УФ стирании содержимого EPROM.
      Встроенная защита не может предотвратить  все  возможности  считывания
программного   кода.   Такое   считывание   можно   произвести   во   многих
лабораториях, выполняющих анализ причин отказов микросхем, причем  за  очень
короткое  время.  Чтобы  усложнить  и  сделать  операцию  считывания   менее
эффективной, некоторые компании  зашифровывают  записанные  программы  путем
перемешивания команд  и  включают   специальные  аппаратные  блоки,  которые
преобразуют перемешенные  данные  в  поток  команд  процессора.  И  все  же,
установка бита защиты не может гарантировать абсолютную защиту  программного
кода загруженного в МК.

1.3. Инструментальные и программные средства разработки и отладки

      Самый  эффективный  способ  отладки  программ  для  МК  –   применение
специализированных профессиональных инструментальных отладочных  средств,  к
которым следует отнести:
 .  внутрисхемные  эмуляторы  (ВСЭ)  –  программно   аппаратное   средство,
   способное замещать собой эмулируемый процессор в реальном устройстве;
 . программные симуляторы  –  программное  средство  способное  имитировать
   работу МК и его памяти;
 .  мониторы  отладки  –  специальная  программа,  загружаемая   в   память
   отлаживаемой системы.
 . платы развития (Evaluation Boards  –  оценочные  платы)  –  своеобразные
   конструкторы для макетирования прикладных систем;
 . эмуляторы ПЗУ – программно-аппаратное средство, позволяющее заменить ПЗУ
   отлаживаемого устройства на ОЗУ, в которое можно загрузить  программу  с
   компьютера через один из стандартных каналов связи.
      Помимо этого существуют и комбинированные устройства и наборы.

Симуляторы

      Как правило, симулятор состоит из отладчика, модели ЦП и памяти. Более
совершенные  устройства  содержат  в   своем   составе   модели   встроенных
периферийных устройств (таймеров, портов, АЦП и систем прерываний).
      Симулятор должен уметь загружать  файлы  программ  в  всех  популярных
форматах, максимально  полно  отображать  информацию  о  состоянии  ресурсов
симулируемого МК, а также предоставлять возможности по симуляции  выполнения
загружаемой  программы  в  различных  режимах.  В  процессе  отладки  модель
выполняет программу, и на экране монитора  компьютера  отображается  текущее
состояние модели.
      Загрузив  программу  в  симулятор,  пользователь  может  запускать  ее
пошаговом или непрерывном режиме, задавать условные  или  безусловные  точки
останова, контролировать и свободно модифицировать содержимое  ячеек  памяти
и регистров симулируемого МК. Симулятор позволяет  быстро  проверить  логику
выполнения программы, правильность выполнения арифметических операций.
      В зависимости  от  класса  используемого  отладчика  некоторые  модели
симуляторов поддерживают высокоуровневую отладку программ.
      Симулятор может содержать и ряд  дополнительных  программных  средств,
например  интерфейс  внешней  среды.  Наличие  такого  интерфейса  позволяет
создавать и гибко использовать модель внешней среды  МК,  функционирующую  и
воздействующую на отлаживаемую программу по заданному алгоритму.
      В реальной системе МК обычно  «занимается»  считыванием  информации  с
подключенных  к  нему  устройств  (датчиков),   обработкой   ее   и   выдачи
управляющих сигналов на исполнительные устройства. Для того чтобы в  простом
симуляторе смоделировать работу датчика, нужно  в  ручную  изменять  текущее
состояние модели периферийного устройства, к  которому  в  реальной  системе
подключен датчик.  Но  существует  ряд  современных  разработок  программных
симуляторов, в которых чтобы имитировать внешние условия и ситуации,  обычно
используется  специальный  файл  входных  воздействий.  Этот   файл   задает
последовательность   входных   сигналов,   поступающих    на    моделируемое
устройство.


      К примеру, для микроконтроллеров AVR этот  входной  файл  программного
симулятора может выглядеть следующим образом:
                                000000000:00
                                000000006:F1
                                000000015:18
                                000000109:1C
                                000000203:61
                                000000250:10
                                000000344:1F
                                000000391:71
                                999999999:ff
      где каждая строка содержит – цикл:данные , поступающие на  какой  либо
указанный порт.
      В некоторых моделях симуляторов эта проблема имитации внешних сигналов
решена таким образом, что симулятор имеет встроенное средство  для  создания
моделей подключенных к МК внешних устройств, включая  средства  графического
отображения информации.
      Очевидная особенность программных симуляторов в том, что загруженные в
них программы выполняются в масштабе времени, отличном от реального.  Однако
низкая цена, возможность отладки даже при  отсутствии  макета  отлаживаемого
устройства делают программные симуляторы  весьма  привлекательным  средством
отладки. Необходимо также  отметить,  что  существует  целый  класс  ошибок,
которые можно обнаружить только с помощью симулятора.

Интегрированные среды разработки

      Идея единства программного и аппаратного обеспечения систем на базе МК
является  очень  важной.  Объединение  инструментальных  средств  разработки
программного   обеспечения   с   инструментальными   средствами   разработки
аппаратного обеспечения может  стать  важным  преимуществом  при  разработке
устройств.
      Существенно  облегчают  и  ускоряют  процесс  разработки   и   отладки
микропроцессорных систем, так называемые интегрированные  среды  разработки.
Они совмещают в себе текстовый  редактор  для  написания  исходных  текстов,
трансляторы с ассемблера и Си, линкер, отладчик,  справочную  информацию  по
МК и другие  средства,  необходимые  разработчику.  Настройка  трансляторов,
линкера и других компонентов  производится  не  методом  указания  ключей  в
командной строке, а в виде диалоговых  окон,  где  нужно  только  расставить
«галочки» в нужных местах. Преобразование исходных текстов программ  в  файл
машинных кодов запускается нажатием одной клавишей.
      Появление интегрированных сред разработки программ ещё больше повысило
эффективность   создания   программ   для   МК,    позволило    разработчику
сосредоточиться на сути решаемой задачи и отвлечься  от  конкретных  деталей
ее реализации. Интегрированные  пакеты  для  разработки  программ  выпускают
несколько фирм, пакеты разных производителей схожи между собой по  функциям,
но различаются предоставляемыми сервисными возможностями,  удобством  работы
и качеством генерированного машинного кода.
      Напомним,  что  при  традиционном  подходе  начальный  этап  написания
программ строится следующим  образом.  Исходный  текст  набирают  с  помощью
какого либо текстового редактора. По завершению набора  работа  с  текстовым
редактором прекращается и запускается кросс-компилятор. Как  правило,  новая
программ содержит синтаксические ошибки, и  компилятор  сообщает  о  них  на
консоль оператора. Затем вновь запускается текстовый  редактор,  и  оператор
ищет и устраняет выявленные ошибки. При  этом  сообщение  об  их  характере,
выведенные  компилятором  уже  не  видны,  так  как  экран  занят  текстовым
редактором.
      Этот цикл может повторяться не один раз. И если программа относительно
сложна, собирается из  различных  частей,  подвергается  редактированию  или
модернизации, то даже этот начальный этап может потребовать очень много  сил
и времени программиста.
      Избежать  рутинной   работы   и   тем   самым   существенно   повысить
производительность  труда  программиста  позволяет  появившиеся   и   быстро
завоевывающие популярность так называемые интегрированные  среды  (оболочки)
разработки (Integrated Development Environment – IDE).
      Как  правило,  хорошая  интегрированная  среда  объединяет   имеющиеся
средства  отладки   (внутрисхемный   эмулятор,   программный   симулятор   и
программатор) и обеспечивает  работу  программиста  с  текстами  программ  в
стиле диалоговых окон.
      Интегрированная среда позволяет:
 . использовать встроенный  многофайловый  текстовый  редактор,  специально
   ориентированный на работу с исходными текстами программ;
 . наблюдать одновременно в многооконном режиме диагностику выявленных  при
   компиляции ошибок и исходный текст программы доступный редактированию;
 . вести параллельную работу над несколькими проектами.  Менеджер  проектов
   позволяет  использовать  любой  проект  в  качестве  шаблона  для  вновь
   создаваемого. Опции используемых компиляторов и список  исходных  файлов
   проекта  устанавливаются  в  диалоговых  меню  и  сохраняются  в  рамках
   проекта, устраняя необходимость работы с неудобными bat – файлами:
 . подвергать перекомпиляции, только редактировавшиеся модули;
 . загружать отлаживаемую программу в имеющиеся средства отладки и работать
   с ними без выхода из оболочки;
 . подключать к оболочки практически любые программные средства.
      В последнее время функции интегрированных сред  разработки  становится
принадлежностью программных интерфейсов наиболее «продвинутых» эмуляторов  и
отладчиков симуляторов.  Такие  функциональные  возможности  в  сочетании  с
дружественным интерфейсом существенно ускоряют работу программиста.
      Таким   образом,   выбирая    инструментальные    средства    отладки,
целесообразно принимать в расчет следующий  комплекс  показателей:  перечень
поддерживаемых  МК,  ограничения  на  ресурсы  эмулируемых/симулируемых  МК,
возможность символьной  отладки,  перечень  поддерживаемых  компиляторов  и,
наконец, сервисные возможности.

Язык Ассемблера.

      Прежде чем начать разработку какого либо устройства на база  МК  очень
важно познакомиться с основами программирования  на  языке  Ассемблера.  При
создании  приложений  для  МК  следует  не   только   освоить   этот   метод
программирования,  но  и  научиться  хорошо  понимать,  как  шаг  за   шагом
выполняется ваша программа, и что при этом происходит в устройстве.
      Чтобы  процесс  изучения  языка,  написание  и  отладка  программ   на
Ассемблере был более простым и понятным, существует несколько  приемов.  Во-
первых – использование визуализации процедур выполнения команд  процессором.
Во-вторых – применение методов структурного программирования, чтобы  сделать
программы более простыми для чтения и понимания.
      Визуализацию выполнения команд  лучше  всего  осуществлять,  используя
структурную схему процессора  или  МК,  на  которой  отмечается  прохождение
данных при выполнении каждой команды. В  результате  обеспечивается  хорошее
визуальное представление процесса выполнения команд.

Языки программирования высокого уровня.

      Для программирования МК можно использовать  различные  языки  высокого
уровня.  Термин  «язык  высокого  уровня»  служит  для  обозначения  языков,
используемых для написания легко читаемых программ,  которые  конвертируются
(компилируются) в язык ассемблера, а затем  преобразуются  в  объектный  код
(биты и байты) для их выполнения микроконтроллером.
      Перечислим основные характеристики языков высокого уровня:
      . наличие встроенных  функций  (например,  консольный  ввод/вывод)  с
        подключаемыми библиотеками;
      . разнообразные  типы  данных  (8-,  16-,  32-битные  и  с  плавающей
        точкой);
      . выполнение арифметических операций с использованием стека;
      . использование  локальных  и  глобальных  переменных,  указателей  и
        структур данных;
      . распределение памяти;
      . доступ к аппаратным регистрам;
      . символическая информация для симулятора/эмулятора.
      Реализация  этих   характеристик   может   быть   проблематичной   для
встраиваемых МК, которые обладают следующими особенностями:
      . ограниченный объем памяти программ ROM и памяти данных RAM;
      . отсутствие BIOS или операционной системы;
      . переопределяемый ввод/вывод (когда вывод может  использоваться  как
        цифровой/аналоговый/последовательный вход/выход).
      Таким образом, использование ассемблера необходимо, если к  размеру  и
быстродействию генерируемого кода предъявляются очень жесткие требования.  В
настоящее  время  таких  случаев  становится  все  меньше  и  меньше,   т.к.
практически всегда можно взять более «быстрый» МК с большим объемом  памяти.
Кроме  того,  современные  пакеты  кросс  средств  позволяют  легко   писать
смешанные программы, где часть модулей написана на Си, а наиболее  критичные
к быстродействию части –  на  ассемблере.  Компиляторы  Си  позволяют  также
вставлять в исходные тексты ассемблерные инструкции.
      При разработке программного обеспечения для  МК  существует  несколько
правил, которые следует выполнять,  чтобы  объем  используемых  ресурсов  не
превысил доступный предел.
     1. Использовать только один вид интерфейса  с  аппаратными  средствами
        (внешними устройствами). Применения различных  интерфейсов  создает
        проблемы,  если  потребуется   подключать   другие   типы   внешних
        устройств.
     2.   Идентифицировать   глобальные   переменные,    специфичные    для
        подпрограмм, и не использовать их где-нибудь еще в коде.
     3. Использовать везде, где возможно, локальные переменные  (это  можно
        реализовать только в языках высокого уровня).
     4. Если предполагается наличие временно  используемых  переменных,  то
        программа должна обеспечить их уникальное использование.
      Следование этим правилам при разработке  прикладных  программ  избавит
вас в дальнейшем от  проблем,  связанных  с  устранением  трудно  выявляемых
неустойчивых ошибок в программе.

1.4. Основные типы интерфейсов МК.


1.4.1. Подключение переключателей и подавление «звона» контактов.

      При замыкании и размыкании переключателей в цепи возникают  импульсные
помехи, вызванные дребезгом контактов. Эти помехи  обычно  называют  «шумом»
или «звоном». Такое явление часто возникает в системах на базах МК, где  для
ввода данных используется клавиатура,  и  «звон»  может  восприниматься  как
многократное нажатие клавиши (см. рис. 1.7). «Звон» возникает при  установке
и разрыве контакта путем нажатия на клавишу.



      а)                                б)

               Рис. 1.7. а) схема ключа; б) дребезг контактов.
      Чтобы устранить данный  эффект,  используются  специальные  схемы  или
программные методы для подавления «звона». Один из простых  схемотехнических
способов устранения «звона» состоит в  подключении  RC-цепи.  В  этой  схеме
время, требуемое для заряда разряда конденсатора до  порогового  напряжения,
маскирует «звон» контактов при переключении. Можно также установить  триггер
Шмитта между схемой ключа и МК, чтобы  усилить  эффект  подавления  «звона».
Недостатки этого метода –  дополнительные  затраты  на  компоненты,  которые
должны быть установлены на плате,  и  дополнительное  время,  требуемое  для
заряда/разряда  RC-цепи.  Все  это  может  затруднить  использование  данной
схемы, так как для некоторых ключей с большим уровнем  шумов  дополнительная
задержка может составить десятые доли  секунды.  Значительно  лучший  способ
избавиться от «звона» – сделать это программно. Если уровень  напряжения  на
выходе ключа не изменяется в течении 20мс,  то  можно  считать,  что  «звон»
окончился, и больше изменения состояний не ожидается.

1.4.2. Световая индикация.

      Очень часто вывод данных реализуются с помощью светодиодов LED  (Light
Emitting Diode), которые  достаточно  дешевы  и  легко  подключаются  к  МК.
Обычно  для  свечения  светодиода  требуется  ток  более  16  мА,  что   для
большинства МК находится в диапазоне  допустимых  значений  выходных  токов.
Следует помнить, что светодиод  является  диодом,  пропуская  ток  только  в
одном направлении.
      Типичная схема подключения светодиода к выводу МК   показана  на  рис.
1.8. В этой схеме светодиоды будут светиться  когда  МК  выдает  сигнал  «0»
(низкое напряжение). Когда вывод работает в качестве  входа  данных  или  на
него выводится «1», то светодиод будет выключен.
      Резистор сопротивлением 220 Ом используется для ограничения тока, т.к.
слишком большой ток может вывести из строя  МК  и  светодиод.  Некоторые  МК
содержат ограничители тока на выходных линиях, что устраняет потребность   в
ограничивающем  резисторе.  Но  все  же  целесообразно,  на  всякий  случай,
включить этот резистор,  чтобы  гарантировать,  что  короткое  замыкание  на
«землю» или напряжение питания Vcc, не выведет из строя МК.



            Рис. 1.8. Подключение светодиода к микроконтроллеру.

Семи сегментный индикатор.

      Вероятно самый простой вывод числовых десятичных  и  шестнадцатеричных
данных  –  это  использование  семи  сегментного  индикатора  (ССИ).   Такие
индикаторы были очень популярны в 70х  годах,  но  в  последствии  их  место
заняли жидкокристаллические индикаторы (ЖКИ). Но светодиодные индикаторы  до
сих пор являются полезными приборами, которые могут быть  включены  в  схему
без  больших  усилий  для   создания   программного   обеспечения.   Включая
определенные светодиоды (зажигая сегменты), можно выводить десятичные  числа
(см. рис. 1.9).
      Каждый светодиод в индикаторе имеет свой буквенный  идентификатор  (A,
B, C, D, E, F, G), и одна из ножек светодиода подключена к  соответствующему
внешнему  выводу.  Вторые  ножки  всех  светодиодов   соединены   вместе   и
подключены к общему выводу. Этот общий вывод определяет  тип  индикатора:  с
общим катодом или с общим анодом.
      Подключение индикатора  к  МК  осуществляется  весьма  просто:  обычно
индикатор подключают как  семь  или  восемь  (если  используется  десятичная
точка)  независимых  светодиодов.  Наиболее   важной   частью   работы   при
подключении к МК нескольких ССИ является назначения линий вводе  вывода  для
каждого  светодиода.  Решение  этой  задачи  в  начале  выполнения   проекта
упростит вам монтаж разводки и  отладку  устройств  в  дальнейшем.  Типичный
способ подключения нескольких индикаторов состоит в том, чтобы  включить  их
параллельно и затем управлять протеканием тока через общие выводы  отдельных
индикаторов.  Так  как  величина  этого  тока  обычно  превышает  допустимое
значение  выходного   тока   МК,   то   для   управления   оком   включается
дополнительные транзисторы, которые выбирают,  какой  из  индикаторов  будет
находиться в активном состоянии.



                    Рис. 1.9. Семи сегментный индикатор.
      На рис. 1.10 показано подключение к МК четырех ССИ. В  этой  схеме  МК
выдает данные для индикации, последовательно переходя от  одного  индикатора
к другому. Каждая  цифра  будет  высвечиваться  в  течении  очень  короткого
интервала  времени.  Это   обычно   выполняется   с   помощью   подпрограммы
обслуживания  прерываний  таймера.  Чтобы  избежать  мерцания   изображения,
подпрограмма  должна  выполняться  со  скоростью,  обеспечивающий  включение
индикатора, по крайней мере, 50 раз в секунду. Чем  больше  цифр,  тем  чаще
должны следовать прерывания от таймера. Например, при  использовании  восьми
ССИ цифры должны выводиться со скоростью 400 раз в секунду.



                  Рис. 1.10. Подключение к МК четырех ССИ.

1.4.3. Ввод с матричной клавиатуры.

      Во многих приложениях требуется производить ввод данных с  клавиатуры.
Это может быть реализовано при помощи  отдельных  кнопок,  но  такой  подход
слишком расточителен с точки зрения  использования  линий  ввода/вывода  МК.
Лучшим  решением  является  использование  матричной   клавиатуры,   которая
представляет собой набор ключей, объединенных в ряды  и  столбцы  (см.  рис.
1.11).



              Рис. 1.11. Подключение к МК матричной клавиатуры.
      Для чтения состояния определенного ключа на столбец подается сигнал, а
затем считывается состояние  рядов.  Обычно  ряды  подключаются  к  высокому
потенциалу,  а  опрашиваемый  столбец  соединяется  с   землей.   Если   при
сканировании считывается низкий уровень сигнала, то это означает,  что  ключ
в данной позиции  ряд-столбец  замкнут.  На  рис.  1.11  показаны  два  МОП-
транзистора, которые используются для подключения столбцов  к  земле.  Но  в
некоторых МК выводы могут  работать  в  режиме  с  открытым  коллектором,  и
следовательно имитировать  работу  этих  транзисторов,  делая  их  включение
ненужным.
      Матричная  клавиатура  может  быть  расширена  практически  до  любого
размера, используя при этом  небольшое  число  выводов  МК.  Например,  104-
клавишная клавиатура ПК – это матрица, содержащая 13х8 ключей.


    2. ОСОБЕННОСТИ ПОСТРОЕНИЯ И ФУНКЦИОНИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ ФИРМЫ
                             ATMEL СЕМЕЙСТВА AVR



2.1. Архитектура микропроцессорного ядра AVR-микроконтроллеров

      Архитектура AVR была оптимизирована так, чтобы  соединить  достоинства
Гарвардской и Принстонской (Фон Неймана) архитектуры  для  достижения  очень
быстрого и эффективного выполнения программ. Такая организация  обеспечивает
высокую эффективность процессора при обработке данных.
      Основной идеей всех  RISC  (Reduced  Instruction  Set  Computer),  как
известно, является увеличение быстродействия за счет  сокращения  количества
операций обмена с памятью  программ.  Для  этого  каждую  команду  стремятся
уместить в одну ячейку памяти программ. При ограниченной разрядности  ячейки
памяти это неизбежно приводит к сокращению набора команд микропроцессора.
      У AVR-микроконтроллеров в соответствии с  этим  принципом  практически
все команды  (исключая  те,  у  которых  одним  из  операндов  является  16-
разрядный адрес) также упакованы в одну ячейку памяти программ.  Но  сделать
это удалось не за счет сокращения  количества  команд  процессора,  а  путем
расширения ячейки памяти программ до 16  разрядов.  Такое  решение  является
причиной  богатства  системы  команд  AVR  по  сравнению  с  другими   RISC-
микроконтроллерами.
      Организация памяти AVR выполнена по схеме Гарвардского типа, в которой
разделены не только адресные пространства памяти программ и  памяти  данных,
но также и шины доступа к ним. Для более углубленного понимания  архитектуры
приведем две схемы (см. рис. 2.1 и 2.2).
      Вся программная память AVR-микроконтроллеров выполнена  по  технологии
FLASH и размещена на кристалле. Она  представляет  собой  последовательность
16-разрядных ячеек и имеет емкость от 512 слов до 64K слов в зависимости  от
типа кристалла.
      Разделение шин доступа (рис. 2.2.) к FLASH памяти и SRAM  памяти  дает
возможность иметь шины данных для памяти данных и памяти программ  различной
разрядности, а также использовать технологию конвейеризации.  Конвейеризация
заключается в том, что во время исполнения текущей команды  программный  код
следующей уже выбирается из памяти и дешифрируется.



                Рис. 2.1. Архитектура AVR-микроконтроллеров.



      Рис. 2.2. Структурная схема архитектуры процессора семейства AVR.
      Для сравнения  вспомним,  что  у  микроконтроллеров  семейства  MCS-51
выборка кода команды и ее  исполнение  осуществляются  последовательно,  что
занимает  один  машинный  цикл,  который  длится  12   периодов   кварцевого
резонатора.
      В случае использования конвейера  приведенную  длительность  машинного
цикла можно сократить. Например, у PIC-микроконтроллеров фирмы Microchip  за
счет использования конвейера удалось уменьшить длительность машинного  цикла
до 4 периодов кварцевого резонатора. Длительность  же  машинного  цикла  AVR
составляет один период кварцевого резонатора. Таким  образом,  AVR  способны
обеспечить заданную производительность при более  низкой  тактовой  частоте.
Именно эта особенность архитектуры и позволяет  AVR-микроконтроллерам  иметь
наилучшее   соотношение   энергопотребление/производительность,   так    как
потребление КМОП микросхем, как известно, определяется их  рабочей  частотой
[9,11].

Программная модель AVR и система команд.

      На рисунке 2.3 изображена  программная  модель  AVR-микроконтроллеров,
которая представляет собой  диаграмму  программно  доступных  ресурсов  AVR.
Центральным блоком  на  этой  диаграмме  является  регистровый  файл  из  32
оперативных регистров (R0-R31) или как их обычно  называют  регистры  общего
назначения (РОН). Все РОН непосредственно  доступны  АЛУ.  Старшие  регистры
(см. рис. 2.4.) объединены парами  и  образуют  три  16-разрядных  регистра,
предназначенных для косвенной адресации ячеек памяти  (AVR  без  SRAM  имеют
только один 16-битный регистр Z).



             Рис. 2.3. Программная модель AVR-микроконтроллеров.
      Регистровый файл, блок регистров ввода/вывода  и  оперативная  память,
как показано на рис. 2.3, образуют единое адресное  пространство,  что  дает
возможность при программировании обращаться к 32 оперативным регистрам  и  к
регистрам ввода/вывода как к ячейкам памяти,  используя  команды  доступа  к
SRAM (в том числе и с косвенной адресацией) [8].
      Все арифметические и  логические  операции,  а  также  часть  операций
работы с битами  выполняются  в  АЛУ  только  над  содержимым  РОН.  Следует
обратить внимание, что команды, которые в качестве  второго  операнда  имеют
константу (SUBI, SBCI, ANDI, ORI, SBR, CBR), могут использовать  в  качестве
первого операнда только регистры из второй половины РОН  (R16-R31).  Команды
16-разрядного сложения с  константой  ADIW  и  вычитания  константы  SBIW  в
качестве первого операнда используют только регистры R24, R26, R28, R30.



                     Рис. 2.4. Регистровый файл или РОН.
      Во время выполнения арифметических и логических операций или  операций
работы с битами АЛУ формирует те или иные признаки результата  операции,  то
есть устанавливает или сбрасывает биты в  регистре  состояния  SREG  (Status
Register) (см. рис. 2.5).
      Признаки результата операции могут быть затем использованы в программе
для  выполнения  дальнейших  арифметико-логических   операций   или   команд
условных переходов.

Адресация регистров ввода/вывода и памяти SRAM.

      Регистры ввода/вывода, также  изображенные  на  рис.  1,  представляют
собой набор регистров управления процессорного ядра и  регистров  управления
и данных  аппаратных  узлов  AVR-микроконтроллера.  Регистрами  ввода/вывода
являются регистры SREG, MCUSR и указатель стека SPH:SPL  а  также  регистры,
управляющие  системой  прерывания  микроконтроллера,  режимами   подключения
EEPROM  памяти,  сторожевым  таймером,  портами   ввода/вывода   и   другими
периферийными   узлами.   Изучение   данных   регистров   удобно   выполнять
одновременно с изучением конкретного периферийного узла.
      Все регистры ввода/вывода могут считываться и записываться  через  РОН
при помощи команд IN, OUT (см. группу команд передачи данных приложение  1).
Регистры ввода/вывода,  имеющие  адреса  в  диапазоне  $00  -  $1F  (знак  $
указывает на шестнадцатеричную  систему  счисления),  обладают  возможностью
побитовой адресации. Непосредственная установка и сброс  отдельных  разрядов
этих регистров выполняется командами SBI и CBI (см. группу команд  работы  с
битами приложение 1). Для признаков результата  операции,  которые  являются
битами регистра ввода/вывода SREG, имеется целый набор  команд  установки  и
сброса. Команды условных переходов в качестве своих  операндов  могут  иметь
как биты-признаки результата  операции,  так  и  отдельные  разряды  побитно
адресуемых регистров ввода/вывода.
      На  рис.  2.3  показано  распределение  адресов  в   едином   адресном
пространстве.  Младшие  32  адреса  ($0  -  $1F)  соответствуют  оперативным
регистрам т.е. РОН. Следующие 64 адреса  ($20  -  $5F)  зарезервированы  для
регистров ввода/вывода. Внутренняя SRAM у всех AVR начинается с адреса  $60.

      Таким образом, регистры ввода/вывода  имеют  двойную  нумерацию.  Если
используются команды IN, OUT, SBI, CBI, SBIC, SBIS, то следует  использовать
нумерацию  регистров  ввода/вывода,  начинающуюся   с   нуля   (назовем   ее
основной). Если же к регистрам  ввода/вывода  доступ  осуществляется  как  к
ячейкам памяти,  то  необходимо  использовать  нумерацию  единого  адресного
пространства оперативной памяти данных AVR. Очевидно,  что  адрес  в  едином
адресном пространстве памяти данных получается путем прибавления  числа  $20
к основному адресу регистра ввода/вывода.
      Для  хранения  оперативных  данных  программист,  кроме   РОН,   может
использовать внутреннюю  и  внешнюю  (если  они  имеются)  блоки  SRAM  (см.
рис. 2.3).
      Работа  с  внешней  SRAM  может  быть  программно  разрешена/запрещена
установкой/сбросом бита SRE в регистре ввода/вывода MCUSR.
      Операции обмена с внутренней оперативной  памятью  AVR-микроконтроллер
выполняет за два машинных  цикла.  Доступ  к  внешней  SRAM  требует  одного
дополнительного цикла на каждый байт  по  сравнению  с  внутренней  памятью.
Кроме  того,  установкой  бита  SRW  в  регистре  ввода/вывода  MCUSR  можно
программно увеличить время обмена с внешней SRAM еще на один  дополнительный
машинный цикл ожидания.
      Выполнять   арифметико-логические   операции   и    операции    сдвига
непосредственно над содержимым ячеек памяти нельзя.  Нельзя  также  записать
константу  или  очистить  содержимое  ячейки  памяти.  Система  команд   AVR
позволяет лишь выполнять операции  обмена  данными  между  ячейками  SRAM  и
оперативными  регистрами.  Достоинством   системы   команд   можно   считать
разнообразные режимы адресации ячеек памяти. Кроме прямой адресации  имеются
следующие режимы: косвенная, косвенная с пост-инкрементом, косвенная с  пре-
декрементом и косвенная со смещением.
      Поскольку  внутренняя  и  внешняя  SRAM  входят  в   единое   адресное
пространство (вместе с оперативными регистрами и  регистрами  ввода/вывода),
то для доступа к ячейкам внутренней и внешней памяти используются одни и  те
же команды.
      Следует отметить, что регистры ввода/вывода  не  полностью  используют
отведенные для них 64  адреса.  Неиспользуемые  адреса  зарезервированы  для
будущих  применений,  дополнительных  ячеек  памяти  по  этим   адресам   не
существует.

Программный счетчик и стек

      В ячейках оперативной  памяти  организуется  системный  стек,  который
используется автоматически для  хранения  адресов  возврата  при  выполнении
подпрограмм, а  также  может  использоваться  программистом  для  временного
хранения содержимого оперативных регистров (команды PUSH и  POP).  В  начале
любой программы необходимо инициализировать  стек  программными  средствами,
т.е. занести в Указатель Стека (Stack Pointer)  начальное  значение,  равное
самому старшему адресу ячейки в  оперативной  памяти.  Микроконтроллеры,  не
имеющие SRAM, содержат трехуровневый аппаратный стек.
      Следует иметь в виду, что если стек располагается во внешней SRAM,  то
вызовы подпрограмм и возвраты из них  требуют  двух  дополнительных  циклов,
если бит SRW не установлен, и четырех, если установлен.
      Размер стека,  организуемого  в  оперативной  памяти,  ограничен  лишь
размерами этой памяти. Если микроконтроллер содержит на кристалле  128  байт
внутренней SRAM и не  имеет  возможности  подключения  внешней  SRAM,  то  в
качестве указателя вершины  стека  используется  регистр  ввода/вывода  SPL.
Если есть возможность  подключения  внешней  памяти  или  внутренняя  память
имеет размеры 256  байт  и  больше,  то  указатель  стека  состоит  из  двух
регистров ввода/вывода SPL и SPH.
      При  занесении  числа  в  стек  автоматически  выполняются   следующие
действия:
1. Число записывается в ячейку памяти по адресу,  хранящемуся  в  указателе
   стека. (SPH:SPL) <- число;
2. Содержимое указателя стека уменьшается на единицу. SPH:SPL =  SPH:SPL  -
   1.
      Обратные действия выполняются при извлечении числа из стека:
1. Содержимое указателя увеличивается на единицу. SPH:SPL= SPH:SPL + 1;
2. Число извлекается из ячейки памяти с  адресом,  хранящимся  в  указателе
   стека. (SPH:SPL) -> число.
      Таким образом, стек растет от  старших  адресов  к  младшим,  поэтому,
учитывая, что начальное значение указателя стека после  сброса  равно  нулю,
программист  AVR  обязательно  должен  в  инициализирующей  части  программы
позаботиться  об   установке   указателя   стека,   если   он   предполагает
использовать хотя бы одну подпрограмму.
      Кроме   оперативной    памяти    программно    доступными    ресурсами
микроконтроллера являются  энергонезависимые,  электрически  программируемые
FLASH и EEPROM блоки памяти, которые имеют отдельные адресные  пространства.

      Младшие адреса памяти программ  имеют  специальное  назначение.  Адрес
$0000 является адресом, с  которого  начинает  выполняться  программа  после
сброса  процессора.  Начиная  со  следующего  адреса  $0001,  ячейки  памяти
программ образуют область векторов прерывания. В этой  области  для  каждого
возможного источника прерывания отведен свой адрес, по  которому  (в  случае
использования данного прерывания) размещают команду относительного  перехода
RJMP на подпрограмму обработки прерывания (см. рис. 2.3).  Следует  помнить,
что адреса векторов прерывания одних и тех же аппаратных  узлов  для  разных
типов  AVR  могут   иметь   разное   значение.   Поэтому   для   обеспечения
переносимости программного обеспечения удобно, так  же  как  и  в  случае  с
регистрами ввода/вывода, использовать символические имена  адресов  векторов
прерывания, которые определены в соответствующем  inc-файле.
      EEPROM блок электрически стираемой памяти данных AVR предназначен  для
хранения энергонезависимых данных, которые могут изменяться  непосредственно
на   объекте.   Это   калибровочные   коэффициенты,   различные   установки,
конфигурационные параметры системы и т. п. EEPROM-память данных  может  быть
программным путем как считана, так и  записана.  Однако  специальных  команд
обращения к EEPROM-памяти нет. Чтение  и  запись  ячеек  EEPROM  выполняется
через регистры ввода/вывода EEAR (регистр адреса), EEDR (регистр  данных)  и
EECR (регистр управления).

Регистр состояния.

      Регистр состояния – SREG является частью пространства  ввода/вывода  и
расположен  по  адресу  $3F.  В  нем  устанавливаются  признаки   результата
арифметических операций. Отдельные биты регистра имеют следующее  назначение
(см. рис. 2.5)



             Рис. 2.5. Регистр состояния SREG (Status Register).
      Рассмотрим некоторые из признаков:
 . Бит 0  –  С  (carry)  Флаг  переноса.  Устанавливается,  если  во  время
   выполнения операции был перенос из старшего разряда результата;
 . Бит 1  –  Z  (zero)  Флаг  нулевого  результата.  Устанавливается,  если
   результат операции равен 0;
 . Бит 2 – N Флаг  отрицательного  результата.  Устанавливается,  если  MSB
   (Most Significant Bit -  старший  бит)  результата  равен  1  (правильно
   показывает знак результата, если не было  переполнения  разрядной  сетки
   знакового числа);
 . Бит 3 – V Флаг переполнения дополнения до двух. Устанавливается, если во
   время выполнения операции было переполнение  разрядной  сетки  знакового
   результата;
 . Бит 4 – : Бит знака, S = N XOR V. Бит S всегда  равен  исключающему  ИЛИ
   между флагами N (отрицательный результат) и V  (переполнение  дополнения
   до двух).  Правильно  показывает  знак  результата  и  при  переполнении
   разрядной сетки знакового числа;
 . Бит 5 – H Флаг половинного  переноса.  устанавливается,  если  во  время
   выполнения операции был перенос из 3-го разряда результата.
 . Бит 6 - T: Хранение копируемого бита. Команды копирования битов BLD (Bit
   LoaD) и BST (Bit STore) используют этот  бит  как  источник  и  приемник
   обрабатываемого бита. Бит из  регистра  регистрового  файла  может  быть
   скопирован в  T  командой  BST,  бит  T  может  быть  скопирован  в  бит
   регистрового файла командой BLD.
 . Бит 7 - I: Общее разрешение прерываний. Для разрешения  прерываний  этот
   бит должен быть установлен в единицу. Управление отдельными прерываниями
   производится регистром маски прерываний - GIMSK/TIMSK. Если флаг сброшен
   (0), независимо от состояния GIMSK/TIMSK, прерывания не разрешены. Бит I
   очищается  аппаратно  после  входа  в  прерывание  и   восстанавливается
   командой RETI, для разрешения обработки следующих прерываний.

Прерывания.

      Описать,  что  происходит  внутри  процессора  во   время   выполнения
прерывания очень просто. Если  произошел  запрос  прерывания,  и  флаг  I  в
регистре состояния установлен в 1, то адрес следующий команды сохраняется  в
стеке,  а  выполнения  программы  продолжается  с   адреса,   хранящимся   в
соответствующем векторе  прерывания.  Когда  запрос  прерывания  получен,  и
программа перешла по этому вектору (адресу), флаг I сбрасывается в 0,  чтобы
предотвратить  возможность  вызова  нового  прерывания  во  время  обработки
текущего прерывания.
      Флаг I будет снова установлен в  1  в  конце  обработчика  прерывания,
когда выполняется команда возврата RETI. Он также может быть установлен в  1
в  процессе  обработки  (после  сохранения  контекстовых  регистров),  чтобы
разрешить  вложенные  прерывания.  Средние  и  старшие  модели   AVR   могут
обрабатывать столько вложенных прерываний, на сколько  хватит  объема  стека
для хранения содержимого счетчика  команд  и  регистров  контекста.  Младшие
модели имеют ограниченный объем стека (три позиции),  который  может  быстро
переполниться при выполнении вложенных прерываний или подпрограмм.


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».
      Окно регистров ввода/вывода.
      Для  более  наглядного  представления,  что  происходит  с  регистрами
ввода/вывода во время выполнения программы, откроем соответствующее  окно  –
«IO view». Это можно сделать либо через меню «View» команда «New  IO  View»,
либо нажав «Alt» и 5, как показано на рис. 3.9, или на  панели  инструментов
нажать соответствующую кнопку – .



          Рис. 3.10. Окно регистров ввода/вывода для МК AT90S8515.
      Так как мы определили для встроенного симулятора микроконтроллер  типа
AT90S8515, то окно регистров ввода/вывода откроется автоматически  со  всеми
надлежащими устройствами для этого типа МК  (см.  рис.  3.10).  Данное  окно
содержит перечень  устройств,  содержимое  которых  можно  просмотреть,  как
«древовидную» структуру, где один  элемент  может  содержать  ряд  вложенных
подэлементов.



                       Рис. 3.11. Содержимое порта В.
      Так как  наша  программа  работает  с  портом  В,  то  рассмотрим  его
содержимое более подробно. Для этого по названию «Port B» щелкнем мышью  два
раза  (double  click)  или  один  раз  по  плюсику  слева.  Список  порта  В
раскроется, как показано на рис. 3.11, и можно будет увидеть регистр  данных
(PORTB), регистр направления данных (DDRB) и выводы порта В (PINB)  –  «Port
B Data», «Data Direction» и «Input Pins», соответственно.
      Каждый бит  этого  регистра  представлен  в  виде  флажка.  Логическая
единица соответствует установленному флажку, а логический  ноль  –  снятому.
Состояния  этих  флажков  обновляются  во  время  выполнения   программы   и
показывают текущее значение каждого бита. Вы также можете устанавливать  или
очищать значения битов, щелкая мышью по соответствующим флажкам,  тем  самым
изменяя значения соответствующих регистров ввода/вывода.
      Существует пара команд для одиночного пошагового выполнения программы.
Это «Trace into» /F11/ и «Step Over» /F10/ из меню «Debug» (см.  рис.  3.7).
Отличие состоит в том, что «Trace into» при  вызове  подпрограммы  входит  в
неё в пошаговом режиме, т.е. можно отследить каждую команду по  отдельности;
а «Step Over» выполняет  подпрограмму  целиком  и  продолжает  выполнение  в
пошаговом режиме со следующей команды после вызова  подпрограммы,  т.е.  как
бы «обходит» подпрограмму.  Наш  пример  не  содержит  подпрограмм,  поэтому
различие заметно не будет.
      Дойдя до последней строчки программы,  следует  обратить  внимание  на
изменение цвета регистров порта В. Те регистры,  которые  в  последнем  шаге
трассировки  поменяли  свое  значение,  становятся  красными,  остальные   –
черные. Это облегчает наблюдать за  теми  регистрами  ввода/вывода,  которые
меняют свое значение при трассировке. Продолжая трассировку  (нажимая  /F11/
)  можно  наблюдать  как  регистры  порта   В   меняют   свое   значение   –
инкрементируются.



                    Рис. 3.12. Добавление точки останова.
      Добавляя точки останова, мы можем выполнять программу  с  максимальной
скоростью, останавливаясь лишь там, где установлены точки останова.
      Установив, курсор на нужном месте и нажав , или вызвав контекстное
меню и нажав  команду  «Toggle  Breakpoint»  можно  лег?о  установить  точку
останова (см. рис. 3.12). Повторное нажатие приведет к  её  снятию.  Красный
квадратик на полоске слева как раз и обозначает  точку  останова.  В  данном
примере точка останова  установлена  для  демонстрации  увеличения  скорости
выполнения программы. Когда не было точки останова  нам  требовалось  трижды
нажимать   чтобы  совершить  один  цикл  (loop:).  Установив  же  точку
останова на команде “rjmp loop” и запустим  программу  на  выполнение  через
меню  «Debug»  команда  «Go»  или  нажмем    (см. рис. 3.7),   остановка
произойдет  лишь  в  точке  останова  и  таким  образом  для  одного   цикла
потребуется всего лишь одно нажатие  .  Это  реальный  пример  ускорения
отладки программы.
      Предположим нам надо чтобы регистр порта  В  не  инкрементировался,  а
декрементировался во время выполнения программы. Для этого  немного  изменим
код программы. В окне исходного кода программы строчку  "inc  temp"  изменим
на "dec temp" (см. рис. 3.13). Если теперь продолжить  выполнение  программы
(нажать  или  или ), то AVR  Studio  выдаст  диалоговое  окно,
которое информирует об изменение исходного  файла  и  спрашивает,  нужно  ли
перекомпилировать проект. Следует нажать «Yes».



   Рис. 3.13. Изменение исходного кода программы и перекомпиляция проекта.
      После перекомпиляции указатель  счетчика  команд  будет  установлен  в
начало  на  первую  команду.  Заметим,  что  установленные  точки   останова
остаются без изменения.


      «Смотровое» окно.
      Для наблюдения за  переменными,  а  точнее  за  их  значениями  удобно
использовать «Смотровое» окно (Watch window). Открыть его можно  использовав
комбинацию клавиш «Alt»  +  «1»  или  вызвав  меню  «View»  команду  «Watch»
(см. рис. 3.9) или нажав кнопку на панели инструментов –          .
      Переменные, которые определены с помощью  макроса  “.DEF”  могут  быть
помещены  в  «Смотровое»  окно   несколькими   способами.   Выделив   нужную
переменную ее можно просто перетащить в «Смотровое» окно или в меню  «Watch»
нажать команду «Add Watch»  или  на  панели  инструментов  нажать  кнопку  –
   .
      В данной программе только переменная “temp” является таковой. Ее мы  и
можем увидеть на рис. 3.14.



                         Рис. 3.14. Смотровое окно.
      Во время пошагового выполнения программы можно наблюдать, как меняется
наша  переменная  “temp”.  Заметим,  что   данное   окно   также   позволяет
пользователю изменять значения переменных, т.е.  непосредственно  влиять  на
ход выполнения программы, облегчая отладку.



                         Рис. 3.15. Окно процессора.
      Окно процессора.
      Теперь понаблюдаем за окном процессора. Откроем его, нажав «Alt» + «3»
(см. рис. 3.9) или щелкнув по иконки –        . Это окно  (см.  рис.  3.15.)
предоставляет  определенную  информацию  о  выполнении   программы   включая
Счетчик Команд (Program  Counter),  Указатель  Стека  (Stack  Pointer),флаги
регистра состояния (Flags), Счетчик Циклов (Cycle Counter) и др.
      Очень полезными  для  оценки  длинны  циклов  или  времени  выполнения
подпрограммы могут оказаться «Cycle Counter» и «StopWatch».  Хоть  в  данном
примере мы практически не используем это  окно,  оно  все  же  играет  очень
важную роль в отладки программы.
      Перед закрытием проекта необходимо его сохранить. AVR Studio  запомнит
расположение окон и использует эти установки при следующем запуске  проекта.



3.2. Анализ методики реализации разработки программного обеспечения


3.2.1. Классификация вариантов заданий

      Цель заданий –  практическое  освоение  методики  программирования  на
ассемблере микроконтроллеров  ATMEL  семейства  AVR,  отладка  программы  на
симуляторе AVR Studio и программирование кристалла с  помощью  программатора
расположенного в системе макета. Примеры  заданий  могут  использоваться  не
только как для проверки знаний и  навыков  по  программированию,  но  и  для
наглядного объяснения архитектуры при чтении теоретического материала.
      После изучения теоретического материала,  а  именно:  архитектуры  МК,
аппаратных  и  программных  средств,  основных  типов  интерфейсов,  системы
команд  и  симулятора  МК,  можно  приступить  к   практической   реализации
различных задач на основе МК.
      Именно написание программ и умение  их  объяснить  является  критерием
понимания архитектуры МК, а также критерием способности использовать  данную
архитектуру в сочетании с программированием (ассемблером).
      Конкретных примеров заданий может быть очень много.  Мы  разделим  эти
примеры на несколько общих классов. Сначала  перечислим  достаточно  простые
классы задач.
      1. Работа с памятью.
      К этому  классу  задач  можно  отнести  любые  операции  с  различными
областями памяти, такие как чтение или запись. К  примеру,  можно  считывать
или записывать данные из/в EEPROM, SRAM или даже  памяти  программ  (Program
Memory). Меняя начальный адрес  и  размер  данных,  а  также  тип  (область)
памяти можно создавать различные примеры задач.
      2. Индикация.
      Подключая к  выводам  портов  различные  системы  индикации,  будь  то
простые  светодиоды,  ССИ  или  ЖКИ  можно  создать  широкий  класс   задач.
Различные  варианты  примеров  можно  создать,   изменяя   очередность   или
длительность световой индикации. Можно сделать несколько примеров заданий  с
движущимися символами или «бегущей строкой»,  задавая  различные  символы  и
строки. Реализация различной  длительности  индикации  может  осуществляться
либо с помощью  таймера,  либо  с  помощью  циклов  задержки,  либо  другими
способами, что увеличивает разнообразие вариантов заданий.
      3. Вычисления и обработка данных
      Существует много примеров с арифметическими вычислениями.  К  примеру,
можно производить сложение, вычитание, умножение, деление или  сравнение  8-
или  16-разрядных  чисел.  Также  существуют  математические  или   базисные
логические функции, из которых  можно  строить  более  сложные  произвольные
функции.
      Еще к этому классу задач  относятся  преобразование  8-,  16-разрядных
чисел в упакованные (или нет) двоично-десятичные  (Binary  Coded  Decimal  –
BCD) и обратно, сортировка чисел различными способами и фильтрация.
      4. Измерение внешних параметров и устройства управления:
      Сюда входят задачи по измерению напряжения, тока,  частоты,  давления,
скорости вращения и других параметров.  Создание  часов  реального  времени,
калькулятора,   кодового   замка,   управление    двигателем,    регулировка
температуры.
      Это достаточно сложный класс задач, так как он может включать в себя и
некоторые вышеперечисленные классы (1-3).

Варианты заданий

      Префикс 0x – обозначает шестнадцатеричное число, 0b  –  двоичное,  без
префикса пишется десятичное число.
      Во всех вариантах необходимо составить и отладить программу с  помощью
симулятора и если необходимо  запрограммировать  микроконтроллер  с  помощью
программатора в системе макета.
1. Дан массив А из 8 (или др.) однобайтовых чисел  распложенных  в  Program
   Memory или EEPROM начинающийся с адреса 0x0A (или  др.).  Переписать  из
   массива А в массив В все числа, большие 0x05 (или др.) и  меньшие  0x2С.
   Массив В может находиться либо в EEPROM, либо в SRAM.
2.    Написать     программу     перекодировки     восьмиразрядного     или
   шестнадцатиразрядного двоичного числа в  упакованное  двоично-десятичное
   число.
3.  Написать  программу  перекодировки  двухразрядного  или  пятиразрядного
   двоично-десятичного числа в двоичное.
4. Написать программу сложения или вычитания двух двухразрядных  десятичных
   чисел
5. Дан массив А  из  8  (или  др.)  однобайтовых  или  двухбайтовых  кодов.
   Определить, содержит ли он код 0хАС или 0хАFВС. Если "да", то в  регистр
   Rn занести число таких кодов.
6. Дан массив А из 10 однобайтовых (или др.) чисел. Переписать его в массив
   В, упорядочив числа по возрастанию (или по убыванию).
7. Дан массив А из 10 однобайтовых чисел.  Переписать  в  массив  В  только
   числа, содержащие четное (или нечетное) количество единиц (или нулей).
8. Зашифровать содержащиеся в массиве А коды 10 букв или цифр по следующему
   правилу: а) циклический сдвиг влево на 5 (или др.) разрядов и  побитовая
   инверсия; б) прибавить константу 2 (или др.) и циклический сдвиг  вправо
   на 3 разряда.
9. Дан массив А из 5 однобайтовых чисел. Определить, содержит ли  он  число
   0х1F (или др.). Если да, то выполнить операцию "логическое И" (или  др.)
   над всеми числами массива А.
10. Переписать в стек, расположенный в памяти с адреса С,  массив  А  из  10
   восьмиразрядных (или др.) чисел. Выполнить  операцию  суммирования  (или
   др.) над ними.
11. Дан массив А из 10 однобайтовых чисел, содержащий число 0хАА.  Выполнить
   операцию "логическое И" (или др.) над всеми числами до 0xАА  и  операцию
   "логическое ИЛИ" (или др.) над всеми числами после него.
12. Написать программу  вычисления  логической  функции  V=X*(NOT.Y*Z+NOT.W)
   (или др.) ,где + - знак операции  ИЛИ,*  -  знак  операции  И,  X,Y,Z,W-
   логические переменные, хранимые в разрядах 3-0 ячейки памяти  EEPROM  по
   адресу 0x00.
13. Написать программу сложения или вычитания двух  8  разрядных  (или  др.)
   двоичных чисел со знаком (или без).
14. Дан массив А из 10 однобайтовых чисел. Переписать в массив В все  числа,
   большие (или меньшие) 0х20, и записать в  регистр  Rn  (или  вывести  на
   индикатор) число таких чисел.
15. Определить четное или нечетное число единиц (или  нулей)  в  8  двоичных
   кодах, записанных в массиве А, и вывести на индикатор сообщение «Ч»  или
   «Н» (или число единиц).
16. Дан массив А из 10 однобайтовых чисел. Переписать в массив В все  числа,
   лежащие в диапазоне 0х0F – 0хF0 (или др.). Вывести  на  индикатор  число
   таких чисел.
17. Дан массив А из 8 однобайтовых чисел, содержащий число 0хА1.  Необходимо
   найти сумму всех чисел массива А, находящихся до этого числа.  Результат
   вывести на индикатор.
18. В массиве А хранится 8 показаний температуры больных .Проверить, нет  ли
   среди  них  значений  выше  37  и  ниже  36  и  вывести   на   индикатор
   соответственно два числа через пробел.
19. Разработать программу  вывода  на   индикатор   отладочного   устройства
   последовательности цифр 1-8,образовав ряд 12345678.
20. Разработать программу вывода на индикатор всех битов регистра  состояния
   процессора SREG в формате: каждому флагу (биту)- один разряд индикатора.
21. Разработать программу для последовательного вывода  всех  цифр  на  один
   семисегментный индикатор с интервалом вывода -1с.
22. Разработать  программу  мигания  одного  (или  др.)  разряда  дисплея  с
   интервалом 3сек. (или др.).
23.  Разработать  программу  последовательного  гашения  всех    индикаторов
   дисплея после его включения.
24.  Разработать  программу   циклического   перемещения   одного   символа,
   хранимого в ячейке памяти, вдоль индикатора (бегущий символ).
25. Разработать программу  для  циклического  перемещения  набора  цифр  или
   символов вдоль индикатора в направлении справа налево (или наоборот).
26. Разработать программу "Электронные часы", используя для  индикации  семи
   сегментный индикатор. Формат  вывода  «22.15.30» или «22.15»,  обеспечив
   мигание точки с интервалом 1с.
27. Разработать программу, чередующую вывод  на  индикатор  сообщений  «1C»,
   «2C» и «4C» (или др.) удерживаемых соответственно 1сек, 2сек и 4сек.
28. Используя матричную клавиатуру 3х3 и светодиод разработать  программу  и
   устройство, которое обеспечивало мигание светодиода такое количество раз
   равное номеру нажатой клавиши (1 – 9).
29. Используя  матричную  клавиатуру  4х4  (или  др.)  и  систему  индикации
   разработать программу и устройство кодового замка из 4  (или  др.)  цифр
   кода.
30.  Используя  матричную  клавиатуру  4х4  (или  др.)  и  семи   сегментные
   индикаторы разработать  программу  и  устройство  калькулятора,  которое
   обеспечивает сложение, вычитание, умножение и  делание  16-ти  разрядных
   чисел.
31.  Используя  генератор  звуковых  колебаний  и  несколько  разрядов   ССИ
   разработать программу и устройство измерения частоты в диапазоне 20 Гц –
   20 КГц.

Основные принципы выполнения заданий.

      Предполагается,  что  обучающийся  должен   иметь   представление   об
архитектуре и системе команд микроконтроллеров AVR. При  выполнении  задания
необходимо придерживаться следующих правил:
      1)  уяснить  поставленную  задачу,  понимая,   что   должно   являться
         результатом;
      2)  выбрать  соответствующий  микроконтроллер,  исходя  из  требования
         задания;
      3) составить подробное (побитовое) описание необходимых для выполнения
         задания  регистров  имея  перед  собой   таблицу   всех   регистров
         ввода/вывода (см. ПРИЛОЖЕНИЕ 2);
      4) определить необходимые векторы  прерываний  и  составить  алгоритмы
         соответствующих обработчиков векторов прерываний;
      5) составить алгоритм  основной  программы,  учитывая  особенности  МК
         (стек и т.д.);
      6) приступить  к  написанию  программы,  выбирая  необходимые  команды
         ассемблера.
      На рис. 3.15.1 изображена структурная  схема  процесса  обучения.  Она
включает:
      1)  Написание  программы  прошивки   микроконтроллера,   для   решения
поставленной задачи;
      2) Контроль  правильности  разработанной  программы  на  симуляторе  с
помощью компьютера (первая петля обратной связи);
      3)  Прошивка  микроконтроллера  и  сопряжение  с  системой   индикации
(внешними   устройствами)   для   окончательного    контроля    правильности
выполненной задачи (вторая петля обратной связи).



              Рис. 3.15.1 Структурная схема процесса обучения.

3.2.2. Рассмотрение типовых примеров

      В качестве примера работы  с  памятью  рассмотрим  следующее  задание:
Требуется написать программу копирования таблицы из  20  восьмибитных  чисел
данных из памяти программ  (Program  Memory)  в  оперативную  память  (SRAM)
начиная с адреса 0х80.
      Рассмотрим выполнение данной программы в соответствии с  предложенными
выше правилами.
      В данном примере нам необходимо работать с оперативной  памятью  SRAM.
Так как в МК AT90S1200 её нет, то выбираем к  примеру  AT90S8515  (или  др).
Теперь нам надо позаботиться о правильной инициализации  стека,  загрузив  в
указатель стека адрес старшей ячейки оперативной  памяти.  Данную  программу
можно  полностью  реализовать  на  симуляторе  AVR  Studio  Simulator,   где
наглядно будет видна вся карта памяти. Ниже приведем программу с  некоторыми
пояснительными комментариями.
      Программа копирования таблицы данных:
;********************************************************************
.include "8515def.inc"
.equ  BLOCK1      =$80 ;начальный адрес копируемой таблицы данных в SRAM
                       ;памяти
.def  flashsize   =r16 ;РОН хранящий размер таблицы
.def  temp   =r16            ;РОН для промежуточных действий

       rjmp   RESET             ;вектор  прерывания  по  включению  питания,
сбросу
                       ;RESET или сбросу от сторожевого таймера
;**********************************************************************
;* Подпрограмма копирования таблицы данных из памяти программ в SRAM
flash2ram:
      lpm              ;загружаем из памяти программ в R0 байт адрес
                       ;которого указан в Z
      st    Y+,r0            ;сохраняем его в SRAM памяти с  постинкрементом

                       ;регистра Y
      adiw  ZL,1       ;инкремент Z
      dec   flashsize  ;декремент flashsize
      brne  flash2ram  ;если предыдущая операция не равна 0 то перейти на
                       ;метку
      ret              ;возврат в основную программу
;***********************************************************************
;* Основная программа
RESET:
      ldi   temp, low(RAMEND)     ; инициализируем указатель стека
      out   SPL, temp             ;
      ldi   temp, high(RAMEND)    ;
      out   SPH, temp             ;
      ldi   ZH, high(F_TABLE*2)   ;загружаем в регистр Z удвоенный адрес
      ldi   ZL, low(F_TABLE*2)    ; начала таблицы данных
      ldi   YH, high(BLOCK1)      ;загружаем в регистр Y адрес начала
      ldi   YL, low(BLOCK1)       ; таблицы данных в SRAM памяти
      ldi   flashsize,20          ;определяем размер таблицы
      rcall flash2ram   ;вызываем подпрограмму копирования таблицы данных
                        ;из памяти программ в SRAM память
forever:rjmp     forever           ;бесконечный цикл
F_TABLE:
      .db   0,1                   ;начало таблицы из 20 восьмибитных чисел
      .db   2,3
      .db   4,5
      .db   6,7
      .db   8,9
      .db   10,11
      .db   12,13
      .db   14,15
      .db   16,17
      .db   18,19
;**********************************************************************
      В качестве примера задачи по индикации рассмотрим второй пример:
      Используя два светодиода и кнопку разработать программу  и  устройство
которое вызывает мигание одного светодиода, подключенного к выводу PB0, и  с
помощью кнопки, подключенной к выводу PD5, зажигает светодиод,  подключенный
к выводу PB4. Частоту мигания светодиода порядка 2-3  Гц  задать  с  помощью
обработчика прерывания от таймера Т0.
      Данное устройство можно реализовать на МК AT90S1200.  Для  обеспечения
заданной частоты мигания  светодиода  коэффициент  предварительного  деления
тактовой частоты  (4Гц)  для  таймера  Т0  будет  равен  1024.  Подпрограмма
обработки  прерывания  по  переполнению  таймера  Т0  инвертирует   значение
логического уровня (0 или 1) на 0 выводе  порта  В,  обеспечивая  тем  самым
мигание подключенного светодиода. Светодиоды подключаются  согласно  разделу
«1.4.2 Световая индикация». Исходный текст программы цифрового частотомера:
;********************************************************************
.include "1200def.inc"
  rjmp       Start     ;вектор прерывания по включению питания, сбросу
                       ;RESET или сбросу от сторожевого таймера
  nop                  ;вектор внешнегго прерывания неиспользуется
  rjmp       TmrInt    ;вектор прерывания по переполнению таймера Т0
;**********************************************************************
;* Подпрограмма обработки прерывания по переполнению таймера Т0
TmrInt:
  in   R0, SREG        ;сохранение регистра статуса SREG
  in   R16, PORTB      ;запомнить текущее значение PortB
  ldi  R17, $1         ;
  eor  R16, R17        ;инвертируем 0 бит порта В
  out  PORTB, R16
  out  SREG, R0
  reti                 ;выход из подпрограммы
;********************************************************************
;* Основная программа
Start:
  ldi  R18, $11        ;конфигурируем биты порта В
  out  DDRB, R18       ; как выход
  clr  R18
  out  PORTB, R18
  clr  R18             ;конфигурируем 5 бит порта D
  out  DDRD, R18       ; как вход
  ldi  R18, $20
  out  PORTD, R18
  ldi  R18, 5          ;устанавливаем коэффициент предварительного деления
  out  TCCR0, R18      ; частоты на 1024
  ldi  R18, 2          ;разрешаем прерывание по переполнению таймера Т0
  out  TIMSK, R18
  SEI                  ;общее разрешение прерываний
Loop:                  ;  Loop Around Forever
  sbis       PIND, 5   ;если PIND5=0 (кнопка нажата)
  rjmp       PORTB0_Hi ; перейти на метку PORTB0_Hi
  cbi  PORTB, 4        ;обнулить бит 4 порта В
  rjmp       Loop
PORTB0_Hi:             ;
  sbi  PORTB, 4        ;установить бит 4 порта В
  rjmp       Loop
;**********************************************************************
      В качестве третьего, достаточно сложного примера рассмотрим  программу
для измерителя частоты в диапазоне 20  Гц  –  20  КГц,  используя  генератор
звуковых колебаний и несколько разрядов ССИ.
      Согласно схеме изображенной на рис. 3.15.2. преобразуем  колебания  от
генератора в П-импульсы и подаем на вывод  прерывания  (INT0)  МК.  Диод  D1
обеспечивает  однополупериодное  выпрямление  исследуемой  синусоиды.  После
делителя R1, R3 напряжение поступает на ограничитель R2,  D2  с  напряжением
ограничения не больше 5 В.



   Рис. 3.15.2 Схема подключения генератора колебаний к микроконтроллеру.
      Таймер/счетчик Т1 ведет подсчет  тактовых  импульсов  с  коэффициентом
деления частоты равным 64, а при переполнении останавливается и обнуляется.
      Внешнее  прерывание   INT0   вызывает   соответствующую   подпрограмму
обработки при нарастающем фронте сигнала на  одноименном  выводе  INT0.  Эта
подпрограмма позволяет таймеру/счетчику Т1  определить  число  импульсов  за
один период внешнего сигнала.  Далее  основная  программа  преобразует  этот
значение  в  частоту  и  переведя  в  двоично-десятичный  код   выводит   на
семисегментные  индикаторы,  которые  подключаются  к  МК  согласно  разделу
1.4.2. Программа прошивки МК для реализации  устройства  измерителя  частоты
на базе МК AT90S8515 приведена в ПРИЛОЖЕНИИ 3.
      Последний  рассмотренный  пример  представляет   устройство   «кодовый
замок».  Реализованное  на  основе  МК  AT90S1200,  оно  содержит  матричную
клавиатуру и два светодиода для индикации работы и  правильности  введенного
кода. Программа прошивки МК для  реализации  этого  устройства  приведена  в
ПРИЛОЖЕНИИ 4.

3.3. Описание макета программатора.

      Макет программатора состоит из  общей  платы  и  вспомогательных  плат
реализующих  необходимые  функции  заданий.  Общая   плата   имеет   разъем,
соединяющая программатора с параллельным портом компьютера. На  общей  плате
также  расположены  две  контактных  колодки  (дип  панели)  для   установки
программируемых микроконтроллеров. Они позволяют использовать  МК  следующих
типов: а) дип панель DIP2x20.2 для МК серий AT90S4414 и  AT90S8515;  б)  дип
панель DIP2x10.1 для МК серии AT90S1200 AT90S2313.
      Вспомогательные платы позволяют макетировать проектируемое устройство,
управляемое  микроконтроллером,  не  подвергая  нежелательным   механическим
воздействиям сам  программатор  и  микросхему  контроллера.  Вспомогательные
платы  соединяются  с  общей  платой  через  дополнительные   разъемы,   что
позволяет более прагматично использовать имеющиеся порты (выводы) МК.
      Питание    программатора    обеспечивается    от    внешнего     блока
стабилизированного питания МС9011.02  с  выходным  напряжением  Vcc=+5В  при
максимальном токе нагрузки Iн=1.5А.



            Рис. 3.16. Принципиальная схема макета программатора.
      На рис 3.16. приведена принципиальная схема макета  программатора  для
последовательного программирования МК  серии  AT90S1200  и  AT90S8515  через
параллельный   (LPT)   порт   компьютера.   Подсоединение    к    компьютеру
осуществляется с помощью кабеля подключения изображенного на рис. 3.17.
      Соединительный  кабель  для   подключения   макета   программатора   к
параллельному (LPT) порту  компьютера  состоит  из  двух  разъемов  DB25F  и
BH10.1 и двух шлейфов по 26  и  10  жил  соединенных  между  собой  согласно
таблице  3.1.  и  таблице  3.2.  Разъем  DB25F  (штырь)   подсоединяется   к
параллельному (LPT) порту компьютера, а BH10.1  (гнездо)  к  разъему  BH10.2
(штырь) на макете программатора (см. рис. 3.16).



        Рис. 3.17. Кабель подключения макета к LPT порту компьютера.

         Таблица № 3.1. Соответствие номера контакта разъема DB25F и
                   порядкового номера 25 жильного шлейфа.
|5            |XTAL1                   |4             |
|6            |RESET                   |5             |
|7            |MOSI                    |1             |
|8            |SCK                     |7             |
|10           |MISO                    |9             |
|19-25        |Gnd                     |10            |


      На  приведенной  схеме  макета  программатора   кроме   соединительных
разъемов и контактных колодок МК находятся внешние элементы необходимые  для
обеспечения  работы  тактового  генератора.  Это  конденсаторы  С2=С1=39 пФ,
С3=1000 пФ  и  кварц  с  частотой  генерации  колебаний  4  МГц.  Кнопка  В1
обеспечивает сброс МК в начальное состояние.
      Подключение вспомогательных плат к макету программатора осуществляется
через штыревые разъемы PLS.1, PLS.2 и PLS.3. Так как разъем  PLS.1  соединен
с дип панелью DIP2x10.1, в которую  устанавливается  МК  серии  AT90S2313  и
AT90S1200, а разъемы PLS.2 и PLS.3 соединены  с  дип  панелью  DIP2x20.2,  в
которую  устанавливается  МК  серий  AT90S4414  и  AT90S8515,  то  нумерация
выводов разъема PLS.1 соответствует нумерации ножек AT90S1200,  а  нумерация
выводов разъемов PLS.2 и PLS.3 соответствует  нумерации  ножек  AT90S4414  и
AT90S8515.
      В макете  программатора  при  программировании  и  последующей  работе
должен находиться только один (!) микроконтроллер, либо в  панели  DIP2x10.1
(AT90S1200  или  AT90S2313),  либо  в  панели   DIP2x20.2   (AT90S4414   или
AT90S8515). К разъемам PLS.n (n=1,2,3) через соответствующую  колодку  можно
подсоединять любые внешние устройства: светодиоды,  ССИ,  кнопки,  матричную
клавиатуру, подавать сигнал на какой либо порт (вывод) микроконтроллера  или
считывать его. При этом надо помнить, что на контакт 20 разъема PLS.1  и  на
контакт 40 разъема PLS.3 подается напряжение Vcc=+5В.
      Макет программатора имеет два режима работы. Первый – непосредственное
программирование микроконтроллера с помощью компьютера. Как с  подключенными
внешними устройствами, так и без  них.  Второй  режим  –  автономный,  когда
происходит работа с внешними устройствами, выполненными  на  вспомогательных
платах. При этом  режиме  макет  программатора  должен  быть  отсоединен  от
компьютера.
      Сначала обучающийся должен, получив задание, подготовить  (написать  и
отладить) программное обеспечение с помощью AVR Studio  (см.  раздел  3.1.),
согласно пп. 1-6 раздела 3.2.  (Принципы  выполнения  заданий).  Результатом
данного этапа  является  безошибочная  трансляция  разработанной  программы.
Только после этого можно приступить к использованию макета  программатора  и
построению  внешнего  устройства  на   вспомогательной   плате,   если   это
предусмотрено заданием.


                                 ЗАКЛЮЧЕНИЕ

      Разработанные методические  указания  содержат  описания  программного
обеспечения  и  аппаратных  средств  реализации  набора  примеров   заданий,
предназначенных для изучения как непосредственной архитектуры МК, так и  для
выработки конкретных навыков программирования.
      Проведен анализ  архитектуры  современных  микроконтроллеров.  Уделено
внимание систематизации аппаратных средств и общим вопросом методам  отладки
разрабатываемых программ.
      Особое  внимание  уделено  серийным  МК  фирмы  ATMEL  семейства  AVR.
Рассмотрены их особенности построения  и  функционирования.  Анализ  системы
команд  микроконтроллеров  AVR  и   практические   рекомендации   работы   в
интегрированной  среде  разработки   «AVR   Studio»   позволяет   эффективно
создавать и разрабатывать программы для AVR микроконтроллеров.
      Представлен  набор  типовых  примеров  с  наиболее   распространенными
задачами  программирования   МК.   Предложены   классификация   и   принципы
выполнения заданий. Дано описание универсального макета программатора.
      Изготовлен универсальный макет программатора, позволяющий проводить не
только прошивку МК  AVR  четырех  типов  (AT90S1200,  AT90S2313,  AT90S4414,
AT90S8515), но и управление проектируемыми внешними устройствами.
      Реализован ряд задач по работе с памятью, по перекодировке, сложению и
делению чисел, по работе с динамической индикацией и матричной  клавиатурой.
На основе этого смакетированы реальные устройства кодового замка  на  основе
AT90S1200 и измерителя частоты в звуковом диапазоне на основе AT90S8515.
      Предлагаемая на  этой  основе  методика  обучения  программирования  и
применения МК позволяет ввести интересующихся в эту перспективную область.


             БИБЛИОГРАФИЧЕСКИЙ СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

   1. Предко М. Руководство по микроконтроллерам. Том 1. / Пер. с англ.  под
      ред. И. И. Шагурина и С. Б. Лужанского – М.: Постмаркет, 2001.  –  416
      с.
   2. Предко М. Руководство по микроконтроллерам. Том 2. / Пер. с англ.  под
      ред. И. И. Шагурина и С. Б. Лужанского – М.: Постмаркет, 2001.  –  488
      с.
   3. Cady, Fredrick M. Microcontrollers and microcomputers:  principles  of
      software

      and hardware engineering. –  New  York  –  Oxford,  Oxford  University
      Press,

      1997. – 252 p.
   4. Вуд А. Микропроцессоры в вопросах и ответах. / Пер. с англ.  под  ред.
      Д. А. Поспелова. – М.: Энергоатомиздат. 1985. – 184 с.
   5. Уильямс Г.Б. Отладка микропроцессорных систем: / Пер. с. англ.  –  М.:
      Энергоатомиздат, 1988. – 253с.
   6. Угрюмов Е.П. Цифровая схемотехника. – Спб.: БВХ – Санкт-Петербург,

      2000. – 528 с.
   7. Алексенко А.Г., Шагурин И.И. Микросхемотехника. – М.: Радио и связь,

      1990. – 496 с.
   8. Бродин Б.В., Шагурин И.И. Микроконтроллеры: Справочник.  –  М.:  ЭКОМ,
      1999. – 395 с.
   9. Программируемые логические ИМС на КМОП-структурах и их  применение.  /
      П.П. Мальцев,  Н.И. Гарбузов,  А.П.  Шарапов,  А.А.  Кнышев.   –   М.:
      Энергоатомиздат, 1998. – 158 с.
  10. Соловьев В.В., Васильев А.Г. Программируемые  логические  интегральные
      схемы и их применение. – Мн.: Беларуская наука, 1998. – 270 с.
  11. Bursky D. Embedded Logic and Memory Find a Home in FPGA. –  Electronic
      Design, 1999, №14, pp. 43-56.
  12. Chang D., Mazek-Sadowska M.  Dynamically  Reconfigable  FPGA.  –  JEEE
      Transition on Computers, 1999, №6, pp. 565 – 578.
  13.  Bursky  D.  Advanced  CPLD  Architectures  Challenge  FPGA,  Gas.   –
      Electronic Design, 1998, №22, pp. 78 – 86.
  14.  Takai Y. a.o. 250 Mbytes Synchronous DRAM  Using  a  3-Stage-Pipeline
      Architecture. – JEEE. Journal of Solid-Stage Circuits. –  1994,  v.29,
      №4,

      pp. 426 – 429.
  15.    Лаптев   В.   Цифровой   измеритель   температуры   на   базе   AVR
      микроконтроллера и RC-цепочки. – Электронные компоненты, 2001. №2,  с.
      46 – 49.
  16. http://www.atmel.ru/ - описание AVR  микроконтроллеров,  русскоязычный
      сайт.
  17. http://www.dontronics.com/atmel.html - программные проекты по AVR.
  18. http://www.gaw.ru/, http://www.cec-mc.ru - информация о МК фирмы ATMEL
  19. http://trush.da.ru/, http://avr.da.ru/ - описание МК  AT90S1200  фирмы
      Atmel
  20.  http://www.ln.com.ua/~real/avreal, http://www.chat.ru/~avreal: -
      AVReAl: программа прошивки At90sXXXX через LPT порт
  21. http://trush.pp.ru/avr/ - полезные ссылки по AVR.


                                ПРИЛОЖЕНИЕ 1

                         Инструкции процессоров AVR.

Ниже приведен набор команд процессоров AVR, более детальное описание их
можно найти в AVR Data Book [16,19].

            Таблица А.1.  Арифметические и логические инструкции.
|Мнемони|Опера|Описание                 |Операция           |Флаги  |Цик|
|ка     |нды  |                         |                   |       |лы |
|ADD    |Rd,Rr|Суммирование без переноса|Rd = Rd + Rr       |Z,C,N,V|1  |
|       |     |                         |                   |,H,S   |   |
|ADC    |Rd,Rr|Суммирование с переносом |Rd = Rd + Rr + C   |Z,C,N,V|1  |
|       |     |                         |                   |,H,S   |   |
|SUB    |Rd,Rr|Вычитание без переноса   |Rd = Rd - Rr       |Z,C,N,V|1  |
|       |     |                         |                   |,H,S   |   |
|SUBI   |Rd,K8|Вычитание константы      |Rd = Rd - K8       |Z,C,N,V|1  |
|       |     |                         |                   |,H,S   |   |
|SBC    |Rd,Rr|Вычитание с переносом    |Rd = Rd - Rr - C   |Z,C,N,V|1  |
|       |     |                         |                   |,H,S   |   |
|SBCI   |Rd,K8|Вычитание константы с    |Rd = Rd - K8 - C   |Z,C,N,V|1  |
|       |     |переносом                |                   |,H,S   |   |
|AND    |Rd,Rr|Логическое И             |Rd = Rd · Rr       |Z,N,V,S|1  |
|       |     |                         |                   |       |   |
|ANDI   |Rd,K8|Логическое И с константой|Rd = Rd · K8       |Z,N,V,S|1  |
|OR     |Rd,Rr|Логическое ИЛИ           |Rd = Rd V Rr       |Z,N,V,S|1  |
|ORI    |Rd,K8|Логическое ИЛИ с         |Rd = Rd V K8       |Z,N,V,S|1  |
|       |     |константой               |                   |       |   |
|EOR    |Rd,Rr|Логическое исключающее   |Rd = Rd EOR Rr     |Z,N,V,S|1  |
|       |     |ИЛИ                      |                   |       |   |
|COM    |Rd   |Побитная Инверсия        |Rd = $FF - Rd      |Z,C,N,V|1  |
|       |     |                         |                   |,S     |   |
|NEG    |Rd   |Изменение знака (Доп.    |Rd = $00 - Rd      |Z,C,N,V|1  |
|       |     |код)                     |                   |,H,S   |   |
|SBR    |Rd,K8|Установить бит (биты) в  |Rd = Rd V K8       |Z,C,N,V|1  |
|       |     |регистре                 |                   |,S     |   |
|CBR    |Rd,K8|Сбросить бит (биты) в    |Rd = Rd · ($FF -   |Z,C,N,V|1  |
|       |     |регистре                 |K8)                |,S     |   |
|INC    |Rd   |Инкрементировать значение|Rd = Rd + 1        |Z,N,V,S|1  |
|       |     |регистра                 |                   |       |   |
|DEC    |Rd   |Декрементировать значение|Rd = Rd -1         |Z,N,V,S|1  |
|       |     |регистра                 |                   |       |   |
|TST    |Rd   |Проверка на ноль либо    |Rd = Rd · Rd       |Z,C,N,V|1  |
|       |     |отрицательность          |                   |,S     |   |
|CLR    |Rd   |Очистить регистр         |Rd = 0             |Z,C,N,V|1  |
|       |     |                         |                   |,S     |   |
|SER    |Rd   |Установить регистр       |Rd = $FF           |None   |1  |
|ADIW   |Rdl,K|Сложить константу и слово|Rdh:Rdl = Rdh:Rdl +|Z,C,N,V|2  |
|       |6    |                         |K6                 |,S     |   |
|SBIW   |Rdl,K|Вычесть константу из     |Rdh:Rdl = Rdh:Rdl -|Z,C,N,V|2  |
|       |6    |слова                    |K6                 |,S     |   |
|MUL    |Rd,Rr|Умножение чисел без знака|R1:R0 = Rd * Rr    |Z,C    |2  |
|MULS   |Rd,Rr|Умножение чисел со знаком|R1:R0 = Rd * Rr    |Z,C    |2  |
|MULSU  |Rd,Rr|Умножение числа со знаком|R1:R0 = Rd * Rr    |Z,C    |2  |
|       |     |с числом без знака       |                   |       |   |
|FMUL   |Rd,Rr|Умножение дробных чисел  |R1:R0 = (Rd * Rr)  |Z,C    |2  |
|       |     |без знака                |<< 1               |       |   |
|FMULS  |Rd,Rr|Умножение дробных чисел  |R1:R0 = (Rd *Rr) <<|Z,C    |2  |
|       |     |со знаком                |1                  |       |   |
|FMULSU |Rd,Rr|Умножение дробного числа |R1:R0 = (Rd * Rr)  |Z,C    |2  |
|       |     |со знаком с числом без   |<< 1               |       |   |
|       |     |знака                    |                   |       |   |


 
                     Таблица А.2.  Инструкции ветвления.
|Мнемон|Опер|Описание                 |Операция                |Флаги|Цик|
|ика   |анды|                         |                        |     |лы |
|RJMP  |k   |Относительный переход    |PC = PC + k +1          |None |2  |
|IJMP  |Нет |Косвенный переход на (Z) |PC = Z                  |None |2  |
|EIJMP |Нет |Расширенный косвенный    |STACK = PC+1, PC(15:0) =|None |2  |
|      |    |переход на (Z)           |Z, PC(21:16) = EIND     |     |   |
|JMP   |k   |Переход                  |PC = k                  |None |3  |
|RCALL |k   |Относительный вызов      |STACK = PC+1, PC =      |None |3/4|
|      |    |подпрограммы             |PC+k+1                  |     |*  |
|ICALL |Нет |Косвенный вызов (Z)      |STACK = PC+1, PC = Z    |None |3/4|
|      |    |                         |                        |     |*  |
|EICALL|Нет |Расширенный косвенный    |STACK = PC+1, PC(15:0) =|None |4* |
|      |    |вызов (Z)                |Z, PC(21:16) =EIND      |     |   |
|CALL  |k   |Вызов подпрограммы       |STACK = PC+2, PC = k    |None |4/5|
|      |    |                         |                        |     |*  |
|RET   |Нет |Возврат из подпрограммы  |PC = STACK              |None |4/5|
|      |    |                         |                        |     |*  |
|RETI  |Нет |Возврат из прерывания    |PC = STACK              |I    |4/5|
|      |    |                         |                        |     |*  |
|CPSE  |Rd,R|Сравнить, пропустить если|if (Rd ==Rr) PC = PC 2  |None |1/2|
|      |r   |равны                    |or 3                    |     |/3 |
|CP    |Rd,R|Сравнить                 |Rd -Rr                  |Z,C,N|1  |
|      |r   |                         |                        |,V,H,|   |
|      |    |                         |                        |S    |   |
|CPC   |Rd,R|Сравнить с переносом     |Rd - Rr - C             |Z,C,N|1  |
|      |r   |                         |                        |,V,H,|   |
|      |    |                         |                        |S    |   |
|CPI   |Rd,K|Сравнить с константой    |Rd - K                  |Z,C,N|1  |
|      |8   |                         |                        |,V,H,|   |
|      |    |                         |                        |S    |   |
|SBRC  |Rr,b|Пропустить если бит в    |if(Rr(b)==0) PC = PC+2  |None |1/2|
|      |    |регистре очищен          |or 3                    |     |/3 |
|SBRS  |Rr,b|Пропустить если бит в    |if(Rr(b)==1) PC = PC+2  |None |1/2|
|      |    |регистре установлен      |or 3                    |     |/3 |
|SBIC  |P,b |Пропустить если бит в    |if(I/O(P,b)==0) PC = PC+|None |1/2|
|      |    |порту очищен             |or 3                    |     |/3 |
|SBIS  |P,b |Пропустить если бит в    |if(I/O(P,b)==1) PC =    |None |1/2|
|      |    |порту установлен         |PC+2 or 3               |     |/3 |
|BRBC  |s,k |Перейти если флаг в SREG |if(SREG(s)==0) PC =     |None |1/2|
|      |    |очищен                   |PC+k+1                  |     |   |
|BRBS  |s,k |Перейти если флаг в SREG |if(SREG(s)==1) PC =     |None |1/2|
|      |    |установлен               |PC+k+1                  |     |   |
|BREQ  |k   |Перейти если равно       |if(Z==1) PC = PC + k + 1|None |1/2|
|BRNE  |k   |Перейти если не равно    |if(Z==0) PC = PC + k + 1|None |1/2|
|BRCS  |k   |Перейти если перенос     |if(C==1) PC = PC + k + 1|None |1/2|
|      |    |установлен               |                        |     |   |
|BRCC  |k   |Перейти если перенос     |if(C==0) PC = PC + k + 1|None |1/2|
|      |    |очищен                   |                        |     |   |
|BRSH  |k   |Перейти если равно или   |if(C==0) PC = PC + k + 1|None |1/2|
|      |    |больше                   |                        |     |   |
|BRLO  |k   |Перейти если меньше      |if(C==1) PC = PC + k + 1|None |1/2|
|BRMI  |k   |Перейти если минус       |if(N==1) PC = PC + k + 1|None |1/2|
|BRPL  |k   |Перейти если плюс        |if(N==0) PC = PC + k + 1|None |1/2|
|BRGE  |k   |Перейти если больше или  |if(S==0) PC = PC + k + 1|None |1/2|
|      |    |равно (со знаком)        |                        |     |   |
|BRLT  |k   |Перейти если меньше (со  |if(S==1) PC = PC + k + 1|None |1/2|
|      |    |знаком)                  |                        |     |   |
|BRHS  |k   |Перейти если флаг        |if(H==1) PC = PC + k + 1|None |1/2|
|      |    |внутреннего переноса     |                        |     |   |
|      |    |установлен               |                        |     |   |
|BRHC  |k   |Перейти если флаг        |if(H==0) PC = PC + k + 1|None |1/2|
|      |    |внутреннего переноса     |                        |     |   |
|      |    |очищен                   |                        |     |   |
|BRTS  |k   |Перейти если флаг T      |if(T==1) PC = PC + k + 1|None |1/2|
|      |    |установлен               |                        |     |   |
|BRTC  |k   |Перейти если флаг T      |if(T==0) PC = PC + k + 1|None |1/2|
|      |    |очищен                   |                        |     |   |
|BRVS  |k   |Перейти если флаг        |if(V==1) PC = PC + k + 1|None |1/2|
|      |    |переполнения установлен  |                        |     |   |
|BRVC  |k   |Перейти если флаг        |if(V==0) PC = PC + k + 1|None |1/2|
|      |    |переполнения очищен      |                        |     |   |
|BRIE  |k   |Перейти если прерывания  |if(I==1) PC = PC + k + 1|None |1/2|
|      |    |разрешены                |                        |     |   |
|BRID  |k   |Перейти если прерывания  |if(I==0) PC = PC + k + 1|None |1/2|
|      |    |запрещены                |                        |     |   |


* Для операций доступа к данным количество циклов указано при условии
доступа к внутренней памяти данных, и не корректно при работе с внешним
ОЗУ. Для инструкций CALL, ICALL, EICALL, RCALL, RET и RETI, необходимо
добавить три цикла плюс по два цикла для каждого ожидания в контроллерах с
PC меньшим 16 бит (128KB памяти программ). Для устройств с памятью программ
свыше 128KB , добавьте пять циклов плюс по три цикла на каждое ожидание.


                  Таблица А.3.  Инструкции передачи данных.
|Мнемо|Опера|Описание                          |Операция      |Флаги|Цик|
|ника |нды  |                                  |              |     |лы |
|MOV  |Rd,Rr|Скопировать регистр               |Rd = Rr       |None |1  |
|MOVW |Rd,Rr|Скопировать пару регистров        |Rd+1:Rd =     |None |1  |
|     |     |                                  |Rr+1:Rr, r,d  |     |   |
|     |     |                                  |even          |     |   |
|LDI  |Rd,K8|Загрузить константу               |Rd = K        |None |1  |
|LDS  |Rd,k |Прямая загрузка                   |Rd = (k)      |None |2* |
|LD   |Rd,X |Косвенная загрузка                |Rd = (X)      |None |2* |
|LD   |Rd,X+|Косвенная загрузка с              |Rd = (X),     |None |2* |
|     |     |пост-инкрементом                  |X=X+1         |     |   |
|LD   |Rd,-X|Косвенная загрузка с              |X=X-1, Rd =   |None |2* |
|     |     |пре-декрементом                   |(X)           |     |   |
|LD   |Rd,Y |Косвенная загрузка                |Rd = (Y)      |None |2* |
|LD   |Rd,Y+|Косвенная загрузка с              |Rd = (Y),     |None |2* |
|     |     |пост-инкрементом                  |Y=Y+1         |     |   |
|LD   |Rd,-Y|Косвенная загрузка с              |Y=Y-1, Rd =   |None |2* |
|     |     |пре-декрементом                   |(Y)           |     |   |
|LDD  |Rd,Y+|Косвенная загрузка с замещением   |Rd = (Y+q)    |None |2* |
|     |q    |                                  |              |     |   |
|LD   |Rd,Z |Косвенная загрузка                |Rd = (Z)      |None |2* |
|LD   |Rd,Z+|Косвенная загрузка с              |Rd = (Z),     |None |2* |
|     |     |пост-инкрементом                  |Z=Z+1         |     |   |
|LD   |Rd,-Z|Косвенная загрузка с              |Z=Z-1, Rd =   |None |2* |
|     |     |пре-декрементом                   |(Z)           |     |   |
|LDD  |Rd,Z+|Косвенная загрузка с замещением   |Rd = (Z+q)    |None |2* |
|     |q    |                                  |              |     |   |
|STS  |k,Rr |Прямое сохранение                 |(k) = Rr      |None |2* |
|ST   |X,Rr |Косвенное сохранение              |(X) = Rr      |None |2* |
|ST   |X+,Rr|Косвенное сохранение с            |(X) = Rr,     |None |2* |
|     |     |пост-инкрементом                  |X=X+1         |     |   |
|ST   |-X,Rr|Косвенное сохранение с            |X=X-1, (X)=Rr |None |2* |
|     |     |пре-декрементом                   |              |     |   |
|ST   |Y,Rr |Косвенное сохранение              |(Y) = Rr      |None |2* |
|ST   |Y+,Rr|Косвенное сохранение с            |(Y) = Rr,     |None |2  |
|     |     |пост-инкрементом                  |Y=Y+1         |     |   |
|ST   |-Y,Rr|Косвенное сохранение с            |Y=Y-1, (Y) =  |None |2  |
|     |     |пре-декрементом                   |Rr            |     |   |
|ST   |Y+q,R|Косвенное сохранение с замещением |(Y+q) = Rr    |None |2  |
|     |r    |                                  |              |     |   |
|ST   |Z,Rr |Косвенное сохранение              |(Z) = Rr      |None |2  |
|ST   |Z+,Rr|Косвенное сохранение с            |(Z) = Rr,     |None |2  |
|     |     |пост-инкрементом                  |Z=Z+1         |     |   |
|ST   |-Z,Rr|Косвенное сохранение с            |Z=Z-1, (Z) =  |None |2  |
|     |     |пре-декрементом                   |Rr            |     |   |
|ST   |Z+q,R|Косвенное сохранение с замещением |(Z+q) = Rr    |None |2  |
|     |r    |                                  |              |     |   |
|LPM  |Нет  |Загрузка из программной памяти    |R0 = (Z)      |None |3  |
|LPM  |Rd,Z |Загрузка из программной памяти    |Rd = (Z)      |None |3  |
|LPM  |Rd,Z+|Загрузка из программной памяти с  |Rd = (Z),     |None |3  |
|     |     |пост-инкрементом                  |Z=Z+1         |     |   |
|ELPM |Нет  |Расширенная загрузка из           |R0 = (RAMPZ:Z)|None |3  |
|     |     |программной памяти                |              |     |   |
|ELPM |Rd,Z |Расширенная загрузка из           |Rd = (RAMPZ:Z)|None |3  |
|     |     |программной памяти                |              |     |   |
|ELPM |Rd,Z+|Расширенная загрузка из           |Rd =          |None |3  |
|     |     |программной памяти с              |(RAMPZ:Z), Z =|     |   |
|     |     |пост-инкрементом                  |Z+1           |     |   |
|SPM  |Нет  |Сохранение в программной памяти   |(Z) = R1:R0   |None |-  |
|ESPM |Нет  |Расширенное сохранение в          |(RAMPZ:Z) =   |None |-  |
|     |     |программной памяти                |R1:R0         |     |   |
|IN   |Rd,P |Чтение порта                      |Rd = P        |None |1  |
|OUT  |P,Rr |Запись в порт                     |P = Rr        |None |1  |
|PUSH |Rr   |Занесение регистра в стек         |STACK = Rr    |None |2  |
|POP  |Rd   |Извлечение регистра из стека      |Rd = STACK    |None |2  |


* Для операций доступа к данным количество циклов указано при условии
доступа к внутренней памяти данных, и не корректно при работе с внешним
ОЗУ. Для инструкций LD, ST, LDD, STD, LDS, STS, PUSH и POP, необходимо
добавить один цикл плюс по одному циклу для каждого ожидания.


                  Таблица А.4.  Инструкции работы с битами.
|Мнемо|Опер|Описание                   |Операция            |Флаги |Цик|
|ника |анды|                           |                    |      |лы |
|LSL  |Rd  |Логический сдвиг влево     |Rd(n+1)=Rd(n),      |Z,C,N,|1  |
|     |    |                           |Rd(0)=0, C=Rd(7)    |V,H,S |   |
|LSR  |Rd  |Логический сдвиг вправо    |Rd(n)=Rd(n+1),      |Z,C,N,|1  |
|     |    |                           |Rd(7)=0, C=Rd(0)    |V,S   |   |
|ROL  |Rd  |Циклический сдвиг влево    |Rd(0)=C,            |Z,C,N,|1  |
|     |    |через C                    |Rd(n+1)=Rd(n),      |V,H,S |   |
|     |    |                           |C=Rd(7)             |      |   |
|ROR  |Rd  |Циклический сдвиг вправо   |Rd(7)=C,            |Z,C,N,|1  |
|     |    |через C                    |Rd(n)=Rd(n+1),      |V,S   |   |
|     |    |                           |C=Rd(0)             |      |   |
|ASR  |Rd  |Арифметический сдвиг вправо|Rd(n)=Rd(n+1),      |Z,C,N,|1  |
|     |    |                           |n=0,...,6           |V,S   |   |
|SWAP |Rd  |Перестановка тетрад        |Rd(3..0) = Rd(7..4),|None  |1  |
|     |    |                           |Rd(7..4) = Rd(3..0) |      |   |
|BSET |s   |Установка флага            |SREG(s) = 1         |SREG(s|1  |
|     |    |                           |                    |)     |   |
|BCLR |s   |Очистка флага              |SREG(s) = 0         |SREG(s|1  |
|     |    |                           |                    |)     |   |
|SBI  |P,b |Установить бит в порту     |I/O(P,b) = 1        |None  |2  |
|CBI  |P,b |Очистить бит в порту       |I/O(P,b) = 0        |None  |2  |
|BST  |Rr,b|Сохранить бит из регистра в|T = Rr(b)           |T     |1  |
|     |    |T                          |                    |      |   |
|BLD  |Rd,b|Загрузить бит из T в       |Rd(b) = T           |None  |1  |
|     |    |регистр                    |                    |      |   |
|SEC  |Нет |Установить флаг переноса   |C =1                |C     |1  |
|CLC  |Нет |Очистить флаг переноса     |C = 0               |C     |1  |
|SEN  |Нет |Установить флаг            |N = 1               |N     |1  |
|     |    |отрицательного числа       |                    |      |   |
|CLN  |Нет |Очистить флаг              |N = 0               |N     |1  |
|     |    |отрицательного числа       |                    |      |   |
|SEZ  |Нет |Установить флаг нуля       |Z = 1               |Z     |1  |
|CLZ  |Нет |Очистить флаг нуля         |Z = 0               |Z     |1  |
|SEI  |Нет |Установить флаг прерываний |I = 1               |I     |1  |
|CLI  |Нет |Очистить флаг прерываний   |I = 0               |I     |1  |
|SES  |Нет |Установить флаг числа со   |S = 1               |S     |1  |
|     |    |знаком                     |                    |      |   |
|CLN  |Нет |Очистить флаг числа со     |S = 0               |S     |1  |
|     |    |знаком                     |                    |      |   |
|SEV  |Нет |Установить флаг            |V = 1               |V     |1  |
|     |    |переполнения               |                    |      |   |
|CLV  |Нет |Очистить флаг переполнения |V = 0               |V     |1  |
|SET  |Нет |Установить флаг T          |T = 1               |T     |1  |
|CLT  |Нет |Очистить флаг T            |T = 0               |T     |1  |
|SEH  |Нет |Установить флаг внутреннего|H = 1               |H     |1  |
|     |    |переноса                   |                    |      |   |
|CLH  |Нет |Очистить флаг внутреннего  |H = 0               |H     |1  |
|     |    |переноса                   |                    |      |   |
|NOP  |Нет |Нет операции               |Нет                 |None  |1  |
|SLEEP|Нет |Спать (уменьшить           |Смотрите описание   |None  |1  |
|     |    |энергопотребление)         |инструкции          |      |   |
|WDR  |Нет |Сброс сторожевого таймера  |Смотрите описание   |None  |1  |
|     |    |                           |инструкции          |      |   |


 
Ассемблер не различает регистр символов. Операнды могут быть таких видов:
      . Rd: Результирующий (и исходный) регистр в регистровом файле
      . Rr: Исходный регистр в регистровом файле
      . b: Константа (3 бита), может быть константное выражение
      . s: Константа (3 бита), может быть константное выражение
      . P: Константа (5-6 бит), может быть константное выражение
      . K6; Константа (6 бит), может быть константное выражение
      . K8: Константа (8 бит), может быть константное выражение
      . k: Константа (размер зависит от инструкции), может быть константное
        выражение
      . q: Константа (6 бит), может быть константное выражение
      . Rdl:  R24, R26, R28, R30. Для инструкций ADIW и SBIW
      . X,Y,Z: Регистры косвенной адресации (X=R27:R26, Y=R29:R28,
        Z=R31:R30)


                                ПРИЛОЖЕНИЕ 2.

                Таблица регистров микроконтроллера AT90S1200

|$3D  |         |з а р е з е р в и р о в а н                                  |
|$3C  |         |з а р е з е р в и р о в а н                                  |
|$36  |         |з а р е з е р в и р о в а н                                  |
|…    |         |з а р е з е р в и р о в а н                                  |
|$1E  |EEAR     |Регистр адреса энергонезависимой памяти                      |
|$1D  |EEDR     |Регистр данных энергонезависимой памяти                      |
|$00  |         |з а р е з е р в и р о в а н                                  |

                                ПРИЛОЖЕНИЕ 3.

                  Программа для измерителя звуковой частоты


.include "8515def.inc"
.equ  last_seg =4
.equ  zero     =0
.equ     start_addr= 8
.def  capture_l    =r2
.def  capture_h    =r3
.def  char      =r5
.def  char_pointer =r6
.def  temp      =r16
.def  temp1     =r17
.def  ZerRol         =r18
.def     char0       =r20
.def     char1       =r21
.def     char2       =r22
.def     char3       =r23
.def     char4       =r24
.def     out_char0    =r8
.def     out_char1    =r9
.def     out_char2    =r10
.def     out_char3    =r11
.def     out_char4    =r12
.def     out_counter  =r13
.eseg       ;EEPROM segment
.org 0
eetbl3:.db  0x3F,0x06
;           ;0    1
       .db  0x5B,0x4F
;           ;2    3
       .db  0x66,0x6D
;           ;4    5
       .db  0x7D,0x07
;           ;6    7
       .db  0x7F,0x6F
;           ;8    9
.cseg
.org 0
      rjmp   reset
      reti ;
      reti ;
      rjmp   TIM1_CAPT
.org $006
      rjmp   TIM1_OVF
      rjmp   TIM0_OVF
;***********************************
;* Main Code
reset: ; Make Stack:
      ldi    temp, high(RAMEND)
      out    SPH,  temp
      ldi    temp, low(RAMEND)
      out    SPL,  temp

      ldi    temp, 0xC3      ;
      out    TCCR1B, temp    ;
      ldi    temp, 0x8A           ;
      out    TIMSK, temp
      ldi    temp, 0x3       ;
      out    TCCR0, temp
      sei
      ldi    temp, zero
      mov    char_pointer, temp
      ldi    temp, 0xFF
      out    DDRA, temp
      out    DDRC, temp
      ldi    char0, 8
      ldi    char1, 8
      ldi    char2, 8
      ldi    char3, 8
      ldi    char4, 8
      ldi    ZH, 0
      ldi    ZL, start_addr
      ldi    ZerRol,0xFE
      clt
      clr    out_counter
forever:
      brtc   forever
      clt
      mov   dv16uL, capture_l     ;tmp16a
      mov   dv16uH, capture_h     ;tmp16b
      ldi   dd16uL, low(62500)
      ldi   dd16uH, high(62500)
; пробразование в Гц:
      rcall  div16u
; преобразование в десятичные цифры
      ldi    tmp16a, low(10000)
      ldi    tmp16b, high(10000)
      rcall  bin2ASCII_digit
      mov    tASCII4, cnt16a
      ldi    tmp16a, low(1000)
      ldi    tmp16b, high(1000)
      rcall  bin2ASCII_digit
      mov    tASCII3, cnt16a
      ldi    tmp16a, low(100)
      ldi    tmp16b, high(100)
      rcall  bin2ASCII_digit
      mov    tASCII2, cnt16a
      ldi    tmp16a, low(10)
      ldi    tmp16b, high(10)
      rcall  bin2ASCII_digit
      rjmp   forever
;* End Main Code
;************************************
;************************************
;* bin2ASCII_digit
.def     fASCIIL           =r24;r11
.def     fASCIIH      =r19;r12
.def     tASCII0      =r24;r11
.def     tASCII1      =r23;r16
.def     tASCII2      =r22;r13
.def     tASCII3      =r21;r14
.def     tASCII4      =r20;r15
.def     cnt16a       =r23;r16
.def     tmp16a       =r16;r17
.def     tmp16b       =r17;r18
bin2ASCII_digit:
      ldi     cnt16a, -1
bin2ASCII_digit_loop:
      inc     cnt16a
      sub     fASCIIL, tmp16a
      sbc     fASCIIH, tmp16b
      brsh    bin2ASCII_digit_loop
      add     fASCIIL, tmp16a
      adc     fASCIIH, tmp16b
      ret
;* End bin2ASCII_digit
;***********************************
;***********************************
;*div16u 16/16 Bit Unsigned Division ;* dd8uH:dd8uL / dv16uH:dv16uL =
;*dres16uH:dres16uL drem16uH:drem16uL
.def  drem16uL =r14
.def  drem16uH =r15
.def  dres16uL =r24;=r16
.def  dres16uH =r19;=r17
.def  dd16uL     =r24;=r16
.def  dd16uH     =r19;=r17
.def  dv16uL     =r27;=r18
.def  dv16uH     =r25;=r19
.def  dcnt16u    =r26;=r20
div16u:    ;clear remainder Low byte:
      clr   drem16uL
;clear remainder High byte and carry:
      sub   drem16uH,drem16uH
;init loop counter:
      ldi   dcnt16u,17
d16u_1:       ;shift left dividend:
      rol   dd16uL
      rol   dd16uH
;decrement counter:
      dec   dcnt16u
      brne  d16u_2   ;if done
      ret           ;  return
d16u_2: ;shift dividend into
        ; remainder
      rol   drem16uL
      rol   drem16uH
;remainder = remainder - divisor
      sub   drem16uL,dv16uL       sbc   drem16uH,dv16uH  ;
      brcc  d16u_3  ;if result
      ;negative restore remainder
      add   drem16uL,dv16uL
      adc   drem16uH,dv16uH
      clc
;clear carry to be shifted into ;result
      rjmp  d16u_1  ;else
d16u_3:  sec  ;set carry to be
      ;shifted into result
      rjmp  d16u_1
;* End div16u
;************************************
;************************************;* Timer1 Capture Handler
TIM1_CAPT:  in    temp1, SREG
      ;in    capture_l, ICR1L
      ;in    capture_h, ICR1H
      in    capture_l, TCNT1L
      in    capture_h, TCNT1H
      ldi   temp, 0
      out   TCNT1H, temp
      out   TCNT1L, temp
      ldi   temp, 0xC3
      out   TCCR1B, temp
      out   SREG, temp1
      set
      reti
;* End Timer1 Capture Handler
;************************************
;************************************
;* Timer1 OverFlow Handler
TIM1_OVF:   in    temp1, SREG
      ldi   char0, 0
      ldi   char1, 0
      ldi   char2, 0
      ldi   char3, 0
      ldi   char4, 0
      ldi   temp, 0xC0
      out   TCCR1B, temp
      ldi   temp, 0
      out   TCNT1H, temp
      out   TCNT1L, temp
      out   SREG, temp1
      reti
;* End Timer1 OverFlow Handler
;************************************
;************************************
;* Timer0 OverFlow Handler
TIM0_OVF:   in    temp1, SREG
      tst   out_counter
      breq  get_char
      rjmp  show_char
get_char:   mov   out_char0, char0
      mov   out_char1, char1
      mov   out_char2, char2
      mov   out_char3, char3
      mov   out_char4, char4
      rjmp  continue
show_char:  ld    char_pointer, Z+
      ldi   temp, eetbl3
      add   char_pointer, temp
      out   EEARL, char_pointer
      ;address EEPROM
      ldi   temp, 0
      out  EEARH, temp;address EEPROM
      sbi  EECR, EERE  ;strobe EEPROM
      in    char, EEDR  ;read code
      out   PORTA, ZerRol
      out   PORTC, char
sbrc ZerRol, last_seg;brcs carry
      rjmp  move_ZerRol
New_loop:   ldi   ZH, 0
      ldi   ZL, start_addr
      ldi   ZerRol,0xFE  ;rol ZerRol
      rjmp  continue
move_ZerRol:     sec
      rol   ZerRol
continue:   inc   out_counter
            out   SREG, temp1
            reti
;* End Timer0 OverFlow Handler
;************************************
                                ПРИЛОЖЕНИЕ 4.

                  Программа для устройства «кодовый замок»


.include "1200def.inc"
;Port B pins
.equ  ROW1  =3
.equ  ROW2  =2
.equ  ROW3  =1
.equ  ROW4  =0
.equ  COL1  =7
.equ  COL2  =6
.equ  COL3  =5
.equ  COL4  =4
;Port D pins
.equ  GREEN =1;green LED indicate
           ;keynumber
.equ  RED   =0;red LED
;initialization & zero keynumber
.equ  INT   =2   ;interrupt input
.equ  max_count  =21
.equ  reset_btn  =4
.equ  psw_length =2
.def  temp  =r16 ;
.def  key   =r17 ;key code pointer
                 ;for EEPROM
.def  fine  =r18 ;loop delay
                 ;counters
.def  medium     =r19
.def  coarse     =r20
.def  status     =r21  ;preserve
           ;sreg here
.def  rowid =r22
.def  colid =r23
.def  counter    =r24
.def  key_pr_count =r25
.eseg       ;EEPROM segment
.org 0
eetbl1:     .db  4,3,2,1,8,7 ,6,5,12,11,10,9,16,15,14,13
eetbl2: .db 3,1,2,4
.cseg       ;CODE segment
.org 0
      rjmp reset  ;Reset handler
      nop
      nop ;unused timer interrupt
      nop ;unused analogue
           ;interrupt
reset:
      ldi temp,0x03          ;initialise port D as O/I
      out DDRD,temp          ;
      out PORTD,temp         ;
      sbi ACSR,ACD ;shut down
      ;comparator to save power
      cli ;disable global
           ;interrupts
      ldi key_pr_count, 0
      set   ;T=1 - true password ;(default);T=0 - false password
      ldi temp,2
      rjmp red_flash ;flash LEDs
      ;for example usage
init_scan:  clr counter
scan: ldi temp,0xff
      out DDRB,temp
      ldi temp, 0x0f
      out PORTB, temp
      ldi rowid,0xAA
 ;0xAA - значение по умолчанию
 ;кнопка не нежата
      sbis PINB,ROW1   ;find row of
                 ;keypress
      ldi rowid,0 ;and set ROW pointer
      sbis PINB,ROW2
      ldi rowid,4
      sbis PINB,ROW3
      ldi rowid,8
      sbis PINB,ROW4
      ldi rowid,12
      cpi rowid, 0xAA
      breq init_scan         ;Branch if equal //counter=0
      inc counter
      cpi counter, max_count;
      brlo scan ;Branch if not
                 ;equal
      ldi temp,0xF0 ;change port B I/O to find column press
      out PORTB,temp         ;
      rcall settle ;allow time for
;port to settle
      ldi colid, 0xAA
;0xAA - значение по умолчанию кнопка не нежата
      sbis PINB,COL1
;find column of keypress
      ldi colid,0
;and set COL pointer
      sbis PINB,COL2
      ldi colid,1
      sbis PINB,COL3
      ldi colid,2
      sbis PINB,COL4
      ldi colid,3
      cpi colid, 0xAA
      breq init_scan
;Branch if equal //counter=0
      add rowid,colid
;merge ROW and COL for pointer
      mov key, rowid
      rjmp clr_counter
misc_rst:     rjmp reset
clr_counter: clr counter
      ldi temp, 0xAA
key_up_wait:     sbis PINB,COL1         ;;ожидание поднятия клавиши
      ldi temp, 0xCC
;если бит=0 то temp=cc
      sbis PINB,COL2
      ldi temp, 0xCC
      sbis PINB,COL3
      ldi temp, 0xCC
      sbis PINB,COL4
      ldi temp, 0xCC
      cpi temp, 0xCC
      breq clr_counter
      inc counter
      cpi counter, max_count  ;
      brlo key_up_wait
;Branch if not equal
      ldi temp,0x00          ;reinitialise port B as I/O
      out DDRB,temp          ;
      out PORTB,temp         ;
flash: ldi temp, eetbl1
      add key, temp
      out EEAR, key;address EEPROM
      sbi EECR, EERE;strobe EEPROM
      in key, EEDR
;read code of pressed button
      cpi key, reset_btn
;if key pressed = reset button
      breq misc_rst
;then goto reset
      ldi temp, eetbl2
      add temp, key_pr_count
      out EEAR, temp
      sbi EECR, EERE
      in temp, EEDR
;read password code
      inc key_pr_count
      cp key, temp
;if pressed wrong key
      brne not_equal
;then goto not equal
equal:      rjmp continue
not_equal:  clt
;T=0 - false password
continue: cpi key_pr_count, psw_length;if kpc > psw length
      brge kpr_exceed
;then goto kpr_exceed
not_kpr_exceed:  rjmp init_scan
kpr_exceed: brts psw_true
;if T=1 then password is true
      ldi key_pr_count, psw_length
;else (T=0 password is false)
      rjmp init_scan
psw_true:   ldi temp, 3
green_flash:
      cbi PORTD,GREEN  ;                rcall delay
      sbi PORTD,GREEN
      rcall delay
      dec temp
      brne green_flash
exit:       rjmp reset ;scan ;ret
red_flash:       sbi PORTD,RED
      rcall delay
      cbi PORTD,RED
      rcall delay
      dec temp
      brne red_flash
      rjmp init_scan
;****Time Delay Subroutine for ;****LED flash****
delay:  ldi coarse,3;8            ;triple nested FOR loop
cagain:     ldi medium,255        ;
magain:     ldi fine,255     ;
fagain:     dec fine
      brne fagain
      dec medium
      brne magain
      dec coarse
      brne cagain
      ret
;***Settling time delay for port ;***to stabilise****
settle:
cagain2:    ldi medium,2          ;
magain2:    ldi fine,255     ;
fagain2:    dec fine
      brne fagain2
      dec medium
      brne magain2
      ret

|AT90S                      |1200 |2313  |4414  |8515  |2323   |4433    |
|Диапазон напряжений        |2,7 - 6,0                                     |
|питания, В                 |                                              |
|Тактовая частота, МГц *)   |0 - 16       |0 - 20        |0 - 16 |0 - 20  |
|Количество линий           |15           |32            |5      |18      |
|ввода/вывода (max)         |             |              |       |        |
|Количество инструкций      |89   |120                                     |
|Объем Flash ROM, байт      |1K   |2K    |4K    |8K    |2K     |4K      |
|Объем EEPROM, байт         |64   |128   |256   |512   |128    |256     |
|Объем внутренней SRAM, байт|-    |128   |256   |512   |128    |128     |
|Объем внешней SRAM, байт   |-    |-     |64K   |64K   |-      |-       |
|(max)                      |     |      |      |      |       |        |
|Объем регистрового файла,  |32                                            |
|байт                       |                                              |
|Количество                 |1    |2     |2     |2     |1      |2       |
|таймеров/счетчиков         |     |      |      |      |       |        |
|ШИМ: Число                 |-    |1/8-10|2/8-10|2/8-10|-      |2/8-10  |
|каналов/разрядность        |     |      |      |      |       |        |
|Количество модулей         |-    |1     |2     |2     |-      |2       |
|захвата/сравнения          |     |      |      |      |       |        |
|Аналоговый компаратор      |+    |+     |+     |+     |-      |+       |
|SPI (загрузка ROM и EEPROM)|+    |+     |+     |+     |+      |+       |
|SPI интерфейс (Master/Slave|-    |-     |+     |+     |-      |+       |
|port)                      |     |      |      |      |       |        |
|Сторожевой таймер          |+    |+     |+     |+     |+      |+       |
|Асинхронный                |-    |+     |+     |+     |-      |+       |
|последовательный порт      |     |      |      |      |       |        |
|Аналого - цифровой         |-    |-     |-     |-     |-      |+       |
|преобразователь            |     |      |      |      |       |        |
|Количество битов защиты    |2                                             |
|Число источников           |2/1  |8/2   |10/2  |10/2  |2/1    |11/2    |
|прерывания:                |     |      |      |      |       |        |
|внутренних/внешних         |     |      |      |      |       |        |
|Тип корпуса                |DIP20,       |DIP40, PLCC44,|DIP8,  |DIP28,  |
|                           |SOIC20,      |TQFP44        |SOIC8  |PLCC28  |
|                           |SSOP20       |              |       |        |


                                ПРИЛОЖЕНИЕ 5.

                Основные характеристики микроконтроллеров AVR


-----------------------
КC147

D2

1К

120

75

Д105

R2

Vcc

Кнопка ручного запуска RESET

К микроконтроллеру

R1 10К



D1

R3

К микроконтроллеру

R1

Внешний генератор


                             Внешние устройства

Кнопка (ключ)

R

К МК

V

t

“Звон” при замыкании ключа

                             Макет программатора

                                  Симулятор
                                   ( ЭВМ )

                                  Программа

                               Объект обучения

                               Типовая задача

220 Ом

|Микроко|
|нтролле|
|р      |


Тактовые сигналы

Командный цикл

Один командный цикл

[pic]

|            |SREG                                     |
|Символьное  |I   |T   |H   |S   |V   |N   |Z   |C   |
|обозначение |    |    |    |    |    |    |    |    |
|Бит         |7   |6   |5   |4   |3   |2   |1   |0   |


|AVR     |
| |      |
| |      |
| |XTAL1 |
| |      |
| |      |
| |      |
| |XTAL2 |


|AVR     |
| |      |
| |      |
| |XTAL1 |
| |      |
| |      |
| |      |
| |XTAL2 |


|AVR     |
| |      |
| |      |
| |RESET |


|15    |…       |    |0 |
|      |5       |4   |  |
|      |        |…   |  |
|КОП            |Rd     |


|РОН          |    |
|             |R0  |
|             |Rd  |
|             |R31 |


|15    |…    |9 … |4 … |
|      |     |5   |0   |
|КОП          |Rd  |Rr  |


|РОН          |    |
|             |R0  |
|             |Rr  |
|             |    |
|             |Rd  |
|             |R31 |


|15    |      |    |5   |
|      |      |    |   0|
|КОП          |Rd/R|P   |
|             |r   |    |


|   |Регистры  |    |
|   |ввода/выво|    |
|   |да        |    |
|0  |          | $00|
|   |          |    |
|   |          |    |
|63 |          | $3f|


|31    |20    |19  |16  |
|КОП          |Rd/Rr     |
|младшие 16 бит          |


| |Единое адресное| |
| |пространство   | |
| |          | $00|
| |          |00  |
| |          |    |
| |          |    |
| |          | $ff|
| |          |ff  |


[pic]


[pic]


Передача данных

Адрес данных из индекса

Выполнение: R0 ( (Z)

PLS.2

PLS.3

PLS.1

BH10.2



Vcc

+5 В

Gnd

RESET

С3

SCK

С1

С2

XTAL1

XTAL2

7

5

9

1

4

10

                                                                       XTAL1

                                                                         Gnd

SCK

RESET

MISO

MOSI

Vcc

1 - 40

1 - 20

20

  1

21 - 40

21

4???????????????????????????????????????????????????????????????????????????
??0

|RESET|
|XTAL2|
|XTAL1|
|MOSI |
|MISO |
|SCK  |
|Gnd  |


|9 |40  |
|18|DIP2|
|  |x20.|
|  |2   |
|19|    |
|6 |    |
|7 |    |
|8 |    |
|20|    |


DB25F



BH10.1



1-25

13

1

14

25

9

20

  1

|RESET|
|XTAL2|
|XTAL1|
|MOSI |
|MISO |
|SCK  |
|Gnd  |


|1 |20 |
|4 |DIP|
|  |2x1|
|  |0.1|
|5 |   |
|17|   |
|18|   |
|19|   |
|10|   |


1 - 20

1

2

10

1-10




смотреть на рефераты похожие на "Разработка программной и аппаратной поддержки к методическим указаниям Программирование микроконтроллеров "