Некоммерческое акционерное общество
АЛМАТИНСКИЙ УНИВЕРСИТЕТ ЭНЕРГЕТИКИ И СВЯЗИ
Кафедра электроники
МИКРОКОНТРОЛЛЕРЫ
Методические
указания по выполнению лабораторных работ
для студентов специальности 5В071600 – Приборостроение
Алматы 2014
СОСТАВИТЕЛИ: Б.С. Байкенов, К.О. Амантаев. Микроконтроллеры. Методические указания по выполнению лабораторных работ для студентов специальности 5В071600 – Приборостроение. – Алматы: АУЭС, 2014. – 35 с.
В методической разработке приводятся краткие сведения об архитектуре микроконтроллера ATMega8535 семейства AVR фирмы Atmel, динамических характеристиках и функциональных возможностях. Среда программирования AVR STUDIO, используемая в указаниях, позволяет пользователю разрабатывать, отлаживать и прошивать в память контроллера программу в ассемблере и Си. Приведены схемные и программные решения, касающихся взаимодействия AVR-микроконтроллеров с популярной периферией и реализации типовых интерфейсов. Рассмотрены примеры программной реализации различных функций: внутренней и внешней EEPROM-памяти данных, аналого-цифрового преобразования, цифровое управление двигателем с помощью ШИМ-модулятора, работу таймер-счетчиков и семисегментных индикаторов в различных режимах.
Методическая разработка составлена в целях закрепления лекционного материала и предназначена для всех форм обучения специальности 5В071600 – Приборостроение.
Ил. 14, табл. 7, библиогр. – 6 назв.
Рецензент: доц. кафедры радиотехники А.А. Куликов
Печатается по плану издания некоммерческого акционерного общества «Алматинский университет энергетики и связи» на 2014 г.
© НАО «Алматинский университет энергетики и связи», 2014 г.
Введение
Целью методических указаний является закрепление теоретических знаний по разработке микропроцессорных систем управления и приобретение практических навыков программирования на ассемблере и Си микроконтроллера ATMega8535 фирмы Atmel.
Система команд и архитектура ядра АVR разрабатывались совместно с фирмой-разработчиком компиляторов с языков программирования высокого уровня IAR Systems. В результате появилась возможность разрабатывать АVR-программы на языке Си намного быстрее и короче по сравнению с программами, написанными на языке ассемблера.
В микроконтроллерах серии АVR большинство команд выполняется за один такт, в то время как микроконтроллеры семейства РIC выполняют команду за 4 такта.
Однако, при этом увеличилось количество команд: почти для каждого способа адресации существует своя команда, к тому же иногда с ограниченной областью действия.
Наличие 32 оперативных регистров, позволяет в ряде случаев вообще не обращаться к оперативной памяти и не использовать стек. Использование языка Си фактически уравнивает разные архитектуры микроконтроллеров с точки зрения особенностей программирования.
Микроконтроллеры серии АVR отличаются универсальностью устройства, преемственностью структуры для различных типов контроллеров, несложностью схемотехники и процесса «прошивки» программ в микросхему.
1 Лабораторная работа № 1. Среда программирования AVR STUDIO
Цель работы: ознакомиться с программной средой программирования и отладки микроконтроллеров фирмы Atmel AVR Studio.
1.1 Краткие сведения
В состав лабораторного стенда входит 8-разрядный микроконтроллер AVR ATmega8535 и необходимые элементы для исследования его периферийных устройств и большинства функциональных возможностей (см. рисунок 1.1).
На лицевой панели модуля расположены:
- переключатель «Сеть» со светодиодом индикации наличия напряжения;
- мнемосхему микроконтроллера с клеммами, связанными с портами ввода/вывода микроконтроллера;
- переключатели S1-S8 с выходными клеммами для подачи логических сигналов на микроконтроллер;
- кнопки S9, S10 с выходными клеммами для подачи логических сигналов на микроконтроллер;
- потенциометр RP1 с выходной клеммой для подачи аналогового напряжения на микроконтроллер;
- мнемосхема генератора низкочастотного прямоугольного сигнала 50 Гц и клемма выхода генератора;
- светодиоды VD1 - VD8 с клеммами для их подключения к источнику напряжения (например, к микроконтроллеру);
- электродвигатель постоянного тока М с усилителем мощности и клеммой для подачи на него управляющего напряжения;
- 7-сегментный 4-х символьный индикатор с клеммами подачи напряжения на сегменты А, В, С, D, Е, F, G, Н, а также на общую точку каждого сегмента индикатора;
- 2 фильтра низкой частоты для фильтрации ШИМ-сигналов на выходе микроконтроллера.
С тыльной стороны модуля располагается разъем для подачи напряжения -220В 50 Гц, а также разъем для подключения модуля к ПК по интерфейсу USB.
Рисунок 1.1 - Внешний вид модуля «Микроконтроллер»
Таблица 1.1 - Краткая характеристика микроконтроллера ATmega8535
Параметр |
Значение |
Частота кварцевого резонатора |
8 МГц |
Напряжение электропитания |
2,7 - 5,5 В |
Объем внутренней Flash - памяти |
8 кБайт |
Объем энергонезависимой памяти |
512 Байт |
Объем внутренней ОЗУ |
512 Байт |
32 программируемых входа/выхода |
32 на 4 портах |
JTAG - интерфейс |
нет |
8-битные таймеры/счетчики с ШИМ |
2 шт. |
16-битный таймер/счетчик с ШИМ |
1 шт. |
10-разрядный аналогово-цифровой преобразователь |
есть |
Количество каналов АЦП |
8 |
Аналоговый компаратор |
есть |
Источники внешних прерываний |
3 шт. |
Универсальный приемопередатчик USART |
есть |
SPI -интерфейс |
есть |
TWI -интерфейс |
есть |
К наиболее популярным методам написания программ относятся:
а) в машинном коде микроконтроллера.
Программы являются наиболее быстродействующими, однако для их написания требуется высокая квалификация программиста и глубокое знание архитектуры процессора;
б) в ассемблере.
Написание программ на ассемблере также требует высокой квалификации программиста. Следует отметить, что язык ассемблера обычно жестко привязан к конкретному типу микропроцессора и может существенно отличаться для разных микропроцессоров одного производителя;
в) на языке высокого уровня (например, Си).
Такие программы обычно являются кросс-платформенными, т.е. практически не отличаются по синтаксису для микропроцессоров разных типов. Пользователь пишет программу на языке высокого уровня, а компилятор преобразует ее на ассемблер и машинный код конкретного микропроцессора.
1.1.1 Создание проекта в среде AVR Studio.
Для программирования на ассемблере используется программное обеспечение AVR Studio v4. Для написания программы необходимо создать проект.
1. Запустить программу AVR Studio. Ярлык для запуска программы находится на рабочем столе или в меню «Пуск» Windows. В появившемся окне приветствия программы будет предложено создать новый проект или открыть существующий.
2. При выборе нового проекта появляется окно, в
котором предлагается выбрать язык программы - Atmel Avr Assembler или Avr GCC (см.
рисунок 1.2). Здесь необходимо выбрать Atmel Avr Assembler, указать имя проекта
и имя
инициализационного файла с расширением *.asm. Рекомендуется, чтобы имя
проекта и инициализационного файла совпадали. Очень важно не допускать в
имени файла, проекта или пути кириллические символы. После этого следует нажать
кнопку «Next».
Рисунок 1.2 - Выбор языка программы
3. После выбора языка программы и имени проекта
появляется окно выбора
платформы (Debug platform) и устройства (Device). Здесь необходимо выбрать AVR Simulator
и процессор ATmega8535, который используется в работе. После этого следует
нажать кнопку «Finish».
4. При нажатии на кнопку «Finish» в программе открываются несколько областей (см. рисунок 1.3).
Рисунок 1.3 - Рабочее окно программы AVR Studio
Это:
-окно «1» проекта «Project». Здесь отображается структура проекта, которая содержит его имя и список подключенных файлов и библиотек;
- центральная рабочая область, в которой осуществляется непосредственно набор программы (окно «2»);
- окно текущих сообщений «built» программы (окно «3»);
- окно регистров микроконтроллера «I/O View» (окно «4»).
1.2 Порядок выполнения работы
1. Требуется набрать программу, осуществляющую вывод числа 01010101 или 10101010 на PORTC микроконтроллера, в зависимости от состояния сигнала на входе PORTB0.
Листинг программы для ATmega8535 имеет вид:
;Входы: PORTB0
;Выходы: PORTC0...PORTC7
.include "m8535def.inc" ;подключение стандартной библиотеки ATmega8535
.cseg ;начало сегмента кода
.org 0
reset:
ldi r16,0xFF
out DDRC,r16 ;назначение PORTC на вывод
clr r16
out DDRB,r16 ;назначение PORTB на ввод
main:
sbis PINB,0 ;если на PINB0 – логический «0», то
rjmp PINB0_is_0 ;переход на "PINB0_is_0"
ldi r16,0xAA ;иначе вывод на PORTC
out PORTC,r16 ;числа 0xAA (1010 1010)
rjmp main ;далее – возврат на main
PINB0_is_0: ;если на PINB0 – логический "0", то
ldi r16,0x55 ;вывод на PORTC
out PORTC,r16 ;числа 0x55 (0101 0101)
rjmp main ;далее – возврат на main
После набора программы необходимо произвести ее ассемблирование, то есть сборку, при которой ассемблер производит проверку синтаксиса написанной программы и при отсутствии ошибок преобразует код ассемблера в машинный код микропроцессора. При этом формируется файл с расширением *.hex, который далее записывается в микроконтроллер.
Для ассемблирования написанной программы необходимо нажать кнопку F7 «Assemble». При отсутствии ошибок в окне текущих сообщений «built» AVR Studio отображается сообщение об успешном завершении операции, а при наличии ошибок выводится их список и положение в тексте программы.
2. Отладить программу в симуляторе.
В программное обеспечение AVR Studio встроен симулятор микроконтроллеров, с помощью которого можно отладить программу, найти ошибки и исправить неточности в алгоритме, не осуществляя непосредственно программирования микросхемы контроллера. Также симулятор может быть полезен при написании программ в домашних условиях.
Симулятор AVR Studio осуществляет симуляцию микроконтроллера, его портов, таймеров, АЦП, прерываний и т.д. Поскольку симулятор работает с hex-файлом проекта, то для запуска эмулятора необходимо написать программу и исключить из нее явные ошибки, с которыми создание hex-файла невозможно.
Для отладки программы в симуляторе необходимо после ее написания нажать сочетание клавиш Ctrl+F7 «Assemble and Run», после чего будет произведено ассемблирование программы и запуск эмулятора.
После успешной компиляции начало программы будет отмечено желтой стрелкой. Для управления процессами отладки программы в строке меню AVR Studio располагается меню «debug», а также панель функциональных кнопок управления симулятором.
Таблица 1.2 - Назначение кнопок управления эмулятором
Название |
Сочетание клавиш |
Назначение |
Start Debugging (начать отладку) |
Ctrl+Shift+Alt+F5 |
Начать процесс отладки программы в эмуляторе |
Stop Debugging (остановить отладку) |
Ctrl+Shift+F5 |
Остановить процесс отладки программы в эмуляторе |
Run (запуск эмуляции) |
F5 |
Эмулятор запускается и циклически производит эмуляцию программы без отображения текущих изменений регистров контроллера на экране |
Break (приостановить эмуляцию) |
Ctrl+F5 |
Команда временно приостанавливает эмулятор без потери данных |
Reset (остановить эмуляцию) |
Shift+F5 |
Команда останавливает эмулятор с потерей данных эмуляции |
Step into (сделать шаг вперед) |
F11 |
Команда извлекает только одну инструкцию. |
Auto Step (авто выполнение) |
Alt+F5 |
Команда выполняет эмуляцию в пошаговом автоматическом режиме. |
Toggle breakpoint (точка остановки) |
F9 |
Команда добавляет точку остановки, в которой программа будет приостановлена. |
Remove all program breakpoints |
- |
Команда удаляет все активные точки остановки программы. |
При симуляции программы рекомендуется выполнять пошаговое выполнение инструкций, пользуясь командой Step into (см. таблицу 1.2). При этом необходимо контролировать содержимое регистров микроконтроллера, а также портов ввода/вывода.
Контроль состояния регистров и отдельных устройств микроконтроллера осуществляется в окне «4» (см. рисунок 1.4). Каждое устройство можно развернуть и увидеть содержимое его регистров управления и контроля (см. рисунок 1.6).
3. Запись программы в микроконтроллер
Для этого необходимо:
- включить переключатель «Сеть» модуля «Микроконтроллер» для подачи на него напряжения питания;
- в меню «Tools» AVR Studio выбрать пункт «Program AVR», в котором указать способ соединения «Connect».
В появившемся окне Select AVR Programmer выделить:
- тип программатора STK500;
- отметить тот СОМ port, который присвоил диспетчер ПК;
- нажать на верхнюю кнопку Connect, после чего происходит подключение микроконтроллера к среде AVR-Studio и появляется окно программирования контроллера;
- в окне программирования необходимо выбрать вкладку main, в которой необходимо выставить в окне Device and Signature Bytes - ATmega8535;
- перейти на вкладку «Program», в которой выбрать графу «Flash».
В этой графе требуется указать путь к .hex файлу проекта, затем произвести запись программы в микроконтроллер нажатием кнопки «Program».
1.3 Содержание отчета
Цель работы.
Листинг программы.
Выводы.
1.4 Контрольные вопросы
1) Как создается проект в среде AVR Studio?
2) Где осуществляется набор программы?
3) Как осуществляется проверка синтаксиса программы?
4) Какое основное назначение симулятора AVR?
5) Как получить hex-файл?
6) Как осуществляется запись hex-файла в микроконтроллер?
2 Лабораторная работа № 2. Стек и программная задержка времени
Цель работы: освоить теоретический и практический материал по использованию стека, приобретение практических навыков написания программ с задержкой времени.
2.1 Краткие сведения. Указатель стека
Указатель стека - это специальный регистр, представляющий собой буфер, в котором реализован принцип «Last In - First Out» LIFO (последним пришел -первым выйдешь). Стек реализован в двух 8-разрядных регистрах SPH, SPL.
Адрес вершины стека пользователь обязан указать самостоятельно, при этом общепринято, что вершина стека находится в конце ОЗУ процессора. Это делается для того, чтобы область программы случайно не перекрылась с областью стека, так как если это произойдет, то адрес возврата, записанный в область стека, будет потерян.
Возможен случай, когда при выполнении подпрограммы происходит запрос на следующий переход на другую подпрограмму (см. рисунок 2.1).
Когда происходит переход из основной программы в подпрограмму 1, в вершину стека записывается адрес возврата 007. Если далее из подпрограммы 1 происходит переход в подпрограмму 2, то в стек записывается адрес 245 возврата в подпрограмму 1.
При окончании подпрограммы 2 первым будет прочитан адрес 245, а затем при окончании подпрограммы 1 - адрес 007.
При вызове директивы rcall в регистр SPH:SPL записывается адрес ячейки памяти, в которую будет сохранен адрес возврата из подпрограммы, и адрес возврата автоматически записывается в стек, а при вызове директивы ret происходит чтение из стека по указанному в регистре SPH:SPL адресу.
Рисунок 2.1 - Принцип заполнения стека
Одним из наиболее наглядных применений указателя стека является реализация программной задержки времени.
Суть программной задержки состоит в том, чтобы заставить процессор выполнять циклически одно и то же действие, например, инкремент какого-либо числа от нуля до максимума, с дальнейшим переходом при окончании выполнения этого действия к дальнейшему выполнению программы.
Рассчитаем примерное время программной задержки, реализованной следующим способом:
clr г1б
met_1:
inc rl6
cpi rl6,0xFF
brne met_l
Значение регистра РОН г16 увеличивается на 1, пока значение в г16 не достигнет значения 0xFF или 255. При этом постоянно идет возврат на метку met_l, и только после того, как значение, записанное в г 16, достигает значения 0xFF (или 255), разрешается выполнение последующих команд программы. Таким образом, программа как бы «зависает» на некоторое время. Это «зависание» и является программной задержкой.
Зная время выполнения команд можно рассчитать время данной программной задержки. Примененные команды имеют следующее время расчета:
- clr г1б: 1 такт процессора
- inc г1б: 1 такт процессора
- cpi rl6,0xFF: 1 такт процессора
- brne met_l: 1 такт процессора, если условие не выполняется и 2 такта процессора, если условие выполняется.
При попадании в цикл суммарное количество тактов процессора будет N=4, то есть при подсчете чисел от 1 до 255 суммарное количество тактов будет равняться N=4х255=1020 циклов. После этого необходимо вычесть один цикл, который остался неучтенным при выполнении ложного условия brne met_i в конце подсчета г16 и прибавить один такт на выполнение команды clr г 16. Итого, суммарное количество тактов N=4х255-1+1=1020 циклов.
Если умножить полученное число на время выполнения одного такта процессора, которое обратно частоте колебаний кварцевого резонатора (fosc = 8 МГц), то время задержки будет равно:
Для реализации более существенных временных задержек приходится иметь дело с большими числами или вложенными циклами. Пример программной задержки с применением вложенных циклов приведен ниже.
Пример. Написать программу бегущего огня на PORTC. При этом время задержки между переключениями разрядов порта задается с помощью программной задержки.
.include"m8535def.inc" ; стандартная библиотека Atmega 8535
.cseg ; начало сегмента кода
. org 0
ldi г1б, low (RAMEND) ; размещение вершины стека по адресу
ldi rl7,high(RAMEND) ; старшей ячейки ОЗУ
out spl,rl6
out sph,rl7
ldi rl6,0xFF ; инициализация портов ввода/вывода
out DDRC,rl6 ; PORTC - на вывод
ldi rl6,0x01 ; занесение в POH r16 числа 1
main: ; начало главной программы
out PORTC,г16 ; вывод на PORTC значения г16
in rl7,SREG ; сохранение регистра SREG
rcall delay ; вызов подпрограммы задержки
out SREG,rl7 ; восстановление SREG после возврата из delay
rol г16 ; цикличный сдвиг r16 влево
rjmp main ; возврат на main
delay: ; подпрограмма №1
clr г18 ; очистка регистра г18
met1:
rcall delayl ; переход на delayl
inc г18 ; инкремент г18
cpi r18,0x0F ; сравнение значения г18 с числом 15
brne metl ; если значение в г18≠5, то переход на metl
ret ; иначе - возврат в основную программу
delay1: ; подпрограмма №2
clr г19 ; очистка регистра г19
met 2:
rcall delay2 ;переход на delay2
inc r19 ; инкремент г19
cpi r19,0xFF ;сравнение значения г19 с числом 255
brne met2 ; если значение в г19≠255, то переход на met2
ret ; иначе - возврат в подпрограмму №1
delay2: ; подпрограмма №3
clr г20 ; очистка регистра г20
met3:
inc г20 ; инкремент г20
cpi r20,0xFF ; сравнение значения г20 с числом 255
brne met3 ; если значение в г20≠255, то переход на met3
ret ; иначе - возврат в подпрограмму №2
При входе в первый цикл, ограниченный меткой met1 и условием brne met1, перед инкрементом регистра г18 происходит вызов подпрограммы delay1, в которой данная операция повторяется и осуществляется переход на подпрограмму delay2. Таким образом, сначала происходит выполнение цикла подпрограммы delay2, потом - инкремент г19 в подпрограмме deiay1, после чего снова осуществляется переход на delay2, и т.д.
2.2 Дисассемблирование программы
Дисассемблирование программы выполняется выбором в меню «View» AVR STUDIO пункта disassembler. В этом случае на экране появляется программа, в которой указывается адрес каждой команды и необходимая служебная информация.
Одновременно на экран необходимо вывести окно контроля содержимого памяти Toggle memory window (для вызова набрать комбинацию Alt+0), в котором необходимо выбрать память данных (Data). В конце области этой памяти будет располагаться указатель стека.
2.3 Содержание отчета
Цель работы.
Написать и отладить собственную программу задержки.
Привести таблицы дисассемблера и содержимого стека.
Выводы.
2.4 Контрольные вопросы
1) Что называется стеком?
2) Какое его основное назначение и принцип заполнения?
3) Какую функцию выполняет указатель стека?
4) В каких командах используется стек?
5) Какая глубина вложения подпрограмм?
6) К какому виду памяти относится стек?
7) В каких случаях необходимо использовать дисассемблер?
3 Лабораторная работа №3. Таймеры Т0/Т2. Режим широтно-импульсной модуляции
Цель работы: освоить теоретический и практический материал по работе 8-разрядных таймеров микроконтроллера Atmega8535 в режиме широтно-импульсной модуляции.
3.1 Краткие сведения из теории
3.1.1 ШИМ-режим.
Таймеры/счетчики могут работать как в режиме подсчета временных интервалов, так и в режиме широтно-импульсной модуляции (ШИМ).
Широтно-импульсной модуляцией называется формирование среднего значения сигнала с помощью сигналов логического «0» и логической «1» за период модуляции Т (см. рисунок 3.1).
Рисунок 3.1 - Принцип широтно-импульсной модуляции сигнала
ШИМ дает возможность с помощью логических сигналов получать на выходе микроконтроллера аналоговый сигнал, который можно изменять от 0 до 1. Значение этого сигнала можно рассчитать по следующей формуле:
Каждый таймер микроконтроллера Atmega 8535 имеет выводы, которые подключаются к портам ввода/вывода микроконтроллера и используются в качестве их альтернативной функции при работе таймеров в режиме ШИМ. Так, к выходу таймера Т0 подключен вывод РВЗ, а к выходу таймера Т2 подключен вывод PD7.
В микроконтроллере Atmega 8535 таймеры Т0 и Т2 работают в двух режимах широтно-импульсной модуляции: быстрый ШИМ и фазово-корректный ШИМ.
В режиме быстрого ШИМ счетный регистр TCNT0(2) таймера производит формирование пилообразной развертки (см. рисунок 3.2,а), инкрементируя свое значение по каждому импульсу с предделителя, который устанавливается в регистре управления TCCR0(2) таймера Т0 и Т2. При достижении счетным регистром значения 255 происходит его автоматическое обнуление.
Рисунок 3.2 - Принцип работы таймеров Т0 и Т2 в режиме «Быстрый ШИМ»
В регистрах сравнения OCR0(2) таймеров Т0 и Т2 может быть записано любое число от 0 до 255. С этим числом сравнивается значение счетного регистра TCNT0(2) и при их равенстве происходит переключение вывода таймера ОС0 или ОС2 в соответствии с настройками регистра управления TCCR0(2) таймера. В случае, если при совпадении TCNT0(2)=OCR0(2) вывод ОС0(2) таймера обнуляется, то ШИМ получается неинвертирующим (см. рисунок 3.2,б), а если при совпадении вывод устанавливается в состояние логической «1», то ШИМ - инвертирующий (см. рисунок 3.2, в).
В режиме фазово-корректного ШИМ счетный регистр TCNT0(2) формирует пилообразный сигнал развертки с нарастающим и спадающим фронтами. Сначала регистр инкрементирует свое значение от 0 до 255, а затем происходит его декремент от 255 до 0 (см. рисунок 3.3, а).
Если при превышении значения, содержащегося в счетном регистре TCNT0(2), значения, содержащегося в регистре сравнения OCR0(2) происходит обнуление вывода ОС0(2) таймера, то ШИМ является неинвертирующим (см. рисунок 3.3,б). В противном случае ШИМ - инвертирующий (см. рисунок 3.3, в).
Несмотря на то, что в режиме фазово-корректного ШИМ частота ШИМ-сигнала меньше, чем в режиме быстрого ШИМ, фазово-корректный ШИМ обладает большей разрешающей способностью и используется для достижения большей точности модуляции.
Рисунок 3.3 - Принцип работы таймеров Т0 и Т2 в режиме «Фазово-корректный ШИМ»
3.1.1.1 Регистры таймера Т0 в режиме ШИМ.
Режим широтно-импульсной модуляции, как и все остальные режимы работы таймера Т0, инициализируется в регистре управления TCCR0.
Таблица 3.1 - Регистр управления таймера Т0 TCCR0
бит |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
FOC0 |
WGM00 |
СОМ01 |
СОМ00 |
WGM01 |
CS02 |
CS01 |
CS00 |
За установку режима работы таймера отвечают биты WGM01:WGM00. При установке WGM01=0, WGM00=1 активируется режим фазово-корректного ШИМ, при установке WGM01=1, WGM00=1 активируется режим быстрого ШИМ.
При активации режима широтно-импульсной модуляции биты СОМ01 и СОМ00 определяют поведение вывода таймера Т0, в качестве которого выступает вывод РВЗ микроконтроллера. Поведение вывода в соответствии с этими битами представлено в таблице 3.2 и таблице 3.3.
Таблица 3.2 - Состояние вывода РВЗ (ОС0) таймера Т0 в режиме быстрого ШИМ
С0М01 |
С0М00 |
Описание |
0 |
0 |
Нормальная функция порта, вывод ОС0 отключен |
0 |
1 |
Комбинация бит зарезервирована |
1 |
0 |
Очистка ОС0 при совпадении. Неинвертирующий ШИМ |
1 |
1 |
Установка ОС0 при совпадении. Инвертирующий ШИМ |
Таблица 3.3 - Состояние вывода РВЗ (ОС0) таймера Т0 в режиме фазово-корректного ШИМ
СОМ01 |
СОМ00 |
Описание |
0 |
0 |
Нормальная функция порта, вывод ОС0 отключен |
0 |
1 |
Комбинация бит зарезервирована |
1 |
0 |
Очистка ОС0 при совпадении при счете. Неинвертирующий ШИМ |
1 |
1 |
Установка ОС0 при совпадении при счете. Инвертирующий ШИМ |
Частота ШИМ-сигнала устанавливается битами CS02...CS00. Эти биты определяют источник задания частоты и коэффициент делителя (см. таблицу 3.4).
Таблица 3.4 - Установка источника задания частоты
CS02 |
CS01 |
CS00 |
Описание |
0 |
0 |
0 |
Таймер остановлен |
0 |
0 |
1 |
Источник - генератор частоты процессора. (fто = fcLk/1) |
0 |
1 |
0 |
Источник - генератор частоты процессора. (fто = fcLk/8) |
0 |
1 |
1 |
Источник - генератор частоты процессора. (fто = fcLk/64) |
1 |
0 |
0 |
Источник - генератор частоты процессора. (fто = fcLk/256) |
1 |
0 |
1 |
Источник - генератор частоты процессора. (fто = fcLk/1024) |
1 |
1 |
0 |
Внешний сигнал на выводе Т0. Спадающий фронт сигнала. |
1 |
1 |
1 |
Внешний сигнал на выводе Т0. Нарастающий фронт сигнала. |
В соответствии с таблицей 3.4 частота ШИМ рассчитывается следующим образом:
- для режима быстрого ШИМ: f = fто/256;
- для режима фазово-корректного ШИМ: f= fто/512.
3.1.1.2 Регистры таймера Т2 в режиме ШИМ.
Режим широтно-импульсной модуляции, как и все остальные режимы работы таймера Т2, инициализируется в регистре управления TCCR2.
Описание и назначение управляющих бит регистра TCCR2 таймера Т2 аналогичны описанным битам регистра TCCR0 таймера Т0. Частота ШИМ-сигнала устанавливается битами CS22...CS20. Эти биты определяют источник задания частоты и коэффициент делителя.
Для запуска режима ШИМ на таймере Т0 или Т2 необходимо:
- остановить таймер обнулением регистра управления TCCR0(2);
- обнулить регистр сравнения OCR0(2) и счетный регистр TCNT0(2);
- установить в регистре управления TCCR0(2) режим ШИМ и выбрать частоту его работы.
3.2 Порядок выполнения работы
1. Разработать программу в соответствии с заданным алгоритмом, отладить в симуляторе и «прошить» в память микроконтроллера.
Таймер Т0 работает в режиме быстрого ШИМ. В зависимости от состояния битов PORTA регулируется яркость светодиода, подключенного к выходу ШИМ таймера Т0. Логическим сигналом PORTD0 ШИМ изменяется с инвертирующего на неинвертирующий.
; ШИМ на таймере Т0
; входы:
; PORTA0...PORTA7 - задание уставки таймера
; PORTD0 - инвертирующий (1)/неинвертирующий (0) ШИМ
; выходы:
; P0RTB3 - ШИМ на таймере Т0
.include"m8535def.inc" ;подключение стандартной библиотеки ATmega8535
.cseg ; начало сегмента кода
.org$0 ; по адресу 0
rjmp reset ; и переход на reset
reset:
cli ; запрет всех прерываний
ldi г16,low(RAMEND) ; запись в указатель стека адреса конца
ldi r17,high(RAMEND) ; памяти данных
out spl,r17
out sph,r17
ldi г16,0х01 ; инициализация портов ввода вывода.
out P0RTD,r16 ; PORTD0 - на ввод информации
clr r16
out DDRD,r16
ldi r16,0xFF
out P0RTA,r16 ; PORTA - на ввод информации
clr r16
out DDRA,r16
out P0RTB,r16
ldi r16,0x08
out DDRB,r16 ; P0RTB3 - на вывод информации
clr r16
out TCCR0,r16 ; сброс регистра управления таймера Т0
out OCR0,r16 ; сброс регистра сравнения таймера Т0
out TCNT0,r16 ;с брос регистра счета таймера Т0
ldi г16,0х69 , установка режима быстрого неинвертирующего
out TCCR0,r16 ; ШИМ таймера Т0
sei ; разрешение всех прерываний
main: ; начало основной программы
in r16,PINA ; считывание значений порта ввода/вывода PORTA
out OCR0,r16 ; и его отправка в регистр сравнения таймера ТО
in r16,PIND ; считывание значений порта ввода/вывода PORTD
andi г16,0х01 ; и выделение бита PORTD0
cpi г16,0х01 ; если PORTD0=l
breq met1 ; то переход на метку met1
ldi г17,0х69 ; иначе запись в г17 значения для неинвертирующего ШИМ
rjmp met2 ; и переход на метку met2
met1: ; по метке met1
ldi r17,0x79 ; запись в г17 значения для инвертирующего ШИМ
met2: ; по метке met2
out TCCR0,r17 , установка заданного режима работы таймера Т0
rjmp main ; и возврат на main
3.3 Содержание отчета
Цель работы.
Временные диаграммы работы ШИМ в 2-х режимах.
Написать и отладить программу в ШИМ режиме.
Выводы.
3.4 Контрольные вопросы
1) Что называется широтно-импульсной модуляцией?
2) Какой режим называется быстрый ШИМ?
3) Какой режим называется фазово-корректный ШИМ?
4) При каких условиях ШИМ является инвертирующим?
5) Какой импульс называется меандр?
6) Как рассчитывается среднее значение моделированного сигнала?
7) Что называется скважностью импульсного генератора?
4 Лабораторная работа №4. Программирование микроконтроллера в среде ICCavr
Цель работы: изучить программное обеспечение Imagecraft ICCavr и процесс программирования микроконтроллера.
4.1 Краткие сведения
4.1.1 Программное обеспечение ICCavr.
Программа «ImageCraft С» (в дальнейшем ICCavr) специально разработана для работы с микроконтроллерами AVR на языке Си. Результатом этапа программирования является листинг прикладной программы с расширением «*.с» (и файл проекта «*.prj»), который после компиляции преобразуется в файл «*.hex», содержащий коды команд процессора микроконтроллера.
4.1.1.1 Запуск программы ICCAVR.
Найти в меню пуск программу и загрузить ее (Пуск - Программы - ImageCraft Development Tools - ICCAVR). После этого откроется окно программы (см. рисунок 4.1), содержащее 4 области:
1 - кнопки меню;
2 - область ввода прикладной программы;
3 - область компиляции;
4 - область файлов проекта.
Рисунок 4.1 - Окно программы ICCavr
4.1.1.2 Создание проекта прикладной программы.
Открыть окно создания нового проекта: в меню Project выбрать строку New (в дальнейшем эти операции будут записываться Project - New). В строке «Папка» появившегося окна ввести папку, где будет храниться проект, в строке «Имя файла» - имя проекта, например, «lab1» и нажать кнопку «Сохранить». В области файлов проекта появится имя проекта.
4.1.1.3 Создание шаблона прикладной программы.
Ввод программы лучше всего начать с помощью мастера - значок или пункт меню «Tools - Application Builder» в меню, который облегчает ввод обязательных элементов программы. На экране появится окно мастера.
Для ввода простейшей программы в этом окне достаточно ввести тип контроллера (в пункте «Target CPU» выбрать М8535) и частоту кварцевого резонатора («Xtal») - 8 МГц. В общем случае в этом меню можно выбрать параметры работы портов, таймеров, АЦП, устройств последовательной передачи UART и SPI, внешних прерываний, выбрав соответствующую вкладку. Кнопка «Options» позволяет ввести в листинг программы строку главной функции «main», кнопка «Preview» - просмотреть шаблон программы. После ввода параметров закрыть окно мастера, нажав кнопку «OК».
В области ввода программы появится вкладка «Untitled - 0» прикладной программы с начальным листингом.
Программу необходимо сохранить на диске: File - Save и ввести имя файла, обязательно указав расширение «*.с», например, «test.c». После этого изменятся цвета элементов в окне программы:
а) цвет символов комментария будет зеленый;
б) цвет символов включаемых файлов - синий;
в) ключевые слова будут выделены полужирным шрифтом и т.д.
4.1.1.4 Дополнение программы своими функциями.
На данном этапе в программу необходимо ввести свои функции, которые, например, вводят и выводят сигналы из портов, определяют обработчики прерываний, выполняют математические операции и т.д. В частности, программа на микроконтроллерах в главной функции main() обычно содержит бесконечный цикл ее исполнения, например, в такой форме:
void main(void)
{
while(1) {;}
}
4.1.1.5 Добавление файла в проект.
Для добавления файла с расширением «*.с» в проект необходимо выбрать пункт меню Project - Add Files и указать на файл программы, в нашем примере, это будет файл «test.c». После этого в правой части экрана в окне файлов проекта в строке «Files» появится имя файла прикладной программы.
4.1.1.6 Параметры компилятора.
После добавления файла в проект необходимо установить базовые настройки компилятора. Для этого выбрать пункт меню Project - Options и ввести необходимые параметры контроллера. Появится окно параметров «Options».
В минимальном варианте для выбора параметров необходимо только ввести тип контроллера: на вкладке «Target» в строке «Device Configuration» выбрать контроллер «AtMega8535».
4.1.1.7 Компиляция программы.
В меню найти кнопку «Build Project» или соответствующую кнопку на панели инструментов. При нажатии этой кнопки выполняется проверка листинга программы, компиляция файла проекта, компоновка и создание исполняемого файла в кодах команд микроконтроллера, который получит расширение «*.hex» (в нашем случае «test.hex»). Сообщения о текущем этапе исполнения, ошибках в программе указывается в области компиляции. Если в программе существуют ошибки, их необходимо устранить. Также компилятор указывает объем полученной программы (сколько места будет занимать программа в микроконтроллере - в процентах от общего объема).
4.1.2 Проверка программы на симуляторе.
Для этого можно использовать программу «AVR Studio», которая эмулирует работу микроконтроллера, всех портов ввода/вывода, счетчиков/таймеров, прерываний, ШИМ и АЦП.
4.1.2.1 Загрузка исполняемого файла в программу «AVR Studio».
Найти на рабочем столе ярлык программы AVR Studio или загрузить через меню кнопки «Пуск» (Программы - Atmel AVR Tools - AVR Studio). На экране появится диалоговое окно программы с предложением ввода нового проекта или открытия существующего.
Нажимаем кнопку «Open» и открываем созданный исполняемый файл с расширением «*.hex», например, «test.hex». После этого программа создает файл для эмуляции программы и присваивает ему имя с расширением «*.aps» (в нашем случае «test_hex.aps»). На экране появится окно диалога записи этого файла на диск, нажимаем на кнопку «OК» и далее появится окно выбора платформы «Debug platform» и устройства «Device».
В пункте «Debug platform» выбираем «AVR Simulator», в пункте «Device» -тип контроллера, который используется в стенде (Atmega8535). Нажать на кнопку «Finish».
После этого появится окно отладки программы, содержащее три рабочих области:
- в левой части экрана откроется окно «I/O View» для просмотра регистров ввода/вывода;
- в правой части экрана окно «Disassembler», в котором представлена дизассемблированная программа - исходная программа, представленная в виде команд ассемблера;
- в нижней части экрана будет представлено окно сообщений «Message», комментирующих выполняемые действия.
Рассмотрим два первых окна. В окне дизассемблера содержится информация о программе:
- в каждой строке содержится одна инструкция, исполняемая контроллером;
- в первой колонке содержится шестнадцатеричное значение счетчика команд, под которым записана команда;
- во второй колонке шестнадцатеричный код команды;
- в третьей и четвертой колонках символическое имя команды и операнды;
- в последней пятой колонке краткий комментарий по выполняемой команде.
В тех строчках, в которых записан код команды FFFF, команда отсутствует. В левом верхнем углу окна размещается желтая стрелка текущей исполняемой команды.
Окно регистров содержит дерево всех устройств (см. рисунок 4.2). Напротив каждого устройства стоит знак «+». Раскрывая устройство, видны все регистры: управляющие регистры, регистры данных и т.д. Так, например, регистр ввода/вывода порта А содержит три регистра: регистр данных PORTA, регистр направления DDRA и выводы порта PINA. Справа от обозначения порта выведено его текущее состояние в виде шестнадцатеричного числа и битовое изображение. Мышкой можно задавать значения битов «0» или «1». Этим эмулируется воздействие внешних сигналов.
4.1.2.2 Запуск эмулятора.
Программа «AVR Studio» позволяет запустить программу в реальном времени и в пошаговом режиме. В меню отладки «Debug» находятся все варианты запуска программы, например:
- Run, запуск программы в реальном времени, результат будет виден только после остановки программы;
- Break, останов программы, после просмотра исполнение программы можно продолжить;
- Reset, сброс программы установка счетчика команд на начало программы;
- Step Over, пошаговое исполнение, при этом программа останавливается после каждой команды, стрелка указывает на текущую команду;
- AutoStep, запуск программы на непрерывное исполнение с возможностью просмотра текущих шагов исполнения.
Рисунок 4.2 - Окно регистров ввода/вывода
Запустив программу кнопкой «AutoStep», получим ее непрерывное исполнение и индикацию регистров во времени. Желтая стрелка в окне дизассемблера показывает текущую исполняемую команду. Приостановив исполнение программы кнопкой «Break», можно изменить значения регистров ввода/вывода, т.е. задать разные значения входных сигналов. И далее, снова запустив программу кнопкой «AutoStep», просмотреть реакцию микроконтроллера на эти воздействия.
4.1.2.3 Запись программы в микроконтроллер.
После проверки программы на симуляторе ее необходимо записать непосредственно в микроконтроллер. Для записи программы в микроконтроллер в лабораторном стенде также используется программное обеспечение AVR Studio. Программа позволяет программировать микроконтроллер, считывать программу из микроконтроллера, записывать и читать внутреннее перепрограммируемое ПЗУ микроконтроллера, программировать биты защиты, менять режимы работы генератора тактовых импульсов и режимы старта микроконтроллера. Входным форматом данных для программатора является hex-файл стандарта фирмы Intel (Intel Standard или Intel Extended).
В строке меню программы AVR Studio необходимо выбрать пункт «Tools - Program AVR - Auto Connect». Если модуль «Микроконтроллер» подключен к персональному компьютеру и установлены соответствующие драйверы, то происходит вызов окна программатора (см. рисунок 4.3).
В этом окне необходимо выбрать во вкладке Main программируемое устройство - Atmega8535, проверить, что оно соответствует выбранному нажатием кнопки «Read Signature».
После этого можно переходить на вкладку «Program» (см. рисунок 4.4). В этой вкладке можно стереть содержимое Flash микроконтроллера (кнопка «Erase Device»), а также запрограммировать Flash и EEPROM память микроконтроллера.
Рисунок 4.3 - Программатор AVR Studio. Вкладка «Main»
Рисунок 4.4 - Программатор AVR Studio. Вкладка «Program»
Запись .hex файла, полученного при написании и компиляции программы, необходимо осуществлять во Flash память микроконтроллера. Для этого необходимо выбрать записываемый файл с расширением *.hex и нажать на кнопку «Program» в окне по работе с Flash. Информация о ходе программирования отображается в нижней части окна. При программировании микроконтроллера должен мигать светодиод «Прог», расположенный на лицевой панели модуля «Микроконтроллер».
4.3 Задание
1. Прошить программу «бегущий огонь», в которой простейшими средствами реализуется задержка времени (ввод в программу цикла с пустым оператором).
// Листинг программы 2
#include <iom8535v.h> #include <macros.h>
void port_init(void)
{
PORTD = 0x01; // Включить 0 бит порта D: PORTD=0000 0001
DDRD = 0xFF;
}
void init_devices(void)
{
CLI ();
port_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00;
SEI () ;
}
void main(void)
{ unsigned int i; //Объявить переменную i. init_devices();
while(1)
{
for (i=l;i;i++) {;} //Пустой цикл
PORTD=PORTD«l; //Задание нового значения порта D.
if (PORTD==0) PORTD=l; //Если значение равно 0, присвоить единичное значение
}
}
4.4 Содержание отчета
Цель работы.
Листинг программы.
Выводы.
4.5 Контрольные вопросы
1) Какое основное преимущество языка Си?
2) Что означает термин «кросс-платформенный язык»?
3) Для чего предназначена программа ICCAVR?
4) Какую функцию выполняет программа AVR Studio?
5) Как осуществляется компиляция программы?
6) Для чего необходим формат hex-файла?
5 Лабораторная работа №5. Управление семисегментным индикатором
Цель работы: изучение принципов организации динамической индикации на базе семисегментных светодиодных индикаторов.
5.1 Краткие ведения
Индикация цифровой информации чаще всего выполняется на базе семисегментных индикаторов. Такой индикатор представляет собой набор светодиодов (сегментов) А, В ... Н (см. рисунок 5.1,а). Индикаторы бывают с общим анодом (см. рисунок 5.1,б) и общим катодом (см. рисунок 5.1,в). Для того, чтобы включить какой-либо сегмент индикатора, например, сегмент А по схеме с общим катодом, необходимо через сопротивление подать напряжение питания на анод этого сегмента и соединить общий катод с нулевым потенциалом источника. Для индикации цифры «2» (см. рисунок 5.1,г) необходимо подать питание на аноды сегментов А, В, D, Е и G.
а - семисегментный индикатор, б - схема с общим анодом, в - схема с общим катодом, г - индикация цифры «2».
Рисунок 5.1 - Семисегментный индикатор
В работе используются 4 семисегментных индикатора HG1...HG4 (см. рисунок 5.2) по схеме с общим катодом. В целях упрощения составления программ клеммы HG1 ... HG4 соединены с выводами катодов индикаторов через логические инверторы. Это позволяет использовать положительную логику для управления катодами индикаторов.
Если подать на индикаторы HG1, HG2, HG3 логические единицы, то при подаче на сегменты А...Н кода какого-либо числа, например «1», оно высветится на всех трех индикаторах одновременно.
Динамическая индикация используется для высвечивания на индикаторах различных чисел, например, для последовательного вывода числа «123» на индикаторах HG1-HG3: вначале на индикатор HG1 цифру «1», затем на второй индикатор HG2 цифру «2» и далее на третий индикатор HG3 цифру «3». Если эту операцию последовательного вывода выполнять с суммарной скоростью более 25 Гц для каждой цифры, то мерцания символов человеческому глазу видно не будет. То есть в нашем случае частота смены символов должна быть не менее 25х3=75 Гц.
Рисунок 5.2 - Схема включения индикаторов
5.2 Порядок выполнения работы
1. Набрать программу и определить, при каких минимальных значениях макроопределения NUM начинается мерцание символов.
Программа, которая реализует алгоритм для вывода числа «123». Частота вывода символов определяется программной паузой. Сегменты А-Н подключены соответственно к выводам РС0-РС7, а индикаторы HG1-HG3 - соответственно к выходам PD0-PD2.
// Динамическая индикация на 7-ми сегментных индикаторах
// Вывод сообщения "123" без использования таймеров
// Входы: нет
// Выходы: PORTС - сегменты индикаторов
// PORTD - индикаторы HG1, HG2, HG3
#include <iom8535v.h>
#include <macros.h>
#define NUM 1000
void main(void)
{
unsigned int i;
DDRC =0xFF; // порт С - на выход
PORTC=0x00; // все сегменты не светятся
DDRD =0x07; // младшие три бита порта D - на выход
PORTD=0x00; // индикаторы не выбраны
for (;;) // бесконечный цикл
{ // вывод цифры "1" на индикатор HG1
PORTC=0x06; // 0000 0110 - сегменты "В" и "С" в порт С
PORTD=0x01; // выбор индикатора HG1
for (i=0; i<NUM; i++); // программная пауза меньше 5 мс
// вывод цифры "2" на индикатор HG2
PORTC=0x5B; // 0101 1011 - сегменты "а","b","d","е","g"
PORTD=0x02; // выбор индикатора HG2
for (i=0; i<NUM; i++); // программная пауза 5 мс
// вывод цифры "3" на индикатор HG3
PORTC=0x4F; // 0100 1111 - сегменты "а","Ь","с","d","g"
PORTD=0x04; // выбор индикатора HG3
for (i=0; i<NUM; i++); // программная пауза меньше 5 мс
}
}
2. Набрать программу и определить, при каких минимальных значениях коэффициента предделителя таймера Т0 начинается мерцание символов.
В данном случае целесообразно задать глобальные переменные, в которых находятся выводимые на индикацию символы в виде кодов, выдаваемых на «сегментный» порт, и текущий номер выводимого индикатора. В программе обработки прерываний меняется этот номер, и на «сегментный» порт выводится соответствующий ему символ. Ниже приведена программа динамической индикации числа «123», выполненной с использованием прерывания таймера Т0.
// Динамическая индикация на 7-ми сегментных индикаторах
// с использованием таймера Т0
// Вывод сообщения "123"
// Входы: нет
// Выходы: PORTC - сегменты
// PD0...PD2 - HG1...HG3
#include <iom8535v.h>
#include <macros.h>
unsigned char cl=0x06, // код цифры "1"
c2=0x5B, // код цифры "2"
c3=0x4F; // код цифры "3"
unsigned char n; // номер индикатора
// ------------ Обработка прерывания Таймера Т0 -----------------
#pragma interrupt_handler indie:10
void indie(void)
{
PORTD&=0xF8 ; // выключаем все индикаторы HG1-HG3
switch (n)
{
case 0:
PORTC=cl ; // код "1"
PORTD=0x01 ; // индикатор HG1
break;
case 1:
PORTC=c2; // код "2"
PORTD=0x02; // индикатор HG2
break;
case 2 :
PORTC=c3; // код "3"
PORTD=0x04; // индикатор HG3
}
n++ ; // смена номера индикатора
n%=3 ;
}
void main(void)
{
DDRC =0xFF; // все биты порта С - на выход
PORTC=0x00; // сегменты не светятся
DDRD =0x07 ; // младшие три бита порта D - на выход
PORTD=0x00 ; // индикаторы не выбраны
TIMSK=0x01; // разрешение прерывания по переполнению таймера Т0
SEI() ; // общее разрешение прерываний - установка бита 7 регистра SREG
TCCR0=0x04 ; // =0000 0100, коэффициент предделителя 256,
// частота прерываний будет 8000000/256/256=122 Гц,
// частота обновления числа (3 цифры): 122/3=40 Гц
for (;;) ;
}
3. Изменить программу с таймером 0 таким образом, чтобы высвечивались:
- год рождения;
- дата рождения (день вместе с символом «точка» и месяц, например, 11.09).
Входным сигналом РА0 изменяется индикация: либо год рождения, либо дата рождения.
5.3 Содержание отчета
Цель работы.
Схемы индикатора и его включение.
Листинг программы.
Выводы.
5.4 Контрольные вопросы
1) Какие существуют схемы семисегментных индикаторов?
2) Как работают семисегментные индидикаторы?
3) Какой порт включен в схему управления индикаторов?
4) Как осуществить переход символа с одного индикатора на другой?
5) Как осуществить мерцание индикаторов?
6) Что называется динамической индикацией?
6 Лабораторная работа №6. Аналого-цифровой преобразователь
Цель работы: изучение схемы АЦП микроконтроллера ATmega8535 и принцип преобразования аналогового сигнала, а также методов программирования АЦП.
6.1 Краткие сведения
Микроконтроллер ATMega8535 позволяет вводить и обрабатывать до 8 аналоговых сигналов. Для этого в состав контроллера входит 10-разрядный АЦП последовательного приближения. Основные параметры АЦП следующие:
- абсолютная погрешность: ±2;
- интегральная нелинейность: ±0.5;
- время преобразования: 65.. .260 мкс.
Структурная схема АЦП приведена на рисунке 6.1.
Рисунок 6.1 - Структурная схема АЦП микроконтроллера
АЦП содержит:
- 8-ми канальный аналоговый мультиплексор с дешифратором каналов;
- внутренний источник опорного напряжения 2,56В со схемой выбора;
- АЦП последовательного приближения;
- предделитель для выбора времени преобразования сигнала.
Для ввода аналоговых сигналов ADC0...ADC7 в контроллере используются альтернативные функции порта А, соответственно выводы РА0...РА7. Следует обратить внимание, что биты портов, используемые как входы АЦП, должны быть запрограммированы как входы, при этом подтягивающие резисторы должны быть выключены, иначе это приведет к искажению входного напряжения.
6.1.1 Регистры АЦП.
Управление работой АЦП выполняется с помощью 4 регистров:
- регистр выбора канала и источника опорного напряжения ADMUX;
- регистр управления и статуса ADCSRA;
- два регистра данных ADCH, ADCL (выходной код АЦП 10-разрядный).
6.1.1.1 Регистр выбора канала ADMUX.
Номер входного канала АЦП и источник опорного напряжения задаются в регистре ADMUX.
Два старших разряда этого регистра определяют тип источника опорного напряжения ИОН. Опорное напряжение определяет напряжение, при котором выходной код максимален (для 10-разрядного АЦП - это 1023). Младшие 4 разряды регистра позволяют выбрать номер канала АЦП. Результат преобразования аналогового сигнала размещается в двух 8-ми разрядных регистрах. Для управления выравниванием результата преобразования (10-ти битного кода) служит разряд ADLAR регистра ADMUX. Если этот разряд установлен в «1», результат преобразования выравнивается по левой границе 10-разрядного слова, размещенного в регистрах ADCH:ADCL, если сброшен в «0» - по правой границе.
6.1.1.2 Регистр управления и статуса ADCSRA.
Регистр ADCSRA позволяет запустить и остановить работу АЦП, выбрать режим работы (одиночный или непрерывный), разрешить работу прерывания по окончании преобразования АЦП, а также задать длительность преобразования аналогового сигнала в цифровой код.
Таблица 6.1 - Биты регистра ADCSRA
Разряд |
Название |
Описание |
7 |
ADEN |
Разрешение АЦП (1 - включено, 0 - выключено) |
6 |
ADSC |
Запуск преобразования (1 - начать преобразование) |
5 |
ADFR |
Выбор режима работы АЦП |
4 |
ADIF |
Флаг прерывания АЦП |
3 |
ADIE |
Разрешение прерывания АЦП |
2...0 |
ADPS2:ADPS0 |
Выбор частоты преобразования |
Разрешить работу АЦП можно установкой бита ADEN регистра ADCSRA в состояние логической «1».
Для запуска АЦП необходимо установить в «1» бит ADSC регистра ADCSRA.
Существует два режима работы АЦП:
- режим одиночного преобразования, когда запуск каждого преобразования инициируется пользователем;
-режим непрерывного преобразования, когда запуск преобразований выполняется непрерывно через определенные интервалы времени.
Режим работы АЦП определяется состоянием разряда ADFR. Если он установлен в «1», АЦП работает в режиме непрерывного преобразования. В этом режиме запуск каждого следующего преобразования осуществляется автоматически после окончания текущего. Если же разряд ADFR сброшен в «0», АЦП работает в режиме одиночного преобразования и запуск каждого преобразования осуществляется по команде пользователя.
Тактирование работы внутреннего цикла АЦП осуществляется от тактового генератора микроконтроллера через предделитель. Частота работы АЦП задается коэффициентом деления предделителя и определяется состоянием разрядов ADPS2..ADPS0 регистра ADCSRA.
При работе с АЦП по прерываниям разрешение прерывания осуществляется установкой в «1» разряда ADIE регистра ADCSRA при установленном флаге I (бит 7) регистра SREG. Как и флаги остальных прерываний, флаг ADIF сбрасывается аппаратно при запуске подпрограммы обработки прерывания от АЦП или программно записью в него логической «1».
Когда цикл работы АЦП завершен, результат записывается в два 8-разрядных регистра ADCH и ADCL. При чтении данных результата преобразования АЦП вначале необходимо считывать младший регистр ADCL, после чего - старший регистр ADCH.
Для корректной работы АЦП необходимо выполнить следующие действия в указанном порядке:
- выбрать коэффициент деления предделителя;
- выбрать режим работы;
- разрешить работу АЦП;
- выбрать номер канала;
- запустить АЦП (установить в «1» бит ADSC).
По завершении преобразования (при установке в «1» флага ADIF регистра ADCSRA) его результат сохраняется в регистре данных АЦП.
6.2 Порядок выполнения работы
1. Написать программу, в которой аналоговый сигнал принимается на канал ADC3 (3-й канал АЦП - вывод РА3), преобразуется вначале в 10-разрядный, потом в 8-разрядный и выводится в порт D.
#include <iom8535v.h>
#include <macros.h>
void port_init(void)
{
DDRA = 0x00; // Порт А на ввод
PORTD = 0x00;
DDRD = 0xFF; // Порт D на вывод
}
void adc_init(void) // Инициализация АЦП
{
ADMUX = 0x03; //Выбираем 3 канал АЦП (РА3), источник опорного
//напряжения - AREF, правое выравнивание результата
ACSR = 0x80; // Компаратор недоступен
ADCSRA = 0хСЕ; // 1100 1110
// 1-й бит - предделитель = 64
// 3-й бит - разрешено прерывание АЦП
// 5-й режим работы - одиночное преобразование,
// 6-й - запуск АЦП
} // 7-й - разрешена работа АЦП
// Подпрограмма обработки прерывания по окончанию преобразования АЦП
// Вектор прерывания=15
#pragma interrupt_handler adc_isr:15
void adc_isr(void)
{
int v;
CLI();
v=ADCL; // считываем младший байт результата преобразования,
v|=(int)ADCH << 8; // а затем старший и соединяем их
v>>=2; // сдвигаем его вправо на 2 разряда
// получаем 8-разрядный результат
PORTD=v; // выводим его в порт D
ADCSRA|=0x40; // запускаем очередное преобразование
SEI();
}
void init_devices(void) // инициализация периферийных устройств
{
CLI();
port_init(); // инициализация портов
adc_init(); // инициализация АЦП
SEI(); }
void main(void)
{
init_devices();
while (1);
}
6.3 Содержание отчета
Цель работы.
Схема АЦП.
Листинг программы.
Выводы.
6.4 Контрольные вопросы
1) Как происходит оцифровка аналогового сигнала?
2) Какие регистры управляют АЦП?
3) Какое основное назначение опорного напряжения?
4) Для чего предусмотрено выравнивание результата?
5) Как включить АЦП и осуществить пуск оцифровки?
6) Какую функцию выполняет предделитель?
Список литературы
1. Баранов В.Н. Применение микроконтроллеров AVR: схемы, алгоритмы, программы. - М.: Додэка – ХХI, 2004. – 288 с.
2. Гребнев В.В. Микроконтроллеры семейства AVR фирмы Atmel. – М.: ИП РадиоСофт, 2002. – 176 с.
3. Евстифеев А.В. Микроконтроллеры семейства Classic фирмы ATMEL. – М.: Додэка - ХХI, 2006. – 288 с.
4. Мортон Дж. Микроконтроллеры AVR. Вводный курс. – М.: Додэка-XXI, 2006. – 356 с.
5. Ревич Ю.В. Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера. – СПб.: БХВ-Петербург, 2011. – 352 с.
6. Трамперт В. AVR-RISC микроконтроллеры. – К.: МК-Пресс, 2006. – 464 с.
Содержание
1 Введение |
3 |
2 Лабораторная работа №1 |
3 |
3 Лабораторная работа №2 |
9 |
4 Лабораторная работа №3 |
13 |
5 Лабораторная работа №4 |
18 |
6 Лабораторная работа №5 |
25 |
7 Лабораторная работа №6 |
29 |
Список литературы |
34 |
Дополнительный план 2014 г., поз. 11
Бахытжан Сергеевич Байкенов
Амантаев Канат Омирзакович
МИКРОКОНТРОЛЛЕРЫ
Методические указания по
выполнению лабораторных работ
для студентов специальности 5В071600 – Приборостроение
Редактор Н.М. Голева
Специалист по стандартизации Н.К. Молдабекова
Подписано в
печать ___________
Тираж 30 экз.
Объем 2,2 уч. изд. л.
Формат 60х84/16
Бумага
типографская № 1
Заказ_____Цена 1100 тн.
Копировально-множительное
бюро
некоммерческого
акционерного общества
«Алматинский
университет энергетики и связи»
050013,
Алматы, ул. Байтурсынова, 126