Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование микроконтроллеров AVR. Учебное пособие.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
Функция вывода данных на ЖК-дисплей: 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]