Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
243
Добавлен:
04.01.2020
Размер:
5.37 Mб
Скачать

Пример 3.20:

MOV #34, W0

BSET W0, #0

BCLR W0, #5

В данном примере в регистр W0 записывается значение 34 (0x22). Затем команда «BSET W0, #0» устанавливает бит 0 этой переменной, в результате чего содержимое регистра становится равным 35 (0x23). Следующая за ней инструкция BCLR W0, #5 сбрасывает бит 5 регистра, в результате чего окончательное его значение будет равно 3 (0x3).

Для быстрого анализа состояния отдельных битов переменной в систему команд микроконтроллеров dsPIC33 включены инструкции FBCL, FF1L и FF1R. Эти инструкции очень полезны в системах сбора данных при сканировании, например, сигнальных выводов периферийных устройств. Краткое описание этих инструкций:

-FBCL – определяет изменение состояния битов от младшего к старшему (слева направо);

-FF1L – находит первый ненулевой бит при проходе слева направо;

-FF1R – находит первый ненулевой бит при проходе справа налево.

Пример 3.21:

MOV #8, W2

FF1R W2, W3

В примере в регистр W2 заносится значение 8. Инструкция FF1R обнаруживает первый единичный бит в регистре W2 на позиции 4 (отсчет ведется от 1) и записывает это значение в регистр W3. Таким образом, регистр W3 будет содержать значение 4.

Среди команд битовых операций инструкции установки (BSET), сброса (BCLR) и переключения (BTG) битов чаще всего применяются для управления внешними исполнительными устройствами, подключенными к портам вывода микроконтроллера.

Пример 3.22:

BTG PORTA, #0

В примере команда BTG использована для переключения состояния бита 0 порта PORTA.

261

Команды сравнения/выбора и условных/безусловных переходов

К группе команд сравнения/выбора относятся команды вида BTxx и CPxx, где аббревиатура BT означает «Bit Test», CP означает «Compare», а символы «xx» – одно из условий. О функциях команд понятно по их названию. Команды BTxx проверяют состояние указанного бита (0 или 1) и по результатам проверки выполняют определенное действие. Команды CPxx выполняют сравнение значений операндов, в результате чего устанавливаются флаги в регистре состояния SR МК. Дальнейшие действия выполняются с помощью команд условных переходов BRA xx, где «хх» – условие выполнения перехода.

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

Наиболее широко при разработке программного обеспечения используются инструкции BRA xx xx» — код условия), CALL и GOTO.

Команда BRA xx осуществляет переход по адресу программы, содержащемуся в теле инструкции, при выполнении условия xx. В общей сложности эта команда может проверять выполнение следующих условий:

-C – установлен флаг переноса;

-GE – больше или равно;

-GEU – больше или равно для операций без знака;

-GT – больше;

-GTU – больше для операций без знака;

-LE – меньше или равно;

-LEU – меньше или равно для операций без знака;

-LT – меньше;

-LTU – меньше для операций без знака;

-N – результат предыдущей операции отрицательный;

-NC – перенос (заем) отсутствует;

-NN – результат предыдущей операции неотрицательный;

-NOV – переполнения нет;

-NZ – результат предыдущей операции ненулевой;

-OV – возникло переполнение;

-Z – установлен бит нуля в регистре состояния.

Например, команда «BRA Z, LABEL1» выполнит переход на метку LABEL1 программы, если установлен бит Z в регистре состояния МК.

262

Кроме того, команда BRA имеет две модификации, позволяющие выполнять безусловный переход:

-BRA метка, где метка должна находиться в пределах от –32768 до +32767 слов памяти программ относительно команды BRA;

-BRA Wn, где Wn – рабочий регистр.

К командам переходов относятся и команды вызова процедур CALL и безусловного перехода GOTO. Инструкции CALL и GOTO в качестве операнда могут использовать либо метку, либо один из рабочих регистров. Если в качестве адреса перехода использовать содержимое какого либо из рабочих регистров, то с помощью одной инструкции BRA или CALL можно организовать несколько ветвлений в программе. Рассмотрим несколько примеров подобного использования команд BRA и CALL.

Пример 3.23:

MOV #0x1, W0

MOV #handle(Sub1), W2 BTSS W0,#0

MOV #handle(Sub2), W2 CALL W2

Sub1:

RETURN

Sub2:

RETURN

Программа работает следующим образом: с помощью команды BTSS W0, #0 анализируется бит 0 регистра W0: если он равен 0, то выполняется следующая за инструкцией команда, а если он равен 1, то следующая за командой инструкция пропускается. Таким образом, если бит 0 установлен, то в регистре W2 остаѐтся адрес вызова процедура Sub1, если же бит 0 сброшен, то в регистр W2 перезаписывается адрес вызова процедуры Sub2. Для того чтобы вызвать процедуру посредством адреса, содержащегося в рабочем регистре W2, выполняется команда «CALL W2». В данном примере бит 0 регистра W0 принудительно устанавливается в 1, поэтому вызывается процедура Sub1.

В примере 3.23 значение стартового адреса одной из процедур (Sub1 или Sub2) записывается в регистр с помощью специального оператора HANDLE в одной из команд:

263

MOV #handle(Sub1),W2

MOV #handle(Sub2),W2

В данном примере бит 0 регистра W0 принудительно устанавливается в 1, поэтому вызывается процедура Sub1.

Команды работы со стеком

Программный стек управляется командами PUSH и POP. Эти инструкции эквивалентны инструкции MOV с регистром W15 в качестве указателя приѐмника. Для сохранения данных в стек необходимо выполнить следующую команду:

PUSH W0

Значение, содержащееся на вершине стека, может быть получено следующей инструкцией:

POP W0

Во время выполнения инструкции вызова подпрограммы CALL, значение счетчика команд (PC) сохраняется в стек. Благодаря этому, после завершения работы подпрограммы, основная программа может продолжить свое выполнение с правильной позиции. Сохранение счетчика команд в стек происходит следующим образом: биты 15...0 располагаются по первому доступному адресу в стеке, а биты 22...16 помещаются по следующему адресу, при этом старшие биты второго слова дополняются нулями.

Контрольные вопросы к теме 3.4

1Укажите отличие микроконтроллеров от универсальных МПС (микроЭВМ).

2Укажите основные технические данные микроконтроллера dsPIC33fj32mc204 (разрядность шин адреса памяти программ и данных, разрядность инструкций и данных, а также быстродействие).

3Перечислите периферийные модули, входящие в состав МК семейства dsPIC33F и поясните их назначение.

4Укажите число рабочих регистров W и поясните их назначение.

5Какие операции выполняют АЛУ МК семейства dsPIC33F?

6Сколько командных циклов требуется для выполнения операций сложения, умножения и деления?

7Поясните назначение узлов в структурной схеме DSP-процессора.

264

8Поясните работу сдвигового регистра (Barrel Shifter) DSP-процессора при выполнении MCU и DSP операций.

9Поясните назначение теневых регистров в программной модели МК dsPIC33F.

10Укажите назначение битов регистра статуса SR.

11Какое число разрядов фактически используется для задания адреса памяти программ

ипочему младший разряд адреса всегда равен 0?

12Поясните, как организована память программ и как осуществляется адресация?

13Для чего предназначена «конфигурационное пространство» программной памяти?

14Для чего предназначена область SFR памяти данных?

15Почему ОЗУ общего назначения делятся на два сектора X и Y?

16Сколько источников тактирования имеет МК семейства dsPIC33F?

17Укажите выводы МК, к которым подключается кварцевый резонатор для первичного

ивторичного генераторов.

18Почему сигнал тактирования ядра МК FCY подается через программно управляемый делитель.

19Укажите источники прерываний МК семейства dsPIC33F.

20Что представляют собой векторы прерывания и где они хранятся?

21Чем отличаются программные и аппаратные исключения?

22Укажите источники сброса МК семейства dsPIC33F.

23Укажите назначение и поясните принцип работы сторожевого таймера WDT.

24Поясните назначение и отличие энергосберегающих режимов работы SLEEP и IDLE в МК семейства dsPIC33F.

25Назовите регистры, которые используются для работы с параллельными портами ввода/вывода. Поясните, как запрограммировать линию параллельного порта на вход либо выход данных.

26Укажите назначение таймеров и поясните работу Timer1 в режиме 16-разрядного синхронного счетчика.

27Поясните назначение и принцип работы модуля захвата IC МК семейства dsPIC33F.

28Поясните назначение и принцип работы модуля сравнения выхода ОС МК семейства dsPIC33F.

29Поясните назначение и принцип работы модуля аналого-цифрового преобразования

ADC МК dsPIC33fj32mc204.

30Поясните назначение и особенности коммуникационных интерфейсов UART, SPI и

I2C.

31Сколько инструкций содержит система команд МК семейства dsPIC33F?

32Какие способы адресации используется в МК семейства dsPIC33F и в чем заключается их сущность?

33На какие группы делится система команд МК семейства dsPIC33F? Приведите примеры инструкций из различных групп.

265

Тема 3.5 Программирование микроконтроллеров

3.5.1Обзор инструментальных средств

Внастоящее время при разработке программного обеспечения (ПО) для микроконтроллеров широко используется персональный компьютер и целый ряд специальных прикладных программ, называемых инструментальными средствами. К ним относятся:

- редактор исходного кода; - ассемблер; - компилятор;

- компоновщик (линкер); - библиотекарь; - отладчик (дебаггер);

- визуальный генератор исходного кода; - интегрированная среда разработки (ИСР).

Рассмотрим назначение, основные свойства и наиболее известные ре-

ализации перечисленных инструментальных средств в применении к микроконтроллерам PIC.

3.5.1.1 Редактор исходного кода

Редактор исходного кода предназначен для создания и последующего редактирования исходных файлов программы. В качестве такого редактора можно использовать любой текстовый редактор, поддерживающий файлы с кодировкой ASCII. Однако существуют и специализированные редакторы исходного кода, предоставляющие ряд дополнительных сервисных услуг, таких, как выделение ключевых слов языка программирования, автоматическое форматирование исходного кода, быстрая и удобная навигация по исходному коду, отображение подсказок, генерация типовых программных конструкций и др. Наиболее часто в качестве редактора исходного кода при написании программ для PIC используется встроенный редактор ИСР Microchip MPLAB.

3.5.1.2 Ассемблер

Основной задачей ассемблера является преобразование файла исходного кода, написанного на языке Ассемблер, в файл объектного кода для последующей компоновки. При этом ассемблер выполняет синтаксическую проверку текста программы и вычисление выражений. Кроме создания файла с

266

объектным кодом ассемблер генерирует различные файлы отчета, используемые для анализа результатов ассемблирования. Как правило, ассемблер является программой командной строки, однако в некоторых реализациях существует возможность работать с ассемблером и в диалоговом режиме. Самым распространенным ассемблером для PIC является универсальный макроассемблер Microchip MPASM. Для МК семейства dsPIC33F используются ассем-

блер MPLAB ASM30.

3.5.1.3 Компилятор

Основной задачей компилятора (Compiler), так же как и ассемблера (Assembler), является преобразование файла исходного кода, написанного на соответствующем языке высокого уровня, в файл объектного кода для последующей компоновки. В дополнение к действиям, выполняемым ассемблером, компилятор выполняет еще и оптимизацию исходного кода. Компилятор в от-

личие от ассемблера может преобразовывать один оператор соответствующего языка в несколько команд микроконтроллера. Таким образом, ком-

пилятор является интеллектуальным генератором объектного кода, в то время как ассемблер просто транслирует исходный код в объектный. Это является принципиальным отличием компилятора от ассемблера. Компилятор также генерирует различные файлы отчета, используемые для анализа результа-

тов компиляции. Как правило, компилятор является программой командной строки. Существуют компиляторы для различных языков программирования. Наибольшее распространение для МК PIC получил язык программирования С. Для МК семейства dsPIC33F используется компилятор MPLAB C30.

3.5.1.4 Компоновщик

Компоновщик (Linker) выполняет объединение и преобразование (компоновку) файлов объектного кода в файл выполнимого кода для последующего программирования микроконтроллера. Как и Ассемблер, компоновщик создает файлы отчета и является программой командной строки. Наиболее известным компоновщиком является Microchip MPLINK.

3.5.1.5 Библиотекарь

Библиотекарь (Librarian) служит для объединения файлов объектного кода в файл библиотеки для последующего использования в других программах, а также для редактирования существующих файлов библиотек. Библиотекарь яв-

267

ляется программой командной строки. Распространенным библиотекарем явля-

ется Microchip MPLIB.

3.5.1.6 Отладчик

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

Симулятор представляет собой только программное средство, моделирующее процесс выполнения программы в микроконтроллере. Достаточно часто отладчик является встроенным средством ИСР, что позволяет ему тесно взаимодействовать с редактором исходного кода. Однако существуют и отдельные программы-отладчики. Среди симуляторов наибольшей популярностью пользуется встроенный в ИСР Microchip MPLAB симулятор Microchip MPLAB-SIM. Среди эмуляторов - Microchip MPLAB ICE (от англ. In-Circuit Emulator), Microchip MPLAB ICD (от англ. In-Circuit Debugger).

3.5.1.7 Визуальный генератор исходного кода

Визуальный генератор исходного кода позволяет путем установки параметров c помощью мыши в ряде диалоговых окон и использования механизма drag and drop легко получить исходный код для конфигурации периферийных модулей микроконтроллера, организации обработчиков прерываний и выполнения других стандартных действий. Визуальный генератор кода позволяет значительно сократить время написания исходного кода, но не обладает достаточной гибкостью и ограничен выполнением стандартных действий. При написании программы часто используется комбинированный подход, при котором сначала используется визуальный генератор, а затем редактируется полученный с его помощью код в редакторе. Визуальный генератор часто встраивается в ИСР. Для МК PIC применяют визуальные генераторы исходного кода, например WIZ-С Visual Development.

268

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

Удобным средством при конструировании программ для микроконтроллеров является ИСР. Среда позволяет автоматизировать и упростить управление процессом создания программ. ИСР, как правило, объединяет в себе редактор исходного кода, ассемблер и компилятор, компоновщик, симулятор и эмулятор, библиотекарь, визуальные средства генерации кода, программатор. Самой популярной ИСР для МК PIC является Microchip MPLAB. Для МК семейства dsPIC33F используется ИСР MPLAB IDE (от англ. Integrated Development Environment).

Существуют и другие среды разработки, такие как IAR, WIZ-C. Существует также альтернативный способ управления процессом конструирования программы - использование пакетных файлов (.bat). В этом случае создается пакетный файл, содержащий вызовы необходимых инструментальных средств и обработку результатов их вызова. Этот способ менее удобен, нежели конструирование программы с использованием ИСР, однако все же находит свое применение.

3.5.2Обзор языков программирования

Внастоящее время широкое распространение получили такие языки про-

граммирования, как Aссемблер, C, C++, Pascal, Object Pascal, Java, Basic и др.

Все эти языки являются универсальными и предназначены для выполнения широкого круга задач.

Примечание – Следует различать язык Ассемблер и прикладную программу ассемблер.

3.5.2.1Различия языков программирования

Различные языки программирования отличаются друг от друга областью применения, грамматикой, степенью абстрагирования от языка машинных кодов и аппаратных средств микроконтроллера. Однако главным отличием языков программирования друг от друга является поддержка различных стилей программирования: процедурного программирования (использование подпрограмм, процедур и функций с передачей параметров и возвратом результата), модульного программирования (использование модулей), объектно-ориентированного программирования (использование иерархий полиморфных классов), обобщенного программирования (использование шаблонных функций и классов). Так, например, язык Ассемблер Microchip для

269

микроконтроллеров PIC не поддерживает ни один из перечисленных стилей, язык С поддерживает только процедурный стиль программирования, Pascal и Object Pascal – все, кроме обобщенного, а C++ поддерживает все стили.

3.5.2.2Языки программирования для микроконтроллеров

Вобласти программирования микроконтроллеров наибольшее распространение получили такие языки, как Ассемблер и C. Язык Ассемблер является языком низкого уровня, тесно связан с набором команд микроконтрол-

лера и аппаратными средствами. Эти его особенности предоставляют

про-

граммисту широкие возможности в

управлении аппаратными средства-

ми микроконтроллера и написании высокоэффективных с точки зрения

вре-

мени выполнения и/или используемого

объема памяти фрагментов исходно-

го кода. С другой стороны, низкий уровень языка Ассемблер затрудняет разработку больших и сложных программ. Выход заключается в использовании языков более высокого уровня.

В 1983г. комитетом при Американском национальном институте стандартов (ANSI) был стандартизирован и рекомендован к применению в элек- тронно-вычислительных системах язык программирования C. Важной особенностью языка С является то, что наряду с предоставлением более высокоуровневых программных конструкций язык сохраняет возможность работы с аппаратными средствами на низком уровне и создания высокоэффективного исходного кода.

При программировании микроконтроллеров иногда используются и другие языки, такие как Basic и Pascal, однако они не получили такого распространения, как С, в основном из-за слишком высокого предполагаемого уровня абстракции от аппаратных средств.

Остановимся более подробно на отличительных особенностях языков Ас-

семблер и С.

3.5.2.3 Особенности языков программирования Ассемблер и C

Язык Ассемблер относительно прост в освоении, тесно связан с архитектурой микроконтроллера, что делает его весьма полезным языком с методической точки зрения особенно на стадии первичного изучения микроконтроллеров. Кроме того, ассемблер позволяет с точностью до команды контролировать генерируемый объектный код программы.

Язык C обеспечивает поддержку различных типов данных (символьные, целочисленные, вещественные), символьных строк, массивов и указателей.

270