WWW.EL.Z-PDF.RU
БИБЛИОТЕКА  БЕСПЛАТНЫХ  МАТЕРИАЛОВ - Онлайн документы
 

«РОССИЙСКОЙ ФЕДЕРАЦИИ ГОУ НИЖЕГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ИМ. Р.Е. АЛЕКСЕЕВА ИНСТИТУТ РАДИОЭЛЕКТРОНИКИ И ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ КАФЕДРА ВЫЧИСЛИТЕЛЬНЫЕ ...»

МИНИСТРЕРСТВО ОБРАЗОВАНИЯ И НАУКИ

РОССИЙСКОЙ ФЕДЕРАЦИИ

ГОУ НИЖЕГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

ИМ. Р.Е. АЛЕКСЕЕВА

ИНСТИТУТ РАДИОЭЛЕКТРОНИКИ И ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ

КАФЕДРА "ВЫЧИСЛИТЕЛЬНЫЕ СИСТЕМЫ И ТЕХНОЛОГИИ"

Дисциплина "Микропроцессорные системы"

Пояснительная записка

к курсовой работе

Тема:

"Разработка системы озвучивания времени"

Выполнил: Сидоренко О.О.

студент группы: 10-В-1

Проверил: Киселев Ю.Н.

Нижний Новгород

2013

Содержание.

Введение

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

Электронные часы используются везде, во всех сферах человеческой деятельности, но в каждой сфере имеют свои специфичные особенности. Так в спорте используемые «часы» чаще называют секундомер, а деловой сфере часы на одном дисплее показывают текущее время в разных точках мира, синхронизируя себя с помощью Сети.

Количество новых вариантов конструкций и моделей растет с каждым днем и они слабо отличаются друг от друга – например, часы, отображающиеся проекцией на потолке или часы, «говорящие» время.

Тема разработки электронных часов сейчас актуальна и продукты построения модели очень востребованы

2. Выбор и обоснование основных технических решений

2.1. Детализация ТЗ и постановка задачи

Задание: На базе микроконтроллера сделать электронные часы такие, что смогут по сигналу «говорить» через динамик.

Часы должны отображать время с точностью до 1 секунды.

Все произносимые фразы должны храниться на внешней SD/MMC карте.

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

Часы должны иметь возможность устанавливать текущее время.

Общая рекомендация: устройство должно быть выполнено на базе стандартных микроконтроллеров с моделированием работы в симуляторе Proteus.

2.2. Источники информации (входных сигналов)

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

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

При воспроизведении фраз источником являются файлы формата.WAV, записанные на карте. Они содержат звуковую дорожку, которая и нужна системе.

Для случая считывания данных с электронных часов источником информации можно считать контроллер. Т.к. именно с помощью него генерируется информация о времени.

2.3 Приемники информации (выходных сигналов)

Для случая ввода данных в часы приемником информации будет является контроллер.

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

2.4 Возможные варианты решения поставленной задачи

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

Рассмотрим различные элементы в каждом типе.

Тип «Отображение». Для вывода информации (сообщений, текущего времени).

7-Сегментный или 14-сегментный индикатор на 8 позиций.

Жидкокристаллический дисплей(LCD) с возможностью вывод двух строк по 16 символов

Графический дисплей

Сенсорный дисплей

Тип «Воспроизведение». Для вывода звуковой информации.

Пьезо-динамик

Динамик

Тип «Ввод». Для ввода информации: настройка часов, сигналы управления и т.д.

Сенсорный ввод (может служить дисплеем)

Массив переключателей (клавиатура)

Тип «Хранение данных». Для хранения больших объемов данных (звуковые файлы).

Сеть

USB-флешSD/MMC

Тип «Микроконтроллер». Для управления работой всей системы

Со встроенными счетчиками.

2.5 Структурная схема и выбор элементов

Основная структурная схема отображает используемые элементы и показывает их взаимосвязь:

Схема 1. Основная структурная схема

Для реализации выберем следующие элементы:

Жидкокристаллический дисплей(LCD) с возможностью вывод двух строк по 16 символов

Динамик

Массив переключателей (клавиатура)

SD/MMC

МК со встроенными счетчиками.

В этом случае собранная схема будет интуитивно понятна любому другому разработчику, уменьшится объем управляемого кода, т.к. большинство из выбранных элементов имеют стандартные команды управления (LCD, например, в отличие от сенсорного дисплея). А также при таком выборе элементов схема интуитивно понятно построена и, следовательно, её можно использовать в учебных целях.

2.6 Обоснование выбора ОМК для решения поставленной задачи

Однокристальный микроконтроллер

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

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

Учитывая все эти требования, в качестве устройства управления выбран микроконтроллер ATmega32. Atmega32 является КМОП 8-битным микроконтроллером, построенным на расширенной AVR RISC архитектуре. Используя команды, исполняемые за один машинный такт, контроллер достигает производительности в 1 MIPS на рабочей частоте 1 МГц, что позволяет разработчику эффективно оптимизировать потребление энергии за счёт выбора оптимальной производительности.

Рис 1. МК ATmega32

Характеристики:

Высокопроизводительный, мало потребляющие 8- битные микроконтроллер

Развитая RISC архитектура:    - 131 исполняемых команд, большинство за один машинный такт    - 32 рабочих регистра общего назначения    - полностью статический режим работы    - производительность до 16 MIPS при 16 МГц    - встроенный 2-х тактовый умножитель

Энергонезависимая память программ и данных    - 32К байт внутрисистемно самопрограммируемой FLASH памяти с количеством циклов перепрограммирования до10 000.    - Опционно загрузочная область памяти с независимыми ключевыми битами, внутрисистемное программирование встроенной загрузочной программой, правильное чтение в процессе записи.    - 1024 байт EEPROM с допустимым количеством циклов стирания записи до 100 000.    - 2К байт внутренней SRAM    - программируемый ключ защиты программ

JTAG (IEEE1149.1 совместимый) интерфейс    - Сканирование памяти в соответствии с JTAG стандартом    - Встроенная поддержка отладчика    - Программирование FLASH, EEPROM, охранных и ключевых бит через JTAG интерфейс

Периферийные функции    - два 8-битных таймера/счётчика с программируемым предделителем и режимом сравнения    - один 16-битный таймер/счётчик с программируемым предделителем, режимом сравнения и захвата    - счётчик реального времени с программируемым генератором    - четыре ШИМ генератора    - 8-и канальный, 10-и битный АЦП    - байт- ориентированный, двухпроводный интерфейс    - программируемый USART    - Master/Slave SPI последовательный интерфейс    - Программируемыи Watchdog таймер с программируемым генератором    - Встроенный аналоговый компаратор Специальные функции    - Reset по включению питания и выключение при снижении напряжения питания    - Внутренний калиброванный RC генератор    - Внешние и внутренние источники прерывания    - Шесть экономичных режимов: Idle, подавления шумов АЦП, экономичный, режим Выкл., режим ожидания и режим расширенного ожидания.

32 программируемых вывода вход-выход и 1 вход

40 выводной корпус PDIP, 44 выводной корпус TQFP, и 44 контактный MLF

Напряжение питания:    - 4.5 В до 5.5 В для Atmega32

Тактовая частота:

    - 0-16 МГц Atmega32

Несколько характеристик стали определяющими для выбора этого контроллера.

Причины выбора:

Количество портов позволяет подключить все необходимые устройства: дисплей, флеш-карту, динамик и клавиатуру.

Множество примеров работы и множество литературы, которая описывает функции МК

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

Существует множество компиляторов, поддерживающих создание прошивки под этот контроллер, что упрощает задачу программирования.

Имеет три встроенных таймера (два на 8 и один на 16 бит) с модулем сравнения.

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

Схема выводов контроллера.

Схема 2. Распиновка контроллера ATmega32

3. Структурная схема устройства и её описание

3.1. Оборудование и структурная схема

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

Получим:

Жидкокристаллический дисплей(LCD) с возможностью вывод двух строк по 16 символов – LM016L

Динамик - Speaker

Массив переключателей (клавиатура) – состоит из кнопок BUTTON

SD/MMC - MMC

ATmega32

3.2. Описание работы схемы

При работе схемы основывается на обработке при получении внешнего сигнала.

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

Общая блок-схема работы микроконтроллера:

Схема 3. Общая блок-схема работы

Рассмотрим подробнее алгоритм работы всей схемы.

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

Необходимо инициализировать внутренние таймеры МК, исходя из нужд.

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

Необходимо инициализировать SD/MMC карту для возможности чтения секторов.

Необходимо инициализировать файловую систему на карточке для чтения файлами, а не секторами.

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

Определим необходимые внешние события. Помимо внутренних событий в МК, таких как переполнение счетчика таймера и аналогичных необходимо также посылать сигнал на изменение отображаемого времени. Изменять желательно и «минуты», и «часы», изменение секунд будет явно лишним, т.к. никакой особой важности не несет. Также необходим сигнал, получив который контроллер начнет воспроизводить файлы из памяти.

На выбранном МК есть 3 входа внешних прерываний, на которые можно поставить как раз три функции: изменение «минут», изменение «часов», запуск воспроизведения.

4. Разработка функциональной и принципиальной схем

4.1. Описание принципиальной схемы устройства

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

Схема 4. Принципиальная схема устройства

Описание схемы:

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

4.2. Описание функциональной схемы устройства

Функциональная схема:

-1009658255ATmega32

Микроконтроллер

SD/MMC карта

Дисплей

Линии порта PORTA

ATmega32 Линии ус-в

PA0 RS

PA1 RW

PA2 E

PA3 -

PA4 D4

PA5 D5

PA6 D6

PA7 D7

Линии порта PORTB

ATmega32 Линии ус-в

PB0 -

PB1 -

PB2/INT2 BUTTON2

PB3/OC0 SPEAKER

PB4/-SS CS

PB5/MOSI D1

PB6/MISO D0

PB7/SCK CLK

Линии порта PORTD

ATmega32 Линии ус-в

PD0 -

PD1 -

PD2/INT0 BUTTON0

PD3/INT1 BUTTON1

PD4 -

PD5 -

PD6 -

PD7 -

Кнопки

Button0,Button1,Button2Динамик

Speaker

ATmega32

Микроконтроллер

SD/MMC карта

Дисплей

Линии порта PORTA

ATmega32 Линии ус-в

PA0 RS

PA1 RW

PA2 E

PA3 -

PA4 D4

PA5 D5

PA6 D6

PA7 D7

Линии порта PORTB

ATmega32 Линии ус-в

PB0 -

PB1 -

PB2/INT2 BUTTON2

PB3/OC0 SPEAKER

PB4/-SS CS

PB5/MOSI D1

PB6/MISO D0

PB7/SCK CLK

Линии порта PORTD

ATmega32 Линии ус-в

PD0 -

PD1 -

PD2/INT0 BUTTON0

PD3/INT1 BUTTON1

PD4 -

PD5 -

PD6 -

PD7 -

Кнопки

Button0,Button1,Button2Динамик

Speaker

Схема 5. Функциональная схема

Описание схемы:

Схема показывает соединения линий портов с устройствами и взаимосвязь их с контроллером. Так линии порта PORTA работают только на выход, PORTD – только на вход, а линии порта PORTB имеют разное значений.

Дисплей использует практически все линии PORTA под свои нужды, порт PORTD имеет функциональными только два входа, отвечающие за внешние прерывания. В линиях порта PORTB разные линии принадлежат разным устройствам. Так линия INT2 используется кнопкой для вызова внешнего прерывания, линия OC0 используется динамиков для вывода последовательности, а остальные линии используется для связи с флеш картой sd/mmc.

5. Разработка и отладка рабочей программы управления

5.1. Алгоритм работы программы.

Составим алгоритм работы, исходя из задач системы:

Т.к. система – часы, то вначале необходимо разработать их. Нам потребуются глобальные переменные, отвечающие за показание часов, минут и секунд. Используя один из встроенных таймеров, программируем контроллер так, чтобы при достижении значения возникало прерывание по совпадению. Как только это произошло, увеличиваем глобальную переменную, отвечающую за секунды на единицу. При достижении 60 обнуляем эту переменную и прибавляем единицу в переменную «минуты», аналогично поступаем и с минутами и часами. Для часов же условием обнуления будет значение 24. Также необходимо инициализировать дисплей, используя библиотечную функцию. Вывод времени на экран будет осуществляться последовательным выводом на экран дисплея цифр, означающих десятки или единицы показателя. Деление на цифры осуществляется при помощи функций.

Чтение файла будет возможно при инициализации sd и fat системы на ней. Настроим Timer1 так, чтобы при выходе за пределы отсчета выполнялась функция связи с sd. Таким образом предотвратим её «сон». Инициализируем карточку при помощи одной из библиотечных функций, также используя другую функцию свяжем файловую систему на карточке с диском 0 в нашей системе. Так мы сможем использовать FAT для просмотра содержимого.

Воспроизведение файла возможно осуществить выводя последовательность байт через порт ШИМа. Однако сразу вывести весь файл не удастся из-за физических особенностей воспроизведения и нужно сделать это с правильной частотой. Инициализируем Timer1, т.к. это единственный 16-битный таймер, для воспроизведения с нужной частотой так, чтобы при достижении значения таймером возникало прерывание по совпадению. При этом будем считывать части файла по несколько байт, записывать их в буфер и воспроизводить уже из буфера.

Теперь необходимо связать все эти блоки так, чтобы они работали как единый механизм. В самом начале нам нужно инициализировать необходимые таймеры, затем инициализировать дисплей и флешку. Следовательно используемые таймеры это Timer1 и Timer2 для отсчета времени. Затем, после инициализации sd нужно заново задать значения таймера Timer1, т.к. он будет использован при воспроизведении. Далее вхождение в основной цикл. Основным циклом программы будет являться цикл отображение времени на экран. Каждая итерация начинается с очистки дисплея и последовательно выводится 8 символов, включая два символа «:» как разделитель. Прерывания изменения времени нет необходимости связывать с другими функциями, но функция воспроизведения должна принимать значения текущего времени. Построим следующую конструкцию: прерывание от кнопки воспроизведение ставит переменную флага в состояние 1, в цикле проверяется значение этой переменной и, если это единица то выполняется функция выбора последовательности воспроизведения. В этой функции дается сигнал на воспроизведение определенного файла. И уже сама функция воспроизведения файла переопределяет значения таймера Timer1, тем самым провоцируя прерывание по совпадению и чтение из файла и пересылку на выход ШИМ.

Рассмотрим описание всех функций и прерываний:

interrupt [TIM2_COMP] void timer2_comp_isr(void)

Прерывание по совпадению таймера Timer2. Считает секунды, минуты и часы.

interrupt [2] void int0(void)

Внешнее прерывание. Инкрементирует переменную, содержащую часы.

interrupt [3] void int1(void)

Внешнее прерывание. Инкрементирует переменную, содержащую минуты

interrupt[4] void int2(void)

Внешнее прерывание. Устанавливает переменную flag в единицу. При этом как следствие вызывается озвучивание времени.

interrupt [TIM1_OVF] void timer1_ovf_isr(void)

Прерывание по переполнению таймера Timer1. Заново устанавливает начальные значения таймера и обращается к карте sd с пустым запросом (защита против «сна»).

interrupt [TIM1_COMPA] void timer1_compa_isr(void)

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

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

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

Обнуляем настройку таймера Timer0, переменную play и счетчик текущего байта если был прочтен последний блок файла.

Иначе читаем из файла следующие 128 байт и зануляем счетчик текущего байта в буфере.

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

char tenth(char a)

Функция возвращает число десятков числа.

char unit(char b)

Функция возвращает число единиц из числа.

void play_stop()

Функция останавливает воспроизведение файла зануляя флаг play, установки таймера Timer0 и закрывает файл.

void play_file(char *nfile)

Открывает файл для чтения, устанавливает таймер Timer1 и запускает ШИМ, настраивая таймер Timer0 необходимым образом. Ставит флаг Play в единицу.

void speak(int f)

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

void Initialization()

Инициализирует таймеры системы, настраивает разрешение прерываний и включает дисплей.

void sdfat_init()

Инициализирует карточку и обрабатывает ошибки, возникшие при этом. Связывает FAT систему на логическом диске с номером 0 и структуру, на которую указывает указатель.

void reinit_timer1()

Реинициализация таймера Timer1 для работы с воспроизведением.

void main(void)

Основная функция программы.

Код программы на высокоуровневом языке C показан в Приложении 1.

5.2 Моделирование

Для моделирования была использована программа Proteus 7 Professional.

Для того чтобы смоделировать наше устройство потребовались следующие компоненты Proteus:

МК Дисплей Кнопка

Динамик

Эмулятор mmc карты Конденсатор

Таблица 1. Компоненты

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

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

5.3 Отладка системы

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

Запустим симуляцию в Proteus. На дисплее выводится информация о инициализации sd карточки и файловой системе на ней. Отображается время с 00 часов, 00 минут и 00 секунд. Можем видеть как с каждой секундой секунды прибавляются и на дисплее. Нажимая кнопки настройки можно указать текущее время.

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

Путем дополнения кода выводом сообщений о текущей выполняемой функции, выбранном файле для воспроизведения и т.д. была выявлена ошибка в функции play_file(). Аналогичным путем было выявлено отсутствие какой-либо реакции на библиотечную функцию открытия файла f_open() из библиотеки ff.h. Более того, не выводилось никакой ошибки и никаких других сообщений об этом.

Возможно, что отсутствие реакции на функцию работы с ФС вызвано неправильной инициализацией карты или невозможностью её чтения. Однако, при инициализации карты выдается сообщение о том, что карта готова работать с системой. Либо возможен вариант, что сама функция f_open() не может работать с картой по такому интерфейсу или есть ошибки в коде функции. Т.к. библиотека ff.h была переписана под синтаксис CodeVision AVR из кода для WinAVR, возможно не все работает так, как необходимо.

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

lcd_clear();

status = disk_read(0,buffer,0,1);

if (status == RES_ERROR )

{ lcd_puts("err drive");}

else if(status == RES_NOTRDY )

{ lcd_puts("not ready ");}

else if(status == RES_PARERR )

{ lcd_puts("err arg ");}

else if(status == 0 )

{ lcd_puts("Ok ");}

else lcd_puts("NotOk");

lcd_gotoxy(0,0);

while(i<16)

{lcd_putchar(buffer[i]); i++;}

delay_ms(2000);

На дисплее отобразятся первые 16 символов сектора 0 на карте. При помощи любого HEX-редактора откроем образ sd карточки и первые 16 символов будут именно такими же, что и отображаются на дисплее (код приведен в Приложении 2). Отсюда можно сделать вывод, что чтение информации с sd-карты возможно и проблема открытия файла заключается в самой функции открытия.

Рис 2. Вывод на дисплей

Рис 3. Реальное содержимое файла

Т.к. мы не смогли получить воспроизведение, попробуем воспроизвести любой файл путем прямого чтения с диска. Для этого перепишем управляемый код, убрав все, что связано с ФС, а также изменим записанную на диск информацию. Теперь информация должна быть записана, начиная с сектора 0. Код приведен в Приложении 3. Запуская симулятор, получаем сообщение о правильной инициализации карты, а при нажатии кнопки воспроизведения – сообщение о верном прочтении. Однако файл не воспроизводится, более того вся система перезагружается. Точно установить причину перезагрузки не удалось, однако, проведенные опыты показали отсутствие такой проблемы при отключении режима ШИМ на таймере Timer0. К сожалению, без включения этого режима воспроизведение невозможно. Остается открытым вопрос, что конкретно служит причиной сброса МК. Можно предположить, что причиной сброса служит сторожевой таймер(WDT), «спасающий» от зависаний МК, только в данной программе он не был инициализирован.

6. Заключение

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

Был обоснован выбор тех или иных схем и выбор микроконтроллера, который будет стоять во главе всего устройства и управлять его составляющими элементами.

Были разработаны основные принципы и алгоритмы работы устройства, по которым оно будет функционировать, а для интеграции данных алгоритмов в само устройство была разработана программа на языке C для контроллера ATmega32 в среде разработки CodeVision AVR(CVAVR).

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

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

7. Список используемой литературы

1. ATmega32 Datasheet

2. Техническая библиотека http://www.ntlib.chat.ru/3. Электронный портал Kazus.ru http://kazus.ru/

4. Форум РадиоКот http://radiokot.ru/

Приложение 1.

// Alphanumeric LCD Module functions

#asm.equ __lcd_port=0x1b ;PORTA #endasm#include <mega32.h>

#include <delay.h>

#include <sdcard.h>

#include <ff.h>

#include <stdio.h>

#include <lcd.h>

#include <string.h>

/* Timer1 частота прерывания по переполнению [Hz] */

#define T1_OVF_FREQ 100

/* Timer1 предделитель */

#define T1_PRESC 1024L

/* Timer1 знаечение после переполнения */

#define T1_INIT (0x10000L-(_MCU_CLOCK_FREQUENCY_/(T1_PRESC*T1_OVF_FREQ)))

char s=0,m=0,h=0;//секунды, минуты, часы

char t,u;// десятки, единицы

char flag, play;//флаги

unsigned char status = 1;

unsigned char drv = 0;

unsigned int nbytes = 0;

FATFS fat;

FRESULT res ;FIL file;

FATFS *pfat;

char buffer[128];

// Timer 2 output compare interrupt service routine

interrupt [TIM2_COMP] void timer2_comp_isr(void)

{

// Place your code here

s=s+1;

if (s==60)

{

s=0;

m=m+1;

if (m==60)

{

m=0;

h=h+1;

if (h==24)

{

h=0;

}

}

}

}

// External Interrupt 1 service routine

interrupt [2] void int0(void)

{

h=h+1;

if(h==24)

{

h=0;

}

}

interrupt [3] void int1(void)

{

m=m+1;

if(m==60)

{

m=0;

}

}

interrupt[4] void int2(void)

{

flag=1;

}

// Timer1 overflow interrupt service routine

interrupt [TIM1_OVF] void timer1_ovf_isr(void)

{

// Reinitialize Timer1 value

TCNT1H = T1_INIT >> 8;

TCNT1L = T1_INIT & 0xff;

// Place your code here

disk_timerproc();

}

// Timer1 output compare A interrupt service routine

interrupt [TIM1_COMPA] void timer1_compa_isr(void)

{

static unsigned int c256=0;

TCNT1=0x00;

if(play == 0)

{

c256 = 0;

return; // Нет ничего для проигрывания

}

// Читаем новый блок

if(c256 == 0 || c256 == nbytes) // Или первый блок или следующий

{

if(c256 == nbytes && nbytes!=128)

{

c256 = 0;

play = 0;

TCCR0=0b00000000;

return;

}

if((res=f_read(&file,buffer,128,&nbytes))==FR_OK) // Читаем в буфер

{

c256 = 0; // Счетчик текущего байта в буфере

}

else // Ошибка чтения или конец файла. Останавливаем воспроизведение.

{

c256 = 0;

play_stop();

return;

}

}

if(nbytes>0)

OCR0=buffer[c256++]; // Выводим через ШИМ

else // Конец воспроизведения

{

c256 = 0;

play_stop();

return;

}

}

char tenth(char a)

{

t=a/10;

return t;

}

char unit(char b)

{

t=b/10;

u=b-t*10;

return u;

}

void play_stop()

{

play = 0;

TCCR0=0b00000000;

f_close(&file);

}

void play_file(char *nfile)

{

if ((res=f_open(&file,nfile,FA_READ))==FR_OK) // Открытие файла

{

lcd_gotoxy(0,1);

lcd_puts("openfile");

OCR1AH=0x07;

OCR1AL=0xD0;

TCCR0=0x69; // 0b1000101 - Запуск ШИМа play = 1; // Запуск воспроизведения

return;

}

else {lcd_gotoxy(0,1);

lcd_puts("not open");

}

}

void speak(int f)

{

char c=0;

if (f==1) c=h;

else c=m;

lcd_gotoxy(0,1);

if (c<10)

{

switch(c)

{

case 0:{play_file("0:0.wav");break;}

case 1:{play_file("1.wav");break;}

case 2:{play_file("2.wav");break;}

case 3:{play_file("3.wav");break;}

case 4:{play_file("4.wav");break;}

case 5:{play_file("5.wav");break;}

case 6:{play_file("6.wav");break;}

case 7:{play_file("7.wav");break;}

case 8:{play_file("8.wav");break;}

case 9:{play_file("9.wav");break;}

}

if (f==1) play_file("chasov.wav");

else play_file("minut.wav");

}

else if (c<=20)

{

switch(c)

{

case 10:{play_file("10.wav");break;}

case 11:{play_file("11.wav");break;}

case 12:{play_file("12.wav");break;}

case 13:{play_file("13.wav");break;}

case 14:{play_file("14.wav");break;}

case 15:{play_file("15.wav");break;}

case 16:{play_file("16.wav");break;}

case 17:{play_file("17.wav");break;}

case 18:{play_file("18.wav");break;}

case 19:{play_file("19.wav");break;}

case 20:{play_file("20.wav");break;}

}

if (f==1) play_file("chasov.wav");

else play_file("minut.wav");

}

else {

switch(tenth(c)*10)

{

case 30:{play_file("30.wav");break;}

case 40:{play_file("40.wav");break;}

case 50:{play_file("50.wav");break;}

}

switch(unit(c))

{

case 0:break;

case 1:{play_file("1.wav");break;}

case 2:{play_file("2.wav");break;}

case 3:{play_file("3.wav");break;}

case 4:{play_file("4.wav");break;}

case 5:{play_file("5.wav");break;}

case 6:{play_file("6.wav");break;}

case 7:{play_file("7.wav");break;}

case 8:{play_file("8.wav");break;}

case 9:{play_file("9.wav");break;}

}

if (f==1) play_file("chasov.wav");

else play_file("minut.wav");

}

return;

}

void Initialization()

{

// Input/Output Ports initialization

// Port A initialization

PORTA=0x00;

DDRA=0xFC;

// Port B initialization

PORTB=0x00;

DDRB=0xF0;

// Port C initialization

PORTC=0x00;

DDRC=0x00;

// Port D initialization

PORTD=0x00;

DDRD=0x00;

// Timer/Counter 0 initialization

TCCR0=0x00;

TCNT0=0x00;

OCR0=0x00;

// Timer/Counter 1 initialization

TCCR1A=0x00;

TCCR1B=0x04;

TCNT1H=T1_INIT>>8; //// perepolnenieTCNT1L=T1_INIT&0xFF; //// perepolnenieICR1H=0x00; /// capture INPUT

ICR1L=0x00; /// capture INPUT

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

// Timer/Counter 2 initialization

ASSR=0x08;

TCCR2=0x0F;

TCNT2=0x00;

OCR2=0x20;

// External Interrupt(s) initialization

// INT0: on

// INT1: on

// INT2: on

GICR|=0xE0;

MCUCR=0x0F;

MCUCSR=0x40;

GIFR=0xE0;

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0x04;

// Analog Comparator initialization

ACSR=0x80;

SFIOR=0x00;

// LCD module initialization

lcd_init(16);

TIFR|=0x80;

}

void sdfat_init()

{

status =1;

status = disk_initialize(drv);

if (status == STA_NOINIT )

{

lcd_clear();

lcd_gotoxy(0,0);

lcd_puts("drive not initialized");

delay_ms(1000);

}

else if(status == STA_NODISK )

{

lcd_clear();

lcd_gotoxy(0,0);

lcd_puts("no card ");

delay_ms(2000);

}

else if(status == STA_PROTECT )

{

lcd_clear();

lcd_gotoxy(0,0);

lcd_puts("write protected ");

delay_ms(2000);

}

else if(status == 0 )

{

lcd_clear();

lcd_gotoxy(0,0);

lcd_puts("On success ");

delay_ms(2000);

};

// Связывает FAT систему на логическом диске с номером Drive(0) и структуру,

// на которую указывает указатель fat.

pfat = &fat;

if ((res=f_mount(0,pfat))==FR_OK)

{

lcd_clear();

lcd_gotoxy(0,0);

lcd_puts("Mounted");

delay_ms(2000);

};

}

void reinit_timer1()

{

// Timer/Counter 1 initialization

TCCR1A=0x00;

TCCR1B=0x01;

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x03;

OCR1AL=0xE8;

OCR1BH=0x00;

OCR1BL=0x00;

TIMSK=0x96;

}

void main(void)

{

// Declare your local variables here

Initialization();

// Global enable interrupts

#asm("sei")

sdfat_init();

reinit_timer1();

lcd_clear();

while (1)

{

// Place your code here

lcd_gotoxy(0,0);

//hours

t=tenth(h);

lcd_putchar(t+0x30);

u=unit(h);

lcd_putchar(u+0x30);

lcd_putsf(":");

//minute

t=tenth(m);

lcd_putchar(t+0x30);

u=unit(m);

lcd_putchar(u+0x30);

if (m==30)

flag=1;

lcd_putsf(":");

//seconds

t=tenth(s);

lcd_putchar(t+0x30);

u=unit(s);

lcd_putchar(u+0x30);

if (flag==1)

{

speak(1);

speak(2);

flag=0;

}

};

}

Приложение 2

// Alphanumeric LCD Module functions

#asm.equ __lcd_port=0x1b ;PORTA #endasm#include <mega32.h>

#include <delay.h>

#include <sdcard.h>

#include <ff.h>

#include <stdio.h>

#include <lcd.h>

#include <string.h>

/* Timer1 частота прерывания по переполнению [Hz] */

#define T1_OVF_FREQ 100

/* Timer1 предделитель */

#define T1_PRESC 1024L

/* Timer1 знаечение после переполнения */

#define T1_INIT (0x10000L-(_MCU_CLOCK_FREQUENCY_/(T1_PRESC*T1_OVF_FREQ)))

char s=0,m=0,h=0;//секунды, минуты, часы

char t,u;// десятки, единицы

char flag, play;//флаги

unsigned char status = 1;

unsigned char drv = 0;

unsigned int nbytes = 0;

char buffer[128];

// Timer 2 output compare interrupt service routine

// Timer 2 output compare interrupt service routine

interrupt [TIM2_COMP] void timer2_comp_isr(void)

{

// Place your code here

s=s+1;

if (s==60)

{

s=0;

m=m+1;

if (m==60)

{

m=0;

h=h+1;

if (h==24)

{

h=0;

}

}

}

}

// External Interrupt 1 service routine

interrupt [2] void int0(void)

{

h=h+1;

if(h==24)

{

h=0;

}

}

interrupt [3] void int1(void)

{

m=m+1;

if(m==60)

{

m=0;

}

}

interrupt[4] void int2(void)

{

flag=1;

}

// Timer1 overflow interrupt service routine

interrupt [TIM1_OVF] void timer1_ovf_isr(void)

{

// Reinitialize Timer1 value

TCNT1H = T1_INIT >> 8;

TCNT1L = T1_INIT & 0xff;

// Place your code here

disk_timerproc();

}

// Timer1 output compare A interrupt service routine

interrupt [TIM1_COMPA] void timer1_compa_isr(void)

{

static unsigned int c256=0;

TCNT1=0x00;

if(play == 0)

{

c256 = 0;

return; // Нет ничего для проигрывания

}

// Читаем новый блок

if(c256 == 0 || c256 == nbytes) // Или первый блок или следующий

{

if(c256 == nbytes && nbytes!=128)

{

c256 = 0;

play = 0;

TCCR0=0b00000000;

return;

}

if(disk_read (0,buffer,8,1)==0) // Читаем в буфер

{

c256 = 0; // Счетчик текущего байта в буфере

}

else // Ошибка чтения или конец файла. Останавливаем воспроизведение.

{

c256 = 0;

play_stop();

return;

}

}

if(nbytes>0)

OCR0=buffer[c256++]; // Выводим через ШИМ

else // Конец воспроизведения

{

c256 = 0;

play_stop();

return;

}

}

char tenth(char a)

{

t=a/10;

return t;

}

char unit(char b)

{

t=b/10;

u=b-t*10;

return u;

}

void play_stop()

{

play = 0;

TCCR0=0b00000000;

}

void play_s()

{

OCR1AH=0x07;

OCR1AL=0xD0;

TCCR0=0x69; // 0b1000101 - Запуск ШИМа play = 1; // Запуск воспроизведения

return;

}

void speak()

{

play_s();

return;

}

void Initialization()

{

// Input/Output Ports initialization

// Port A initialization

PORTA=0x00;

DDRA=0xFC;

// Port B initialization

PORTB=0x00;

DDRB=0xF8;

// Port C initialization

PORTC=0x00;

DDRC=0x00;

// Port D initialization

PORTD=0x00;

DDRD=0x00;

// Timer/Counter 0 initialization

TCCR0=0x00;

TCNT0=0x00;

OCR0=0x00;

// Timer/Counter 1 initialization

TCCR1A=0x00;

TCCR1B=0x04;

TCNT1H=T1_INIT>>8; //// perepolnenieTCNT1L=T1_INIT&0xFF; //// perepolnenieICR1H=0x00; /// capture INPUT

ICR1L=0x00; /// capture INPUT

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

// Timer/Counter 2 initialization

ASSR=0x08;

TCCR2=0x0F;

TCNT2=0x00;

OCR2=0x20;

// External Interrupt(s) initialization

// INT0: on

// INT1: on

// INT2: on

GICR|=0xE0;

MCUCR=0x0F;

MCUCSR=0x40;

GIFR=0xE0;

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0x04;

// Analog Comparator initialization

ACSR=0x80;

SFIOR=0x00;

// LCD module initialization

lcd_init(16);

TIFR|=0x80;

}

void sdfat_init()

{

status =1;

status = disk_initialize(drv);

if (status == STA_NOINIT )

{

lcd_puts("drive not initialized");

}

else if(status == STA_NODISK )

{

lcd_puts("no card ");

}

else if(status == STA_PROTECT )

{

lcd_puts("write protected ");

}

else if(status == 0 )

{

lcd_puts("On success ");

};

}

void reinit_timer1()

{

// Timer/Counter 1 initialization

TCCR1A=0x00;

TCCR1B=0x01;

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x03;

OCR1AL=0xE8;

OCR1BH=0x00;

OCR1BL=0x00;

TIMSK=0x92;

}

void main(void)

{

char i=0;

// Declare your local variables here

Initialization();

#asm("sei")

lcd_clear();

sdfat_init();

reinit_timer1();

lcd_clear();

status = disk_read(0,buffer,0,1);

if (status == RES_ERROR )

{ lcd_puts("err drive");}

else if(status == RES_NOTRDY )

{ lcd_puts("not ready ");}

else if(status == RES_PARERR )

{ lcd_puts("err arg ");}

else if(status == 0 )

{ lcd_puts("Ok ");}

else lcd_puts("NotOk");

lcd_clear();

while(i<16)

{lcd_putchar(buffer[i]); i++;}

delay_ms(2000);

lcd_clear();

while (1)

{

// Place your code here

lcd_gotoxy(0,0);

//hours

t=tenth(h);

lcd_putchar(t+0x30);

u=unit(h);

lcd_putchar(u+0x30);

lcd_putsf(":");

//minute

t=tenth(m);

lcd_putchar(t+0x30);

u=unit(m);

lcd_putchar(u+0x30);

if (m==30)

flag=1;

lcd_putsf(":");

//seconds

t=tenth(s);

lcd_putchar(t+0x30);

u=unit(s);

lcd_putchar(u+0x30);

if (flag==1)

{

speak();

flag=0;

}

};

}

Приложение 3.

// Alphanumeric LCD Module functions

#asm.equ __lcd_port=0x1b ;PORTA #endasm#include <mega32.h>

#include <delay.h>

#include <sdcard.h>

#include <ff.h>

#include <stdio.h>

#include <lcd.h>

#include <string.h>

/* Timer1 частота прерывания по переполнению [Hz] */

#define T1_OVF_FREQ 100

/* Timer1 предделитель */

#define T1_PRESC 1024L

/* Timer1 знаечение после переполнения */

#define T1_INIT (0x10000L-(_MCU_CLOCK_FREQUENCY_/(T1_PRESC*T1_OVF_FREQ)))

char s=0,m=0,h=0;//секунды, минуты, часы

char t,u;// десятки, единицы

char flag, play;//флаги

unsigned char status = 1;

unsigned char drv = 0;

unsigned int nbytes = 0;

char buffer[128];

// Timer 2 output compare interrupt service routine

interrupt [TIM2_COMP] void timer2_comp_isr(void)

{

// Place your code here

s=s+1;

if (s==60)

{

s=0;

m=m+1;

if (m==60)

{

m=0;

h=h+1;

if (h==24)

{

h=0;

}

}

}

}

// External Interrupt 1 service routine

interrupt [2] void int0(void)

{

h=h+1;

if(h==24)

{

h=0;

}

}

interrupt [3] void int1(void)

{

m=m+1;

if(m==60)

{

m=0;

}

}

interrupt[4] void int2(void)

{

flag=1;

}

// Timer1 overflow interrupt service routine

interrupt [TIM1_OVF] void timer1_ovf_isr(void)

{

// Reinitialize Timer1 value

TCNT1H = T1_INIT >> 8;

TCNT1L = T1_INIT & 0xff;

// Place your code here

disk_timerproc();

}

// Timer1 output compare A interrupt service routine

// 16000 Hz / 8000 Hz

interrupt [TIM1_COMPA] void timer1_compa_isr(void)

{

TCNT1=0x00;

}

char tenth(char a)

{

t=a/10;

return t;

}

char unit(char b)

{

t=b/10;

u=b-t*10;

return u;

}

void play_stop()

{

play = 0;

TCCR0=0b00000000;

}

void play_s()

{

char i=0,c256=0;

TCCR0=0x5B; // 0b01011001 - Запуск быстрого ШИМа ПЕРЕЗАГРУЖАЕТ ПОЛНОСТЬЮ!!!

// Читаем

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

{

if(disk_read (0,buffer,i,1)==0)

{

delay_ms(4000);

while(c256<255)

{

OCR0=buffer[c256]; // Выводим через ШИМ

c256++;

delay_ms(3200);

}

}

else // Ошибка чтения или конец файла. Останавливаем воспроизведение.

continue;

} c256 = 0;

play_stop();

return;

}

void speak()

{

play_s();

return;

}

void Initialization()

{

// Input/Output Ports initialization

// Port A initialization

PORTA=0x00;

DDRA=0xFC;

// Port B initialization

PORTB=0x00;

DDRB=0xF8;//0xF0;

// Port C initialization

PORTC=0x00;

DDRC=0x00;

// Port D initialization

PORTD=0x00;

DDRD=0x00;

// Timer/Counter 0 initialization

TCCR0=0x00;

TCNT0=0x00;

OCR0=0x00;

// Timer/Counter 1 initialization

TCCR1A=0x00;

TCCR1B=0x04;

TCNT1H=T1_INIT>>8; //// perepolnenieTCNT1L=T1_INIT&0xFF; //// perepolnenieICR1H=0x00; /// capture INPUT

ICR1L=0x00; /// capture INPUT

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

// Timer/Counter 2 initialization

ASSR=0x08;

TCCR2=0x0F;

TCNT2=0x00;

OCR2=0x20;

// External Interrupt(s) initialization

// INT0: on

// INT1: on// INT2: onGICR|=0xE0;

MCUCR=0x0F;

MCUCSR=0x40;

GIFR=0xE0;

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0x04;

// Analog Comparator initialization

ACSR=0x80;

SFIOR=0x00;

// LCD module initialization

TIFR|=0x80;

}

void sdfat_init()

{

status =1;

status = disk_initialize(drv);

if (status == STA_NOINIT )

{

lcd_puts("drive not initialized");

}

else if(status == STA_NODISK )

{

lcd_puts("no card ");

}

else if(status == STA_PROTECT )

{

lcd_puts("write protected ");

}

else if(status == 0 )

{

lcd_puts("On success ");

};

}

void reinit_timer1()

{

// Timer/Counter 1 initialization

TCCR1A=0x00;

TCCR1B=0x01;

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x03;

OCR1AL=0xE8;

OCR1BH=0x00;

OCR1BL=0x00;

TIMSK=0x92;

}

void main(void)

{

// Declare your local variables here

Initialization();

// Global enable interrupts

#asm("sei")

lcd_init(16);

lcd_clear();

sdfat_init();

delay_ms(2000);

reinit_timer1();

lcd_clear();

while (1)

{

// Place your code here

lcd_gotoxy(0,0);

//hours

t=tenth(h);

lcd_putchar(t+0x30);

u=unit(h);

lcd_putchar(u+0x30);

lcd_putsf(":");

//minute

t=tenth(m);

lcd_putchar(t+0x30);

u=unit(m);

lcd_putchar(u+0x30);

if (m==30)

flag=1;

lcd_putsf(":");

//seconds

t=tenth(s);

lcd_putchar(t+0x30);

u=unit(s);

lcd_putchar(u+0x30);

if (flag==1)

{

speak();

flag=0;

}

};

}

Похожие работы:

«ПРАВИТЕЛЬСТВО РОССИЙСКОЙ ФЕДЕРАЦИИПОСТАНОВЛЕНИЕ от 24 июня 2017 г. N 743ОБ ОРГАНИЗАЦИИБЕЗОПАСНОГО ИСПОЛЬЗОВАНИЯ И СОДЕРЖАНИЯ ЛИФТОВ, ПОДЪЕМНЫХПЛАТФОРМ ДЛЯ ИНВАЛИДОВ, ПАССАЖИРСКИХ КОНВЕЙЕРОВ (ДВИЖУЩИХСЯПЕШЕХОДНЫХ ДОРОЖЕК), ЭСК...»

«Министерство образования и науки Пермского Края государственное бюджетное образовательное учреждение среднего профессионального образования "Пермский химико-технологический техникум" Специальность 151031"Монтаж техническая эксплуатация промышленного оборудования (по отраслям)" Дневник-отчетпроизводственной практики ПП.0...»

«Благо народа высший закон Муниципальный вестник № 52 Совета и Исполнительного комитета Заинского муниципального района (март 2014 года) Местная властьПриняты решения Совета Заинского муниципального района:О состоянии коррупции и принимаемых мерах по сокращению коррупционных ус...»

«Техническое задание на приобретение канцелярский товаров № п/п Наименование Товара Ед. изм. Кол-во1. Скоросшиватели (мелованный картон, гарант пл. 360г/кв.м; цвет ассорти) шт. 50 2. Бумага А4 80 г/м2, листовая для офисной техники формат А4,210х297 мм, 500 л/п, категория бумаги В. пачка 10...»

«center2052084Руководство администратора АИС "Контингент-регион" 0Руководство администратора АИС "Контингент-регион" Оглавление TOC \o 1-3 \h \z \u Оглавление PAGEREF _Toc410831486 \h 21 ВВЕДЕНИЕ PAGEREF _Toc410831487 \h 41.1 Область применения PAGEREF...»

«Киев, 20121. Общие положения1.1. Племенной смотр является зоотехническим мероприятием Кинологического Союза Украины,  позволяющим осуществить, по нижеуказанным критериям, отбор собак для использования их в племенном разведении. При этом, сравнение...»

«П О С Т А Н О В Л Е Н И ЕАДМИНИСТРАЦИИ КИРОВСКОГО МУНИЦИПАЛЬНОГО РАЙОНАСТАВРОПОЛЬСКОГО КРАЯ 02 мая 2017 г. г. Новопавловск № 223 Об утверждении программы комплексного развития социальной инфраструктуры муниципального образования Зо...»

«ИСТОРИЯ НОВОГО ВРЕМЕНИ. 1500-1800 ГГ. (28 часов) Тема 1. Мир вначале Нового времени (13 часов) № п/п Тема и тип урока Дата проведения Кол-во часов Планируемые результаты УУД Деятельность ученика Деятельность учителя 1 Глава...»









 
2018 www.el.z-pdf.ru - «Библиотека бесплатных материалов - онлайн документы»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 2-3 рабочих дней удалим его.