Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование микроконтроллеров AVR. Учебное пособие.pdf
X
- •ПРЕДИСЛОВИЕ
- •1. АРХИТЕКТУРА МИКРОКОНТРОЛЛЕРОВ AVR СЕМЕЙСТВА MEGA
- •1.1. Регистры микроконтроллера
- •1.2. Порты ввода/вывода
- •1.3. Периферийные устройства
- •1.3.1. Таймеры/счетчики
- •1.3.2. Аналого-цифровой преобразователь
- •2. ОБЩИЕ СВЕДЕНИЯ О ЯЗЫКЕ С
- •2.1. Вводные понятия в языке С
- •2.2. Правила приведения типов компилятора Code Vision AVR
- •2.3. Структура программы на языке С
- •3. СОЗДАНИЕ ПРОЕКТА С ИСПОЛЬЗОВАНИЕМ МАСТЕРА-ПОСТРОИТЕЛЯ
- •3.1. Выбор общих параметров проекта
- •3.1.1. Настройка портов
- •3.1.2. Настройка таймеров
- •3.1.3. Настройка параметров АЦП
- •3.1.4. Настройка параметров ЖКИ
- •3.2. Генерации программы
- •4. ПРИМЕНЕНИЕ МИКРОКОНТРОЛЛЕРОВ AVR ПРИ РАЗРАБОТКЕ ИЗМЕРИТЕЛЬНЫХ СИСТЕМ
- •ЗАКЛЮЧЕНИЕ
- •БИБЛИОГРАФИЧЕСКИЙ СПИСОК

Флаги всех прерываний таймера/счетчика ТС1 находятся в регистре
TIFR, а разрешение или запрещение этих прерываний производится установкой или сбросом соответствующего бита маски прерываний регистра
TIMSK.
Счетный регистр таймера/счетчика TCNT1 входит в состав основного
блока модуля – блока реверсивного счетчика. В зависимости от режима
работы модуля содержимое счетного регистра сбрасывается, инкрементируется или декрементируется по приходу каждого тактового импульса на
входе таймера/счетчика. Независимо от того, присутствует тактовый сигнал или нет, регистр в любой момент времени доступен как для чтения,
так и для записи. После подачи напряжения питания в регистре TCNT1
находится нулевое значение.
Основной режим, который чаще всего используется при разработке
измерительных систем, называется «Сброс при совпадении» (СТС), где
задействован специальный регистр – регистр совпадения.
Таймер Т1 микроконтроллера ATmega8 имеет два регистра совпадения, которые задействованы в работе только тогда, когда выбран режим
СТС. Для каждого из регистров ввода-вывода с именами OCR1AL,
OCR1AH, OCR1BL, OCR1BH сравнение осуществляется раздельно. В случае сравнения содержимого счетного регистра с содержимым одного из
регистров совпадения произойдет вызов соответствующего прерывания.
Кроме этого, в момент совпадения может происходить одно из следующих событий:
• сброс таймера (только для регистров совпадения OCR1 и OCR1A);
• изменение состояния одного из выводов микроконтроллера.
Регистры OCR1A/OCR1B входят в состав блоков сравнения. Во время
работы таймера/счетчика в каждом машинном цикле осуществляется непрерывное сравнение содержимого этих регистров с содержимым регистра TCNT1. В случае равенства этих содержимых в следующем машинном цикле устанавливается соответствующий флаг OCF1A/OCF1B реги-
21

стра TIFR и генерируется прерывание (если оно разрешено). При наступлении такого события может изменяться состояние ОС1А/ОС1В.
Структура программы, в которой необходимо проводить непрерывные измерения, должна быть построена по принципу бесконечного цикла
с использованием прерываний, инициируемых таймером и АЦП. Таймер
требуется для запуска АЦП через равные промежутки времени, например
через 100 мс, чтобы провести не менее 10 измерений за контрольный период времени 1 с перед выводом информации на ЖКИ.
В этом случае процедура измерений будет проводиться непрерывно
с периодом 100 мс при работе основной программы в режиме бесконечного цикла с использованием прерываний, инициируемых таймером и АЦП.
В процессе проведения измерений напряжения в цепях постоянного тока
отсчеты за контролируемый период времени (1 с) необходимо проводить
многократно через равные промежутки времени. Наиболее удобными для
программирования в цепи постоянного тока являются промежутки времени, равные 100 мс.
1.3.2. Аналого-цифровой преобразователь
В состав моделей ATmega8, ATmega16, ATmega32, ATmega64
и ATmega128 входит модуль 10-разрядного АЦП последовательного приближения. Основные параметры этого АЦП следующие [2]:
− абсолютная погрешность ±2 МЗР;
− интегральная нелинейность ±0,5 МЗР;
− быстродействие до 15 тыс. выборок/с.
В составе модуля АЦП на входе присутствует 8-канальный аналоговый мультиплексор, имеющий восемь каналов с несимметричными входами. Микроконтроллер Atmega8 в корпусе DIP-32 содержит только
шесть входных, аналоговых каналов, из них два канала (ADC4 и ADC5)
являются 8-разрядными. Для формирования различного числа каналов
с дифференциальным входом входы АЦП могут объединяться попарно.
22

Источником опорного напряжения (ИОН) для АЦП может служить
либо источник питания микроконтроллера, либо внутренний, либо внешний ИОН.
Модуль АЦП может работать в двух режимах [1]:
а) в режиме одиночного преобразования, когда запуск каждого преобразования инициируется пользователем;
б) в режиме непрерывного преобразования, когда запуск преобразований выполняется непрерывно через определенные интервалы времени.
АЦП осуществляет преобразование входного аналогового напряжения в 10-разрядный код методом последовательных приближений. Минимальное значение напряжения соответствует нулевому уровню, а максимальное – уровню на выводе AREF минус один младший разряд.
К выводу AREF может быть подключено напряжение питания AVCC
или внутренний источник на 2,56 В путем записи соответствующих значений в биты REFS1...0 регистра ADMUX. Значение битов REFS1...0 и соответствующие им источники опорного напряжения приведены в табл. 1.3.
Таблица 1.3
Источники опорного напряжения АЦП
REFS1 REFS0 Источник опорного напряжения
0 0 Вывод AREF, внутренний ИОН отключен
0 1 AVCC с внешним конденсатором на выводе AREF
1 0 Зарезервировано
Внутренний ИОН 2,56 В с внешним конденсатором на выводе
1 1
AREF.
Канал аналогового ввода определяется путем записи бит MUX в регистр
управления мультиплексором ADMUX. В качестве однополярного аналогового входа АЦП может быть выбран один из входов ADC0…ADC5. Значения битов MUX3...MUX0 для различных входов приведено в табл. 1.4.
23

Таблица 1.4
Управление входным мультиплексором
MUX3...MUX0 Вход АЦП
00000 ADC0
00001 ADC1
00010 ADC2
00011 ADC3
00100 ADC4
00101 ADC5
АЦП преобразует аналоговый сигнал в 10-разрядный код, который
помещается в пару регистров данных АЦП – ADCH и ADCL. По умолчанию результат преобразования размещается в младших 10 разрядах 16разрядного слова (выравнивание справа) при нулевом состоянии бита
ADLAR в регистре ADMUX, но может быть размещен и в старших 10 разрядах (выравнивание слева) путем установки этого бита в единичное состояние. Формат регистра ADMUX приведен в табл. 1.5.
Таблица 1.5
Биты регистра ADMUX
Бит Название Описание
7,6 REFS1:REFS0 Выбор источника опорного напряжения
5 ADLAR Выравнивание результата преобразования
3...0 MUX3...MUX0 Выбор входного канала
Работа АЦП разрешается путем установки бита ADEN в регистре
управления и состояния ADCSR.
В проектах, которые будут рассмотрены в данном учебном пособии,
предлагается использовать при программировании АЦП одиночное преобразование в режиме запуска по прерыванию.
24

Одиночное преобразование запускается посредством записи логической единицы в бит запуска ADSC преобразования АЦП регистра ADCSR.
Данный бит остается в высоком состоянии в процессе преобразования
и сбрасывается контроллером по завершении преобразования.
Используя флаг прерывания АЦП в качестве источника управления,
АЦП начинает новое преобразование сразу же после завершения текущего, без потери времени на инициализацию. В данном случае АЦП функционирует в режиме непрерывного преобразования, постоянно обновляя
ADC Data Register – регистр результата преобразования. Первое преобразование должно быть начато установкой логической единицы в бит ADSC
регистра ADCSR. Если в процессе преобразования переключается канал
аналогового ввода, то АЦП автоматически завершит текущее преобразование прежде, чем переключит канал. Формат регистра ADCSR представлен в табл. 1.6.
Биты регистра ADCSR
Бит Название Описание
7 ADEN Разрешение АЦП
6 ADSC Запуск преобразования
5 ADFR Выбор режима работы АЦП
0 – режим одиночного преобразования
1 – остальные режимы
4 ADIF Флаг прерывания от компаратора
3 ADIE Разрешение прерывания от компаратора
2…0 ADPS2:ADPS0 Выбор частоты преобразования
Таблица 1.6
Преобразование аналогового сигнала в цифровой код в преобразователе
выполняется под управлением тактового сигнала АЦП, частота которого
должна находиться в пределах 50–200 кГц для обеспечения разрядности результата, равной 10 бит. При больших значениях тактовой частоты разряд-
25

ность преобразования понижается до 8 бит. Реальная частота дискретизации
АЦП зависит от количества тактов необходимого на одно преобразование,
которое может быть разным в зависимости от режима работы АЦП.
Для задания тактовой частоты АЦП служит модуль предделителя.
Основным параметром предделителя является коэффициент деления, который может принимать следующие значения: 2, 4, 8, 16, 32, 64, 128.
Результирующая частота работы АЦП получается при делении уста-
новленной частоты процессора на коэффициент деления предделителя.
Таким образом, для задания частот работы и дискретизации АЦП
необходимо задать коэффициент деления предделителя установкой битов
ADPS 2...0 в регистре управления АЦП ADCSR. Значения битов ADPS для
разных коэффициентов деления приведены в табл. 1.7.
Таблица 1.7
Биты ADPS
ADPS2 ADPS1 ADPS0 Коэффициент деления
0 0 1 2
0 1 0 4
0 1 1 8
1 0 0 16
1 0 1 32
1 1 0 64
1 1 1 128
В режимах одиночного и непрерывного преобразований цикл преоб-
разования запускается по первому нарастающему фронту тактового сигнала после установки разряда ADSC. Если используется запуск по прерыванию, то цикл преобразования начинается по первому нарастающему
фронту тактового сигнала после установки флага выбранного прерывания.
Одновременно с установкой этого флага производится сброс предделителя модуля АЦП.
26

Длительность цикла при использовании несимметричного входа со-
ставляет 13 тактов, а при использовании дифференциального входа –
13 либо 14 тактов; выборка и запоминание входного сигнала производятся
в течение первых 1,5 и 2,5 тактов соответственно. Через 13 (14) тактов
преобразование завершается, разряд ADSC в режиме одиночного преобразования сбрасывается в «0», а результат преобразования сохраняется в регистре данных АЦП. Одновременно устанавливается флаг прерывания
ADIF регистра ADCSR и генерируется запрос на прерывание. Как и флаги
остальных прерываний, флаг ADIF сбрасывается при запуске подпрограммы обработки прерывания от АЦП или программно, записью в него
«1». Разрешение прерывания осуществляется установкой в «1» разряда
ADIE регистра ADCSR при установленном флаге «I» регистра SREG. Если
АЦП работает в режиме непрерывного преобразования, новый цикл
начнется сразу же после записи результата. В режиме одиночного преобразования новое преобразование может быть запущено сразу же после
сброса разряда ADSC (до сохранения результата текущего преобразования). Однако реально цикл преобразования начнется не ранее чем через
один такт после окончания текущего преобразования [1]. Временные диаграммы, иллюстрирующие сказанное, приведены на рис. 1.6.
Рис. 1.6. Временные диаграммы работы АЦП
в режиме одиночного преобразования
27

При запуске первого преобразования (в режиме одиночного) после
включения АЦП для выполнения преобразования потребуется 25 тактов,
т. е. на 12 тактов больше, чем обычно. В течение этих 12 тактов выполняется «холостое» преобразование, инициализирующее АЦП (рис. 1.7).
Рис. 1.7. Временные диаграммы работы АЦП при первом преобразовании
(режим одиночного преобразования)
Высокая точность преобразования достигается, если тактовая частота
преобразования АЦП находится в диапазоне 50–200 кГц. Соответственно
коэффициент деления предделителя желательно выбирать таким, чтобы
тактовая частота модуля АЦП находилась в указанном диапазоне.
С уменьшением разрядности АЦП менее 10 разрядов точность преобразования снижается, при этом для ускорения процесса можно использовать
более высокую частоту, увеличивая частоту выборки. В моделях
ATmega8, ATmega16, ATmega64 и ATmega128 для этой же цели предназначен разряд ADCHM регистра SFIOR. При установке этого разряда в логическую единицу скорость преобразования АЦП увеличивается. Однако
при этом увеличивается и потребление микроконтроллера.
28

2. ОБЩИЕ СВЕДЕНИЯ О ЯЗЫКЕ С
На начальной стадии применения микроконтроллеров разработка про-
граммного обеспечения происходила исключительно на языке ассемблера,
ориентированного для работы с конкретным процессором. Поэтому такие
языки представляли собой символьные аналоги машинных кодов, а перевод мнемоники в машинный код выполнялся транслятором. Главным недостатком ассемблерных языков являлась привязка каждого из них к конкретному типу микропроцессорных устройств и логике его работы.
В отличие от ассемблера язык С является языком высокого уровня
и может использоваться при программировании любого процессора, для
которого существует компилятор с языка С. В языке С все низкоуровневые
операции, выполняемые микроконтроллером, представлены в виде абстрактных конструкций, позволяющих разработчикам сосредоточиться на
программировании без перевода в машинные коды [3].
Язык С является самым популярным языком для создания системного
программного обеспечения.
2.1. ВВОДНЫЕ ПОНЯТИЯ В ЯЗЫКЕ С
Комментарий – некоторый поясняющий текст, который при компиля-
ции не учитывается. Комментарии бывают многострочными (начинаются
с символов /* и заканчиваются символами */) и однострочными (начинаются с символов //).
Идентификатор – последовательность букв, цифр и символов под-
черкивания “_”, которая не должна начинаться с цифры, используемая для
именования различных программных элементов, таких как переменные,
константы, функции, пользовательские типы данных и т. д. Регистр букв
имеет значение.
Ключевое слово – зарезервированное слово определенного значения.
Ключевые слова не могут использоваться в качестве идентификаторов.
29

Литерал – постоянное значение некоторого типа, используемое в вы-
–38
–38
ражениях, например “10” как число в десятичной форме.
Формами представления числа в языке С являются:
10 – число 10 в десятичной форме;
0хА – число 10 в шестнадцатеричной форме (префикс 0х);
0b1010 – число 10 в двоичной форме (префикс 0b);
012 – число 10 в восьмеричной форме (префикс 0);
10.5 – число с плавающей точкой;
105e-1 – число 10,5 в экспоненциальной форме;
10U – беззнаковая константа (суффикс U);
10L – знаковая константа (суффикс L).
Тип данных определяет диапазон допустимых значений и простран-
ство, отводимое в памяти данных для переменных, констант и результатов,
возвращаемых функциями.
В различных компиляторах языка С могут использоваться собственные типы данных, однако все они базируются на стандартных типах, перечисленных в табл. 2.1.
Таблица 2.1
Типы данных языка С
Тип Название
bit Бит 1 0, 1
char Символ 8 –128...127
int Целое число 16 –32768...32767
float Вещественное число 32 ±1.175·10
Размер,
Диапазон значений
бит
... ±3.402·10
long int Длинное целое 32 –2 147 483 648...2 147 483 647
unsigned char Беззнаковый символ 8 0...255
unsigned int Беззнаковое целое 16 0..65535
unsigned long int Беззнаковое длинное целое
32 0...4 294 967 295
30
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
