- •Перечень сокращений
- •Предисловие
- •Введение
- •Часть 1. Архитектура и аппаратные средства микроконтроллера LPC214x
- •1.1 Общие сведения о микроконтроллерах LPC214x
- •1.2 Программистская модель процессорного ядра ARM7TDMI
- •1.2.1 Режимы работы ядра ARM7
- •1.2.2 Система регистров
- •1.2.3 Слово состояния программы
- •1.2.4 Организация памяти
- •1.3 Система команд
- •1.3.1 Команды арифметической и логической обработки
- •1.3.2 Команды умножения
- •1.3.3 Команды регистровой пересылки
- •1.3.4 Команды загрузки и сохранения регистров
- •1.3.5 Команды пакетного обмена с памятью
- •1.3.6 Команды передачи управления
- •1.3.7 Команды обращения к слову состояния программы
- •1.4 Методы адресации
- •1.4.1 Непосредственная адресация
- •1.4.2 Регистровая адресация
- •1.4.3 Косвенная адресация
- •1.4.4 Индексная адресация
- •1.5 Процедура начальной загрузки и режимы отображения памяти
- •1.6 Обработка исключительных ситуаций
- •1.7 Система тактирования
- •1.7.1 Выбор тактовой частоты микроконтроллера
- •1.7.2 Настройка тактирования периферийных устройств
- •1.8 Модуль ускорения памяти
- •1.9 Внешние выводы микроконтроллера
- •1.9.1 Служебные контакты
- •1.9.2 Программно-управляемые линии ввода-вывода
- •1.9.3 Альтернативные функции линий ввода вывода
- •1.10 Цифровые порты ввода-вывода
- •1.10.1 Управление портом через низкоскоростную шину
- •1.10.2 Управление портом через высокоскоростную шину
- •1.11 Система прерываний
- •1.11.1 Назначение системы прерываний
- •1.11.2 Процесс обработки прерываний IRQ
- •1.11.3 Процесс обработки быстрых прерываний FIQ
- •1.11.4 Регистры управления системой прерываний
- •1.11.5 Порядок настройки прерывания IRQ
- •1.11.6 Порядок настройки быстрого прерывания FIQ
- •1.11.7 Процедура обработки прерывания
- •1.11.8 Задержка обработки прерывания
- •1.12 Внешние прерывания
- •1.12.1 Регистры управления блоком внешних прерываний
- •1.12.2 Порядок настройки блока внешних прерываний
- •1.13 Таймеры-счетчики
- •1.13.1 Режим таймера и схема совпадения
- •1.13.2 Режим счетчика
- •1.13.3 Схема захвата
- •1.13.4 Управляющие регистры
- •1.13.5 Формирование интервалов времени через систему прерываний
- •1.13.6 Измерение периода и длительности импульса с помощью устройства захвата
- •1.13.7 Подсчет числа импульсов в единицу времени
- •1.14 Широтно-импульсный модулятор
- •1.14.1 Основы функционирования
- •1.14.2 Дополнительные возможности
- •1.14.3 Регистры управления ШИМ
- •1.14.4 Порядок настройки ШИМ
- •1.15 Аналого-цифровые преобразователи
- •1.15.1 Краткие сведения о встроенных АЦП
- •1.15.2 Общие рекомендации по использованию АЦП
- •1.15.3 Управляющие регистры
- •1.15.4 Порядок настройки АЦП
- •1.15.5 Программный запуск аналого-цифрового преобразователя
- •1.15.6 Запуск аналого-цифрового преобразователя по таймеру
- •1.15.7 Программный опрос готовности АЦП
- •1.15.8 Опрос готовности АЦП по прерыванию
- •1.15.9 Считывание и масштабирование результата АЦП
- •1.16 Цифро-аналоговый преобразователь
- •1.16.1 Регистр управления ЦАП
- •1.16.2 Рекомендации по применению ЦАП
- •1.17 Последовательный синхронный приемо-передатчик SPI
- •1.17.1 Назначение и основы функционирования интерфейса SPI
- •1.17.2 Управляющие регистры
- •1.17.3 Передача и прием данных в режиме ведущего
- •1.17.4 Передача и прием данных в режиме ведомого
- •1.18 Последовательный синхронный приемо-передатчик I2С
- •1.18.1 Назначение и основы функционирования интерфейса I2С
- •1.18.2 Управляющие регистры
- •1.18.3 Настройка модуля I2C
- •1.18.4 Типовые циклы обмена данными по шине I2C
- •1.19 Последовательный асинхронный приемопередатчик UART
- •1.19.1 Назначение и основы функционирования порта UART
- •1.19.2 Управляющие регистры
- •1.19.3 Настройка порта UART
- •1.19.4 Прием байта с опросом флага
- •1.19.5 Передача байта с опросом флага
- •1.19.6 Прием и передача данных с использованием прерываний
- •1.19.7 Прием и передача пакетов данных
- •1.19.8 Диагностика ошибок
- •1.19.9 Автоматическая настройка скорости
- •1.20 Часы реального времени
- •1.20.1 Основные возможности часов реального времени
- •1.20.2 Управляющие регистры
- •1.20.3 Рекомендации по применению
- •1.21 Управление питанием и идентификация источников сброса
- •1.21.1 Краткие сведения о мониторе питания
- •1.21.2 Управляющие регистры
- •Часть 2. Разработка и отладка программ с помощью современных инструментальных средств
- •2.1 Форматы представления чисел
- •2.1.1 Основные коды представления целых чисел
- •2.1.2 Форматы представление целых чисел, приятные в языке Си
- •2.1.3 Форматы чисел c плавающей точкой стандарта IEEE754
- •2.2 Основы программирования на языке Си
- •2.2.1 Структура программы
- •2.2.2 Числовые константы
- •2.2.3 Переменные и именованные константы
- •2.2.4 Оператор присваивания, выражения и операции
- •2.2.5 Условный оператор
- •2.2.6 Приведение и преобразование типов
- •2.2.7 Массивы
- •2.2.8 Строки символов
- •2.2.9 Структуры
- •2.2.10 Объединения
- •2.2.11 Указатели
- •2.2.12 Ветвление
- •2.2.13 Множественное ветвление
- •2.2.14 Цикл со счетчиком
- •2.2.15 Циклы с предусловием и постусловием
- •2.2.16 Функции
- •2.2.17 Некоторые директивы компилятора
- •2.2.18 Библиотека математических функций MATH.h
- •2.2.19 Функция создания форматированных строк SNPRINTF
- •2.2.20 Ассемблер в Си-программах
- •2.3 Интегрированная среда разработки Keil µVision 4
- •2.3.1 Создание проекта
- •2.3.2 Создание файла программы
- •2.3.3 Настройка проекта
- •2.3.4 Набор текста программы
- •2.3.5 Компиляция программы
- •2.3.6 Отладка программы
- •2.3.7 Основные отладочные инструменты среды Keil µVision 4
- •2.3.8 Управление распределением памяти
- •2.4 Методика отладки программ
- •2.4.1 Быстрый поиск ошибок
- •2.4.2 Ввод и вывод дискретных сигналов
- •2.4.3 Таймер-счетчик. Формирование интервалов времени
- •2.4.4 Таймер-счетчик. Формирование внешних сигналов совпадения
- •2.4.5 Таймер-счетчик. Счетчик внешних событий
- •2.4.6 Таймер-счетчик. Устройство захвата
- •2.4.7 Широтно-импульсный модулятор
- •2.4.8 Аналого-цифровой преобразователь
- •2.4.9 Цифро-аналоговый преобразователь
- •2.4.10 Приемопередатчик SPI
- •2.4.11 Приемопередатчик I2C
- •2.4.12 Приемопередатчик UART
- •2.4.13 Часы реального времени
- •2.5 О программировании ARM7 на ассемблере
- •2.5.1 Основные правила записи программ на ассемблере
- •2.5.2 Псевдокоманды
- •2.5.3 Директивы ассемблера
- •2.5.4 Макросы
- •2.5.5 Пример простой программы
- •2.6 Распространенные средства разработки и отладки
- •2.6.1 Демонстрационные платы EA-EDU-001 и EA-EDU-011
- •2.6.2 Внутрисхемный отладчик J-Link
- •2.6.3 Утилиты программирования ПЗУ LPC Flash Utility и FlashMagic
- •2.6.4 Программа-терминал 232Analyzer
- •2.6.5 Низкоуровневый редактор диска DMDE
- •Часть 3. Решение типовых задач локального управления
- •3.1 Формирование временной задержки с помощью цикла
- •3.1.1 Задание
- •3.1.2 Общие рекомендации
- •3.1.3 Алгоритм программы
- •3.1.4 Отладка
- •3.1.5 Дополнительные сведения о формировании временной задержки
- •3.2 Формирование дискретного сигнала с помощью таймера
- •3.2.1 Задание
- •3.2.2 Общие рекомендации
- •3.2.3 Алгоритм программы
- •3.3 Опрос дискретного датчика или кнопки
- •3.3.1 Задание
- •3.3.2 Общие рекомендации
- •3.3.3 Алгоритм программы
- •3.3.4 Отладка
- •3.4 Опрос состояния механических контактов с подавлением дребезга
- •3.4.1 Задание
- •3.4.2 Общие рекомендации
- •3.4.3 Алгоритм программы
- •3.4.4 Отладка
- •3.5 Опрос клавиатуры с автоповтором
- •3.5.1 Задание
- •3.5.2 Общие рекомендации
- •3.5.3 Алгоритм программы
- •3.5.4 Отладка
- •3.6 Формирование импульсного управляющего сигнала с помощью модуля ШИМ
- •3.6.1 Задание
- •3.6.2 Общие сведения
- •3.6.3 Алгоритм программы
- •3.6.4 Отладка
- •3.6.5 Синхронизация внешним сигналом
- •3.7 Формирование сигналов специальной формы с помощью ЦАП
- •3.7.1 Задание
- •3.7.2 Основы
- •3.7.3 Алгоритм программы
- •3.7.4 Повышение точности генерирования частоты
- •3.7.5 Выбор числа дискрет
- •3.8 Управление двухфазным шаговым двигателем
- •3.8.1 Задание
- •3.8.2 Общие сведения
- •3.8.3 Алгоритм программы
- •3.9 Применение ШИМ для формирования низкочастотных аналоговых сигналов
- •3.9.1 Задание
- •3.9.2 Основные сведения
- •3.9.3 Алгоритм основной программы
- •3.9.4 Алгоритм процедуры обработки прерывания
- •3.10 Управление символьным жидкокристаллическим индикатором
- •3.10.1 Задание
- •3.10.2 Управление модулем жидкокристаллической индикации
- •3.10.3 Разработка функции управления ЖКИ с ожиданием готовности
- •3.10.4 Функция вывода строки символов
- •3.10.5 Разработка функции инициализации модуля ЖКИ
- •3.10.6 Разработка тестовой программы
- •3.10.7 Управление ЖКИ с опросом флага готовности
- •3.10.8 Программирование произвольных символов
- •3.11 Управление матричным светодиодным индикатором
- •3.11.1 Задание
- •3.11.2 Основные рекомендации
- •3.11.3 Алгоритм основной программы
- •3.11.4 Алгоритм процедуры обработки прерывания
- •3.11.5 Реализация движения строки
- •3.12 Управление матричным жидкокристаллическим дисплеем
- •3.12.1 Управление дисплеем на основе контроллера PCF8833
- •3.12.2 Построение простейших геометрических фигур
- •3.13 Измерение постоянного напряжения
- •3.13.1 Задание
- •3.13.2 Основные рекомендации
- •3.13.3 Алгоритм основной программы
- •3.13.4 Алгоритм процедуры обработки прерывания от АЦП
- •3.13.5 АЦП с циклическим опросом нескольких каналов
- •3.13.6 Автоматический выбор пределов измерения
- •3.14 Измерение параметров уровня переменного напряжения
- •3.14.1 Задание
- •3.14.2 Основные рекомендации
- •3.14.3 Алгоритм основной программы
- •3.14.4 Алгоритм процедуры обработки прерывания
- •3.15 Измерение ускорения с помощью трехосевого акселерометра
- •3.16 Измерение интервалов времени с помощью таймера
- •3.16.1 Задание
- •3.16.2 Общие рекомендации
- •3.16.3 Алгоритм основной программы
- •3.16.4 Алгоритм процедуры обработки прерывания
- •3.16.5 Повышение разрешающей способности путем усреднения
- •3.16.6 Введение поправок
- •3.17 Измерение частоты с помощью счетчика
- •3.17.1 Задание
- •3.17.2 Основные рекомендации
- •3.17.3 Алгоритм программы
- •3.17.4 Повышение точности измерений
- •3.18 Опрос цифрового датчика температуры. Интерфейс I2C
- •3.18.1 Задание
- •3.18.2 Общие рекомендации
- •3.18.3 Алгоритм программы
- •3.20 Обмен данными с электрически перепрограммируемым ПЗУ
- •3.20.1 Задание
- •3.20.2 Общие сведения о микросхемах EEPROM
- •3.20.3 Адресация в микросхемах EEPROM
- •3.20.4 Порядок чтения EEPROM
- •3.20.5 Порядок записи EEPROM
- •3.20.6 Разработка программы чтения EEPROM
- •3.20.7 Разработка функции записи блока данных в EEPROM
- •3.21 Интерфейс RS-232. Прием и передача простых команд
- •3.21.1 Задание
- •3.21.2 Алгоритм программы
- •3.21.3 Автоматическая настройка скорости
- •3.22.1 Задание
- •3.22.2 Основные рекомендации
- •3.22.3 Алгоритм программы
- •3.23 Интерфейс RS-232. Прием пакета переменной длины
- •3.23.1 Задание
- •3.23.2 Основы реализации
- •3.23.3 Алгоритм программы
- •3.24 Обмен данными с картой памяти Secure Digital
- •3.24.1 Задание
- •3.24.2 Общие сведения о карах FLASH-памяти SD/MMC
- •3.24.3 Команды SD/MMC
- •3.24.4 Процедура инициализации карты
- •3.24.5 Чтение и запись данных
- •3.24.6 Обработка ошибок
- •3.24.7 Комментарии к алгоритму и программе
- •Алфавитный указатель управляющих регистров
- •Список литературы
- •Содержание
3.12.2 Построение простейших геометрических фигур
Приведем формулы, применяемые для построения простейших геометрических фигур: линии и окружности.
Линия, заданная координаторами начала (, ), а также проекциями на оси координат (, ), строится по следующим формулам.
Если
,
где — целое, изменяющееся через 1 от до . Если
,
где — целое, изменяющееся через 1 от до .
Окружность, заданная координатами центра (, ) и радиусом строится, как множество точек с координатами
;
;
;
;
,
где — целое, изменяющееся через 1 в пределах .
3.13 Измерение постоянного напряжения
3.13.1 Задание
Разработать программу, выполняющую аналого-цифровое преобразование напряжения на входе AIN0.1 (P0.28) и отображение на ЖКИ результата измерения в вольтах. Измерение и обновление показаний производить каждые 0,4 с.
3.13.2 Основные рекомендации
Измеряемое постоянное напряжение регулируется с помощью потенциометра (рисунок 3.13.1) в диапазон от 0 до 3,3 В.
Рисунок 3.13.1 – Схемы формирования опорного напряжения (слева) и аналоговых сигналов (справа)
Предлагается формировать задержку измерений 0,4 с с помощью таймера. Запуск АЦП будет осуществляться сигналом от схемы совпадения.
206
Считывание результата, преобразование в строку символов и обновление индикатора будет осуществляться в процедуре обработки прерывания от АЦП.
3.13.3 Алгоритм основной программы
Программа должна содержать директивы подключения библиотек функций ввода-вывода и функций управления ЖКИ.
#include <LPC214x.h> #include <STDIO.h> #include "LCD.C"
Процедура обработки прерываний будет описана ниже. Алгоритм основной программы показан на рисунке 3.13.1.
1.Перевести линию P0.28 в режим входа АЦП (регистр PINSEL1).
2.Вызвать функцию инициализации ЖКИ LCDInit (из библиотеки).
3.Настроить таймер. Задать пороговое значение (регистр T0MR1), соответствующее временной задержке 0,4 с (1.13.3). Разрешить сброс таймера по совпадению 1 (регистр T0MCR). Разрешить установку внешнего сигнала совпадения 1 (регистр T0EMR). Включить таймер (регистр T0TCR).
4.Настроить АЦП (регистр AD0CR):
а) включить запуск АЦП нарастающим сигналом MAT0.1 (биты
START и EDGE).
б) включить АЦП (бит PDN);
в) непрерывное преобразование не использовать (биты BURST и CLKS);
Основная программа
Начало
1Настройка режима линии P0.28
2
Инициализация
ЖКИ
3
Настройка таймера и схемы совпадения, включение таймера
4 Настройка АЦП
5Настройка системы прерываний
6
Пустая команда
Процедура обработки прерывания от АЦП
Начало
1
Сохранение и масштабирование результата
2
Формирование строки символов
3
Вывод строки на ЖКИ
4
Инициализация системы прерываний
Возврат
Рисунок 3.13.1 – Алгоритм программы измерения постоянного напряжения
207
г) установить делитель частоты (биты CLKDIV), так чтобы тактовая частота АЦП не превышала 4,5 МГц (1.15.1); напомним, что по умолчанию тактовая частота периферийных устройств МГц;
д) выбрать канал 1 (биты SEL).
5.Настроить систему прерываний, разрешив прерывание по заверше-
нии АЦП через VICVectAddr0, VICVectCntl0 и VICIntEnable (раздел 1.11.5).
6.Записать конструкцию вечного цикла.
3.13.4 Алгоритм процедуры обработки прерывания от АЦП
В процедуре обработки прерываний потребуется объявить две переменные: вещественного типа N для хранения результата преобразования в вольтах и строку символов из восьми символов S.
float N; char S[10];
Поясним размерность массива S. Для отображения результата предлагается отвести 9 позиций:
U=1.234 V
Десятый элемент массива необходим для хранения пустого символа (код 0x00), обозначающего конец строки.
1.Считать результат АЦП из регистра AD0DR1 в переменную N (см. пример в разделе 1.15.9). Опорное напряжение задается резисторным делителем кОм, и кОм. Что дает В.
2.Вызвать стандартную функцию форматирования строк sprintf из библиотеки STDIO.h (раздел 2.2.19).
snprintf(S,10,"U=%4.3f V",N);
При строке S получит значение в соответствии с предложенным форматом.
3.Вывести на дисплей строку S c помощью функции PrintSymbol.
4.Сбросить в ноль сигнал EMС1, приведший к запуску АЦП, напри-
мер, так:
T0EMR&=0xFFFFFFFD;
Как всегда, последней командой процедуры обработки прерывания загрузить нулевое значение в регистр VICVectAddr.
3.13.5 АЦП с циклическим опросом нескольких каналов
Дополнительно предлагается разработать модификацию программы, которая проводит измерения двух сигналов, отображая результаты измерения на разных строках индикатора. Теперь запуск АЦП будет выполняться в режиме непрерывного преобразования с автоматическим опросом каналов.
За основу берется прежний алгоритм, в который необходимо внести ряд изменой.
1.Кроме портовой линии P0.28 перевести в режим аналогового ввода линию P0.29 (блок 1).
2.Исключить из основной программы команды, отвечающие за настройку таймера (блок 3), а из процедуры обработки прерывания — команды сброса сигнала EM0 в регистре T0EMR (блок 4).
208
3. Изменить настройку АЦП:
а) сбросить в нули биты START; установить в единицу бит BURST;
б) в разрядах SEL установить единицы, соответствующие каналам
AIN0.1 и AIN0.2.
4. В процедуре обработки прерываний от АЦП повторить команды блоков 1–3 для второго канала. Результаты считывать из регистров AD0DR1
иAD0DR2.
3.13.6Автоматический выбор пределов измерения
Для расширения динамического диапазона измерительные приборы делают многопредельными. Это значит, что чувствительность прибора и диапазон (предел) измерения может меняться. С этой целью в структуру канала обработки измерительного сигнала вводятся специальные масштабирующие устройства, коэффициент передачи которых меняется с помощью коммутирующей аппаратуры. Весьма популярны, например, интегральные операционные усилители или микросхемы АЦП с программируемым коэффициентом передачи.
Ряд пределов измерения определяется возможностями аппаратной части прибора. Часто это десятикратное изменение предела (например, 0,01; 0,1; 1, 10, 100). Встречается вариант удвоения (0,25; 0,5; 1; 2; 4), а также схема 1-2-5 (0,1; 0,2; 0,5; 1; 2). Количество пределов может быть от двух до нескольких десятков.
С точки зрения программиста коэффициент передачи внешних электрических цепей управляется параллельным или последовательным двоичным кодом, формируемым непосредственно на портовых линиях или передаваемый через интерфейс SPI или I2C.
Здесь обсудим логику автоматического переключения пределов измерения. Программа микроконтроллера должна распознавать необходимость повышения чувствительности (то есть перехода на меньший предел) и понижения чувствительности (перехода на больший предел).
Выбор предела с меньшей чувствительностью выполняется, если код АЦП превышает значение, соответствующее текущему верхнему пределу измерения, и, разумеется, если код АЦП содержит все единицы (насыщение).
Выбор предела измерения с большей чувствительностью выполняется при условии, что измеряемая величина не превышает 90–95% этого нового предела.
Отметим, что повышение и понижение чувствительности осуществляется при разных уровнях измерительного сигнала. Такой гистерезис необходим во избежание циклического переключения, когда сигнал близок к границе пределов
Условие понижения чувствительности имеет вид
.
Для десятиразрядного АЦП обычно выбирают или . Условие понижения чувствительности
.
209