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

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

Рубрика Коммуникации, связь, цифровые приборы и радиоэлектроника
Вид курсовая работа
Язык русский
Дата добавления 28.04.2012
Размер файла 1,9 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

СОДЕРЖАНИЕ

  • ВВЕДЕНИЕ
  • 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 регистра непосредственно связаны с арифметико-логическим устройством (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.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 ЭСКИЗНЫЙ ПРОЕКТ

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

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 lcd_data;

/* вывод старшей тетрады байта данных */

void out_nibble() {

asm {

movwf _lcd_data ; байт данных должен быть в W

bcf PORTB, 4

btfsc _lcd_data, 4

bsf PORTB, 4

bcf PORTB, 5

btfsc _lcd_data, 5

bsf PORTB, 5

bcf PORTB, 6

btfsc _lcd_data, 6

bsf PORTB, 6

bcf PORTB, 7

btfsc _lcd_data, 7

bsf PORTB, 7

}

}

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

только для инициализации ЖКИ) */

void wr_cmd(char cmd) {

asm {

bcf PORTB, 2 ; RS - down, пишем в IR

movfw param00_wr_cmd

call _out_nibble

bsf PORTB, 3 ; E - up

bcf PORTB, 3 ; E - down

call _delay

}

}

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

void wr_cmd4(char cmd) {

asm {

bcf PORTB, 2 ; RS - down, пишем в IR

movfw param00_wr_cmd4

call _out_nibble

bsf PORTB, 3 ; E - up

bcf PORTB, 3 ; E - down

call _delay

swapf param00_wr_cmd4, W ; меняем тетрады байта

call _out_nibble

bsf PORTB, 3 ; E - up

bcf PORTB, 3 ; E - down

call _delay

}

}

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

void wr_data4(char data) {

asm {

bsf PORTB, 2 ; RS - up, пишем в DR

movfw param00_wr_data4

call _out_nibble

bsf PORTB, 3 ; E - up

bcf PORTB, 3 ; E - down

call _delay

swapf param00_wr_data4, W ; меняем тетрады байта

call _out_nibble

bsf PORTB, 3 ; E - up

bcf PORTB, 3 ; E - down

call _delay

}

}

/* задержка */

void delay() {

delay_ms(1);

}

.

.

.

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

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

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

.

.

.

char i, ch;

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

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

wr_cmd(0x28);

delay_ms(5);

wr_cmd(0x28);

delay();

wr_cmd(0x28);

delay();

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

wr_cmd4(0x28);

wr_cmd4(0x0c);

wr_cmd4(0x06);

ch = 0x20;

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

for (i=0; i<16; i++) {

wr_data4(ch); /* выводим символы */

ch++;

}

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

for (i=0; i<16; i++) {

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

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 - если отсчет периода еще не начался

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

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

void RefreshDisplay(void)

{

#asm("cli");

if (btDisplayUpdate)

{

wLockedRpm = wRpm;

btDisplayUpdate = FALSE;

}

#asm("sei");

PrepareRpmData(wLockedRpm);

ShowDisplayData();

}

Листинг 4.3 - Преобразование скорости мотора

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:

}

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

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);

}

}

Лисинг 4.5 - Обработка прерываний от 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;

}

}

}

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

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;

}

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

{

wTimerOvfCnt++;

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

// 0 оборотов и запускаем измерение заново

if( wTimerOvfCnt > NO_PULSES_INTERVAL )

{

wRpm = 0;

btFirstLowRateFlash = TRUE;

wTimerOvfCnt = 0;

}

}

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

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();

}

}

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 с.

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

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

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


Подобные документы

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

    курсовая работа [322,3 K], добавлен 30.03.2012

  • Разработка структурной и принципиальной схем электронного тахометра. Изучение принципа работы датчика магнитного поля. Выбор микроконтроллера. Проектирование управляющей программы для микроконтроллера. Адаптация устройства к промышленному применению.

    курсовая работа [1,1 M], добавлен 22.01.2015

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

    курсовая работа [415,9 K], добавлен 03.11.2014

  • Разработка структурной и принципиальной схем микропроцессорного тахометра. Микроконтроллер PIC16F886 и устройство индикации тахометра. Основные температурные и электрические характеристики микроконтроллера. Разработка алгоритма управляющей программы.

    курсовая работа [527,0 K], добавлен 07.07.2013

  • Условия эксплуатации микропроцессорного устройства "Светодиодные фонари с электронным управлением" на базе МК ATtiny 15. Техническое описание микроконтроллера. Разработка структурной и электрической принципиальной схем, интерфейса управления и индикации.

    курсовая работа [267,5 K], добавлен 01.05.2015

  • Описание структурной и функциональной схем электронных часов, выбор элементной базы. Разработка счетчика времени с системой управления на базе микроконтроллера. Экономический расчет затрат на проектирование, разработку и сборку макета электронных часов.

    дипломная работа [223,5 K], добавлен 26.07.2015

  • Цифровой термостат с регулируемым гистерезисом на базе микроконтроллера ATtiny2313. Разработка алгоритма функционирования устройства. Разработка принципиальной схемы. Подключение устройств к МК PIC16F84A. Разработка цепи питания устройства, программа.

    курсовая работа [10,9 M], добавлен 07.01.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.