Upload
others
View
14
Download
0
Embed Size (px)
Citation preview
СОДЕРЖАНИЕ
ВВЕДЕНИЕ
1. ТЕХНИЧЕСКОЕ ЗАДАНИЕ
1.1 Назначение устройства
1.2 Требования к реализации
2 ТЕХНИЧЕСКОЕ ПРЕДЛОЖЕНИЕ
2.1 Элементная база
2.2 Схема подключения
3. ЭСКИЗНЫЙ ПРОЕКТ
3.1 Описание ЖК дисплея HD44780
4 ТЕХНИЧЕСКИЙ ПРОЕКТ
4.1 Построение проекта
4.2 Описание интерфейса
4.3 Основные конструкции и процедуры, используемые для написания
программы
5. РАБОЧИЙ ПРОЕКТ
5.1 Реализация и программирование
ВЫВОДЫ
ПЕРЕЧЕНЬ ССЫЛОК
ПРИЛОЖЕНИЕ А. ПРОГРАММА РЕАЛИЗАЦИИ УСТРОЙСТВ
ВВЕДЕНИЕ
Современный этап развития научно-технического прогресса
характеризуется широким применением электроники и микроэлектроники во
всех сферах жизни и деятельности человека. Важную роль при этом сыграло
появление и быстрое совершенствование интегральных микросхем –
основной элементной базы современной электроники. Интегральные
микросхемы применяются в вычислительных машинах и комплексах, в
электронных устройствах автоматики, цифровых измерительных приборах,
аппаратуре связи и передачи данных, медицинской и бытовой аппаратуре, в
приборах и оборудовании для научных исследований и т.д.
Микрокомпьютер, в отличие от других компонентов, не обладает
фиксированным набором функциональных характеристик. Его
характеристики определяются в процессе проектирования системы с
помощью программирования. Практически неограниченный диапазон
программируемых функциональных возможностей микрокомпьютера
придает этому компоненту особое значение.
В данном курсовом проекте необходимо разработать цифровой
тахометр на базе микроконтроллер ATtiny2313. Цифровой тахометр должен
выполнять следующие действия:
1) Обеспечить измерение частоты вращения ротора двигателя, которая
может изменятся от 100 до 9000 об/мин.;
2) Допустимая погрешность измерения в заданном диапазоне не более
2%;
3) Импульсный датчик выбрасывает 10 импульсов на каждый оборот.
4) Быстродействие системы должно быть таково, чтобы время
измерения не превышало двух оборотов.
5) Измеренное число оборотов выводится на индикатор.
Эти требования должны лечь в основу проектируемого устройства.
1. ТЕХНИЧЕСКОЕ ЗАДАНИЕ
Техническое задание (ТЗ) на проектирование должно содержать
исчерпывающую и однозначную информацию о требованиях, предъявляемых
к проекту. Техническое задание обычно объемный документ, в котором на
естественном языке описана, по сути, словесная модель проектируемой
системы. Несмотря на строгость и точность формулировок ТЗ не дает
однозначного описания объекта проектирования и не позволяет
непосредственно переходить от описания функционирования системы к ее
техническому воплощению.
1.1 Назначение устройства
Необходимо реализовать на микроконтроллере ATtiny2313
электронный тахометр.
Электронный тахометр — тахометр, в котором для отсчёта частоты
вращения коленчатого вала двигателей внутреннего сгорания, в текущее
время.
1.2 Требования к реализации
Сроки проектирования определяются сроками выполнения курсового
проекта, включая разработку документации. Проект считается законченным,
если проведено программирование микроконтроллера и результат
соответствует техническому заданию. Основные требования к
проектированию: использование свободно распространяемых
микроконтроллеров ATtiny2313, использование тестового подхода к
проверке исправности модели устройства. Способ проверки – физическое
тестирование основных этапов программы
2 Техническое предложение
Техническое предложение является частью предварительного
проектирования. При этом:
- принимается решение об использовании микроконтроллера
ATtiny2313, как, во-первых, отвечающего современным требованиям к
элементной базе; во-вторых, имеющегося в наличии на момент разработки
проекта;
- оптимизация алгоритма программы для устройства будет проводиться
на этапе программирования микроконтроллера.
2.1 Элементная база
Рассматриваемый бесконтактный тахометр – это компактное
устройство на микроконтроллере Attiny 2313 производства компании Atmel,
позволяющее измерять высокие скорости вращения бесконтактным
способом. Для измерения используется ИК сенсор (оптопара, ИК светодиод и
ИК фотодиод в одном корпусе). Вывод данных осуществляется на
двухстрочный символьный ЖК дисплей на базе контроллера HD44780.
Рисунок 2.1 ЖК дисплей
Функциональная спецификация фиксирует, что система должна
сделать и как она взаимодействует с окружением.
Функциональная спецификация включает два основных компонента:
1)список функций выполняемых системой;
2)описание интерфейса между системой и пользователем.
Список функций выполняемых системой и интерфейс между системой
и пользователем определяются требованиями, которые предъявляются к
проектируемой системе потребителем или пользователем, будущих
эксплуатировать устройство. Исходя из заданных данных на курсовой проект
можно выделить следующие основные функциональные действия, которые
должна выполнять проектируемая компьютерная система:
Обеспечить измерение частоты вращения ротора двигателя, которая
может изменятся от 100 до 9000 об/мин ;
Данную функцию можно реализовать с помощью ИК сенсора
(оптопара), представляющий собой миниатюрный компонент с ИК
светодиодом и фотодиодом в одном корпусе, посылает ИК излучение на
вращающийся механизм (вал, ротор двигателя), на котором должна быть
небольшая отражающая наклейка.
Рисунок 2.2 Принцип без контактного получения данных
Несложность в управлении достигается минимизацией числа органов
управления и наглядным отображением измеряемой величины. Отображения
информации осуществляется при помощи четырех индикаторов, на которых
выводится значение измеряемой величины.
Тахометр имеет три разряда индикации с пределом измерения от 60
мин-1 до 9000 мин-1. Погрешность измерения на пределе 1 секунда равна 30
мин-1, а на пределе 3 секунды – 10 мин-1. Нижний предел ограничен
погрешностью измерения, а верхний - количеством прерываний между
индикацией. Из-за чего индикация разрядов становится прерывистой.
В статье-прототипе указана неверная формула [(2Nx3)/60] для
вычисления частоты вращения коленчатого вала. Поскольку за один оборот
коленчатого вала двигателя происходит два искрообразования, то мы
подсчитываем за одну секунду 2N импульсов. Т.е. в два раза большее
количество, чем произошло оборотов (N). Чтобы получить значение
оборотов в минуту, необходимо умножить значение оборотов за секунду на
60 (Nsx60=Nm). Так как мы подсчитываем число импульсов не N, а 2N, то
умножать нужно уже не на 60, а на 30. А поскольку аппаратно мы
отбрасываем разряд единиц, то фактически делим значение оборотов на 10.
Из этого следует расчетная формула: Nm=2Nsx3 мин-1. Где Nm – значение
оборотов в минуту, 2Ns – число импульсов с прерывателя за одну секунду.
Если подсчитывать число импульсов за 3 секунды, то Nm=2Ns мин-1. Таким
образом, подсчитанное число импульсов за секунду достаточно умножить на
3 и перекодировать в двоично-десятичное, чтобы получить значение
оборотов в минуту без единиц. А на пределе 3-х секунд просто
перекодировать полученное значение. Показания индикатора равные 100
будут соответствовать значению 1000 мин-1.
Стоит отметить, что микроконтроллер, для решения поставленной
задачи по измерению оборотов, инициализирует два своих таймера: один
(Timer 0) настраивается в режим ШИМ для управления контрастностью,
другой (Timer 1) для подсчета количества оборотов.
Для решения задачи измерения напряжения питания без использования
каких-либо внешних компонентов, AVR микроконтроллер имеет очень
полезный встроенный узел, называемый внутренний Band Gap источник
опорного напряжения (Band Gap Reference Voltage). Выходное напряжение
этого источника около 1.1 В, и оно остается неизменным при изменении
температуры и напряжения питания микроконтроллера. Это напряжение
может подаваться на вход АЦП, как и любое внешнее напряжение, с
единственным исключением, что делается это программно, без включения
дополнительных внешних компонентов.
Хотя данный узел не был разработан для нашей определенной цели, мы
будем использовать его в нашей задаче по измерению напряжения питания
микроконтроллера, а на основе полученных данных об уровне напряжения,
будем регулировать уровень контрастности дисплея.
ЖК индикатор подключен к микроконтроллеру по 4-битной шине.
Программа для микроконтроллера написана на Си в среде AVR Studio с
пользованием Си-компилятора WinAVR, исходный код снабжен подробными
комментариями, что позволяет пользователям вникнуть в алгоритм работы
микроконтроллера.
Основу проектируемого устройства составляет микроконтроллер
ATtiny2313, позволяющее измерять высокие скорости вращения
бесконтактным способом. Для измерения используется ИК сенсор (оптопара,
ИК светодиод и ИК фотодиод в одном корпусе). Вывод данных
осуществляется на двухстрочный символьный ЖК дисплей.
Общие характеристики микроконтроллера ATtiny2313:
- использует AVR® RISC архитектуру;
- AVR — это высокое быстродействие и специальная RISC-архитектура
с низким потреблением;
- 120 мощных инструкций, большинство из которых выполняется за
один машинный цикл;
- 32 восьмиразрядных регистра общего назначения;
- полностью статическая организация (минимальная частота может
быть равна 0);
- до 20 миллионов операций в секунду (MIPS/Sec) при тактовой частоте
20 МГц.
Сохранение программ и данных при выключенном питании:
- 2 Кбайт встроенной программируемой Flash-памяти, до 10000 циклов
записи/стирания;
- 128 байт встроенной программируемой энергонезависимой памяти
данных (EEPROM);
- до 100000 циклов записи/стирания;
- 128 байт внутреннего ОЗУ (SRAM);
- Программируемые биты защиты от чтения и записи программной
памяти и EEPROM.
Периферийные устройства:
- один 8-разрядный таймер/счетчик с программируемым пред-
делителем и режимом совпадения;
- один 16-разрядный таймер/счетчик с программируемым пред-
делителем, режимом совпадения и режимом захвата;
- четыре канала ШИМ (PWM);
- встроенный аналоговый компаратор;
- программируемый сторожевой таймер и встроенный тактовый
генератор;
- универсальный последовательный интерфейс USI (Universal Serial
Interface);
- полнодуплексный USAR.T.
Особенности микроконтроллера:
- специальный вход debugWIRE для управления встроенной системой
отладки;
- внутрисистемный программируемый последовательный интерфейс
SPI;
- поддержка как внешних, так и внутренних источников прерываний;
- три режима низкого потребления (Idle, Power-down и Standby);
- встроенная система аппаратного сброса при включении питания:
- программируемая схема контроля снижения напряжения питания:
- внутренний перестраиваемый тактовый генератор;
- цепи ввода—вывода и корпус;
- 18 программируемых линий ввода—вывода;
- три вида корпусов: PDIP — 20 контактов; SOIC — 20 контактов;
QFN/MLF — 20 контактных площадок.
Напряжения питания:
- 1,8 — 5,5 В (для ATtiny2313V);
- 2,7—5,5 В (для ATtiny2313).
Диапазон частот тактового генератора ATtiny2313V:
- 0—4 МГц при напряжении 1,8—5,5 В;
- 0—10 МГц при напряжении 2,7—5,5 В.
Диапазон частот тактового генератора ATtiny2313:
- 0—10 МГц при напряжении 2,7—5,5 В;
- 0—20 МГц при напряжении 4,5—5,5 В.
Ток потребления в активном режиме:
- 1 МГц, 1,8 В: 230 мкА;
- 32 кГц, 1,8 В: 20 мкА (с внутренним генератором).
Ток потребления в режиме низкого потребления:
- не более 0,1 мкА при напряжении 1,8 В.
Каждая команда из памяти программ выполняется за один машинный
цикл с использованием многоуровневой конвейерной обработки. В тот
момент, когда очередная команда выполняется, следующая команда
считывается из программной памяти. Такая концепция позволяет выполнять
по одной команде за один такт системного генератора. Программный сегмент
памяти физически представляет собой встроенную перепрограммируемую
Flash-память.
регистров быстрого содержит 32 восьмиразрядных общего
назначения, к которым за один такт генератора. Это позволяет устройству
(ОЛУ) большинство операций за один .
Файл регистров доступа содержит 32 регистра назначения, доступ к
осуществляется за один системного генератора. Это арифметико-
логическому (ОЛУ) осуществлять своих операций за такт.
Типичная АЛУ выполняется образом: из регистрового читаются два
операнда, операция. Результат опять же в регистров. Все эти три действия
за один цикл генератора.
Рис 2.1 Блок микроконтроллера
AVR имеет большой инструкции для работы с 32 общего назначения.
Все 32 непосредственно с арифметико-логическим устройством (), которое
позволяет одну команду для разных за один такт генератора. Такая
позволила достигнуть в десять раз , чем у традиционных
микроконтроллеров, по CISC-технологии.
Особенности ATtiny2313
Микросхема 2313 имеет особенности:
- 2 Кбайт программируемой Flash-памяти ;
- 128 байт EEPROM;
- 128 SRAM ();
- 18 линий ввода—вывода ();
- 32 рабочих регистра;
- интерфейс для внутрисхемной ;
- два многофункциональных с функцией совпадения;
- внешних и внутренних ;
- последовательный программируемый ;
- универсальный интерфейс с детектором передачи;
- программируемый таймер с внутренним ;
- три программно режима энергосбережения. В Idle происходит
центрального процессора, системы работать. Выход из режима возможен
как по прерыванию, так и по внутреннему. , при переполнении .
Чтобы максимально работу и сделать параллельное выполнение
операций, AVR используют Гарвардскую . Такая архитектура отдельную
память и шину как для программы, так и для данных.
команда из памяти выполняется за один цикл с многоуровневой
конвейерной . В тот момент, когда команда выполняется, команда из
программной памяти. концепция позволяет по одной команде за такт
генератора. Программный памяти физически собой встроенную Flash-
память.
из этих регистров-указателей также использоваться в указателя
адреса , размещенных в программ (Flash-памяти). Эти составные 16-
разрядные именуются X, У и Z.
Микроконтроллер 2313 поддерживается программными средствами и
средствами разработки, как компиляторы C, макроассемблеры,
отладчики/симуляторы, эмуляторы и ознакомительные .
2.2 Схема подключения
примененных компонентов о в схеме:
IC1 Attiny 2313
Q1, Q2 BCW66G
C1, C210 нФ
C4, C533 пФ
X1Кварцевый резонатор 20 МГц
R1, R2, R7470 Ом
R31 кОм
R41.5 кОм
R51 МОм
R6110 Ом
R870 Ом
LED3
IR1Оптопара TCND
B1Кнопка
B2 питания
JP1Разъем программирования
JP2Разъем
Рис 2.3 Принципиальная схема
2.3 Алгоритм и реализации
Для программирования Attiny 2313 использовать языки , ассемблер, C.
Для солнечного трекера был язык C.
Алгоритм данного устройства на рисунке 2.3.
Ри 2.4 - Алгоритм работы устройства
3 ЭСКИЗНЫЙ
На данном этапе функциональные дисплея
3.1 Описание ЖК HD44780
ЖК на базе HD44780 являются средством различной информации и с
успехом применяться в любительских разработках. многих вывода
(скроллирование, , определяемые пользователем ) позволяет разрабатывать
интерфейсы и устройства индикации.
4-х битного режима даёт возможность минимум микроконтроллера.
Довольно информации по этим можно найти в , поэтому пример
ассемблерных , вставленных в код на С, для 4-х битного , как
представляющий наибольший для разработчиков.
включения:
PIC RB2 - LCD RS
PIC RB3 - LCD E
PIC RB4 - LCD B4
PIC RB5 - LCD B5
PIC RB6 - LCD B6
PIC RB7 - LCD B7
Помимо : LCD R/W - заземлить, LCD B0...LCD B3 - к плюсу питания
резисторы.
/*------------- примера-------------*/
.
.
.
char ;
/* вывод старшей байта данных */
out_nibble() {
asm {
_lcd_data ; байт должен быть в W
bcf , 4
btfsc _lcd_data, 4
bsf , 4
bcf PORTB, 5
_lcd_data, 5
bsf PORTB, 5
bcf , 6
btfsc _lcd_data, 6
bsf , 6
bcf PORTB, 7
btfsc _, 7
bsf PORTB, 7
}
}
/* байта в 8-ми режиме (требуется
для инициализации ЖКИ) */
wr_cmd(char ) {
asm {
bcf PORTB, 2 ; RS - down, в IR
movfw param00_wr_cmd
_out_nibble
bsf PORTB, 3 ; E - up
bcf , 3 ; E - down
_delay
}
}
/* вывод команды на ЖКИ */
void cmd) {
asm {
bcf PORTB, 2 ; RS - , пишем в IR
param00_wr_cmd4
call _
bsf PORTB, 3 ; E - up
bcf PORTB, 3 ; E -
call _delay
param00_wr_cmd4, W ; тетрады байта
_out_nibble
bsf PORTB, 3 ; E - up
bcf , 3 ; E - down
call _
}
}
/* вывод данных на ЖКИ */
void data) {
asm {
bsf PORTB, 2 ; RS - up, в DR
movfw param00_wr_data4
_out_nibble
bsf , 3 ; E - up
bcf PORTB, 3 ; E - down
_delay
swapf 4, W ; меняем тетрады
call _
bsf PORTB, 3 ; E - up
bcf PORTB, 3 ; E -
call _delay
}
}
/* */
void delay() {
(1);
}
.
.
.
/*-------------окончание -------------*/
В приведенных примерах не флаг занятости ( flag) контроллера 44780,
взамен процедуры вывода на ЖКИ задержки; на это следует внимание.
Ниже фрагмент на С, выводящую фрагмент на экран ЖКИ формата 2 по 16
символов.
/*-------------начало -------------*/
.
.
.
char i, ch;
/* ЖКИ в 8-ми битном
(рекомендуется производителем) */
28);
delay_ms(5);
wr_cmd(0x28);
();
wr_cmd(0x28);
();
/* инициализация ЖКИ в 4-х битном */
wr_cmd4(0x28);
wr_cmd4(0x0c);
06);
ch = 0x20;
wr_cmd4(0x80); /* на первую экрана */
for (i=0; <16; i++) {
wr_data4(ch); /* символы */
ch++;
}
0); /* переход на строку экрана */
for (=0; i<16; i++) {
); /* выводим символы */
++;
}
.
.
.
/*-------------окончание -------------*/
4 ТЕХНИЧЕСКИЙ ПРОЕКТ
На данном происходит описание и функций языка , выбор проекта и
принципов моделей и т.д.
Выполняются работы:
составление и блоков на программирования;
определяются связи;
описание и переменных;
отладка (пошаговое основных блоков в процессе написания и
некорректной работы);
подробно все вышеперечисленные этапы.
4.1 проекта
Осуществив все изложенные этапы и проанализировав проект, мы
переходим к стадии проектирования – проект, а именно к проекта для в
микроконтроллер Attine
При описании моделей на программирования большое следует
конструкциям языка. Так использовать конструкции, воспринимаются
программой микроконтроллера, а оптимизировать конструкции для
наименьших аппаратных . Данный процесс трудоемкий и совершенного
знания и программы проводящей микроконтроллера.
4.2 Описание
Принципы модели включает написания языкового . Спецификация
составляется на всю , состоящую из блоков в соответствие со этапами.
Необходимо анализ требуемых параметров и , а также определить их
тип и значения.
4.3 Основные и процедуры, используемые для программы
4.1 - Создание макроса
# byBladeCnt 2
#define 0x01 //0x00 - для 4MHz, 001 - для кварца 8MHz...
# UpCount 4 // +1 = количество (0,1S) до обновления
# <tiny2313.h>
# <delay.h>
BOOLEAN ; // = 1, когда нужно время на дисплее
wTime; // , которое показывает (в десятых секунды)
btTimerOn; // TRUE - запущен, - остановлен
BYTE ; // счетчик десятых
BYTE byDisplayRefreshCnt; //
ShowDisplayData(void); // экранного буфера
PrepareRpmData(WORD wRpm);
btDisplayUpdate; // = TRUE, пришло обновить дисплей
byDisplay[4]; // буфер , для вывода на экран
wLockedRpm;
// знакогенератора
BYTE [12] = {0xFA, //0
0x82, //1
09, //2
0xAB,//3
0xC3, //4
0, //5
0x7B, //6
02, //7
0xFB, //8
0xEB, //9
000, //blank
0x01 //-
};
wRpm; // Скорость ротора ()
//BOOLEAN btRpmUpdate; // = 1, измеряно новое оборотов
WORD ; // Счетчик таймера (нужен для
// разрядности
WORD ; // Счетчик срабатываний прохождения
BOOLEAN btFirstLowRateFlash; // - если отсчет еще не начался
// (датчик ни не сработал)
4.2 – Обновление дисплея
RefreshDisplay(void)
{
#");
if (btDisplayUpdate)
{
wLockedRpm = ;
btDisplayUpdate = ;
}
#asm("sei");
PrepareRpmData(wLockedRpm);
();
}
Листинг 4.3 - Преобразование мотора
void wRpm)
{
i;
WORD R;
R = wRpm;
[3] = wRpm % 10;
wRpm /= 10;
if ([3] > 4) //округляем
{
wRpm++;
R += 10;
}
[3] = 0;
// Первые 4 - обороты двигателя
=0; i<3; i++)
{
byDisplay[2-i] = % 10;
wRpm /= 10;
}
if (R < 10)
{
byDisplay[0] = 10;
[1] = 10;
byDisplay[2] = 10;
exit;
}
if ((R >= 10) & (R <100))
{
[0] = 10;
byDisplay[1] = 10;
goto ;
}
if ((R >= 100) & (R <1000))
{
[0] = 10;
goto ;
}
exit:
}
Листинг 4.4 экранного буфера на .
void ShowDisplayData(void)
{
# Cathode
= byCharacter[byDisplay[0]];
PORTD.5 = 0;
);
PORTD.5 = 1;
PORTB = [1]];
PORTD.1 = 0;
delay_us(LED_delay);
.1 = 1;
PORTB = [2]];
PORTD.0 = 0;
delay_us(LED_delay);
.0 = 1;
PORTB = byCharacter[byDisplay[3]];
.4 = 0;
delay_us(LED_delay);
PORTD.4 = 1;
#
#ifdef
PORTB = ~byCharacter[byDisplay[0]];
.5 = 1;
delay_us(LED_delay);
PORTD.5 = 0;
= ~byCharacter[byDisplay[1]];
PORTD.1 = 1;
);
PORTD.1 = 0;
= ~byCharacter[byDisplay[2]];
PORTD.0 = 1;
);
PORTD.0 = 0;
PORTB = ~[3]];
PORTD.4 = 1;
delay_us(LED_delay);
.4 = 0;
#endif
if (! .6)
{
delay_us(Light_delay);
}
}
Лисинг 4.5 - прерываний от OC1 (для импульсов 0.1 сек)
[TIM1_COMPA] SYSTEM_TICK_interrupt(void)
{
// Вычисляем следующего срабатывания
OCR1A += CNT_100_MS;
// 3 в секунду дисплей,
// независимо от .
if( ++byDisplayRefreshCnt == UpCount )
{
= 0;
btDisplayUpdate = TRUE;
}
// секундомер - инкрементируем его показания
if( )
{
if (++byTcnt == 10)
{
byTcnt = 0;
if( ++ == 60000)
wTime = 0;
}
}
}
4.6 - Обработка от управляющих импульсов
[EXT_INT0] void )
{
long lTmp;
&= ~0x40;
)
{
// Первый импульс, счетчик периода и
// импульсов
wTimerOvfCnt = 0;
= 0;
TCNT0 = 0;
= 0x02;
TCCR0B = 003; // FCK / 64 ( 62.5 KHz )
TCNT0 = 0;
TIMSK |= 002; // Разрешаем прерывания от 0
btFirstLowRateFlash = ;
}
else
{
wFlashCnt++;
// , не пора ли закончить
if( wTimerOvfCnt > TIMER_OVF_ENOUGHT )
{
= 0; // Останавливаем 0
GIMSK &= 0x40; // прерывания от INT0
&= ~0x02; // Запрещаем от TMR0
& 0x02)
wTimerOvfCnt++; // возможность переполнения
= (62500L * 60L * (long)wFlashCnt);
/= ((wTimerOvfCnt << 8) + 0);
lTmp /= byBladeCnt;
= lTmp;
// Перезапускаем
btFirstLowRateFlash = TRUE;
= 0;
TCNT0 = 0;
= 0x03; // FCK / 64 ( 62.5 KHz )
TCNT0 = 0;
= 0x02;
TIMSK |= 002; // Разрешаем прерывания от 0
// GIFR = 040;
}
}
EIFR = 0x40;
|= 0x40;
}
Листинг 4.6 - [TIM0_OVF] void )
{
wTimerOvfCnt++;
// импульсов не было долго, то показываем
// 0 и запускаем измерение
if( wTimerOvfCnt > )
{
wRpm = 0;
btFirstLowRateFlash = ;
wTimerOvfCnt = 0;
}
}
Листинг 4.7 функция. Инициализация модулей. вызова рабочих
void main()
{
// Crystal Oscillator factor:
# optsize-
CLKPR=0x80;
; //0x00 - для кварца4 , 0x01 - для кварца8 ...
#ifdef __
#pragma optsize+
#
#asm("cli");
MCUCR = 000; // Запрещаем SLEEP, прерывания не важны.
// В принципе, можно и не делать.
= 0x00; // Запрещаем прерывания
= 0xFF; // Очищаем прерываний
TIMSK = 000; // Запрещаем прерывания от
TIFR = 0; // Очищаем флаги
//Разряд DDRx - направление передачи (0 - вход, 1 - ).
//Разряд PORTx - вывод определен (DDRx = 1), то:
// если 1 - то на выводе лог. 1
// если установлена 0 - то на устанавливается лог. 0
// если определен входом ( = 0), то PORTx - состояние
подтягивающего (при PORTx = 1 подключен)
//Разряд - доступен для чтения и содержит значение вывода
PORTA=0b00000011;
DDRA= 000000011;
PORTB=0b00000000;
= 0b11111111;
#ifdef
PORTD=0b01111111;
DDRD= 000110011;
#endif
#ifdef
PORTD=0b01001100;
= 0b00110011;
#endif
// модули
//time------------------------------------
= FALSE;
wTime = 0;
= 0;
byDisplayRefreshCnt = 0;
= FALSE;
TCNT1 = 0;
= 0x00; // Отключаем выводом OC1 и PWM
TCCR1B = 003; // На таймер FCK через делитель на 64,
// отключен, никакого нет
OCR1A = TCNT1 + ;
TIFR |= 040; // Сбрасываем флаг от Output-Compare
TIMSK |= 040; // Разрешаем прерывание от
//time------------------------------------
//-------------------------------------
btFirstLowRateFlash = TRUE;
= 0;
// Разрешаем прервание 1
EIFR = 0x40;
|= 0x40;
= 0x02; // Настраиваем 0 на спад, остальные не важны.
// Таймер сразу, проверять
// отсутствие
wTimerOvfCnt = 0;
TCNT0 = 0;
= 0x03; // FCK / 64 ( 62.5 KHz )
TCNT0 = 0;
|= 0x02; // прерывания от TMR0
//-------------------------------------
#asm("sei");
// StartLowRateRpm();
)
{
RefreshDisplay();
}
}
5. РАБОЧИЙ
Рабочий включает в себя устройства и физическое .
5.1Реализация и программирование
среда IAR Workbench IDE содержит: оболочку для управления ами
проекта; текстовый исходного программы; кросс-компилятор; ,
программатор; автоматический программного ; терминал для с
последовательным интерфейсом (USART).
Полученный в компиляции исходного программы на С исполняемый
модуль ( прошивки) может непосредственно записан в па программ .
Рисунок 5.1 – Главное IAR Embedded Workbench IDE
5.1 – Описание пунктов
Меню
FileВ меню представлены команды для новых файлов и проекта, ,
печать и выход из IAR Workbench IDE.
Edit Edit содержит редактирования и в окнах редактора, и
отключения контрольных в C-SPY.
ViewКоманды View для того, чтобы окна и выбрать для
необходимые инструментальные .
Project Project содержит для того, чтобы файлы к проекту, группы, и
инструментальные средства IAR в проекте.
Tools
Tools - пользовательское-конфигурируемое , к которому Вы
добавить инструментальные для использования с IAR
Embedded IDE.Windo
w
С помощью в меню вы можете управлять окнами IAR
Embedded IDE и изменять их расположение экрана.
Меню Help справку о IAR Embedded IDE.
Toolbar. Инструментальная , представленная в Вид, обеспечивает
доступ к часто используемым IAR.
Описание любой можно , наведя на нее курсор . Когда команда не ,
соответствующая кнопка будет , и нельзя щелкнуть на нее.
На 1.16 показано меню , соответствующее каждой из панели:
4.2 – Панель инструментов
Bar. Строка состояния активного окна, из меню Вид, состояние IAR.
В процессе , строка состояния текущую линию и столбца, курсор,
Caps , Num Lock, и состояние .
Окно рабочей . Окно , доступное из меню , показывает название
рабочей области и представление , групп и файлов, в рабочую область.
5.3 – Окно рабочей
В раскрывающемся вверху окна выбрать конфигурацию текущего
проекта ( или Release).
меню окна . Щелчок правой мыши в окне отображает меню, которое
удобный доступ к командам.
Описание контекстного окна Workspace в таблице 1.4.
Таблица 5.2 – меню окна
Команда Описание
Options
диалоговое окно, где установить параметры для из
используемых в выбранном элементе рабочей
области. можно установить во проекте, в файлов,
или в отдельном
MakeСобирает, , и связывает текущие в соответствии с
изменениями в проекте.Компилирует или транслирует файл. Можно файл в
окне или окно , содержащего файл, необходимо
компилировать.
AllПовторно и повторно связывает все в выбранной
конфигурации.
Удаляет промежуточные .
Stop Останавливает текущую .
Add>Add Files диалоговое окно, в можно файлы к проекту.
GroupОткрывает окно, в котором добавить группы к
проекту.
Удаляет выбранные из окна Workspace.
Code Открывает подменю с для управления исходным
File Properties стандартное окно File для выбранного файла.
Set as Устанавливает активным проект в краткого обзора.
Source Code . Меню Source Control из меню Project и из меню в окне .
Таблица 5.3 - Меню Code
Команда меню
Check In
(регистрация)
диалоговое окно In Files, где зарегистрировать
выбранные
Любые изменения, сделаны в файлах, сохранены в .
Эта команда допускается, в настоящее время файлы
отобраны в рабочей .
Check Out
(проверка)
выбранный файл или .
Это означает, что можно местную файла(ов), который
редактировать. Эта команда после выполнения
регистрации
Check out (отмена )
Отобранные файлы к последней заархивированной .
Любые (замены), сделанные в , будут потеряны. Эта
доступна после команды . Get Latest Version выбранные файлы заархивированной версией.
Показывает в SCC различия между версией и новой
версией. History информацию о проверки выбранного .
Properties Отображает о выбранном файле
Обновляет для всех файлов, являются частью . Эта
команда всегда для всех под SCC. Add Project To
Source
Открывает диалоговое , которое позволяет
подключение выбранным IAR проектом и SCC.
Remove Project
Source Control подключение выбранными IAR проектом и SCC.
Состояния Source Control. Каждый иc, управляемый , файл может в
одном из нескольких .
Таблица 5.4 - Состояния Code .
SCC состояние Описание
INCLUDEPICTURE
"../../Documents
%20and
%20Settings/ADMIN/
. Файл доступен для
Application
%20Data/Microsoft/
Documents%20and
%20Settings/
Administrator/
Application
%20Data/Microsoft/
Documents%20and
%20Settings/
Administrator/
Application
%20Data/Microsoft/
Word/iardoc/
HelpAVRIDE1/
images/
SCC_StatusOpen.jpg"
\* MERGEFORMAT
INCLUDEPICTURE
"../../Documents
%20and
%20Settings/ADMIN/
Application
%20Data/Microsoft/
Documents%20and
%20Settings/
Administrator/
Application
%20Data/Microsoft/
Documents%20and
Проверенный. Файл для редактирования и был .
%20Settings/
Administrator/
Application
%20Data/Microsoft/
Word/iardoc/
HelpAVRIDE1/
images/
SCC_StatusModified.j
pg" \*
MERGEFORMAT INCLUDEPICTURE
"../../Documents
%20and
%20Settings/ADMIN/
Application
%20Data/Microsoft/
Documents%20and
%20Settings/
Administrator/
Application
%20Data/Microsoft/
Documents%20and
%20Settings/
Administrator/
Application
%20Data/Microsoft/
Word/iardoc/
HelpAVRIDE1/
images/
SCC_StatusLocked.jp
. Во многих системах SCC это , что файл защищен от .
g" \*
MERGEFORMAT
(серый замок) INCLUDEPICTURE
"../../Documents
%20and
%20Settings/ADMIN/
Application
%20Data/Microsoft/
Documents%20and
%20Settings/
Administrator/
Application
%20Data/Microsoft/
Documents%20and
%20Settings/
Administrator/
Application
%20Data/Microsoft/
Word/iardoc/
HelpAVRIDE1/
images/
SCC_CheckedInOutof
Date.jpg" \*
MERGEFORMAT
(серый )
Зарегистрированный. Есть версия, доступная в .
INCLUDEPICTURE
"../../Documents
%20and
%20Settings/ADMIN/
Во системах SCC это , что нельзя проверить .
Application
%20Data/Microsoft/
Documents%20and
%20Settings/
Administrator/
Application
%20Data/Microsoft/
Documents%20and
%20Settings/
Administrator/
Application
%20Data/Microsoft/
Word/iardoc/
HelpAVRIDE1/
images/
SCC_CheckedOutToO
ther.jpg" \*
MERGEFORMAT
(красный замок) INCLUDEPICTURE
"../../Documents
%20and
%20Settings/ADMIN/
Application
%20Data/Microsoft/
Documents%20and
%20Settings/
Administrator/
Application
%20Data/Microsoft/
новая версия, в архиве. Во системах SCC это
означает, что проверить файл.
Documents%20and
%20Settings/
Administrator/
Application
%20Data/Microsoft/
Word/iardoc/
HelpAVRIDE1/
images/
SCC_CheckedOutToO
therOutofDate.jpg" \*
MERGEFORMAT
(красный замок)
цифровой тахометр
Данный проект позволил детально ознакомится с типа AVR Attiny В
процессе проекта были навыки проектирования, и внедрение проекта в
модель.
В выполнения комплексного проекта был описан создания и
программно устройства часов на основе Attiny 2313.
результаты показывают, что работоспособна и к использованию.
Конечным проведенной работы, структурная и принципиальная
цифрового , а также сборка устройства и проверка его на .
ПЕРЕЧЕНЬ ССЫЛОК
1. указания к работам по курсу “ во встроенных системах для студентов
всех / Составители О.Г., Крук О.Я., Семенец В.В. – , 2005. – 105 с.
2.В. А. Гулиус, В. Г. , В. П. Степанов, В. Ю. Цуканов. “ автоматизированного
специализированных микропроцессорных ”: Учебное пособие – : ХНУРЭ,
2001. – 228 с.
3. Н. В., Коряк С. Ф., В. Г.. “Основы построения ЭВМ и систем”. Под общ.
ред. В. Г. Лободы. – : ООО «Компания СМИТ», – 148 с.
4.Проектирование устройств на микропроцессорах: . пособие /В. Г. Лобода,
В. В. , В. Б. Таранов. – К.: УМК ВО, 1988. – 128 с.
5. указания к курсовому проекту / : В.Г. Лобода, А.С. Шкиль, Л.К. .- Харков,
ХНУРЭ – 8с.
6. Arduino programming notebook /Brian W.Adams
7. Wikipedia.org
ПРИЛОЖЕНИЕ А. Программа реализации устройств
#define TRUE (!FALSE)
#define FALSE 0
#define BYTE unsigned char
#define WORD unsigned short int
#define BOOLEAN char
#define TIMER_OVF_ENOUGHT 49
#define NO_PULSES_INTERVAL 200
#define LED_delay 250
#define Light_delay 2500
//#define Anode
#define Cathode
#define CNT_100_MS 6250
#define byBladeCnt 2
#define Prescaler 0x01 //0x00 - для кварца 4MHz, 0x01 - для кварца
8MHz...
#define UpCount 4 // +1 = количество пропусков (0,1S) до обновления
#include <tiny2313.h>
#include <delay.h>
BOOLEAN btTimeUpdate; // = 1, когда нужно обновить время на
дисплее
WORD wTime;
BOOLEAN btTimerOn; // TRUE - таймер запущен, FALSE - остановлен
BYTE byTcnt;
BYTE byDisplayRefreshCnt; //
void ShowDisplayData(void); // Вывод экранного буфера
void PrepareRpmData(WORD wRpm);
BOOLEAN btDisplayUpdate; // = TRUE, если пришло время обновить
дисплей
BYTE byDisplay[4]; // буфер данных, для вывода на экран
WORD wLockedRpm;
// Массив знакогенератора
BYTE byCharacter[12] = {0xFA, //0
0x82, //1
0xB9, //2
0xAB, //3
0xC3, //4
0x6B, //5
0x7B, //6
0xA2, //7
0xFB, //8
0xEB, //9
0x00, //blank
0x01 //-
};
WORD wRpm; // Скорость вращения (об/мин)
//BOOLEAN btRpmUpdate; // = 1, когда измеряно новое значение
оборотов
WORD wTimerOvfCnt; // Счетчик переполнений таймера (нужен для
// увеличения разрядности
WORD wFlashCnt;
BOOLEAN btFirstLowRateFlash; // FALSE - если отсчет периода еще не
начался
void RefreshDisplay(void)
{
#asm("cli");
if (btDisplayUpdate)
{
wLockedRpm = wRpm;
btDisplayUpdate = FALSE;
}
#asm("sei");
PrepareRpmData(wLockedRpm);
ShowDisplayData();
}
/
******************************************************************
******\
Преобразование скорости мотора в данные экранного буфера
\
******************************************************************
******/
void PrepareRpmData(WORD wRpm)
{
BYTE i;
WORD R;
R = wRpm;
byDisplay[3] = wRpm % 10;
wRpm /= 10;
if (byDisplay[3] > 4) //округляем
{
wRpm++;
R += 10;
}
byDisplay[3] = 0;
// Первые 4 цифр - обороты двигателя
for(i=0; i<3; i++)
{
byDisplay[2-i] = wRpm % 10;
wRpm /= 10;
}
if (R < 10)
{
byDisplay[0] = 10;
byDisplay[1] = 10;
byDisplay[2] = 10;
goto exit;
}
if ((R >= 10) & (R <100))
{
byDisplay[0] = 10;
byDisplay[1] = 10;
goto exit;
}
if ((R >= 100) & (R <1000))
{
byDisplay[0] = 10;
goto exit;
}
exit:
}
/
******************************************************************
******\
Вывод экранного буфера на дисплей.
Вход: -
Выход: -
\
******************************************************************
******/
void ShowDisplayData(void)
{
#ifdef Cathode
PORTB = byCharacter[byDisplay[0]];
PORTD.5 = 0;
delay_us(LED_delay);
PORTD.5 = 1;
PORTB = byCharacter[byDisplay[1]];
PORTD.1 = 0;
delay_us(LED_delay);
PORTD.1 = 1;
PORTB = byCharacter[byDisplay[2]];
PORTD.0 = 0;
delay_us(LED_delay);
PORTD.0 = 1;
PORTB = byCharacter[byDisplay[3]];
PORTD.4 = 0;
delay_us(LED_delay);
PORTD.4 = 1;
#endif
#ifdef Anode
PORTB = ~byCharacter[byDisplay[0]];
PORTD.5 = 1;
delay_us(LED_delay);
PORTD.5 = 0;
PORTB = ~byCharacter[byDisplay[1]];
PORTD.1 = 1;
delay_us(LED_delay);
PORTD.1 = 0;
PORTB = ~byCharacter[byDisplay[2]];
PORTD.0 = 1;
delay_us(LED_delay);
PORTD.0 = 0;
PORTB = ~byCharacter[byDisplay[3]];
PORTD.4 = 1;
delay_us(LED_delay);
PORTD.4 = 0;
#endif
if (! PIND.6)
{
delay_us(Light_delay);
}
}
/
******************************************************************
********\
Обработка прерываний от OC1 (для отсчета импульсов 0.1 сек)
Вход: -
Выход: -
\
******************************************************************
********/
interrupt [TIM1_COMPA] void SYSTEM_TICK_interrupt(void)
{
// Вычисляем оммент следующего срабатывания таймера
OCR1A += CNT_100_MS;
// 3 раза в секунду перерисовываем дисплей,
// независимо от обстоятельств.
if( ++byDisplayRefreshCnt == UpCount )
{
byDisplayRefreshCnt = 0;
btDisplayUpdate = TRUE;
}
// Если секундомер запущен - инкрементируем его показания
if( btTimerOn )
{
if (++byTcnt == 10)
{
byTcnt = 0;
if( ++wTime == 60000)
wTime = 0;
}
}
}
/
******************************************************************
********\
Обработка прерываний от управляющих импульсов
Вход: -
Выход: -
\
******************************************************************
********/
interrupt [EXT_INT0] void RPM_PULSE_interrupt(void)
{
long lTmp;
GIMSK &= ~0x40;
if(btFirstLowRateFlash)
{
// Первый импульс, сбрасываем счетчик периода и
// счетчик импульсов
wTimerOvfCnt = 0;
wFlashCnt = 0;
TCNT0 = 0;
TIFR = 0x02;
TCCR0B = 0x03; // FCK / 64 ( 62.5 KHz )
TCNT0 = 0;
TIMSK |= 0x02; // Разрешаем прерывания от TMR0
btFirstLowRateFlash = FALSE;
}
else
{
wFlashCnt++;
// Проверяем, не пора ли закончить измерения
if( wTimerOvfCnt > TIMER_OVF_ENOUGHT )
{
TCCR0B = 0; // Останавливаем TMR0
GIMSK &= 0x40; // Запрещаем прерывания от INT0
TIMSK &= ~0x02; // Запрещаем прерывания от TMR0
if(TIFR & 0x02)
wTimerOvfCnt++; // Учитываем возможность переполнения
lTmp = (62500L * 60L * (long)wFlashCnt);
lTmp /= ((wTimerOvfCnt << 8) + TCNT0);
lTmp /= byBladeCnt;
wRpm = lTmp;
// Перезапускаем измерения
btFirstLowRateFlash = TRUE;
wTimerOvfCnt = 0;
TCNT0 = 0;
TCCR0B = 0x03; // FCK / 64 ( 62.5 KHz )
TCNT0 = 0;
TIFR = 0x02;
TIMSK |= 0x02; // Разрешаем прерывания от TMR0
// GIFR = 0x40;
}
}
EIFR = 0x40;
GIMSK |= 0x40;
}
/
******************************************************************
********\
Обработка переполнений TMR0 (добавляем к счетчику еще 8 разрядов)
Вход: -
Выход: -
\
******************************************************************
********/
interrupt [TIM0_OVF] void TIMER0_interrupt(void)
{
wTimerOvfCnt++;
// Если импульсов не было слишком долго, то показываем
// 0 оборотов и запускаем измерение заново
if( wTimerOvfCnt > NO_PULSES_INTERVAL )
{
wRpm = 0;
btFirstLowRateFlash = TRUE;
wTimerOvfCnt = 0;
}
}
/
******************************************************************
********\
Головная функция. Инициализация всех модулей. Цикл вызова рабочих
подпрограмм.
Вход: -
Выход: -
\
******************************************************************
********/
void main(void)
{
// Crystal Oscillator division factor:
#pragma optsize-
CLKPR=0x80;
CLKPR=Prescaler; //0x00 - для кварца 4MHz, 0x01 - для кварца 8MHz...
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
#asm("cli");
MCUCR = 0x00; // Запрещаем SLEEP, режимы прерывания пока не
важны.
// В принципе, этого можно и не делать.
GIMSK = 0x00; // Запрещаем внешние прерывания
EIFR = 0xFF; // Очищаем флаги прерываний
TIMSK = 0x00; // Запрещаем прерывания от таймеров
TIFR = 0xFF; // Очищаем флаги прерываний
//Разряд DDRx - определяет направление передачи данных (0 - вход, 1 -
выход).
//Разряд PORTx - если вывод определен выходом (DDRx = 1), то:
// если установлена 1 - то на выводе устанавливается лог. 1
// если установлена 0 - то на выводе устанавливается лог. 0
// если вывод определен входом (DDRx = 0), то PORTx - определяет
состояние подтягивающего резистора (при PORTx = 1 резистор подключен)
//Разряд PINx - доступен только для чтения и содержит физическое
значение вывода порта
PORTA=0b00000011;
DDRA= 0b00000011;
PORTB=0b00000000;
DDRB= 0b11111111;
#ifdef Cathode
PORTD=0b01111111;
DDRD= 0b00110011;
#endif
#ifdef Anode
PORTD=0b01001100;
DDRD= 0b00110011;
#endif
// Инициализируем модули
//time------------------------------------
btTimerOn = FALSE;
wTime = 0;
byTcnt = 0;
byDisplayRefreshCnt = 0;
btTimeUpdate = FALSE;
TCNT1 = 0;
TCCR1A = 0x00; // Отключаем управление выводом OC1 и PWM
TCCR1B = 0x03; // На таймер подается FCK через делитель на 64,
// шумодав отключен, никакого сброса нет
OCR1A = TCNT1 + CNT_100_MS;
TIFR |= 0x40; // Сбрасываем флаг прерываний от Output-Compare
TIMSK |= 0x40; // Разрешаем прерывание от Output-Compare
//time------------------------------------
//rmp-------------------------------------
btFirstLowRateFlash = TRUE;
wRpm = 0;
// Разрешаем прервание INT1
EIFR = 0x40;
GIMSK |= 0x40;
MCUCR = 0x02; // Настраиваем INT0 на спад, остальные биты не
важны.
// Таймер запускаем сразу, чтобы проверять
// отсутствие сигнала
wTimerOvfCnt = 0;
TCNT0 = 0;
TCCR0B = 0x03; // FCK / 64 ( 62.5 KHz )
TCNT0 = 0;
TIMSK |= 0x02; // Разрешаем прерывания от TMR0
//rmp-------------------------------------
#asm("sei");
// StartLowRateRpm();
while(TRUE)
{
RefreshDisplay();
}
}
Размещено на Allbest.ru