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

Функция вывода данных на ЖК-дисплей:
void lcd_outp ut (void)
{
sprintf(str1,"U=%. 1f" , resultData.U);
sprintf(str2,"I=%.3f", resultData.I);
lcd_clear();
// Вывод
lcd_gotoxy(0, 0);
lcd_puts(str1);
}
Функция-обработчик прерывания таймера/счетчика ТС1:
interrupt [TIM 1_OVF] void timer1_ovf_isr(void)
{
// начало следующего преобразования АЦП
ADCSRA|=(1<<ADSC);
}
Функция-обработчик прерывания по завершению преобразования АЦП:
interrupt [AD C_INT] void adc_isr(void)
{
// считывание данных из регистра результата АЦП ADCH
adc_data=ADCH;
// вывод информации на ЖК-дисплей
lcd_output();
}
// мультиплексирование каналов
// увеличиваем номер канала на 1 и проверяем его значение
if (++chIndex > 1) c hI ndex=0;
ADMUX=ADC_VREF_TYPE + chIndex; // выбираем следующий
вход АЦП
41

// задержка на стабилизацию сигнала на входе АЦП
delay_us(10);
// начинаем следующее преобразование
ADCSRA|=0x40;
}
Основная функция подпрограммы:
void main(void)
{
// инициализация портов ввода/вывода
// инициализация таймеров-счетчиков
// инициализация АЦП
// выбор частоты работы АЦП: 125 kHz
// выбор источника опорного напряжения АЦП: контакт AREF
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0b11001101;
// инициализация ЖК-дисплея
lcd_init(16);
// глобальное разрешение прерываний
#asm("sei")
// основной цикл (бесконечный)
while (1) {
}
}
Программы обычно начинаются с отработки директив препроцессора (начинаются с символа “#”), которые, по сути, не являются конструкци-
ями языка С и обрабатываются до фактической компиляции программы.
Их смысл – начальная подстановка некоторого кода в программу.
42

Препроцессор – это особая программа, которая выполняет предвари-
тельную обработку данных до начала компиляции. Так, к примеру, очень
часто используется директива #include, которая включает в код программы
код внешнего заголовочного файла. Заголовочные файлы содержат определения глобальных типов, констант, переменных и функций.
Директива #define указывает препроцессору на необходимость вы-
полнить подстановку (замену) в тексте программы определенной последовательности символов другой последовательностью:
#define заменяемая_последовательность фрагмент_подстановки
Программа на С начинает работу с функции main(). По необходимо-
сти из main() вызываются другие функции программы, которые по завер-
шении работы снова возвращаются в функцию main() в то место, откуда
были вызваны ранее.
43

3. СОЗДАНИЕ ПРОЕКТА С ИСПОЛЬЗОВАНИЕМ МАСТЕРА-ПОСТРОИТЕЛЯ
Для создания программ на языке С выберем, например, программную
среду Code Vision AVR [4]. Программа Code Vision AVR фирмы HP
InfoTech – это интегрированная среда разработки, содержащая компилятор языка С, графическую оболочку, автоматический генератор программ
и встроенный программатор, ориентированные на работу с семейством
микроконтроллеров AVR. Наряду со стандартными библиотеками языка С
и системой справок по языку компилятор имеет библиотеки для работы
с периферийными устройствами (ЖКИ-индикаторами с встроенными контроллерами, датчиками температуры, часами реального времени, энергонезависимой памятью EEPROM, шиной SPI и др.). Среда Code Vision
AVR не имеет своего отладчика, но позволяет отлаживать программы, используя возможности системы AVR Studio. Отличительной особенностью
системы Code Vision AVR является наличие мастера-построителя программы, который существенно облегчает работу начинающему программисту. Он избавляет от необходимости листать справочник и выискивать
информацию о том, какой регистр за что отвечает и какие коды нужно
в него записать. Результат работы мастера – это заготовка будущей программы, в которую включены все команды предварительной настройки,
а также заготовки всех процедур языка С. Поэтому сначала необходимо
научиться работать с мастером, создать заготовку программы на языке С,
а затем разобрать подробнее все ее элементы и уже после этого создать из
заготовки рабочую программу [4].
Программа Code Vision AVR, как и любая современная среда программирования, работает не просто с текстом программы, а с так называемым «Проектом».
Проект, кроме текста программы, содержит ряд вспомогательных
файлов, включающих в себя дополнительную информацию, такую как тип
используемого процессора, тактовую частоту кварцевого резонатора
44

и т. п. Эта информация необходима в процессе трансляции и отладки программ. За исключением текста программы, все остальные файлы проекта
создаются и изменяются автоматически.
После того как программная среда Code Vision AVR установлена на
компьютер, можно создавать новый проект. Задача программиста – лишь
написать текст программы, для которого в проекте отводится отдельный
файл с расширением «.с».
3.1. ВЫБОР ОБЩИХ ПАРАМЕТРОВ ПРОЕКТА
Рассмотрим процесс создания в программной среде Code Vision AVR
нового проекта при помощи мастера-построителя Code Wizard AVR [4].
Для этого необходимо выбрать в меню File пункт New. Откроется не-
большой диалог, в котором нужно определиться с выбором источника создаваемого файла. Предлагаются следующие варианты:
− Source (Исходный текст программы);
− Project (Проект).
Выбираем Project и нажимаем Ок. Появляется окно с вопросом You
are about to create a new project. Do you want to use the Code Wizard
AVR?. В переводе это означает: «Вы создаете новый проект. Будете ли вы
использовать построитель Code Wizard AVR?». Ранее было оговорено, что
будем, поэтому выбираем Yes, после чего открывается окно мастерапостроителя (рис. 3.1). Это окно имеет множество вкладок, каждая из которых содержит элементы выбора режимов.
Имеющиеся в наборе вкладок элементы позволяют настроить параметры создаваемой заготовки программы. Сразу после запуска мастера
все параметры принимают значения по умолчанию (все внутренние устройства выключены, все порты ввода-вывода настроены на ввод, а внутренние нагрузочные резисторы отключены). Эти установки соответствуют
начальному состоянию микроконтроллера после системного сброса.
45

В данном окне мастера выберем необходимые для работы параметры,
а те, которые не нужны, использовать пока не будем (оставим значения по
умолчанию).
На первой вкладке (рис. 3.2) с именем Chip можно выбрать общие
параметры проекта. Используя список Chip, устанавливаем тип микроконтроллера, например, ATmega8. При помощи поля Clock выбираем частоту кварцевого резонатора. В данном случае она равна 4 МГц.
Рис. 3.1. Окно мастера-построителя
Code Wizard AVR
Рис. 3.2. Выбор
частоты
Без изменений оставим флажок Ch eck Reset Sou rce (Проверка источника сигнала сброса). Включение данного флажка добавляет к создаваемой программе процедуру, связанную с определением источника сигнала
системного сброса.
46

3.1.1. Настройка портов
Закончив с общими настройками, перейдем к вкладке (Ports). Эта
вкладка позволяет настроить все имеющиеся порты ввода-вывода. На
вкладке Ports присутствуют еще несколько вкладок в зависимости от количества портов в микроконтроллере (рис. 3.3).
Рис. 3.3. Настройка порта РВ
Сначала выбираем вкладку Port В, где видим два столбца с парамет-
рами. Столбец Data direction (Направление передачи данных) позволяет
настроить каждую линию порта либо на ввод, либо на вывод. По умолчанию параметр каждого разряда имеет значение In (вход) для того, чтобы
поменять значение разряда, достаточно щелкнуть один раз мышью по полю с надписью In и параметр сменится на Out. Повторный щелчок заставит вернуться к In. Каждое поле столбца Data direct ion определяет, какое
значение будет присвоено соответствующему разряду регистра направления передачи DDRB в будущей программе. Если порт PВ микроконтроллера должен работать на ввод, то состояние элементов первого столбца
не меняется.
Второй столбец на той же вкладке называется Pullup / Output Value
(Включение подтяжки / Выходное значение). Этот столбец определяет,
47

требуется ли установка подтягивающего резистора (подтяжки) на входе
порта PD
регистра данных порта или нет. Так как порт PB работает в режиме ввода,
элементы в столбце Pullup / Output Value могут принимать значение Т
или Р. По умолчанию этот параметр имеет значение Т.
Т (Terminate) означает отсутствие подтяжки, а Р (Pull-up) – подтяжка
включена.
Если на вводе в микроконтроллер присутствует коммутационное
устройство (кнопка, переключатель, электромеханический контактор), то
для каждого из таких входов требуется обязательно включать внутренние
нагрузочные (подтягивающие) резисторы установкой значения Р.
Включим подтяжку для выбранных разрядов порта PВ, изменив при
помощи мыши значение поля вкладки с Т на Р. В результате элементы
управления будут выглядеть так, как показано на рис. 3.3.
Если порт PС в работе не участвует, его не программируем.
Теперь перейдем к настройке порта РD, который работает на вывод.
На его вкладке увидим такие же органы управления, как на вкладке Port В
(рис. 3.4).
Поменяем в столбце Data direction
для каждого разряда значение In на Out
(Выход). Содержимое регистра данных
порта РD определяет выходное значение
всех разрядов порта. По умолчанию все
они имеют значение «0». Если по условиям поставленной задачи они должны
быть равны единице, изменим нули на
единицы, например, в четырех разрядах.
Рис. 3.4. Настройка
Для этого достаточно простого щелчка
мыши. В результате всех операций
вкладка Port D будет выглядеть так, как это показано на рис. 3.4.
48

3.1.2. Настройка таймеров
Теперь перейдем к настройке таймеров. Для этого надо сначала открыть
вкладку Timers, в которой увидим еще три вкладки (рис. 3.5). Эти вкладки
предназначены для настройки двух системных таймеров (Timer0 и Timerl), а также охранного таймера (Watchdog). Открываем
вкладку Timer0, как показано на рис. 3.5. При
помощи расположенных там элементов управления выставляем следующие настройки.
• Поле Clock Source (Источник Такто-
вого Сигнала) оставляем в положении
SystemClock (Тактовый сигнал от системного генератора).
• В поле Clock Value (Значение тактовой
частоты) установим значение 500 кГц. Для
этого сначала выбирается коэффициент де-
Рис. 3.5. Настройка
ления предварительного делителя, который
таймера ТС0
для данного случая равен 8. Во вкладке вместо коэффициента деления показаны получаемые при этом частоты сигнала. Их значения вычисляются исходя из выбранной частоты тактового генератора (см. вкладку Chip), которая равна 4 МГц.
• Если планируется работа таймера в режиме OVERFLOW, то в пу-
стом квадрате с названием Overflow Interrupt нужно установить отметку
для разрешения этого вида прерывания от таймера.
• Поле Timer Value предназначено для задания начального значения
кода реинициализации, который должен быть записан в шестнадцатеричном формате. После установки этого кода в окне Timer Period появляется
численное значение интервала времени, на которое программируется данный таймер. По этим результатам можно удостовериться в верности расчетов при его программировании.
49

На этом настройка таймера ТС0 завершается.
Теперь перейдем к настройке таймера
ТС1. Открываем вкладку Timer1, как показано на рис. 3.6. При помощи расположенных там элементов управления выставляем следующие настройки.
• Поле Clock Source (Источник такто-
вого Сигнала) оставляем в положении
SystemClock (Тактовый сигнал от систем-
ного генератора).
• В поле Clock Value (Значение такто-
вой частоты) выберем значение 62,500 кГц.
В этом случае установлен расчетный коэффициент деления предварительного делителя, равный 64.
Рис. 3.6. Настройка
таймера ТС1
• Если планируется работа таймера
в режиме совпадения в поле Mode, нужно
выбрать режим работы таймера СТС top =
OCR1A (режим сброса при совпадении с регистром OCR1A). Два поля
Out. А и Out. В оставляем без изменений. При помощи этих полей можно
включить и настроить параметры вывода сигнала совпадения на внешние
контакты микроконтроллера. В данном случае это не требуется.
• Поле Input Capture (Вход Захвата) используется при работе в ре-
жиме захвата. Указанный режим в данном случае не задействован, значит,
и это поле тоже оставим без изменения или применим режим Nois e Can cel
(Подавление шума).
• Поле Interrupt on (Прерывание от) требуется обязательно изменить.
Это поле предназначено для разрешения или запрета различных видов
прерываний от таймера. В правой части поля имеются две кнопки, при
помощи которых можно листать его содержимое. В процессе перелисты-
50
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
