Добавил:
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 ПРИ РАЗРАБОТКЕ ИЗМЕРИТЕЛЬНЫХ СИСТЕМ
- •ЗАКЛЮЧЕНИЕ
- •БИБЛИОГРАФИЧЕСКИЙ СПИСОК

формируемое как сокращение от полного названия регистра. Полное
название регистра соответствует его назначению, например:
– Watchdog Timer Control Register (сокращенное название – WDTCR).
Этот регистр предназначен для управления сторожевым таймером, его
адрес $21 или 0x21.
Функция регистров МК состоит в том, чтобы управлять режимом работы периферийных устройств и хранить данные, характерные для данного периферийного устройства, например: результат отдельного преобразования аналогово-цифрового преобразователя (АЦП) сохраняется в составном регистре ADCH, L (допустим, результат преобразования имеет разрядность 10 бит и не помещается в один регистр).
Такой же принцип соблюдается в именовании отдельных битов регистров.
Регистры целиком либо отдельные биты могут иметь начальное значение и быть доступны:
а) только для чтения;
б) только для записи;
в) для чтения и записи.
1.2. ПОРТЫ ВВОДА/ВЫВОДА
Каждый порт микроконтроллеров состоит из определенного числа
выводов, через которые микроконтроллер может осуществлять прием
и передачу цифровых сигналов. Структурная схема контакта порта ввода/вывода показана на рис. 1.3 [1].
Изменение направления передачи данных через любой контакт ввода/вывода может быть произведено программно в любой момент времени,
не влияя на другие выводы порта. Выходные буферы всех портов обеспечивают высокую нагрузочную способность, достаточную для непосредственного управления светодиодными индикаторами.
11

Рис. 1.3. Схема контакта порта ввода/вывода микроконтроллера,
использующая следующие управляющие сигналы:
PUD – выключение подтягивающего резистора; SLEEP – управление
спящим режимом; clki/o – тактовый сигнал подсистемы ввода/вывода;
WDx – запись регистра DDRx; RDx – чтение регистра DDRx;
WPx – запись регистра PORTx; RRx – чтение регистра PORTx;
RPx – чтение выводов порта PORTx;
AIOxn – аналоговый выход вывода n порта PORTx
Входные буферы всех выводов построены по схеме триггера Шмитта
и для всех входов есть возможность подключения внутреннего подтягивающего резистора между входом и шиной питания VCC. Большинство контактов ввода/вывода всех микроконтроллеров семейства имеют дополнительные функции и могут использоваться различными периферийными
устройствами микроконтроллеров. При этом возможны две ситуации:
в одних случаях пользователь должен самостоятельно задавать конфигурацию вывода, а в других – вывод конфигурируется автоматически при
включении соответствующего периферийного устройства [1].
Обращение к портам осуществляется через регистры ввода-вывода.
12

В микроконтроллерах AV R каждому параллельному порту вводавывода поставлены в соответствие три регистра:
DDRx – регистр направления передачи данных – определяет, является
тот или иной вывод порта входом или выходом; если некоторый разряд регистра DDRx содержит логический 0, то соответствующий вывод порта
сконфигурирован как вход, если логическую 1, то – как выход.
PORTx – регистр данных порта – если вывод выполняет роль выхода,
то в соответствующий разряд записывается значение, предназначенное для
вывода; если вывод выполняет роль входа, то логическому 0 в некотором
разряде регистра PORTx соответствует высокоомный вход, а логической 1 –
вход, нагруженный подтягивающим сопротивлением.
PINx – регистр выводов порта – в отличие от регистров DDRx
и PORTx доступен только для чтения и позволяет считать входные данные
порта на внутреннюю шину микроконтроллера.
При работе с входами и выходами микроконтроллеров AVR обычно
используют двоичную систему счисления, при этом каждый входной или
выходной контакт соответствует конкретному биту в составе регистра
определенного порта.
1.3. ПЕРИФЕРИЙНЫЕ УСТРОЙСТВА
Микроконтроллеры семейства Mega имеют наиболее богатый набор
периферийных устройств (ПУ). При этом в большинстве моделей имеются
все ПУ, которые встречаются в составе микроконтроллеров AVR. Этими
устройствами являются [1]:
• 8-разрядные таймеры/счетчики (таймеры ТС0 и ТС2). В ряде моде-
лей эти таймеры/счетчики могут работать в качестве часов реального времени (в асинхронном режиме);
• 16-разрядные таймеры/счетчики (таймеры ТС1 и ТС3);
13

• сторожевой таймер WDT;
• генераторы сигнала с ШИМ разрядностью 8 бит (один из режимов
работы 8-разрядных таймеров/счетчиков ТС0 и ТС2);
• одно-, двух- и трехканальные генераторы сигнала с ШИМ регули-
руемой разрядности (один из режимов работы 16-разрядных таймеров
ТС1 и ТС3). Разрешение ШИМ-сигнала для разных моделей составляет
8...10 бит или 1...16 бит;
• аналоговый компаратор;
• многоканальный 10-разрядный АЦП как с несимметричными, так
и с дифференциальными входами;
• полнодуплексный универсальный асинхронный приемопередатчик
(UART);
• полнодуплексный универсальный синхронный/асинхронный прие-
мопередатчик (USART);
• последовательный синхронный интерфейс SPI;
• последовательный двухпроводной интерфейс TWI (аналог интер-
фейса I2С).
1.3.1. Таймеры/счетчики
Микроконтроллеры AVR содержат в своем составе как 8-, так и 16-
разрядные таймеры/счетчики. Разрядность влияет на момент переполнения
счетчика, при котором происходит его обнуление. Например, для 8разрядного счетчика ТС0 (ТС2) переполнение наступает, когда счет импульсов достигает значения 255, а для 16-разрядного счетчика ТС1 – 65535.
Если таймер/счетчик используется в качестве счетчика, то он должен
подсчитывать число импульсов, поступающих на определенный вход
микроконтроллера. При использовании его в качестве таймера, он должен
в режиме реального времени формировать заданные временные промежутки, а также может работать генератором периодических сигналов.
14

Функциональная схема восьмиразрядного таймера/счетчика показана
на рис. 1.4.
Рис. 1.4. Функциональная схема восьмиразрядного таймера/счетчика
Счетный регистр таймера/счетчика (TCNT0), а также оба регистра
совпадения (OCR0A, OCR0B) представляют собой восьмиразрядные регистры. Появление запроса на прерывание всегда можно определить по
наличию соответствующего флага прерываний в регистре TIFR.
15

Содержимое регистров OCR0A и OCR0B таймера/счетчика должно
непрерывно сравниваться со значением счетного регистра. Результат
сравнения может использоваться для генерации прямоугольных импульсов переменной частоты (сигнал ШИМ) на одном из выходов ОС0А или
ОС0В. В момент сравнения на одном из каналов устанавливается соответствующий флаг OCF0A или OCF0B, который может использоваться для
генерации запроса на прерывание по совпадению.
Таймер/счетчик запускается или от внутреннего, или от внешнего источников тактового сигнала. Определение источника тактового сигнала
осуществляется при помощи управляющей логики, которая производит
выбор источника в соответствии со значениями битов CS02:0 регистра
TCCR0B.
Коэффициент деления предделителя устанавливается для каждого из
таймеров с применением мультиплексора, который управляется разрядами
CSn(0..2) из регистра управления таймера/счетчика TCCRn (табл. 1.1).
С помощью этих же битов устанавливается режим работы таймера.
Таблица 1.1
Выбор режима и входного такта для ТС0 и ТС1 микроконтроллера
CSn2 CSn1 CSn0 Описание
0 0 0 Останов
0 0 1 Таймер, такт = такт системной синхронизации
0 1 0 Таймер, такт = такт системной синхронизации / 8
0 1 1 Таймер, такт = такт системной синхронизации / 64
1 0 0 Таймер, такт = такт системной синхронизации / 256
1 0 1 Таймер, такт = такт системной синхронизации / 1024
1 1 0 Счетчик, такт – внешний, ниспадающий фронт сигнала
1 1 1 Счетчик, такт – внешний, нарастающий фронт сигнала
Модуль совпадения содержит в своем составе восьмиразрядный компаратор, который непрерывно сравнивает содержимое регистра TCNT0
16

с содержимым каждого из двух регистров совпадения (OCR0A или
OCR0B). Всякий раз, когда содержимое TCNT0 при сравнении совпадает
с содержимым OCR0A или OCR0B, компаратор вырабатывает сигнал совпадения. В следующем тактовом цикле этот сигнал устанавливает соответствующий флаг совпадения (OCF0A или ОCF0B).
С помощью регистра маски прерываний таймера TIMSK прерывание
для любого устройства может быть замаскировано. Если для этого
устройства прерывание индивидуально разрешено, установка флага совпадения вызывает прерывание. Флаг совпадения автоматически сбрасывается при запуске процедуры обработки прерывания. Флаг может быть
очищен путем записи в него логической единицы. На рис. 1.5 показана
блок-схема модуля совпадения.
Рис. 1.5. Блок-схема модуля совпадения
17

Таймер успешно используется для оценки временных интервалов. Для этого в ходе выполнения программы в регистр TCNT заносится исходное значение. После этого таймер запускается с требуемым
входным тактом. Программа ожидает появления в регистре TIFR флага переполнения TOV, указывающего на то, что требуемое время истекло [1].
Все микроконтроллеры семейства Mega имеют в своем составе сторожевой таймер, который является обязательным атрибутом всех современных микроконтроллеров. Этот таймер позволяет предотвратить зацикливание программы, возникающее по тем или иным причинам.
Установка режима работы таймера/счетчика ТС0 (ТС2) определяется
состоянием разрядов WGMnl: WGMn0 регистра TCCR0 (TCCR2). Режимы
работы таймеров от состояния этих разрядов показаны в табл. 1.2.
Таблица 1.2
Режимы работы таймеров/счетчиков ТС0 и ТС2
Номер
режима
0 0 0 Normal
1 0 1 Phase correct PWM
2 1 0 СТС (сброс при совпадении)
3 1 1 Fast PWM
Примечание: п = 0 или 2.
WGMul
(CTCn)
WGMiiO
Режим работы таймера/счетчика Тл
(PWMn)
Режим Normal – это самый простой режим работы таймеров/счетчиков. В таймере/счетчике ТС0 моделей ATmega8x и ATmega163x это вообще единственный режим. Счетный регистр в этом режиме функционирует как простой суммирующий счетчик. При поступлении на вход каждого тактового импульса в счетчике происходит накопление итогового
18

значения, т. е. содержимое счетчика только увеличивается, и принудительный сброс при совпадении не выполняется. При достижении максимального значения $FF возникает переполнение, а счет продолжается со
значения $00.
В режиме СТС (сброс при совпадении) счетный регистр также функ-
ционирует как обычный суммирующий счетчик, итоговый результат которого подсчитывается по приходу каждого тактового импульса. Однако
максимально возможное значение счетного регистра и, следовательно,
разрешающая способность счетчика определяются регистром совпадения
OCR0А (OCR2А).
В режиме СТС счетчик сбрасывается в ноль при совпадении содер-
жимого счетного регистра (TCNT0) и регистра OCR0A.
Таким образом, регистр OСR0A определяет максимальное значение
для счетчика и его коэффициент пересчета.
Этот режим позволяет контролировать частоту сигнала на выходе модуля. Упрощается также и подсчет внешних событий. Значение счетного
регистра (TCNT0) увеличивается до момента, пока не происходит совпадения между TCNT0 и OCR0A, и затем содержимое счетчика (TCNT0)
очищается.
Прерывание может вызываться каждый раз, когда счетчик достигает
значения ТОР. При этом используется флаг OCF0A. Если прерывание разрешено, вызывается процедура обработки прерывания, которая может использоваться для того, чтобы обновить значение ТОР.
Микроконтроллеры ATmega8 имеют в своем составе три таймера/
счетчика общего назначения – два 8-разрядных и один 16-разрядный.
Любой таймер – это счетчик, однако в режиме таймера его счетный
вход подключен к генератору импульсов, который формирует импульсы
через равные промежутки времени, а в режиме счетчика он подсчитывает
импульсы, поступающие на его счетный вход.
19

Как отмечалось выше, каждый таймер микроконтроллера ATmega8
может работать в различных режимах:
а) в режиме счетчика внешних сигналов;
б) в режиме обычного таймера (задержка времени на включение);
в) в режиме ШИМ.
Для каждого таймера существует ряд регистров, которые и управляют
состоянием таймеров.
Рассмотрим теперь таймер/счетчик ТС1.
Шестнадцатиразрядный таймер/счетчик ТС1 входит в состав всех моделей микроконтроллеров семейства Mega. Как и таймеры/счетчики ТС0
и ТС2, он имеет возможности: формирования временных интервалов, подсчета числа внешних событий и генерации сигналов с ШИМ. В составе
каждого таймера/счетчика ТС1 присутствуют следующие регистры ввода/вывода [1]:
• 16-разрядный счетный регистр TCNT1;
• 16-разрядный регистр захвата ICR1;
• два 16-разрядных регистра сравнения OCR1A, OCR1B;
• два 8-разрядных регистра управления TCCR1A, TCCR1B.
Каждый из 16-разрядных регистров физически размещается в двух
регистрах ввода/вывода, названия которых получаются добавлением к названию регистра буквы «Н» (старший байт) и «L» (младший байт). Счетный регистр таймера/счетчика TCNT1, например, размещается в регистрах
TCNT1H:TCNT1L.
Таймер/счетчик ТС1 может генерировать прерывание при наступлении следующих событий:
• при переполнении счетного регистра;
• при равенстве счетного регистра и регистра сравнения (по одному
прерыванию на каждый блок сравнения);
• при сохранении счетного регистра в регистре захвата.
20
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
