Сама курсовая работа (docx)

advertisement
ПОЛИТЕХНИЧЕСКИЙ КОЛЛЕДЖ ЛУГАНСКОГО АГРАРНОГО
УНИВЕРСИТЕТА
КУРСОВОЙ ПРОЕКТ
по дисциплине
“ЭКСПЛУАТАЦИЯ ТЕХНИЧЕСКИХ СРЕДСТВ
ИНТЕЛЛЕКТУАЛЬНЫХ СИСТЕМ”
на тему: “ Частотомер с передачей данных по
последовательному порту и динамической индикацией ”
Выполнил студент ІV курса
группы І-41-11
Лободин Я. В.
проверил преподаватель
Зубова С.О.
Луганск, 2015
МИНИСТЕРСТВО АГРАРНОЙ ПОЛИТИКИ И ПРОДОВОЛЬСТВИЯ
УКРАИНЫ
ОТДЕЛЁННОЕ ПОДРАЗДЕЛЕНИЕ «ПОЛИТЕХНИЧЕСКИЙ КОЛЛЕДЖ
ЛУГАНСКОГО НАЦИОНАЛЬНОГО АГРАРНОГО УНИВЕРСИТЕТА »
ЗАДАНИЕ НА КУРСОВОЙ ПРОЕКТ
Студенту _________________________________________________________________
Группы __________________________________________________________________
Специальности 5.05020205 «Обслуживание интеллектуальных интегрированных систем»
1. Тема проекта _________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
2. Входные данные ______________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
__________________________________________
3. Содержание пояснительной записки (перечень разделов для разработки)
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
4. Объём графического материала
_____________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
Дата выдачи задания «____»______________20__ р.
Срок выполнения проекта «____»__________20__ р.
Студент ___________________________________/
Руководитель проекта ___________________________/
/
/
РЕФЕРАТ
Курсовой проект содержит: 46 страниц формата А4, 2 приложения, 7
литературных источников, 3 листа графической части.
Ключевые слова: микроконтроллер, AVR, ATmega16, таймер, часовой
кварц, прерывания, внешние прерывания, семисегментный индикатор, UART,
Proteus.
В курсовом проекте рассмотрено устройство для измерения частоты
сигнала, с последующим выводом частоты на семисегментный индикатор и
передачей
данных
по
последовательному
порту.
Программа
для
микроконтроллера написана на языке C и компилируется c помощью
компилятора avr-gcc. Также рассматривается изготовление печатной платы и
корпуса для устройства.
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
3
СОДЕРЖАНИЕ
ВВЕДЕНИЕ ................................................................................................................................................................... 5
1
Разработка принципиальной схемы устройства ................................................................................................ 7
1.1
Микроконтроллер Atmega16 фирмы Atmel ................................................................................................... 7
1.1.1
Структура, основные характеристики и возможности ................................................................................. 7
1.1.2
Отличительные особенности ATmega16 ....................................................................................................... 9
1.2
Краткая характеристика архитектуры ......................................................................................................... 11
1.3
Порты ввода-вывода микроконтроллеров AVR ......................................................................................... 14
1.4
Таймеры микроконтроллеров AVR ............................................................................................................. 17
1.5
Внешние прерывания .................................................................................................................................... 22
1.6
Универсальный асинхронный приёмопередатчик UART .......................................................................... 26
1.7
Схема устройства........................................................................................................................................... 35
2
Разделение устройства на отельные модули ................................................................................................... 37
3
Разработка программы управления .................................................................................................................. 38
3.1
Компиляция программы ............................................................................................................................... 40
3.2
Проверка работоспособности устройства ................................................................................................... 42
4
Разработка печатных плат модулей проектированного устройства .............................................................. 38
5
Разработка конструктива ................................................................................................................................... 43
ВЫВОД ........................................................................................................................................................................ 45
ЛИТЕРАТУРА............................................................................................................................................................. 46
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
4
ВВЕДЕНИЕ
В классической микропроцессорной системе используются отдельная
микросхема процессора, отдельные микросхемы памяти и отдельные порты
ввода вывода. Стремительное развитие микропроцессорной техники требует
всё большей и большей степени интеграции микросхем.
Именно поэтому были разработаны микросхемы, которые объединяют в
себе сразу все элементы микропроцессорной системы. Такие микропроцессоры
называются микроконтроллерами. В советское время такие микросхемы
называли «Однокристальные микро ЭВМ».
Для
однокристальных
микроконтроллеров
понятие
«центральный
процессор» обычно не употребляется. Так как процессор – это все-таки
отдельное устройство. Функции процессора в микроконтроллере заменяет
арифметико-логическое устройство (АЛУ).
Кроме АЛУ, микроконтроллер содержит в своём составе:
 тактовый генератор;
 память данных;
 память программ;
 порты ввода-вывода.
Все эти элементы соединены между собой внутренними шинами данных и
адреса. С внешним миром микроконтроллер общается при помощи портов
ввода-вывода. Любой микроконтроллер всегда имеет один или несколько
портов. Кроме того, современные микроконтроллеры всегда имеют встроенную
систему прерываний, а также встроенные программируемые таймеры,
компараторы, цифроаналоговые преобразователи и многое другое.
Если речь идёт не о большом компьютере, а о портативном устройстве
управления, то в нём применяются именно микроконтроллеры. Конечно, любая
реальная схема редко обходится без простых логических микросхем, триггеров,
счётчиков и тому подобного. Но основой всегда является микроконтроллер.
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
5
Чистые микропроцессоры в настоящее время применяются только в
персональных компьютерах.
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
6
1 Разработка принципиальной схемы устройства
1.1
Микроконтроллер Atmega16 фирмы Atmel
1.1.1 Структура, основные характеристики и возможности
Рис. 1.1 Блок-схема ATmega16
Изм. Лист
№ докум.
Розраб.
Лободин Я.В.
Руковод.
Зубова С.О.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лит.
Частотомер с передачей
данных по
последовательному порту и
динамической индикацией
У К
Лист
П
7
ПК ЛАУ
Гр. І 41-11
Листов
29
Рис. 1.2 – Расположение выводов ATmega16
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
8
1.1.2 Отличительные особенности ATmega16





Изм.
Лист
8-разрядный высокопроизводительный AVR микроконтроллер с малым
потреблением
Прогрессивная RISC архитектура
- 130 высокопроизводительных команд, большинство команд
выполняется за один тактовый цикл
- 32 8-разрядных рабочих регистра общего назначения
- Полностью статическая работа
- Производительность приближается к 16 MIPS (при тактовой частоте 16
МГц)
- Встроенный 2-цикловый перемножитель
Энергонезависимая память программ и данных
- 16 Кбайт внутрисистемно программируемой Flash памяти (In-System
Self-Programmable Flash)
- Обеспечивает 1000 циклов стирания/записи
- Дополнительный сектор загрузочных кодов с независимыми битами
блокировки
Внутрисистемное программирование встроенной программой загрузки
- Обеспечен режим одновременного чтения/записи (Read-While-Write)
- 512 байт EEPROM
- Обеспечивает 100000 циклов стирания/записи
- 1 Кбайт встроенной SRAM
- Программируемая блокировка, обеспечивающая защиту программных
средств пользователя
Интерфейс JTAG (совместимый с IEEE 1149.1)
- Возможность сканирования периферии, соответствующая стандарту
JTAG
- Расширенная поддержка встроенной отладки
- Программирование через JTAG интерфейс: Flash, EEPROM памяти,
перемычек и битов блокировки
Встроенная периферия
- Два 8-разрядных таймера/счетчика с отдельным предварительным
делителем, один с режимом сравнения
- Один 16-разрядный таймер/счетчик с отдельным предварительным
делителем и режимами захвата и сравнения
- Счетчик реального времени с отдельным генератором
- Четыре канала PWM
- 8-канальный 10-разрядный аналого-цифровой преобразователь
- 8 несимметричных каналов
- 7 дифференциальных каналов (только в корпусе TQFP)
- 2 дифференциальных канала с программируемым усилением в 1, 10 или
200 крат (только в корпусе TQFP)
- Байт-ориентированный 2-проводный последовательный интерфейс
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
9




Изм.
Лист
- Программируемый последовательный USART
- Последовательный интерфейс SPI (ведущий/ведомый)
- Программируемый сторожевой таймер с отдельным встроенным
генератором
- Встроенный аналоговый компаратор
Специальные микроконтроллерные функции
- Сброс по подаче питания и программируемый детектор
кратковременного снижения напряжения питания
- Встроенный калиброванный RC-генератор
- Внутренние и внешние источники прерываний
- Шесть режимов пониженного потребления: Idle, Power-save, Powerdown, Standby, Extended Standby и снижения шумов ADC
Выводы I/O и корпуса
- 32 программируемые линии ввода/вывода
- 40-выводной корпус PDIP и 44-выводной корпус TQFP
Рабочие напряжения
- 2,7 - 5,5 В (ATmega16L)
- 4,5 - 5,5 В (ATmega16)
Рабочая частота
- 0 - 8 МГц (ATmega16L)
- 0 - 16 МГц (ATmega16)
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
10
Краткая характеристика архитектуры
1.2
Главная функция центрального ядра процессора – управление процессом
выполнения программ. Для этого центральный процессор должен иметь
непосредственный доступ к памяти, должен быть способен производить все
виды вычислений и выполнять запросы на прерывания.
Чтобы максимально ускорить работу и сделать возможным параллельное
выполнение нескольких операций, микроконтроллеры AVR используют
Гавардскую архитектуру (рис 1.3).
Рис. 1.3 – Гавардская архитектура микропроцессора
Такая архитектура предусматривает отдельную память и отдельную шину
адреса как для программы, так и для данных.
Каждая команда из пяти программ выполняются за один машинный цикл
с использованием многоуровневой конвейерной обработки. В тот момент, когда
очередная
команда
выполняется,
следующая
команда
считывается
из
программной памяти.
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
11
Такая концепция позволяет выполнять по одной команде за один такт
системного генератора. Программный сегмент памяти физически представляет
собой встроенную перепрограммируемую Flash-память.
Файл регистров быстрого доступа содержит 32 восьмиразрядных
регистра общего назначения, доступ к которым осуществляется за один такт
системного генератора. Это позволяет арифметико-логическому устройству
(ОЛУ) осуществлять большинство своих операций за один такт.
Типичная
операция
АЛУ
выполняется
следующим
образом:
из
регистрового файла читаются два операнда, выполняется операция. Результат
сохранения опять же в файле регистров. Все эти три действия выполняются за
один цикл тактового генератора.
Шесть из этих 32 регистраторов могут использоваться как три 16разрядных регистра-указателя косвенной адресации. Эти сдвоенные регистры
могут использоваться для адресации данных в адресном пространстве ОЗУ.
Такая организация даёт возможность программного вычисления адреса.
Один из этих регистров-указателей может также использоваться в
качестве указателя адреса данных, размещённых в памяти программ (Flashпамяти). Эти дополнительные составные 16-разрядные регистры именуются X,
Yи Z.
АЛУ поддерживает арифметические и логические операции между двумя
регистраторами или между константой и регистратором. В АЛУ также могут
выполняться
операции
с
отдельными
регистраторами.
После
каждой
арифметической операции обновляется регистр статуса для того, чтобы
отразить информацию о её результате.
Последовательность выполнения программы может быть изменена
командами условного и безусловного перехода, а также командой вызова
подпрограммы, в которых используется непосредственная адресация.
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
12
Большинство инструкций AVR представляет собой одно 16-разрядное
слово. Каждый адрес памяти программы содержит 16-битовую инструкцию или
половину 32-разрядной инструкции.
При выполнении процедуры обработки прерывания или подпрограммы
текущее значение счётчика команд (PC)сохраняется в стеке.
Стек фактически размещён в одном адресном пространстве с памятью
данных SRAM (ОЗУ) и, следовательно, размер стека ограничен только
размером SRAM и тем, какую часть SRAM использует остальная программа.
Программа
пользователя
обязательно
должна
инициализировать
указатель стека (SP)сразу после сброса (прежде, чем будет выполнена
подпрограмма или будет вызвано прерывание). Указатель стека (SP) имеет свой
конкретный адрес в пространстве регистров ввода-вывода. К данным в ОЗУ
(SRAM) можно получить доступ, используя память различных способов
адресации, поддержанных архитектурой AVR.
Адресное пространство всех видов памяти в архитектуре AVR являются
регулярным линейным. Гибкий модуль прерываний имеет ряд регистраторов
управления
в
адресном
пространстве
регистров
ввода-вывода
и
дополнительный флаг глобального разрешения прерываний в регистре статуса.
Каждый вид прерывания имеет свой отдельный вектор в таблице
векторов прерываний. Прерывания имеют приоритет в соответствии с их
положением в таблице векторов прерываний. Чем ниже адрес вектора
прерывания, тем выше приоритет.
Пространство регистров ввода-вывода содержит 64 адреса для регистров
управления периферийными устройствами, регистров управления режимами
работы процессора и другими функциями ввода/вывода. К любому регистру
ввода-вывода можно получить доступ непосредственно по его номеру или как к
ячейке памяти данных. В адресном пространстве памяти данных регистры
ввода-вывода располагаются сразу после файла регистров общего назначения
(0x20 – 0x5F).
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
13
1.3
Порты ввода-вывода микроконтроллеров AVR
Все порты микроконтроллеров AVR в режиме цифрового ввода-вывода
представляют собой полноценные двунаправленные порты, у которых каждый
из выводов может работать как в режиме ввода, так и в режиме вывода. Это
означает, что каждый отдельный разряд порта может быть настроен либо как
вход, либо как выход, независимо от настройки всех остальных разрядов того
же порта.
Настроить разряды порта можно при помощи команд сброса и установки
бита SBI и CBI. То же самое касается изменения значения на выходе (если
разряд сконфигурирован как выход) или включения/ отключения внутреннего
резистора нагрузки (если разряд сконфигурирован как вход).
Все эти настройки выполняются отдельно для каждого вывода порта.
Выходной буфер каждого из выводов порта содержит симметричный выходной
каскад с высокой нагрузочной способностью. Нагрузочная способность
каждого вывода любого порта достаточна для непосредственного управления
светодиодным дисплеем.
Все выводы любого порта имеют индивидуально подключаемые
резисторы нагрузки, которые в случае необходимости могут подключаться
между этим выводом и источником питания. Входные схемы каждой линии
порта имеют по два защитных диода, подключённых к цепи питания и к
общему проводу, как это показано на рис. 1.4.
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
14
Рис. 1.4 – Эквивалентная схема входных цепей одного разряда порта
ввода-вывода
Буква “x” в описании имён регистра означает название порта, сточная
буква “n” означает номер разряда. При использовании этого имени в программе
вместо этих символов нужно подставлять конкретную букву названия порта и
конкретный номер разряда.
Например, PORTB3 – для бита номер 3 порта B, если в документации
этот бит назывался PORTxn.
Для каждого порта ввода-вывода в микроконтроллере имеется три
специальных регистра:
 PORTx – регистр данных;
 DDRx – регистр управления;
 PINx – регистр непосредственного чтения состояния линий порта.
Регистр непосредственного чтения состояния линий порта доступен
только для чтения, в то время как регистр данных и регистр управления
доступны как для чтения, та и для записи.
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
15
Однако тоже возможна
запись логической единицы в любой разряд
регистра PINx. Она приведёт к переключению соответствующего разряда
регистра данных (PORTx). Каждый разряд регистра PORTx управляет
включением
и
отключением
резистора
внутренней
нагрузки,
если
соответствующий разряд порта находится в режиме ввода.
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
16
1.4
Таймеры микроконтроллеров AVR
В микроконтроллерах AVR может быть до 4х таймеров/счетчиков (ТС).
Разрядность этих таймеров 8 или 16 бит (т.е. они могут считать до 28=256 или
до 216=65536). Обычно их используют для точного формирования временных
интервалов, подсчета импульсов на выводах микроконтроллера, формирования
последовательности импульсов. Таймеры способны вырабатывать запросы на
прерывания, при
этом освобождая процессор от необходимости опроса
состояния таймеров. В данной статье мы разберем работу таймеров и
прерываний, которые они могут вырабатывать, на примере 16-ти битного
таймера/счетчика1 (TС1) микроконтроллера ATmega16. Всего у этого МК три
таймера - два 8ми битных (TС0, TС2) и один 16 битный (TС1). Взглянем на
таблицу векторов прерываний МК ATmega16 - 7 прерываний связаны с
таймерами микроконтроллера, из них 4 связаны с таймером/счетчиком1 (TС1).
Давайте разберемся, что же может этот таймер, какие регистры им управляют и
что в них нужно записать, чтобы настроить таймер как нам нужно. Для начала
рассмотрим все регистры ТС1 и за что какой бит отвечает, а потом рассмотрим
какие-нибудь простые примеры по настройке таймера. Начнем с регистров
управления таймером.
TCCR1A - регистр управления A
Рис. 1.5 – Регистр TCCR1A
Биты 7:6 - COM1A 1:0: контролируют поведение выхода OC1A (см. Таблицу
1).
Биты 5:4 - COM1B 1:0: контролируют поведение выхода OC1B (см. Таблицу
1).
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
17
Биты 3:2 - FOC1A, FOC1B: служат для принудительного изменения
состояния выходов OC1A и OC1B.
Биты 1:0 - WGM11, WGM10: служат для настройки ТС1 для работы в
качестве широтно-импульсного
модулятора (ШИМ). В режиме ШИМ
состояние выходов OC1A и OC1B будет отличаться. В этой статье не буду
ничего писать про режим ШИМа, а то будет куча информации, которую трудно
переварить. Что такое ШИМ опишу как-нибудь в другой раз.
TCCR1B - регистр управления В
Рис. 1.7 – Регистр TCCR1B
Бит 7 - ICNC1: подавление дребезга на входе ICP1. Если бит установлен,
то определение события на входе ICP1 происходит с задержкой в 4 машинных
цикла (см. дальше по тексту).
Бит 6 - ICES1: выбор фронта срабатывания прерывания по захвату. Если
установлен - на растущем фронте, если сброшен - на падающем фронте.
Бит 5 - не используется
Биты 4:3 - WGM1 3:2: для настройки ШИМа.
Биты 2:0 - CS1 2:0: выбор тактирования ТС1 (Таблица 2).
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
18
Далее, с частотой, которую мы выбрали в регистре TCCR1B, счетчик
таймера начинает считать и записывать значение счетчика в регистры TCNT1H
и TCNT1L - старший и младший байт счетного регистра. При достижении
TCNT1 значения 216 счетчик переполняется и сбрасывается, и начинает счет
заново. В этот регистр мы также можем записать какое-нибудь значение, с
которого мы хотим, чтобы наш счетчик стартовал. Для 16-битной операции
записи, старший байт должен быть записан первым. Младший - вторым. Для
операции 16-битного чтения, младший байт должен быть прочитан первым, а
содержимое старшего байта считывается вторым. Если мы настроили
изменение состояния входа OC1A или OC1B, тогда значение счетного регистра
сравнивается каждый раз со значением регистров OCR1A и OCR1B - регистры
сравнения. Каждый из этих регистров состоит из двух байт (например,
OCR1AH и OCR1AL). Можно записать в эти регистры нужное значение и по
совпадению значения регистра счетчика с регистром сравнения будет
происходить изменение на выходах OC1A и OC1B. Также есть регистр захвата
входа - ICR1 (ICR1H и ICR1L). Значение TCNT1 в этот регистр записывается
при наступлении события на входе ICP1.
Счет и изменение состояния ножек МК это уже хорошо, но также этот
таймер может при определенных событиях генерировать прерывания. Как мы
уже видели из таблицы векторов прерываний у ТС1 есть 4 вектора прерывания -
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
19
прерывание по захвату, прерывание по совпадению А, прерывание по
совпадению В, прерывание по переполнению (указаны в порядке уменьшения
приоритета). Рассмотрим регистры, настраивая которые можно управлять
прерываниями ТС1.
TIMSK - регистр маски прерываний таймеров/счетчиков
Рис. 1.8 – Регистр TIMSK
Бит 7 - OCIE2: прерывание по совпадению ТС2
Бит 6 - TOIE2: прерывание по переполнению ТС2
Бит 5 - TICIE1: прерывание по захвату ТС1
Бит 4 - OCIE1A: прерывание по совпадению A ТС1
Бит 3 - OCIE1B: прерывание по совпадению В ТС1
Бит 2 - TOIE1: прерывание по переполнению ТС1
Бит 1 - не используется
Бит 0 - TOIE0: прерывание по переполнению ТС0
Если соответствующий бит установлен в "1" и бит I (7-й бит) регистра
состояний SREG установлен в "1", тогда соответствующее прерывание будет
срабатывать.
TIFR - регистр флагов прерываний таймеров/счетчиков
Рис. 1.9 – Регистр TIFR
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
20
Флаги соответствуют прерываниям в регистре TIMSK. Устанавливаются
в "1" при выполнении условий соответствующего прерывания.
Вот и вся теория связанная с ТС1. Остальные таймеры настраиваются
аналогичным образом.
Обобщённые сведения о таймере 1:

Счетчик 16-ти битный (16 битный ШИМ)

Два независимых выхода, срабатывающих по совпадению

Один вход по захвату события (растущий или падающий фронт) и
подавление дребезга на этом входе

Тактирование от встроенного тактового генератора или внешний
источник тактирования таймера (T1)

Изм.
Лист
4 независимых прерывания
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
21
1.5
Прерывание –
Внешние прерывания
это событие, при котором происходит приостановка
основной программы и переход на выполнение подпрограммы прерывания.
Чтобы узнать какие же есть прерывания в МК, нужно открыть даташит
микроконтроллера и найти раздел Interrupts. В самом начале можно увидеть
таблицу векторов прерываний.
Таблица 3 – Таблица векторов прерываний для МК Atmega16
В каждом векторе прерывания находится команда перехода с адресом
начала подпрограммы прерывания. Любая программа начинается с Reset, в
котором находится команда перехода к блоку инициализации. А дальше,
каждое прерывание настроено на какое-то событие и при срабатывании этого
события программа переходит к обработчику этого прерывания. Видно, что
каждому прерыванию соответствует свой вектор прерывания. Чем выше адрес
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
22
прерывания, тем ниже приоритет прерывания. Т.е. в очереди прерываний,
прерывания с большим приоритетом будут выполняться раньше. Если началась
обработка какого-нибудь прерывания, никакое другое не может быть вызвано,
даже с большим приоритетом. Иначе получался бы рекурсивный вызов
обработчиков прерываний и сложнее было бы отследить работу программы.
При вызове обработчика любого прерывания бит глобального разрешения
прерываний I регистра SREG (status register - регистр состояния) сбрасывается в
"0"и только по завершении обработки прерывания снова устанавливается в "1"
и разрешает начать обработку следующего прерывания в очереди. Чтобы
установить ручками этот бит существует функция sei(), а чтобы сбросить - cli().
При запуске программы этот бит всегда сброшен и чтобы прерывания
срабатывали его нужно установить (вызвать sei()).
Итак, в этой статье нас будут интересовать только внешние прерывания,
т.е. те прерывания, которые возникают при изменении состояния определенных
входом МК. Из таблицы векторов прерываний видно, что у МК ATmega8 таких
прерываний 2 - INT0 и INT1 и их приоритет выше других прерываний. Жмем в
даташите External Interrupts и обнаруживаем интересную вещь. Для настройки
этих прерываний нужно воспользоваться регистрами MCUCR (MCU Control
Register - регистр управления) и GICR (General Interrupt Control Register общий регистр управления прерываниями). Рассмотрим их подробней.
MCUCR
Рис. 1.10 – Регистр MCUCR

Бит 1, 0 - ISC01, ISC00: Настройка условия срабатывания прерывания
INT0 (таблица 4).
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
23
Таблица 4 – Настройка условия срабатывания прерывания INT0
Бит 3, 2 - ISC11, ISC10: Настройка условия срабатывания прерывания

INT1 (таблица 5)
Таблица 5 – Настройка условия срабатывания прерывания INT0
Биты 4-7 относятся к управлению питанием и здесь рассматривать их не будем.
Регистр GICR
Рис. 1.11 – Регистр GICR
Бит 7 - INT1: Разрешает внешнее прерывание 1 ("1" - разрешено, "0" -

запрещено)
Бит 6 - INT0: Разрешает внешнее прерывание 0 ("1" - разрешено, "0" -

запрещено)
Также любое прерывание имеет свой флаг прерывания. Этот флаг
устанавливается в "1" в момент, когда должно произойти прерывание, даже
если прерывания глобально запрещены и соответствующая программа
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
24
обработки прерывания не вызывается. Можно, например, внутри какого-нибудь
обработчика прерывания по этому флагу проверять было ли какое-либо
прерывание или нет. Флаги внешних прерываний являются 7-м и 6-м битом
регистра GIFR. Флаги прерываний сбрасываются записью в них "1".
Регистр GIFR
Рис. 1.12 – Регистр GIFR
Изм.

Бит 7 - INTF1: Флаг внешнего прерывания 1.

Бит 6 - INTF0: Флаг внешнего прерывания 0.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
25
1.6
Универсальный асинхронный приёмопередатчик UART
UART — один из самых распространённых и удобных в работе портов.
Хоть его первоначальную разновидность в виде RS-232C уже сложно найти, то
его родственники встречаются повсеместно, как в виде промышленных
проводных гигантов, таких, как RS485. В микроконтроллерной технике он
соединяет различные узлы, которые обмениваются большими объёмами
данных, например: МК, датчики, модули беспроводных и проводных
интерфейсов.
В
свою
очередь,
UART
расшифровывается
как
«универсальный
асинхронный приемник и передатчик» («Universal Asynchronous Receiver and
Transmitter»).
Выводы МК, связанные с USART:
RXD – PD0 – вход _USART;
TXD – PD1 – выход _USART;
XCK – PB0 – вход/выход внешнего тактового сигнала.
Основные свойства:
 Полнодуплексный обмен по последовательному каналу.
 Синхронный и асинхронный режимы работы.
 Синхронизация как от ведущего, так и от ведомого устройства.
 Скорость передачи может варьироваться в довольно больших пределах.
 Посылка может быть от 5-и до 9-и разрядов (UART 8-9 разрядов).
 Аппаратная поддержка генерации и контроля бита чётности.
 Имеются три прерывания: «передача завершена», «регистр данных
передатчика пуст», «приём завершен».
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
26
Рис. 1.13 – Подключение двух устройств по UART
Картинка весьма наглядна, но все же соединяем крест-накрест приемник с
передатчиком, а передатчик с приемником. Вывод тактирования мы не
подключаем, так как намерены использовать асинхронный режим работы
модуля.
Формат кадра:
Рис. 1.14 – Формат кадра UART
Под кадром в данном случае понимается совокупность одного слова
данных и сопутствующей информации. Кадр начинается со старт-бита, за
которым следует младший разряд слова данных. После старшего разряда слова
данных следует один или два стоп-бита.
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
27
Если включена схема формирования бита четности, он включается между
старшим разрядом слова данных и первым стоп-битом.
Формат кадра определяется разрядом UCSZ2 регистра UCSRB и разрядами
UCSZ1, UCSZ0 регистра UCSRC. Выбор количества стоп-битов (в USART)
осуществляется
с
помощью
разряда
USBS
регистра
UCSRC. Разряды
UPM1:UPM0 регистра UCSRC определяют функционирование схемы контроля
четности модулей USART.
Значение бита четности получается путем выполнения операции «Исключающее ИЛИ» над всеми разрядами передаваемого слова данных. Если
используется проверка на нечетность (odd parity), полученный результат инвертируется.
Проверка на чётность:
Peven = d n-1 | …| d3 | d2| d1 | d0 | 0,
Проверка на нечётность: Podd = d n-1 | …| d3 | d2| d1 | d0 | 1.
Регистры
В микроконтроллере atmega32 для работы с модулем USART
используются 6 регистров :
- управляющий регистр UCSRA ,
- управляющий регистр UCSRB ,
- управляющий регистр UCSRC,
- регистры скорости передачи UBRRL и UBRRH,
- регистр данных UDR.
Рис. 1.15 – Управляющий регистр UCSRA
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
28
Бит RXC – Флаг завершения приема. Флаг устанавливается в «1» при
наличии непрочитанных данных в буфере приемника (регистр данных UDR).
Сбрасывается флаг аппаратно после опустошения буфера.
Бит TXC – Флаг завершения передачи. Флаг устанавливается в «1» после
передачи всех разрядов посылки из сдвигового регистра передатчика, при
условии, что в регистр данных UDR не было загружено нового значения. Флаг
сбрасывается аппаратно при выполнении подпрограммы обработки прерывания
или программно, записью в него лог. 1.
Бит UDRE – Флаг опустошения регистра данных. Данный флаг
устанавливается в «1» при пустом буфере передатчика (после пересылки байта
из регистра данных UDR в сдвиговый регистр передатчика). Установленный
флаг означает, что в регистр данных можно загружать новое значение. Если
разряд UDRIE регистра UCR (UCSRB) установлен, генерируется запрос на
прерывание «регистр данных пуст». Флаг сбрасывается аппаратно, при записи в
регистр данных.
Бит FE – Флаг ошибки кадрирования. Флаг устанавливается в «1» при
обнаружении ошибки кадрирования, т. е. если первый стопбит принятой
посылки равен «0». Флаг сбрасывается при приеме стоп бита, равного «1».
Бит DOR – Флаг переполнения. В USART флаг устанавливается в
«1», если в момент обнаружения нового стартбита в сдвиговом регистре
приемника находится последнее принятое слово, а буфер приемника полон (два
значения). В UART флаг устанавливается в «1», если новый кадр будет
помещен в сдвиговый регистр приемника до того, как из регистра данных будет
считано предыдущее слово. Флаг сбрасывается при пересылке принятых
данных из сдвигового регистра приемника в буфер.
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
29
Бит PE – Флаг ошибки контроля четности. Флаг устанавливается в «1»,
если в данных, находящихся в буфере приемника, выявлена ошибка контроля
четности. При отключенном контроле четности этот разряд постоянно читается
как «0».
Бит U2X – Удвоение скорости обмена. Если этот разряд установлен в «1»,
коэффициент
деления
предделителя
контроллера
скорости
передачи
уменьшается с 16 до 8, удваивая тем самым скорость асинхронного обмена по
последовательному каналу. В USART разряд U2X используется только при
асинхронном режиме работы. В синхронном режиме он должен быть сброшен.
Бит MPCM – Режим мультипроцессорного обмена. Разряд MPCM
используется в режиме мультипроцессорного обмена. Если он установлен в
«1», ведомый микроконтроллер ожидает приема кадра, содержащего адрес.
Кадры, не содержащие адреса устройства, игнорируются.
Рис. 1.16 – Управляющий регистр UCSRB
Бит RXCIE – Разрешение прерывания по завершению приема. Если
данный разряд установлен в «1», то при установке флага RXC регистра UCSRA
генерируется прерывание.
Бит TXCIE – Разрешение прерывания по завершению передачи. Если
данный разряд установлен в «1», то при установке флага TXC регистра UCSRA
генерируется прерывание.
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
30
Бит UDRIE – Разрешение прерывания при очистке регистра данных
UART. Если данный разряд установлен в «1», то при установке флага UDRE в
регистра UCSRA генерируется прерывание.
Бит RXEN – Разрешение приема. При установке этого разряда в «1»
разрешается
работа
приемника
USART/UART
и
переопределяется
функционирование вывода RXD.
Бит TXEN – Разрешение передачи. При установке этого разряда в «1»
разрешается работа передатчика UART и переопределяется функционирование
вывода TXD.
Бит UCSZ2 – Формат посылок. Этот разряд используется для задания
размера слов данных, передаваемых по последовательному каналу. В модулях
USART он используется совместно с разрядами UCSZ1 и UCSZ0 регистра
UCSRC.
Бит RXB8 – 8 й разряд принимаемых данных. При использовании 9
разрядных слов данных этот разряд содержит значение старшего разряда
принятого слова. В случае USART содержимое этого разряда должно быть
считано до прочтения регистра данных UDR.
Бит TXB8 – 8 й разряд передаваемых данных. При использовании 9
разрядных слов данных, содержимое этого разряда является старшим разрядом
передаваемого слова. Требуемое значение должно быть занесено в этот разряд
до загрузки байта данных в регистр UDR.
Рис. 1.17 – Управляющий регистр UCSRC
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
31
URSEL – Выбор регистра. Этот разряд определяет, в какой из
регистров модуля
производится
запись.
Если
разряд
установлен
в
«1», обращение производится к регистру UCSRC. Если же разряд сброшен в
«0», обращение производится к регистру UBRRH.
UMSEL – Режим работы USART. Если разряд сброшен в «0», модуль
USART работает в асинхронном режиме. Если разряд установлен в «1», то
модуль USART работает в синхронном режиме.
UPM1 и UPM0 – Режим работы схемы контроля и формирования
четности.
Эти разряды
определяют
функционирование
схем
контроля
и формирования четности.
Рис. 1.18 – Режимы формирования чётности
USBS – Количество стопбитов. Этот разряд определяет количество стоп
битов, посылаемых передатчиком. Если разряд сброшен в «0», передатчик
посылает 1 стоп бит, если установлен в «1», то 2 стоп бита. Для приемника
содержимое этого разряда безразлично.
UCSZ1 и UCSZ0 – Формат посылок. Совместно с разрядом UCSZ2
эти разряды определяют количество разрядов данных в посылках (размер
слова).
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
32
Таблица 6 – Формат посылок
UCPOL – Полярность тактового сигнала. Значение этого разряда
определяет момент выдачи и считывания данных на выводах модуля. Разряд
используется только при работе в синхронном режиме. При работе в
асинхронном режиме он должен быть сброшен в «0».
Рис. 1.19 – Регистры скорости передачи
USEL – Выбор регистра. Этот разряд определяет, в какой из
регистров модуля
производится
запись.
Если
разряд
установлен
в
«1», обращение производится к регистру UCSRC. Если же разряд сброшен в
«0»,
обращение
производится
к
регистру
UBRRH.
UBRR11 – UBRR0 - Значение скорости передачи в бодах.
Установка скорости передачи в асинхронном режиме. При работе в
асинхронном режиме скорость обмена определяется не только содержимым
регистра UBRR, но и состоянием разряда U2X регистра UCSRA. Если этот
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
33
разряд установлен в «1», коэффициент деления предделителя уменьшается в
два раза, а скорость обмена соответственно удваивается. При работе в
синхронном режиме этот разряд должен быть сброшен.
Итак, скорость обмена определяется следующими формулами:
- асинхронный режим (обычный, U2X = «0»):
BAUD=fCK/ 16 / (UBRR+1);
(4.1)
- асинхронный режим (ускоренный, U2X = «1»):
BAUD= fCK / 8 / (UBRR +1);
(4.2)
- синхронный режим ведущего:
BAUD= fCK/ 2 / (UBRR+ 1), где
–
BAUD
fCK
UBRR
–
скорость
тактовая
–
передачи
частота
содержимое
(4.3)
в
бодах,
микроконтроллера,
регистра
контроллера
скорости передачи (0…4095).
Количество
изменений
информационного
параметра
несущего
периодического сигнала в секунду измеряется в бодах. 1 бод равен одному
изменению информационного параметра в секунду. Например, если такт
передачи информации равен 0,1 секунды, то сигнал изменяется со скоростью 10
бод. Таким образом, скорость в бодах целиком определяется величиной такта
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
34
1.7
Схема устройства
Схема моделируется в программе САПР Proteus. PROTEUS VSM —
пакет
программ
для
автоматизированного
проектирования
(САПР)
электронных схем.
Пакет представляет собой систему схемотехнического моделирования,
базирующуюся на основе моделей электронных компонентов, принятых в
PSpice. Отличительной чертой пакета PROTEUS VSM является возможность
моделирования работы программируемых устройств: микроконтроллеров,
микропроцессоров, DSP и проч. Библиотека компонентов содержит справочные
данные.
Дополнительно
в
пакет
PROTEUS
VSM
входит
система
проектирования печатных плат. Пакет Proteus состоит из двух частей, двух
подпрограмм: ISIS — программа синтеза и моделирования непосредственно
электронных схем и ARES — программа разработки печатных плат. Вместе с
программой
устанавливается
набор
демонстрационных
проектов
для
ознакомления.
Использованы компоненты:
 ATmega16
 Семисегментный индикатор на 4 разряда с общим анодом
 Транзистор BC547
 Кварцевый резонатор 32.768 кГц (часовой)
 Конденсатор керамический 22пФ
 Резистор 120 Ом – 8 шт.
 Резистор 1 кОм – 4 шт.
 Разъём PBS (12 пинов)
 Разъём PBS (2 пина) – 2 шт.
 Разъём PBS (3 пина)
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
35
Для симуляции использованы устройства:
 Генератор сигнала 42 Гц
 Виртуальный UART терминал
Рис. 1.20 – Принципиальная схема устройства
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
36
2 Разделение устройства на отельные модули
Данное устройство разделено на три модуля: основная плата устройства,
блок питания, семисегментный индикатор. Семисегментный индикатор
подключается к плате с помощью гибкого шлейфа.
Изм. Лист
№ докум.
Розраб.
Лободин Я.В.
Руковод.
Зубова С.О.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лит.
Частотомер с передачей
данных по
последовательному порту и
динамической индикацией
У К
Лист
П
37
ПК ЛАУ
Гр. І 41-11
Листов
1
3 Разработка печатных плат модулей проектированного
устройства
Печатная плата разрабатывалась в САПР Proteus.
Размер печатной платы: 58.4 х 77.5 мм
Для экономии средства для травления, а также для уменьшения наводок
использована большая площадка по всему периметру платы (рис. 4.1)
Рис. 4.1 – Печатная плата устройства
Изм. Лист
№ докум.
Розраб.
Лободин Я.В.
Руковод.
Зубова С.О.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лит.
Частотомер с передачей
данных по
последовательному порту и
динамической индикацией
У К
Лист
П
38
ПК ЛАУ
Гр. І 41-11
Листов
1
4 Разработка программы управления
Программа написана на языке C и компилируется с помощью компилятора
avr-gcc (WinAvr). Исходный код состоит из заголовочного файла main.h
(приложение А) и файла main.с (приложение Б).
Изм. Лист
№ докум.
Розраб.
Лободин Я.В.
Руковод.
Зубова С.О.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лит.
Частотомер с передачей
данных по
последовательному порту и
динамической индикацией
У К
Лист
П
39
ПК ЛАУ
Гр. І 41-11
Листов
4
4.1
Компиляция программы
Компиляция программы происходит следующим образом:
1. Для начала нужно установить компилятор avr-gcc, на ОС Windows
известный
как
WinAvr.
Получить
его
можно
на
сайте
http://winavr.sourceforge.net/
2. Также нужно проверить наличие пути к исполняемым файлам WinAvr в
системной переменной PATH. Это можно легко проверить, открыв
командную строку и введя avr-gcc –version(Рис. 3.1):
Рис. 3.1 – Проверка версии компилятора
Далее описывается один из способов компиляции программы на примере
Windows 7.
3. В папке с исходным кодом программы нужно нажать Shift и правую
кнопку мыши. Затем нажать «Открыть окно команд» (Рис. 3.2)
Рис. 3.2 – Открытие окна команд
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
40
Это действие откроет командную строку с рабочей директорией, которую
мы выбрали.
4. Далее следует ввести
avr-gcc -Os -mmcu=atmega16 -DF_CPU=8000000UL -std=gnu99
main.c main.h -o result.elf
-Os – флаг оптимизации
-std=gnu99 – стандарт языка
-DF_CPU=8000000UL – частота тактирования МК
-mmcu=atmega16 – тип микроконтроллера
-o result.elf – файл-результат компиляции
При удачной компиляции появится файл с расширением elf (рис. 3.3)
Рис. 3.3 – Результат компиляции
5. Этот файл содержит в себе данные flash памяти, eeprom памяти и др.
Этим файлом уже можно прошить микроконтроллер. Для извлечения
«чистой» прошивки для flash памяти МК следует выполнить команду
avr-objcopy -O ihex -R.eeprom result.elf firmware.hex (рис. 3.4)
Рис. 3.4 – Результат выполнения команды avr-objcopy
Теперь этим файлом можно прошить микроконтроллер.
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
41
4.2
Проверка работоспособности устройства
В Proteus нужно выбрать программу для микроконтроллера. Для этого
нужно два раза нажать мышкой на микроконтроллер и выбрать прошивку.
Также нужно задать частоту тактирования – внутренний генератор 8 мГц.
Далее можно запустить симуляцию (Рис. 3.5)
Рис. 3.5 – Симуляция работы устройства
Как и ожидалось, дисплей и терминал выводят частоту генератора.
Изм. Лист
№ докум.
Розраб.
Лободин Я.В.
Руковод.
Зубова С.О.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лит.
Частотомер с передачей
данных по
последовательному порту и
динамической индикацией
У К
Лист
П
42
ПК ЛАУ
Гр. І 41-11
Листов
1
5 Разработка конструктива
Моделирование
корпуса
для
устройства
выполнено
в
программе
КОМПАС-3D.
КОМПАС-3D
—
система
трехмерного
проектирования,
ставшая
стандартом для тысяч предприятий, благодаря сочетанию простоты освоения и
легкости
работы
с
мощными
функциональными
возможностями
твердотельного и поверхностного моделирования.
Ключевой особенностью продукта является использование собственного
математического ядра С3D и параметрических технологий, разработанных
специалистами АСКОН.
КОМПАС-3D
обеспечивает
поддержку
наиболее
распространенных
форматов 3D-моделей (STEP, ACIS, IGES, DWG, DXF), что позволяет
организовывать эффективный обмен данными со смежными организациями и
заказчиками, использующими любые CAD / CAM / CAE-системы в работе.
Изм. Лист
№ докум.
Розраб.
Лободин Я.В.
Руковод.
Зубова С.О.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лит.
Частотомер с передачей
данных по
последовательному порту и
динамической индикацией
У К
Лист
П
43
ПК ЛАУ
Гр. І 41-11
Листов
2
Размер готового устройства: 33 х 116 х 80
Рис. 5.1 – Корпус (крышка)
Рис. 5.2 – Корпус (основание)
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
44
ВЫВОД
В результате выполнения курсового проекта было смоделировано
устройство для измерения частоты сигнала. Программа заняла всего лишь 16%
памяти устройства, благодаря этому есть свободное пространство для
последующей модернизации устройства. Например, добавить в устройство
функцию вольтметра.
Данных получилось достаточно для повторения устройства в реальной
жизни: принципиальная схема, разводка печатной платы, список компонентов,
а также чертёж корпуса для устройства.
Данному устройству обязательно найдётся применение в цифровой и
аналоговой схемотехнике, ведь можно измерить частоты выходных сигналов
разнообразных генераторов (в разумных пределах).
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
45
ЛИТЕРАТУРА
1. C/C++. Программирование на языке высокого уровня / Т. А. Павловская. –
СПб.: Питер, 2012. – 461 с.: ил.
2. Шилдт Г. Самоучитель С++: Пер. с англ. – 3-е изд. – СПб.: БХВ-Петербург.
2003. – 688 с.
3. http://samou4ka.net/page/vneshnie-preryvanija-mk-avr
4. http://samou4ka.net/page/tajmer-schetchik-mikrokontrollerov-avr
5. http://easyelectronics.ru/avr-uchebnyj-kurs-asinxronnyj-rezhim-tajmera.html
6. http://we.easyelectronics.ru/antonluba/samye-prostye-chasy-na-avr.html
7. http://alex-exe.ru/radio/avr/avr-uart/
8. http://www.gaw.ru/html.cgi/txt/ic/Atmel/micros/avr/atmega16.htm
http://multimote.ru/avr-freq-meter/ - моя статья
https://github.com/MultiMote/AVR-Freq-meter-7seg - Исходник на GitHub
http://multimote.ru/wp-content/uploads/2015/04/freq-meter-KOMPAS.zip - Чертежи
и модели в КОМПАС-3D
Изм.
Лист
№ докум.
Подп.
Дата
КП 5.05020205.770.ЕТЗIС.ПЗ
Лист
46
Приложение А
#ifndef __MAIN_H_
#define __MAIN_H_
#include <stdint.h>
#include <stdbool.h>
typedef uint8_t byte;
byte buf[16];
uint32_t freq;
uint32_t freq_max;
uint32_t measure_buf;
// порт для сегментов
#define SEGMENTS_DDR DDRA
#define SEGMENTS_PORT PORTA
// порт для разрядов
#define DIGITS_DDR DDRC
#define DIGITS_PORT PORTC
#define SWITCH_TIME 45 // время между переключениями разрядов; чем
меньше, тем меньше мерцает
#define INPUT 0x00
#define OUTPUT 0xFF
#define SYMBOLS_SIZE 11 // количество символов в таблице
byte symbols[SYMBOLS_SIZE] = //состояния пинов для символов
{
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111, // 9
0b10000000 // .
};
int main(void);
void switchDigit(byte digit); // показать нужный разряд, остальные
погасить; значения от 0 до 3
void showDigit(byte number, bool dot); // вывести символ на
разряд, с точкой или без; значения от 0 до SYMBOLS_SIZE
void initTimer(); // инициализация таймера (для нас - часового)
void initInterrupts(); //инициализация прерываний
void initUART(); //инициализация последовательного порта
void sendByte(byte b); //отправка байта по UART
void sendString(byte *str); //отправка строки по UART
#endif //__MAIN_H_
Приложение Б
#include
#include
#include
#include
#include
"main.h"
<avr/io.h>
<avr/interrupt.h>
<util/delay.h>
<stdio.h>
int main(void) {
SEGMENTS_DDR = OUTPUT; // настраиваем порты ввода-вывода
DIGITS_DDR = OUTPUT;
DIGITS_PORT = 0xFF;
initTimer();
initInterrupts();
initUART();
byte i;
uint32_t num;
sprintf(buf, "? Stabilization...\r\n");
sendString(buf);
_delay_ms(100); // ожидаем стабилизации таймера
sprintf(buf, "? Init finished!\r\n");
sendString(buf);
while (1) {
num = freq > 9999 ? 9999 : freq; // ограничиваем показания
for (i = 0; i < 4; ++i) { // перебираем все разряды,
разбираем частоту на цифры
switchDigit(i);
switch (i) {
case 0:
showDigit((byte) ((num / 1000) % 10), false);
break;
case 1:
showDigit((byte) ((num / 100) % 10), false);
break;
case 2:
showDigit((byte) ((num / 10) % 10), false);
break;
case 3:
showDigit(num % 10, false);
break;
default:
break;
}
_delay_ms(SWITCH_TIME);
}
}
}
ISR(TIMER2_OVF_vect) { // прерывание таймера при переполнении
freq = measure_buf;
if (freq > freq_max) freq_max = freq;
measure_buf = 0;
sprintf(buf, "> Freq: %dHz, ", freq); // отправляем данные
sendString(buf);
sprintf(buf, "Max: %dHz\r\n", freq_max);
sendString(buf);
}
ISR(INT0_vect) { //внешнее прерывание
measure_buf++;
}
void showDigit(byte digit, bool dot) {
SEGMENTS_PORT = ~symbols[digit > SYMBOLS_SIZE - 1 ? 10 :
digit] | (dot ? symbols[10] : 0);
}
void switchDigit(byte number) {
DIGITS_PORT = number < 4 ? (byte) (1 << number) : 0x00;
}
void initTimer() {
ASSR |= _BV(AS2); // асинхронный режим, тактируемся от
часового кварца
TCCR2 = _BV(CS20) | _BV(CS22); //предделитель 128, одна
секунда
TIMSK |= _BV(TOIE2); // включаем таймер
}
void initInterrupts() {
MCUCR = (1 << ISC01) | (1 << ISC00); //прерывание по растущему
форонту
GICR = (1 << INT0); //включаем прерывание на INT0
sei(); // разрешаем прерывания
}
void initUART() {
// выставляем скорость: 9600 при частоте 8МГц
// UBRR=8000000/(16*9600)-1=51.0833, округляем = 51 (0x33)
UBRRH = 0x00;
UBRRL = 0x33;
// Разрешаем приём и передачу
UCSRB = (1 << RXEN) | (1 << TXEN);
UCSRB |= (1 << RXCIE);
// устанавливаем формат: 8 бит данных, 2 стоп бита
UCSRC = (1 << URSEL) | (1 << USBS) | (3 << UCSZ0);
}
void sendByte(byte b) {
while (!(UCSRA & (1 << UDRE))); // ожидаем завершения передачи
UDR = b; // записываем байт в буфер
}
void sendString(byte *str) {
while (*str != 0) sendByte(*str++); // побайтно отправляем
строку
}
Download