лабы. Laboratornye_raboty_1-5 Микропроцессорные системы. Методические указания к лабораторным работам 15 по дисциплине "Микропроцессорные системы" для студентов направления подготовкиспециальности
Скачать 1.97 Mb.
|
Листинг 1 #include unsigned char rab; interrupt [TIM1_COMP] void timerl_comp_isr(void){ if (PIND.0==1) { // Проверка состояния переключателя rab = rab » 1; // Сдвиг разрядов if (rab==0) rab = 0b10000000;} // Если дошли до конца else { rab = rab «1: // Сдвиг разрядов if (rab==0) rab = 0b00000001;} // Сдвиг влево PORTB=rab^0xFF; // Запись в порт с инверсией } void main(void) { CLKPR=0x80;//Отключить деление частоты CLKPR=0x00; PORTА=0x00; // Инициализация порта A DDRA=0x00; PORTB=0xFF; // Инициализация порта B DDRB=0xFF; PORTD=0x7F; // Инициализация порта D DDRD=0x00; TCCR0A=0x00; // Инициализация таймера Т0 TCCR0B=0x00; TCNT0=0x00; OCROA=0x00; OCROB=0x00; TCCR1A=0x00; // Инициализация таймера Т1 TCCR1B=0x0D; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x03; //Коэффициент деления (030CH = 780) OCR1AL=0x0C; OCR1BH=0x00; OCR1BL=0x00; GIMSK=0x00; // Инициализация внешних прерываний MCUCR=0x00; TIMSK=0x40; // Запись маски прерываний USICR=0x00; ACSR=0x80; // Инициализация аналогового компаратора rab=0b00010000;//Присвоение начального значение переменной rab #asm("sei") // Команда разрешения прерываний while (1) {}; } ЛАБОРАТОРНАЯ РАБОТА №3 Разработка микропроцессорного устройства управления семисегментным индикатором Цель. Разработать электронное устройство, предназначенное для управления семисегментным индикатором. Задача. Используя два семисегментных индикатора в эмуляторе Proteus разработать схему устройства на основе ATMega16 (или ATMega8 или ATtiny 2313), которое бы отображало числа от 0 до 99. В программной среде CodeVisionAVR разработать программу для поставленной задачи. Предварительные сведения Для отображения цифровой информации в системах на базе микроконтроллеров используются светодиодные семисегментные индикаторы. Они просты в управлении, имеет высокую яркость, широкий диапазон рабочих температур и низкую стоимость. К недостаткам светодиодных индикаторов относятся – высокое энергопотребление, отсутствие управляющего контроллера и скудные возможности по выводу буквенной информации. С ветодиодный семисегментный индикатор представляет собой группу светодиодов (рис. 1) расположенных в определенном порядке и объединенных конструктивно. Зажигая одновременно несколько светодиодов можно формировать на индикаторе символы цифр. Индикаторы различаются по типу соединения светодиодов – общий анод, общий катод, по количеству отображаемых разрядов – одноразрядные, двух разрядные и т.д. и по цвету – красные, зеленые, желтые и т.д. Рис. 1 – Семисегментный индикатор Семисегментным индикатором можно управлять статически или динамически. При статическом управлении (рис. 2) разряды индикатора подключены к микроконтроллеру независимо друг от друга и информация на них выводится постоянно. Этот способ управления проще динамического, но без использования дополнительных элементов, как-то сдвиговые регистры, подключить многоразрядный семисегментный индикатор к микроконтроллеру будет проблематично – может не хватить выводов. Рис. 2 – Статическое управление семисегментным индикатором Динамическое управление (динамическая индикация) (рис. 3) подразумевает поочередное зажигание разрядов индикатора с частотой, не воспринимаемой человеческим глазом. Схема подключения индикатора в этом случае на порядок экономичнее благодаря тому, что одинаковые сегменты разрядов индикатора объединены. Рис. 3 – Динамическое управление семисегментным индикатором Рассмотрим случай управления индикатором с выводом одной цифры. Упрощенная схема в Proteus для подобного устройства приведена на рис. 4. Рис. 4 – Схема подключения одного индикатора в Proteus Элементы, используемые в схеме: Рис. 5 – Список элементов из библиотеки компонентов Proteus Чтобы зажечь на индикаторе какую-либо цифру нужно настроить порты, к которым подключен индикатор, в режим выхода, «открыть» транзистор (в данном случае подать на базу «единицу») и установить в порту микроконтроллера её код. В зависимости от того, куда подключены сегменты индикатора - коды могут быть разные. Программа на языке C++ Возможный вариант программы управления семисегментным индикатором на языке C++ приведен в листинге 1. Листинг 1. Вывод цифр от 0 до 9 (статическая индикация) #include #include unsigned char number[] = { 0x3f, //0 0x06, //1 0x5b, //2 0x4f, //3 0x66, //4 0x6d, //5 0x7d, //6 0x07, //7 0x7f, //8 0x6f //9 }; unsigned char count = 0; void main(void){ //порт, к которому подключаются сегменты PORTC = 0xff; DDRC = 0xff; //вывод, к которому подключается катод PORTD |= (1<<0); DDRD |= (1<<0); while (1) { PORTC = number[count]; count++; if (count == 10) count = 0; delay_ms(300); } } ЛАБОРАТОРНАЯ РАБОТА №4. Разработка микропроцессорного устройства формирования звука Цель. Освоение организации памяти и базовой архитектуры МК. Составление принципиальной схемы, разработка алгоритма работы устройства, конфигурирование портов ввода/вывода контроллера, написание программы для МК предложенного устройства. Задача. Разработать электронное устройство (синтезатор «Семь нот»), имеющее семь входов и один звуковой выход. К каждому из входов подключен датчик, состоящий их двух нормально разомкнутых контактов. При замыкании контактов любого из датчиков устройство должно вырабатывать звуковой сигнал определенной частоты. Каждому датчику должна соответствовать своя собственная частота звукового сигнала. Если контакты всех датчиков разомкнуты, звуковой сигнал, на выходе должен отсутствовать. Постановка задачи Для формирования звука достаточно взять за основу схему с мигающим светодиодом, подключить вместо светодиода звуковой излучатель (например динамик), а в соответствующей программе использовать константу задержки таким образом, чтобы частота колебания сигнала повысилась и достигла звукового диапазона. Диапазон частот, которые может услышать человек, лежит в пределах примерно от 50 Гц до 15 кГц. Если светодиод мигает с частотой 4 Гц. то уменьшив время задержки в 1000 раз можно получить частоту сигнала на выходе, равную 4 кГц. Эта частота как раз входит в звуковой диапазон. Предлагаемый выше способ формирования звукового сигнала реализует эту задачу программным путем. Однако для формирования звука гораздо удобнее использовать систему прерываний таймеров/счетчиков микроконтроллера. Целью данной работы является создание простейшего сигнального устройства, которое при нажатии разных клавиш будет издавать звуки разной частоты. Схема Поставленная выше задача прекрасно решается при помощи микроконтроллера ATtiny2313. Микроконтроллер имеет два встроенных таймера/счетчика. Какой же из таймеров использовать нам? Для формирования звука лучше подходит шестнадцатиразрядный таймер. Чем больше разрядов, тем с большей точностью можно выбирать его коэффициент деления. Это очень важно для создания нотного стана. Поэтому для формирования звука выберем шестнадцатиразрядный таймер Т1. Определим режим работы нашего таймера. Для генерации звука удобнее всего использовать режим СТО (сброс по совпадению). Нужно выбрать такой коэффициент деления, чтобы на выходе таймера получить колебания в звуковом диапазоне частот. Прежде всего, нужно отказаться от предварительного деления. Если частота кварцевого генератора и код. помещаемый в регистр совпадения, останутся такими же. как в предыдущей работе (в программе «Бегущие огни»), то в новом варианте частота повысится более чем в тысячу раз и как раз попадает в нужный диапазон. Теперь определимся с тем, как сигнал будет попадать на внешний вывод микроконтроллера. Конечно, это можно сделать программно, при помощи процедуры обработки соответствующего прерывания. Но микроконтроллер предусматривает прямой вывод сигнала на один из своих выходов. Причем предусмотрены отдельные выходы для каждого из каналов совпадения. Для канала А подобный выход называется ОС1А. Он совмещен с третьим разрядом порта РВ и является альтернативной функцией данного контакта. Подключение и отключение сигнала совпадения к внешнему выводу ОС1А производится программным путем. Это позволяет программе в нужный момент включать или выключать звук. Так как для вывода звука мы будем использовать один из разрядов порта РВ, то для подключения датчиков воспользуемся другим портом. А именно портом PD. Вариант принципиальной схемы описанного выше устройства показан на рис. 2. Рис. 2 – Схема сигнализатора «Семь нот» на ATtiny2313 Как видно из рисунка, нами снова применен внешний кварцевый резонатор (Q1) с цепями согласования (C1, С2). При подключении датчиков используется та же схема, что использовалась до сих пор для подключения контактов переключателя. Датчики подключаются ко всем разрядам порта PD. При этом для правильной работы датчиков для каждого разряда порта PD должны быть активизированы встроенные резисторы нагрузки. Для подключения звукоизлучателя (динамика) применяется ключевой каскад на транзисторе VT1. Это самый простой способ получить звук достаточной громкости, учитывая, что наш сигнал – это прямоугольные импульсы с амплитудой, почти равной напряжению питания. Транзисторный каскад нужен лишь для повышения нагрузочной способности. Однако подобная схема имеет и свой недостаток. В отсутствии звукового сигнала на выходе 15 микроконтроллера (рис.2) обязательно нужно установить низкий логический уровень. Высокий логический уровень приведет к тому, что транзистор VT1 будет постоянно открыт. Это вызовет недопустимо большой ток через динамик VF1. Постоянно протекающий ток через обмотку динамика вызовет излишнюю потерю мощности и может даже вызвать выход из строя как транзистора, так и динамика. При составлении программы мы должны учесть этот момент. Рис. 3 – Схема звукового сигнализатора в Proteus на ATMega8 Вариант принципиальной схемы, выполненной в PROTEUS 7.5 для ATMega8 по казан на рис. 3. Алгоритм работы программы Алгоритм разрабатываемого устройства следующий. При замыкании контактов любого из датчиков микроконтроллер должен загрузить в регистр совпадения нужный коэффициент и подключить выход таймера к выводу ОС1В. При размыкании контактов датчика микроконтроллер должен отключить сигнал от внешнего вывода ОС1В и подать на него низкий логический уровень. Если контакты всех датчиков разомкнуты, то внешний вывод должен оставаться отключенным. Однако схема построена таким образом, что ничто не мешает одновременно замкнуться сразу нескольким контактам. Что делать в этом случае? Самый правильный путь – обеспечить систему приоритетов. При замыкании нескольких контактов программа должна реагировать лишь на один из них. На тот, приоритет которого выше. Обычно в таких случаях используется следующий прием. Программа поочередно проверяет состояние всех датчиков, например, справа налево. Обнаружив первый же замкнутый контакт, программа прекращает сканирование и выдает звуковой сигнал, соответствующий этому датчику. Договоримся, что датчику, подключенному к входу PD.0 (рис.2), будет соответствовать нота «До». Следующему датчику – нота «Ре», и так далее до ноты «Си». Коэффициенты деления для каждой из нот рассчитываются по законам музыкального ряда исходя из частот звучания нот. указанных в рис. 1. ВЫПОЛНЕНИЕ РАБОТЫ. Разработка программы на языке C++ Листинг 1. #include flash unsigned int tabkd[7] = {4748, 4480, 4228, 3992, 3768, 3556, 3356}; void main(void) { unsigned char count; //определяем переменную count unsigned char temp; //определяем переменную temp PORTB=0X00; //инициализация порта PB DDRB=0x08; PORTD=0X7F; //инициализация порта PD DDRD=0x08; ACSR=0x80; //инициализация (отключение) компаратора TCCR1A=0x00; //инициализация таймера счетчика T1 TCCR1B=0x09; while (1) { m1: temp=PIND; for (count=0; count<7; count++) { //цикл сканирования датчиков if ((temp&1)==0) goto m2; temp >>= 1; //сдвиг содержимого temp } TCCR1A=0x00; //выключение звука goto m1; //переход на начало m2: OCR1A=tabkd[count]; //запись коэффициента деления таймера TCCR1A=0x40; //включение звука }; } ЛАБОРАТОРНАЯ РАБОТА №5. Разработка микропроцессорного синтезатора мелодий Задача. Разработать электронное устройство (синтезатор мелодий), предназначенное для воспроизведения простых одноголосых мелодий, записанных в память программ на этапе программирования. Устройство должно иметь семь управляющих кнопок. Каждой из кнопок должна соответствовать своя мелодия. Мелодия воспроизводится при нажатии и удержании кнопки. При отпускании всех кнопок воспроизведение мелодий прекращается ПРЕДВАРИТЕЛЬНЫЕ СВЕДЕНИЯ Схема Неслучайно в условии задачи заложено именно семь кнопок и несколько одноголосых мелодий. Это позволяет использовать для новой задачи схему из предыдущей работы (рис. 1). Представим, что контакты, подключенные к порту PD – это не датчики. а кнопки управления. Каждая кнопка будет включать одну из заложенных в программу мелодий. Воспроизведение мелодий будет происходить при помощи звуковой части схемы (R1, VT1, VF1). Формат кодируемых мелодий Определимся с методом сохранения мелодии в памяти. Для того, чтобы в памяти можно было хранить данные, нужно сначала эти данные закодировать. Любая мелодия состоит из нот. Каждая нота имеет свой тон (частоту) и длительность звучания. Для того, чтобы закодировать тон ноты, можно просто все ноты пронумеровать по порядку. Удобнее нумеровать, начиная с самого низкого тона. На клавиатуре клавишного инструмента это будет слева направо. Рассмотрим кодирование мелодий. Для экономии памяти удобнее каждую ноту кодировать одним байтом. Три старших бита мы будем использовать для кодирования длительности ноты, а оставшиеся пять битов – для кодирования ее тона. Пятью битами можно закодировать до 32 разных нот, что вполне хватит для разрабатываемого музыкального синтезатора. Итак, если использовать приведенный выше способ кодирования, то код ноты ля первой октавы длительностью 1/4 в двоичном виде будет равен: Рис. 1 – Формат закодированных данных (длительность и частота) Рассмотрим кодирование мелодий. Для того, чтобы закодировать мелодию, нужна ее нотная запись. Используя нотную запись, мы должны присвоить каждой ноте (табл. 2 работы №4) и каждой музыкальной паузе (табл. 3 работы №4) свой код (рис. 1). Цепочка таких кодов и будет представлять собой закодированную мелодию. По условиям задачи музыкальный синтезатор должен уметь воспроизводить несколько разных мелодий. Коды всех мелодий мы разместим в программной памяти микроконтроллера. Для определить конца каждой мелодии используем код 255 (FFh) в качестве признака конца. Теперь определимся, как микроконтроллер будет находить начало каждой мелодии. Все мелодии имеют разную длину, а в памяти они будут записаны одна за другой. Поэтому адрес начала каждой мелодии зависит от длины всех предыдущих. Удобнее всего просто по факту определить адрес начала каждой мелодии и поместить все адреса в специальный массив. Алгоритм работы музыкального синтезатора Рис. 2 – Алгоритм работы музыкального синтезатора ВЫПОЛНЕНИЕ РАБОТЫ Программа на языке C++ Листинг 1 1 #include 2 #include 3 flash unsigned int tabz[] = {16,32,64,128,256,512,1024}; //Массив коэффициентов деления 4 flash unsigned int tabkd[] = {0, 4748, 4480, 4228, 3992, 3768, 3556, 3356, 3168, 2990, 2822, 2664, 2514, 2374, 2240, 2114, 1996, 1884, 1778, 1678, 1584, 1495, 1411, 1332, 1257, 1187, 1120, 1057, 998, 942, 889, 839, 792}; |