Разработка цифрового тахометра на базе микроконтроллер ATtiny2313

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информатика, ВТ, телекоммуникации
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    1,32 Мб
  • Опубликовано:
    2012-04-27
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Разработка цифрового тахометра на базе микроконтроллер ATtiny2313

СОДЕРЖАНИЕ

ВВЕДЕНИЕ

. ТЕХНИЧЕСКОЕ ЗАДАНИЕ

1.1     Назначение устройства

.2       Требования к реализации

2 Техническое предложение

2.1 Элементная база

.2 Схема подключения

3. ЭСКИЗНЫЙ ПРОЕКТ

3.1 Описание ЖК дисплея HD44780

4 Технический проект

4.1     Построение проекта

.2       Описание интерфейса

.3       Основные конструкции и процедуры, используемые для написания программы

5.       Рабочий проект

5.1 Реализация и программирование

ВЫВОДЫ

ПЕРЕЧЕНЬ ССЫЛОК

ПРИЛОЖЕНИЕ А. Программа реализации устройств

ВВЕДЕНИЕ


Современный этап развития научно-технического прогресса характеризуется широким применением электроники и микроэлектроники во всех сферах жизни и деятельности человека. Важную роль при этом сыграло появление и быстрое совершенствование интегральных микросхем - основной элементной базы современной электроники. Интегральные микросхемы применяются в вычислительных машинах и комплексах, в электронных устройствах автоматики, цифровых измерительных приборах, аппаратуре связи и передачи данных, медицинской и бытовой аппаратуре, в приборах и оборудовании для научных исследований и т.д.

Микрокомпьютер, в отличие от других компонентов, не обладает фиксированным набором функциональных характеристик. Его характеристики определяются в процессе проектирования системы с помощью программирования. Практически неограниченный диапазон программируемых функциональных возможностей микрокомпьютера придает этому компоненту особое значение.

В данном курсовом проекте необходимо разработать цифровой тахометр на базе микроконтроллер ATtiny2313. Цифровой тахометр должен выполнять следующие действия:

) Обеспечить измерение частоты вращения ротора двигателя, которая может изменятся от 100 до 9000 об/мин.;

) Допустимая погрешность измерения в заданном диапазоне не более 2%;

) Импульсный датчик выбрасывает 10 импульсов на каждый оборот.

) Быстродействие системы должно быть таково, чтобы время измерения не превышало двух оборотов.

) Измеренное число оборотов выводится на индикатор.

Эти требования должны лечь в основу проектируемого устройства.

1. ТЕХНИЧЕСКОЕ ЗАДАНИЕ

Техническое задание (ТЗ) на проектирование должно содержать исчерпывающую и однозначную информацию о требованиях, предъявляемых к проекту. Техническое задание обычно объемный документ, в котором на естественном языке описана, по сути, словесная модель проектируемой системы. Несмотря на строгость и точность формулировок ТЗ не дает однозначного описания объекта проектирования и не позволяет непосредственно переходить от описания функционирования системы к ее техническому воплощению.

1.1 Назначение устройства

Необходимо реализовать на микроконтроллере ATtiny2313 электронный тахометр.

Электронный тахометр - <#"564179.files/image001.gif">

Рисунок 2.1 ЖК дисплей

Функциональная спецификация фиксирует, что система должна сделать и как она взаимодействует с окружением.

Функциональная спецификация включает два основных компонента:

)список функций выполняемых системой;

)описание интерфейса между системой и пользователем.

Список функций выполняемых системой и интерфейс между системой и пользователем определяются требованиями, которые предъявляются к проектируемой системе потребителем или пользователем, будущих эксплуатировать устройство. Исходя из заданных данных на курсовой проект можно выделить следующие основные функциональные действия, которые должна выполнять проектируемая компьютерная система:

Обеспечить измерение частоты вращения ротора двигателя, которая может изменятся от 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 контактов;/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 регистра непосредственно связаны с арифметико-логическим устройством (ALU), которое позволяет выполнять одну команду для двух разных регистров за один такт системного генератора. Такая архитектура позволила достигнуть производительности в десять раз большей, чем у традиционных микроконтроллеров, построенных по CISC-технологии.

Особенности микросхемы ATtiny2313

Микросхема ATtiny2313 имеет следующие особенности:

2 Кбайт системной программируемой Flash-памяти программ;

128 байт EEPROM;

128 байт SRAM (ОЗУ);

18 линий ввода-вывода (I/O);

32 рабочих регистра;

однопроводной интерфейс для внутрисхемной отладки;

два многофункциональных таймера/счетчика с функцией совпадения;

поддержка внешних и внутренних прерываний;

последовательный программируемый USART-порт;

универсальный последовательный интерфейс с детектором начала передачи;

программируемый сторожевой таймер с внутренним генератором;

три программно изменяемых режима энергосбережения. В режиме Idle происходит приостановка центрального процессора, остальные системы продолжают работать. Выход из этого режима возможен как по внешнему прерыванию, так и по внутреннему. Например, при переполнении таймера.

Чтобы максимально ускорить работу и сделать возможным параллельное выполнение нескольких операций, микроконтроллеры AVR используют Гарвардскую архитектуру. Такая архитектура предусматривает отдельную память и отдельную шину адреса как для программы, так и для данных.

Каждая команда из памяти программ выполняется за один машинный цикл с использованием многоуровневой конвейерной обработки. В тот момент, когда очередная команда выполняется, следующая команда считывается из программной памяти. Такая концепция позволяет выполнять по одной команде за один такт системного генератора. Программный сегмент памяти физически представляет собой встроенную перепрограммируемую Flash-память.

Один из этих регистров-указателей может также использоваться в качестве указателя адреса данных, размещенных в памяти программ (Flash-памяти). Эти дополнительные составные 16-разрядные регистры именуются X, У и Z.

Микроконтроллер ATtiny2313 поддерживается различными программными средствами и интегрированными средствами разработки, такими как компиляторы C, макроассемблеры, программные отладчики/симуляторы, внутрисхемные эмуляторы и ознакомительные наборы.

.2 Схема подключения

Список примененных компонентов обозначение в схеме:

IC1    Микроконтроллер Attiny 2313

Q1, Q2        Транзистор BCW66G

C1, C2        10 нФ

C4, C5        33 пФ

X1     Кварцевый резонатор 20 МГц

R1, R2, R7  470 Ом

R3     1 кОм

R4     1.5 кОм

R5     1 МОм

R6     110 Ом

R8     70 Ом

LED3 Светодиод

IR1    Оптопара TCND-5000

B1     Кнопка

B2     Выключатель питания

JP1    Разъем внутрисхемного программирования

JP2    Разъем расширения

Рис 2.3 Принципиальная схема устройства

2.3 Алгоритм и варианты реализации

Для программирования микроконтроллера Attiny 2313 можно использовать языки программирования, ассемблер, C. Для реализации солнечного трекера был выбран язык C.

Алгоритм работы данного устройства представлен на рисунке 2.3.

Рисунок 2.4 - Алгоритм работы работы устройства

3 ЭСКИЗНЫЙ ПРОЕКТ

На данном этапе описываются функциональные возможности дисплея

.1 Описание ЖК дисплея HD44780

ЖК на базе контроллеров HD44780 являются эффективным средством отображения различной информации и могут с успехом применяться даже в любительских разработках. Наличие многих режимов вывода (скроллирование, курсоры, определяемые пользователем символы) позволяет разрабатывать удобные интерфейсы управления и устройства индикации.

Наличие 4-х битного режима вывода даёт возможность задействовать минимум портов микроконтроллера.

Довольно много информации по этим индикаторам можно найти в интернете, поэтому приведу пример ассемблерных процедур, вставленных в код на С, для 4-х битного режима, как представляющий наибольший интерес для разработчиков.

Схема включения:RB2 - LCD RS

PIC RB3 - LCD ERB4 - LCD B4RB5 - LCD B5RB6 - LCD B6RB7 - LCD B7

Помимо этого: LCD R/W - заземлить, LCD B0...LCD B3 - подключить к плюсу питания через резисторы.

/*-------------начало примера-------------*/

.

.

.lcd_data;

/* вывод старшей тетрады байта данных */out_nibble() {{_lcd_data ; байт данных должен быть в W

bcf PORTB, 4_lcd_data, 4PORTB, 4PORTB, 5_lcd_data, 5PORTB, 5PORTB, 6_lcd_data, 6PORTB, 6PORTB, 7_lcd_data, 7

bsf PORTB, 7

}

}

/* вывод байта в 8-ми битном режиме (требуется

только для инициализации ЖКИ) */wr_cmd(char cmd) {

asm {PORTB, 2 ; RS - down, пишем в IRparam00_wr_cmd_out_nibblePORTB, 3 ; E - upPORTB, 3 ; E - down

call _delay

}

}

/* вывод байта команды на ЖКИ */

void wr_cmd4(char cmd) {{PORTB, 2 ; RS - down, пишем в IRparam00_wr_cmd4_out_nibblePORTB, 3 ; E - upPORTB, 3 ; E - down_delayparam00_wr_cmd4, W ; меняем тетрады байта_out_nibblePORTB, 3 ; E - upPORTB, 3 ; E - down_delay

}

}

/* вывод байта данных на ЖКИ */

void wr_data4(char data) {{PORTB, 2 ; RS - up, пишем в DRparam00_wr_data4_out_nibblePORTB, 3 ; E - upPORTB, 3 ; E - down_delayparam00_wr_data4, W ; меняем тетрады байта_out_nibblePORTB, 3 ; E - upPORTB, 3 ; E - down_delay

}

}

/* задержка */delay() {_ms(1);

}

.

.

.

/*-------------окончание примера-------------*/

В приведенных примерах не отслеживается флаг занятости (busy flag) контроллера HD44780, взамен этого процедуры вывода на ЖКИ имеют задержки; на это следует обратить внимание. Ниже приводится фрагмент программы на С, выводящую фрагмент знакогенератора на экран ЖКИ формата 2 строки по 16 символов.

/*-------------начало примера-------------*/

.

.

.i, ch;

/* инициализация ЖКИ в 8-ми битном режиме

(рекомендуется производителем) */_cmd(0x28);

delay_ms(5);_cmd(0x28);();_cmd(0x28);();

/* инициализация ЖКИ в 4-х битном режиме */

wr_cmd4(0x28);_cmd4(0x0c);

wr_cmd4(0x06);= 0x20;_cmd4(0x80); /* переход на первую строку экрана */

for (i=0; i<16; i++) {_data4(ch); /* выводим символы */

ch++;

}_cmd4(0xc0); /* переход на вторую строку экрана */

for (i=0; i<16; i++) {_data4(ch); /* выводим символы */

ch++;

}

.

.

.

/*-------------окончание примера-------------*/

4 Технический проект

На данном этапе происходит описание и моделирование функций языка программирования, выбор организации проекта и принципов построения моделей и т.д.

Выполняются следующие работы:

·   составление и описание блоков на языке программирования;

·   определяются межблоковые связи;

·   описание констант и переменных;

·   отладка проекта (пошаговое тестирование основных блоков программы в процессе написания и исправление некорректной работы);

Далее подробно описаны все вышеперечисленные этапы.

4.1   Построение проекта

Осуществив все выше изложенные этапы проектирования и проанализировав эскизный проект, мы переходим к следующей стадии проектирования - технический проект, а именно к описанию проекта для ввода в микроконтроллер Attine 2313.

При описании моделей на языках программирования большое внимание следует уделять конструкциям языка. Так нужно использовать конструкции, которые воспринимаются программой программирования микроконтроллера, а также оптимизировать конструкции для достижения наименьших аппаратных затрат. Данный процесс очень трудоемкий и требует совершенного знания языка и программы проводящей программирования микроконтроллера.

4.2  
Описание интерфейса

Принципы построения модели включает методологию написания языкового кода. Спецификация составляется на всю программу, состоящую из основных блоков в соответствие со следующими этапами.

Необходимо выполнить анализ требуемых входных параметров и констант, а также определить их тип и начальные значения.

4.3     Основные конструкции и процедуры, используемые для написания программы

Листинг 4.1 - Создание макроса

#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, когда нужно обновить время на дисплееwTime; // Время, которое показывает секундомер (в десятых секунды)btTimerOn; // TRUE - таймер запущен, FALSE - остановленbyTcnt; // счетчик десятых секундbyDisplayRefreshCnt; //ShowDisplayData(void); // Вывод экранного буфераPrepareRpmData(WORD wRpm);btDisplayUpdate; // = TRUE, если пришло время обновить дисплейbyDisplay[4]; // буфер данных, для вывода на экранwLockedRpm;

// Массив знакогенератораbyCharacter[12] = {0xFA, //0

0x82, //1

xB9, //2

xAB,  //3

xC3, //4

x6B, //5

x7B, //6

xA2, //7

xFB, //8

xEB, //9

x00, //blank

0x01 //-

};wRpm; // Скорость вращения ротора (об/мин)

//BOOLEAN btRpmUpdate; // = 1, когда измеряно новое значение оборотовwTimerOvfCnt; // Счетчик переполнений таймера (нужен для

// увеличения разрядностиwFlashCnt; // Счетчик срабатываний датчика прохождения допастиbtFirstLowRateFlash; // FALSE - если отсчет периода еще не начался

// (датчик ни разу не сработал)

Листинг 4.2 - Обновление дисплея

void RefreshDisplay(void)

{

#asm("cli");(btDisplayUpdate)

{= wRpm;= FALSE;

}

#asm("sei");(wLockedRpm);();

}

Листинг 4.3 - Преобразование скорости мотораPrepareRpmData(WORD wRpm)

{i;R;= wRpm;[3] = wRpm % 10;/= 10;(byDisplay[3] > 4) //округляем

{

wRpm++;+= 10;

}[3] = 0;

// Первые 4 цифр - обороты двигателя

for(i=0; i<3; i++)

{[2-i] = wRpm % 10;/= 10;

}(R < 10)

{[0] = 10;[1] = 10;[2] = 10;exit;

}((R >= 10) & (R <100))

{[0] = 10;[1] = 10;exit;

}((R >= 100) & (R <1000))

{[0] = 10;exit;

}:

}

Листинг 4.4 Вывод экранного буфера на дисплей.

void ShowDisplayData(void)

{

#ifdef Cathode= byCharacter[byDisplay[0]];.5 = 0;_us(LED_delay);.5 = 1;= byCharacter[byDisplay[1]];.1 = 0;_us(LED_delay);.1 = 1;= byCharacter[byDisplay[2]];.0 = 0;_us(LED_delay);.0 = 1;= byCharacter[byDisplay[3]];.4 = 0;_us(LED_delay);.4 = 1;

#endif

#ifdef Anode= ~byCharacter[byDisplay[0]];.5 = 1;_us(LED_delay);.5 = 0;= ~byCharacter[byDisplay[1]];.1 = 1;_us(LED_delay);.1 = 0;= ~byCharacter[byDisplay[2]];.0 = 1;_us(LED_delay);.0 = 0;= ~byCharacter[byDisplay[3]];.4 = 1;_us(LED_delay);.4 = 0;

#endif(! PIND.6)

{_us(Light_delay);

}

}

Лисинг 4.5 - Обработка прерываний от OC1 (для отсчета импульсов 0.1 сек)

interrupt [TIM1_COMPA] void SYSTEM_TICK_interrupt(void)

{

// Вычисляем оммент следующего срабатывания таймераA += CNT_100_MS;

// 3 раза в секунду перерисовываем дисплей,

// независимо от обстоятельств.

if( ++byDisplayRefreshCnt == UpCount )

{

byDisplayRefreshCnt = 0;

btDisplayUpdate = TRUE;

}

// Если секундомер запущен - инкрементируем его показания

if( btTimerOn )

{(++byTcnt == 10)

{= 0;

if( ++wTime == 60000)= 0;

}

}

}

Литинг 4.6 - Обработка прерываний от управляющих импульсов

interrupt [EXT_INT0] void RPM_PULSE_interrupt(void)

{lTmp;&= ~0x40;(btFirstLowRateFlash)

{

// Первый импульс, сбрасываем счетчик периода и

// счетчик импульсов= 0;= 0;= 0;

TIFR = 0x02;B = 0x03; // FCK / 64 ( 62.5 KHz )

TCNT0 = 0;|= 0x02; // Разрешаем прерывания от TMR0= FALSE;

}

{++;

// Проверяем, не пора ли закончить измерения

if( wTimerOvfCnt > TIMER_OVF_ENOUGHT )

{B = 0; // Останавливаем TMR0&= 0x40; // Запрещаем прерывания от INT0&= ~0x02; // Запрещаем прерывания от TMR0(TIFR & 0x02)++; // Учитываем возможность переполнения

lTmp = (62500L * 60L * (long)wFlashCnt);/= ((wTimerOvfCnt << 8) + TCNT0);/= byBladeCnt;= lTmp;

// Перезапускаем измерения= TRUE;= 0;= 0;B = 0x03; // FCK / 64 ( 62.5 KHz )

TCNT0 = 0;= 0x02;|= 0x02; // Разрешаем прерывания от TMR0

// GIFR = 0x40;

}

}= 0x40;|= 0x40;

}

Листинг 4.6 - interrupt [TIM0_OVF] void TIMER0_interrupt(void)

{++;

// Если импульсов не было слишком долго, то показываем

// 0 оборотов и запускаем измерение заново( wTimerOvfCnt > NO_PULSES_INTERVAL )

{= 0;= TRUE;= 0;

}

}

Листинг 4.7 Головная функция. Инициализация всех модулей. Цикл вызова рабочих подпрограмм

void main(void)

{

// Crystal Oscillator division factor:

#pragma optsize-=0x80;=Prescaler; //0x00 - для кварца 4MHz, 0x01 - для кварца 8MHz...

#ifdef _OPTIMIZE_SIZE_

#pragma optsize+

#endif

#asm("cli");= 0x00; // Запрещаем SLEEP, режимы прерывания пока не важны.

// В принципе, этого можно и не делать.= 0x00; // Запрещаем внешние прерывания= 0xFF; // Очищаем флаги прерываний= 0x00; // Запрещаем прерывания от таймеров= 0xFF; // Очищаем флаги прерываний

//Разряд DDRx - определяет направление передачи данных (0 - вход, 1 - выход).

//Разряд PORTx - если вывод определен выходом (DDRx = 1), то:

// если установлена 1 - то на выводе устанавливается лог. 1

// если установлена 0 - то на выводе устанавливается лог. 0

// если вывод определен входом (DDRx = 0), то PORTx - определяет состояние подтягивающего резистора (при PORTx = 1 резистор подключен)

//Разряд PINx - доступен только для чтения и содержит физическое значение вывода порта

PORTA=0b00000011;= 0b00000011;=0b00000000;= 0b11111111;

#ifdef Cathode=0b01111111;= 0b00110011;

#endif

#ifdef Anode=0b01001100;= 0b00110011;

#endif

// Инициализируем модули

//time------------------------------------= FALSE;= 0;= 0;= 0;= FALSE;= 0;A = 0x00; // Отключаем управление выводом OC1 и PWM

TCCR1B = 0x03; // На таймер подается FCK через делитель на 64,

//time------------------------------------

//rmp-------------------------------------= TRUE;= 0;

// Разрешаем прервание INT1= 0x40;|= 0x40;= 0x02; // Настраиваем INT0 на спад, остальные биты не важны.

// Таймер запускаем сразу, чтобы проверять

// отсутствие сигнала= 0;= 0;B = 0x03; // FCK / 64 ( 62.5 KHz )= 0;|= 0x02; // Разрешаем прерывания от TMR0

//rmp-------------------------------------

#asm("sei");

// StartLowRateRpm();(TRUE)

{();

}

}

5.      
Рабочий проект

Рабочий проект включает в себя программирование устройства и физическое тестирование.

5.1     Реализация и программирование

Интегрированная среда IAR Embedded Workbench IDE содержит: графическую оболочку для управления ресурсами проекта; текстовый редактор исходного модуля программы; кросс-компилятор; отладчик, программатор; автоматический генератор программного кода; терминал для работы с последовательным интерфейсом RS232C (USART).

Полученный в результате компиляции исходного кода программы на языке С исполняемый модуль (файл прошивки) может быть непосредственно записан в память программ микроконтроллера.

Рисунок 5.1 - Главное окно IAR Embedded Workbench IDE

Таблица 5.1 - Описание пунктов меню

Меню

Описание

File

В меню File представлены команды для открытия новых файлов и файлов проекта, сохранение, печать и выход из IAR Embedded Workbench IDE.

Edit

Меню Edit содержит команды редактирования и поиска в окнах редактора, включения и отключения контрольных точек в C-SPY.

View

Команды меню View используют для того, чтобы открыть окна и выбрать для отображения необходимые инструментальные панели.

Project

Меню Project содержит команды для того, чтобы добавить файлы к проекту, создать группы, и использовать инструментальные средства IAR в текущем проекте.

Tools

Меню Tools - пользовательское-конфигурируемое меню, к которому Вы можете добавить инструментальные средства для использования с IAR Embedded Workbench IDE.

Window

С помощью команд в меню Window вы можете управлять внедренными окнами IAR Embedded Workbench IDE и изменять их расположение относительно экрана.

Help

Меню Help содержит справку о IAR Embedded Workbench IDE.


Toolbar. Инструментальная панель, представленная в меню Вид, обеспечивает доступ к наиболее часто используемым командам IAR.

Описание любой кнопки можно посмотреть, наведя на нее курсор мыши. Когда команда не доступна, соответствующая кнопка панели будет недоступна, и нельзя щелкнуть на нее.

На рисунке 1.16 показано меню команд, соответствующее каждой из кнопок панели:

Рисунок 4.2 - Панель инструментов

Status Bar. Строка состояния внизу активного окна, вызываемая из меню Вид, отображает состояние IAR.

В процессе редактирования, строка состояния показывает текущую линию и номер столбца, содержащего курсор, Caps Lock, Num Lock, и состояние ввода.

Окно рабочей области. Окно Workspace, доступное из меню View, показывает название текущей рабочей области и древовидное представление проектов, групп и файлов, включенных в рабочую область.

Рисунок 5.3 - Окно рабочей области

В раскрывающемся списке вверху окна можно выбрать конфигурацию построения текущего проекта (Debug или Release).

Контекстное меню окна Workspace. Щелчок правой кнопкой мыши в окне Workspace отображает контекстное меню, которое дает удобный доступ к таким командам.

Описание пунктов контекстного меню окна Workspace приведено в таблице 1.4.

Таблица 5.2 - Контекстное меню окна Workspace

Команда меню

Описание

Options

Отображает диалоговое окно, где можно установить параметры для каждого из используемых инструментов в выбранном элементе окна рабочей области. Параметры можно установить во всем проекте, в группе файлов, или в отдельном файле

Make

Собирает, транслирует, и связывает текущие файлы в соответствии с последними изменениями в проекте.

Compile

Компилирует или транслирует открытый файл. Можно выбрать файл в рабочем окне или окно редактора, содержащего файл, который необходимо компилировать.

Rebuild All

Повторно собирает и повторно связывает все файлы в выбранной конфигурации.

Clean

Удаляет промежуточные файлы.

Stop Build

Останавливает текущую операцию.

Add>Add Files

Открывает диалоговое окно, в котором можно добавить файлы к проекту.

Add>Add Group

Открывает диалоговое окно, в котором можно добавить новые группы к проекту.

Remove

Удаляет выбранные элементы из окна Workspace.

Source Code Control

Открывает подменю с командами для управления исходным текстом

File Properties

Открывает стандартное диалоговое окно File Properties для выбранного файла.

Set as Active

Устанавливает активным выбранный проект в дисплее краткого обзора.


Меню Source Code Control. Меню Source Code Control доступно из меню Project и из контекстного меню в окне Workspace.

Таблица 5.3 - Меню Source Code Control

Команда меню

Описание

Check In (регистрация)

Открывает диалоговое окно Check In Files, где можно зарегистрировать выбранные файлы Любые изменения, которые сделаны в файлах, будут сохранены в архиве. Эта команда допускается, когда в настоящее время выделенные файлы отобраны в окне рабочей области.

Check Out (проверка)

Проверяет выбранный файл или файлы. Это означает, что можно получить местную копию файла(ов), который можно редактировать. Эта команда возможна после выполнения команды регистрации

Undo Check out (отмена проверки)

Отобранные файлы возвращаются к последней заархивированной версии. Любые изменения (замены), сделанные в файлах, будут потеряны. Эта команда доступна после выполнения команды проверки.

Get Latest Version

Заменяет выбранные файлы последней заархивированной версией.

Compare

Показывает в окне SCC различия между существующей версией и новой заархивированной версией.

History

Отображает информацию о хронологии проверки выбранного файла.

Properties

Отображает информацию о выбранном файле

Refresh

Обновляет состояния для всех файлов, которые являются частью проекта. Эта команда всегда допускается для всех проектов под SCC.

Add Project To Source Control

Открывает диалоговое окно, которое позволяет создавать подключение между выбранным IAR проектом и проектом SCC.

Remove Project From Source Control

Удаляет подключение между выбранными IAR проектом и проектом SCC.


Состояния Source Code Control. Каждый иcходный, управляемый кодом, файл может быть в одном из нескольких состояний.

Таблица 5.4 - Состояния Source Code Control.

SCC состояние

Описание

Проверенный. Файл доступен для редактирования


Проверенный. Файл доступен для редактирования и был изменен.


(серый замок)Зарегистрированный. Во многих системах SCC это означает, что файл защищен от записи.


(серый замок)Зарегистрированный. Есть новая версия, доступная в архиве.


(красный замок)Во многих системах SCC это означает, что нельзя проверить файл.


(красный замок)Есть новая версия, доступная в архиве. Во многих системах SCC это означает, что нельзя проверить файл.



ВЫВОДЫ

цифровой тахометр микроконтроллер

Данный курсовой проект позволил более детально ознакомится с микроконтроллерами типа AVR Attiny 2313. В процессе разработки проекта были получены навыки проектирования, реализации и внедрение проекта в реальную модель.

В результате выполнения комплексного курсового проекта был описан процесс создания и программно реализованы устройства электронных часов на основе микроконтроллера Attiny 2313.

Полученные результаты показывают, что программа работоспособна и готова к использованию.

Конечным результатом проведенной работы, явилась структурная и принципиальная схема цифрового тахометра, а также сборка самого устройства и проверка его на работоспосбность.

ПЕРЕЧЕНЬ ССЫЛОК

1. Методические указания к лабораторным работам по курсу “Микроконтроллеры во встроенных системах управления для студентов всех специальностей / Составители Аврунин О.Г., Крук О.Я., Семенец В.В. - ХНУРЭ, 2005. - 105 с.

2.   В. А. Гулиус, В. Г. Лобода, В. П. Степанов, В. Ю. Цуканов. “Средства автоматизированного проектирования специализированных микропроцессорных устройств”: Учебное пособие - Харьков: ХНУРЭ, 2001. - 228 с.

.     Белова Н. В., Коряк С. Ф., Лобода В. Г.. “Основы построения ориентированных ЭВМ и систем”. Под общ. ред. В. Г. Лободы. - Харьков: ООО «Компания СМИТ», 2007. - 148 с.

4.   Проектирование встроенных устройств на микропроцессорах: Учеб. пособие /В. Г. Лобода, В. В. Логвин, В. Б. Таранов. - К.: УМК ВО, 1988. - 128 с.

.    Методические указания к комплексному курсовому проекту / Составители: В.Г. Лобода, А.С. Шкиль, Л.К. Штец.- Харков, ХНУРЭ,2001. - 8с.

6. Arduino programming notebook /Brian W.Adams

. 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> btTimeUpdate; // = 1, когда нужно обновить время на дисплее

WORD wTime;btTimerOn; // TRUE - таймер запущен, FALSE - остановленbyTcnt;byDisplayRefreshCnt; //ShowDisplayData(void); // Вывод экранного буфераPrepareRpmData(WORD wRpm);btDisplayUpdate; // = TRUE, если пришло время обновить дисплей byDisplay[4]; // буфер данных, для вывода на экран

WORD wLockedRpm;

// Массив знакогенератора

BYTE byCharacter[12] = {0xFA, //0

0x82, //1

xB9, //2

xAB,  //3

xC3, //4

x6B, //5

x7B, //6

xA2, //7

xFB, //8

xEB, //9

x00, //blank

0x01 //-

};

WORD wRpm; // Скорость вращения (об/мин)

//BOOLEAN btRpmUpdate; // = 1, когда измеряно новое значение оборотов

WORD wTimerOvfCnt; // Счетчик переполнений таймера (нужен для

// увеличения разрядности

WORD wFlashCnt;

BOOLEAN btFirstLowRateFlash; // FALSE - если отсчет периода еще не начался

void RefreshDisplay(void)

{

#asm("cli");(btDisplayUpdate)

{= wRpm;= FALSE;

}

#asm("sei");(wLockedRpm);();

}

/************************************************************************\

Преобразование скорости мотора в данные экранного буфера

\************************************************************************/PrepareRpmData(WORD wRpm)

{i;R;= wRpm;[3] = wRpm % 10;/= 10;(byDisplay[3] > 4) //округляем

{++; += 10;

}

byDisplay[3] = 0;

// Первые 4 цифр - обороты двигателя

for(i=0; i<3; i++)

{[2-i] = wRpm % 10;/= 10;

}(R < 10)

{[0] = 10;[1] = 10;[2] = 10;exit;

}((R >= 10) & (R <100))

{[0] = 10;[1] = 10;exit;

}((R >= 100) & (R <1000))

{[0] = 10;exit;

}:

}

/************************************************************************\

Вывод экранного буфера на дисплей.

Вход: -

Выход: -

\************************************************************************/ShowDisplayData(void)

{

#ifdef Cathode= byCharacter[byDisplay[0]];.5 = 0;_us(LED_delay);.5 = 1;= byCharacter[byDisplay[1]];.1 = 0;_us(LED_delay);.1 = 1;= byCharacter[byDisplay[2]];.0 = 0;_us(LED_delay);.0 = 1;= byCharacter[byDisplay[3]];.4 = 0;_us(LED_delay);.4 = 1;

#endif

#ifdef Anode= ~byCharacter[byDisplay[0]];.5 = 1;_us(LED_delay);.5 = 0;= ~byCharacter[byDisplay[1]];.1 = 1;_us(LED_delay);.1 = 0;

= ~byCharacter[byDisplay[2]];.0 = 1;_us(LED_delay);.0 = 0;= ~byCharacter[byDisplay[3]];.4 = 1;_us(LED_delay);.4 = 0;

#endif(! PIND.6)

{_us(Light_delay);

}

}

/**************************************************************************\

Обработка прерываний от OC1 (для отсчета импульсов 0.1 сек)

Вход: -

Выход: -

\**************************************************************************/[TIM1_COMPA] void SYSTEM_TICK_interrupt(void)

{

// Вычисляем оммент следующего срабатывания таймера

OCR1A += CNT_100_MS;

// 3 раза в секунду перерисовываем дисплей,

// независимо от обстоятельств.

if( ++byDisplayRefreshCnt == UpCount )

{

byDisplayRefreshCnt = 0;

btDisplayUpdate = TRUE;

}

// Если секундомер запущен - инкрементируем его показания

if( btTimerOn )

{(++byTcnt == 10)

{= 0;( ++wTime == 60000)

wTime = 0;

}

}

}

/**************************************************************************\

Обработка прерываний от управляющих импульсов

Вход: -

Выход: -

\**************************************************************************/[EXT_INT0] void RPM_PULSE_interrupt(void)

{lTmp;&= ~0x40;(btFirstLowRateFlash)

{

// Первый импульс, сбрасываем счетчик периода и

// счетчик импульсов

wTimerOvfCnt = 0;

wFlashCnt = 0;

TCNT0 = 0;

TIFR = 0x02;B = 0x03; // FCK / 64 ( 62.5 KHz )0 = 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);/= ((wTimerOvfCnt << 8) + TCNT0);/= byBladeCnt;= lTmp;

// Перезапускаем измерения= TRUE;= 0;= 0;B = 0x03; // FCK / 64 ( 62.5 KHz )0 = 0;

TIFR = 0x02;

TIMSK |= 0x02; // Разрешаем прерывания от TMR0

// GIFR = 0x40;

}

}= 0x40;|= 0x40;

}

/**************************************************************************\

Обработка переполнений TMR0 (добавляем к счетчику еще 8 разрядов)

Вход: -

Выход: -

\**************************************************************************/[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-=0x80;=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;= 0b00000011;=0b00000000;= 0b11111111;

#ifdef Cathode=0b01111111;= 0b00110011;

#endif

#ifdef Anode=0b01001100;= 0b00110011;

#endif

// Инициализируем модули

//time------------------------------------= FALSE;= 0;= 0;= 0;= FALSE;= 0;A = 0x00; // Отключаем управление выводом OC1 и PWM1B = 0x03; // На таймер подается FCK через делитель на 64,

// шумодав отключен, никакого сброса нет

OCR1A = TCNT1 + CNT_100_MS;

TIFR |= 0x40; // Сбрасываем флаг прерываний от Output-Compare

TIMSK |= 0x40; // Разрешаем прерывание от Output-Compare

//time------------------------------------

//rmp-------------------------------------= TRUE;= 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();(TRUE)

{();

}

}

Похожие работы на - Разработка цифрового тахометра на базе микроконтроллер ATtiny2313

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!