Программирование микропроцессорных систем

Основные составляющие компьютерной системы. История развития, особенности применения микропроцессоров. Устройство и работа D-триггера. Принципиальная электрическая схема, директивы, операторы и описание программы для микропроцессоров, виды отладчиков.

Рубрика Программирование, компьютеры и кибернетика
Вид методичка
Язык русский
Дата добавления 27.11.2011
Размер файла 2,9 M

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

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

Элементы C1, R2 - это стандартная цепь начального сброса. Такая цепь обеспечивает сброс микроконтроллера в момент включения питания. Еще недавно подобная цепь была обязательным атрибутом любой микропроцессорной системы. Однако технология производства микроконтроллеров достигла такого уровня, что обе эти цепи (внешний кварц и цепь начального сброса) теперь можно исключить.

Большинство микроконтроллеров AVR, кроме тактового генератора с внешним кварцевым резонатором, содержат внутренний RC-генератор, не требующий никаких внешних цепей. Если вы не предъявляете высоких требований к точности и стабильности частоты задающего генератора, то микросхему можно перевести в режим внутреннего RC-генератора и отказаться как от внешнего кварца (Q1), так и от согласующих конденсаторов (С2 и СЗ).

Цепь начального сброса тоже можно исключить. Любой микроконтроллер AVR имеет внутреннюю систему сброса, которая в большинстве случаев прекрасно обеспечивает стабильный сброс при включении питания. Внешние цепи сброса применяются только при наличии особых требований к длительности импульса сброса. А это бывает лишь в тех случаях, когда микроконтроллер работает в условиях больших помех и нестабильного питания.

Все описанные выше переключения производятся при помощи соответствующих fuse-переключателей. Как это можно сделать, мы увидим на следующих занятиях. Три освободившихся вывода микроконтроллера могут быть использованы как дополнительный порт (порт А). Но в данном случае в этом нет необходимости.

Упростим схему, показанную на рис. 2.1, с учетом описанных выше возможностей. От внешнего кварца пока отказываться не будем. Он нам пригодиться чуть позже, когда мы начнем формировать временные интервалы. Доработанная схема изображена на рис. 2.2.

2.4 Алгоритм

Итак, схема у нас есть. Теперь нужно приступать к разработке программы. Разработка любой программы начинается с разработки алгоритма.

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

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

Операции начальной настройки:

· установить начальное значение для вершины стека микроконтроллера;

· настроить порт В на вывод информации;

· подать на выход РВ.0 сигнал логической единицы (потушить светодиод);

· сконфигурировать порт D на ввод;

· включить внутренние нагрузочные резисторы порта D.

Операции, составляющее тело цикла:

· прочитать состояние младшего разряда порта PD (PD.0);

· если значение этого разряда равно единице, выключить светодиод;

· если значение разряда PD.0 равно нулю, включить светодиод;

· перейти на начало цикла.

2.5 Программа на Ассемблере

Для создания программ мы используем версию Ассемблера, предложенную разработчиком микроконтроллеров AVR -- фирмой Atmel. А также воспользуемся программным комплексом «AVR Studio», разработанным той же фирмой и предназначенным для создания, редактирования, трансляции и отладки программ для AVR на Ассемблере.

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

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

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

Некоторые команды состоят только из одного оператора. Другие же команды имеют один или два операнда (параметра). Операнды записываются в той же строке сразу после оператора, через пробел. Если операнда два, их записывают через запятую. Так, в строке 6 нашей программы записана команда загрузки константы в регистр общего назначения. Она состоит из оператора ldi и двух операндов temp и RAMEND.

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

При выборе имени метки необходимо соблюдать следующие правила:

· имя должно состоять из одного слова, содержащего только латинские буквы и цифры;

· допускается также применять символ подчеркивания;

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

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

Определение. Комментарий -- это специальная запись в теле программы, предназначенная для человека. Компьютер в процессе трансляции программы игнорирует все комментарии. Комментарий может занимать отдельную строку, а может стоять в той же строке, что и команда. Начинается комментарий с символа «точка с запятой». Все, что находится после точки с запятой до конца текущей строки программы, считается комментарием.

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

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

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

Далее из конкретных примеров вы поймете, о чем идет речь. В данной конкретной версии Ассемблера директивы выделяются особым образом. Имя каждой директивы начинается с точки. Смотри листинг 2.1, строки с 1 по 5.

При написании программ на Ассемблере принято соблюдать особую форму записи:

· программа записывается в несколько колонок (см. листинг 2.1);

· аналогичные элементы разных команд принято размещать друг под другом;

· самая первая (левая) колонка зарезервирована для меток;

· если метка отсутствует, место в колонке пустует;

· следующая колонка предназначена для записи операторов;

· затем идет колонка для операндов;

· оставшееся пространство (крайняя колонка справа) предназначено для комментариев.

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

Итак, мы рассмотрели общие принципы построения программы на Ассемблере. Теперь пора приступать к подробному описанию конкретной программы, приведенной в листинге 2.1. И начнем мы с описания входящих в нее команд.

2.6 Директивы

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

В языке Ассемблер для присоединения фрагмента к программе используется псевдооператор include. В качестве параметра для этой директивы должно быть указано имя присоединяемого файла. Если такой оператор поставить в любом месте программы, то содержащийся в присоединяемом файле фрагмент в процессе трансляции как бы вставляется в то самое место, где находится оператор. Например, в программе на листинге 2.1 в строке 1 в основной текст программы вставляется текст из файла tn2313def. inc.

Кстати, подробнее об этом файле. Файл tn2313def. inc -- это файл описаний. Он содержит описание всех регистров и некоторых других параметров микроконтроллера ATtiny2313. Это описание понадобится нам для того, чтобы в программе мы могли обращаться к каждому регистру по его имени. О том, как делаются такие описания, мы поговорим при рассмотрении конкретных программ.

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

.def - Макроопределение. Эта команда позволяет присваивать различным регистрам микроконтроллера любые осмысленные имена, упрощающие чтение и понимание текста программы. В нашем случае нам понадобится один регистр для временного хранения различных величин. Выберем для этой цели регистр r16 и присвоим ему наименование temp от английского слова temporary -- временный.

Данная команда выполняется в строке 3 (см. листинг 4.1). Теперь в любом месте программы вместо имени r16 можно применять имя temp. Вы спросите: а зачем это нужно? Да для наглядности и читаемости программы. В данной программе мы будем использовать лишь один регистр, и преимущества такого переименования здесь не очень видны. Но представьте, что вы используете множество разных регистров для хранения самых разных величин. В этом случае присвоение осмысленного имени очень облегчает программирование. Скоро вы сами в этом убедитесь. Кстати, именно таким образом определены имена всех стандартных регистров в файле tn2313def. inc.

.cseg- Псевдооператор выбора программного сегмента памяти. О чем идет речь? Как уже говорилось, микроконтроллер для хранения данных имеет три вида памяти: память программ (Flash), оперативную память (SRAM) и энергонезависимую память данных (EEPROM). Программа на Ассемблере должна работать с любым из этих трех видов памяти. Для этого в Ассемблере существует понятие «сегмент памяти». Существуют директивы, объявляющие каждый за кой сегмент:

· сегмент кода (памяти программ).cseg;

· сегмент данных (ОЗУ)dseg;

· сегмент EEPROMeseg.

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

Только в сегменте кода Ассемблер описывает команды, которые затем в виде кодов будут записаны в память программ. В остальных двух сегментах используются директивы распределения памяти и директивы описания данных. Ну, к сегментам dseg и eseg мы еще вернемся. Сейчас же подробнее рассмотрим сегмент cseg.

Так как команды в программной памяти должны располагаться по порядку, одна за другой, то их размещение удобно автоматизировать. Программист не указывает, по какому адресу в памяти должна быть расположена та либо иная команда. Программист просто последовательно пишет команды. А уже транслятор автоматически размещает их в памяти. Для этого используется понятие «указатель текущего адреса». Указатель текущего адреса не имеет отношения к регистру адреса микроконтроллера и вообще физически не существует. Это просто понятие, используемое в языке Ассемблер. Указатель помогает транслятору разместить все команды программы по ячейкам памяти. По умолчанию считается, что в начале программы значение текущего указателя рано нулю. Поэтому первая же команда программы будет размещена по нулевому адресу. По мере трансляции программы указатель смещается в сторону увеличения адреса. Если команда имеет длину в один байт, то после ее трансляции указатель смещается на одну ячейку. Если команда состоит из двух байтов -- на две. Таким образом, размещаются все команды программы.

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

Она позволяет принудительно изменить значение указателя текущего адреса. Оператор org имеет всего один параметр -- новое значение указателя адреса. К примеру, команда.org 0x10 установит указатель на адрес 0x10. Транслятор автоматически следит, чтобы при перемещении указателя ваши фрагмент программы не налезали друг на друга. В случае несоблюдения этого условия транслятор выдает сообщение об ошибке.

В нашей программе команда позиционирования указателя применяется всего один раз. В строке 5 указатель устанавливается на нулевой адрес. В данном случае директива org имеет чисто декларативное значение, так как и начале программы, значение указателя и так равно нулю.

2.7 Операторы

Idi- Загрузка в РОН числовой константы. В строке 6 программы (листинг 4.1) при помощи этой команды в регистр temp (rl6) записывается числовая константа, равная максимальному адресу ОЗУ. Эта константа имеет имя RAMEND. Ее значение описано в файле tn2313def. inc. В нашем случае (для микроконтроллера ATtiny2313) значение RAMEND равно $7F.

Как можно видеть из листинга 4.1, оператор Idi имеет два параметра:

· первый параметр -- это имя РОН, куда помещается наша константа;

· второй параметр -- значение этой константы.

Обратите внимание, что в команде сначала записывается приемник информации, затем ее источник. Такой же порядок вы увидите в любой другой команде, имеющей два операнда. Это общее правило для языка Ассемблер.

Out- Вывод содержимого РОН в регистр ввода--вывода. Команда также имеет два параметра:

· первый параметр -- имя РВВ, являющегося приемником информации;

· второй параметр -- имя РОН, являющегося источником.

В строке 7 программы содержимое регистра temp выводится в РВВ с именем SPL.

In - Ввод информации из регистра ввода--вывода. Имеет два параметра. Параметры те же, что и в предыдущем случае, но источник и приемник меняются местами. В строке 19 программы содержимое регистра PORTD помещается в регистр temp.

rjmp - Команда безусловного перехода. Команда имеет всего один параметр - адрес и перехода. В строке 21 программы оператор безусловного перехода передает давление на строку, помеченную меткой main. To есть на строку 19. Данная строка демонстрирует использование метки.

На самом деле в качестве параметра оператора rjmp должен выступать так называемый относительный адрес перехода. То есть число байт, на которое нужно сместиться вверх или вниз от текущего адреса. Направление смещения (вверх или вниз) - это знак числа. Он определяется старшим битом. Язык Ассемблера избавляет программиста от необходимости подсчета величины смещения. Достаточно в нужной строке программы поставить метку, а в качестве адреса перехода указать ее имя, и транслятор сам вычислит значение этого параметра.

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

2.8 Описание программы

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

Самая первая команда программы -- это псевдокоманда include, которая присоединяет к основному тексту программы файл описаний (см. листинг 4.1 строка 1). В стандартном пакете AVR-Studio имеется целый набор подобных файлов описаний. Для каждого микроконтроллера серии AVR -- свой отдельный файл. Все стандартные файлы описаний находятся в директории «C:\Program FilesVAtmel\AVR Tools\AvrAssembler\Appnotes\». Программисту нужно лишь выбрать нужный файл и включить подобную строку в свою программу. Учтите, что без присоединения файла описаний дальнейшая программа работать не будет.

###################################

;# Программа 1 #

;# Программа управлением светодиодом #

;###################################

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

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

Для микроконтроллера ATtiny2313 файл описаний имеет название tn2313def. inc. Если файл описаний находится в указанной выше директории, то в команде include достаточно лишь указать его полное имя (с расширением). Указывать полный путь необязательно.

Назначение команды.list (строка 2), надеюсь, у вас уже не вызывает вопросов. Остановимся на команде макроопределения (строка 3). Эта команда, как уже говорилось, присваивает регистру r16 имя temp. Дальше в программе регистр temp используется для временного хранения промежуточных величин. Уместно задаться вопросом: почему выбран именно r16, а, к примеру, не г0? Это становится понятно, если вспомнить, что регистры, начиная с r0 и заканчивая r15, имеют меньше возможностей. Например, в строке 14 программы регистр temp используется в команде ldi. Однако команда ldi не работает с регистрами r0-r15. Именно по этой причине мы и выбрали r16.

Следующие две команды (строки 4, 5) подробно описаны в начале этого раздела. Они служат для выбора программного сегмента памяти и установки начального значения указателя.

В строках 6 и 7 производится инициализация стека. В регистр стека SPL записывается адрес его вершины. В качестве адреса выбран самый верхний адрес ОЗУ. Для обозначения этого адреса в данной версии Ассемблера существует специальная константа с именем RAMEND. Значение этой константы определяется в файле описаний (в нашем случае в файле tn2313def. inc). Для кроконтроллера ATtiny2313 константа RAMEND равна OxDF.

Одной строкой записать константу в регистр стека невозможно, так как в системе команд микроконтроллеров AVR отсутствует подобная команда. Отсутствующую команду мы заменяем двумя другими. И тут нам пригодится регистр temp. Он послужит в данном случае передаточным звеном. Сначала константа RAMEND помещается в регистр temp (строка 6), а затем уже содержимое temp помещается в регистр SPL (строка 7).

В строках 8--12 производится настройка портов ввода--вывода. Ранее мы уже договорились, что порт PD у нас будет работать на ввод, а порт РВ -- на вывод. Для выбора нужного направления передачи информации запишем управляющие коды в соответствующие регистры DDRx. Во все разряды регистра DDRD запишем нули (настройка порта PD на ввод), а во все разряды регистра DDRB запишем единицы (настройка порта РВ на вывод). Кроме того, нам нужно включить внутренние нагрузочные резисторы порта PD. Для этого мы запишем единицы (то есть число 0xFF) во все разряды регистра PORTD. И, наконец, в момент старта программы желательно погасить светодиод. Для этого мы запишем единицы в разряды порта РВ.

Все описанные выше действия по настройке порта также выполняются с использованием промежуточного регистра temp. Сначала в него помещается ноль (строка 8). Ноль записывается только в регистр DDRD (строка 9). Затем в регистр temp помещается число OxFF (строка 10). Это число по очереди записывается в регистры DDRB, PORTB, PORTD (строки 11,12,13).

Строки 14 и 15 включены в программу для перестраховки. Дело в том, что встроенный компаратор микроконтроллера после системного сброса остается включен. И хотя прерывания при этом отключены и срабатывание компаратора не может повлиять на работу нашей программы, мы все же отключим компаратор. Именно это и делается в строках 14 и 15.

Здесь уже знакомым нам способом с использованием регистра temp производится запись константы 0x80 в регистр ACSR. Регистр ACSR предназначен для управления режимами работы компаратора, а константа 0x80, записанная в этот регистр, отключает компаратор.

Настройкой компаратора заканчивается подготовительная часть программы. Подготовительная часть занимает строки 1--15 и выполняется всего один раз после включения питания или после системного Сброса. Строки 16--18 составляет основной цикл программы.

Определение. Основной цикл -- это часть программы, которая повторяется многократно и выполняет все основные действия.

В нашем случае, согласно алгоритму, действия программы состоят в том, чтобы прочитать состояние кнопки и перенести его на светодиод. Есть много способов перенести содержимое младшего разряда порта PD в младший разряд порта РВ. В нашем случае реализован самый простой вариант. Мы просто переносим одновременно все разряды. Для этого достаточно двух операторов.

Первый из них читает содержимое порта PD и запоминает это содержимое в регистре temp (строка 16). Следующий оператор записывает это число в порт РВ (строка 17). Завершает основной цикл программы оператор безусловного перехода (строка 18). Он передает управление по метке main.

В результате три оператора, составляющие тело цикла, повторяются бесконечно. Благодаря этому бесконечному циклу все изменения порта PD тут же попадают и порт РB. По этой причине, если кнопка SI не нажата, логическая единица со входа PD0 за один проход цикла передается на выход PB0. И светодиод не светится. При нажатии кнопки S1 логический ноль со входа PD0 поступает на выход PB0, и светодиод загорается.

Эта же самая программа без каких-либо изменений может обслуживать до семи кнопок и такое же количество светодиодов. Дополнительные кнопки подключаются к линиям PD1--PD6, а дополнительные светодиоды (каждый со своим токоограничивающим резистором) - к выходам РВ 1 - РВ7. При этом каждая кнопка будет управлять своим собственным светодиодом. Такое стало возможным потому, что все выводы каждого из двух портов мы настроили одинаково (смотри строки 8--13).

3. Лабораторная №3

3.1 Переключающийся светодиод

Постановка задачи

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

Новая задача может звучать так:

«Разработать устройство управления одним светодиодным индикатором при помощи одной кнопки. При каждом нажатии кнопки светодиод должен поочередно включаться и отключаться. При первом нажатии кнопки светодиод должен включиться, при следующем отключиться и т. д.». Вы можете сказать, что и эта новая задача легко решаема при помощи простейшего D-триггера. Однако все же рассмотрим, как ее можно решить при помощи микроконтроллера.

3.2 Принципиальная схема

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

3.3 Алгоритм

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

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

Прочитать состояние младшего разряда порта PD (PD.0).

Если значение этого разряда равно единице, перейти к началу цикла.

3. Если значение разряда PD.0 равно нулю, изменить состояние выхода РВ.0 на противоположное.

Перейти к началу цикла.

Итак, мы описали алгоритм словами. Причем это довольно общее описание. Реальным алгоритм немного сложнее. Словесное описание алгоритма не всегда удобно. Гораздо нагляднее графический способ описания алгоритма. На рис. 3.3 алгоритм нашей работы будущей программы изображен в графическом виде.

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

Допускается объединять несколько операций в один блок и обозначать одним прямоугольником. Последовательность выполнения действий показывается стрелками. Ромбик реализует разветвление программы. Он представляет собой операцию выбора. Условие выбора записывается внутри ромбика. Если условие истинно, то дальнейшее выполнение программы продолжится по пути, обозначенному словом «Да».

Если условие не выполнено, то программа пойдет по другому пути, обозначенному стрелкой с надписью «Нет». Прямоугольником со скругленными боками принято обозначать начало и конец алгоритма. В нашем случае программа не имеет конца. Основной цикл программы является бесконечным циклом.

Рассмотрим подробнее алгоритм, изображенный на рис. 4.8. Как видно из рисунка, сразу после старта программы выполняется установка вершины стека. Следующее действие -- это программирование портов ввода--вывода. Затем начинается главный цикл программы (обведен пунктирной линией). Внутри цикла ход выполнения программы разветвляется.

Первой операцией цикла является проверка состояния младшего разряда порта PD (PD0). Программа сначала читает состояние этой линии, а затем выполняет операцию сравнения. В процессе сравнения значение разряда PD0 проверяется на равенство единице. Если условие выполняется, программа переходит к началу цикла (по стрелке «Да»).

Если условие не выполняется (PD0 не равен единице), выполнение программы продолжается по стрелке «Нет», где выполняется еще одна операции сравнения. Это сравнение является частью процедуры переключения светодиода. Для того, чтобы переключить светодиод, мы должны проверить его текущее состояние и перевести его в противоположное.

Как вы помните, светодиодом управляет младший разряд порта РВ (РВ0). Поэтому именно его мы будем промерять и изменять. Работа алгоритма переключения светодиода предельно проста. Сначала оператор сравнения проверяет разряд РВ0 на равенство единице. Если результат проверки -- истина (РВ0=1), то разряд сбрасывается в ноль (0 => РВ0). Если ложно, устанавливается в единицу (1 => РВ0). Сочетание символов «=>» означает операцию присвоения. Такое обозначение иногда используется в программировании при написании алгоритмов. После переключения светодиода управление передается на начало главного цикла.

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

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

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

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

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

Новый, доработанный алгоритм приведен на рис. 4.9. Как видно из рисунка, новый алгоритм дополнен всего двумя новыми операциями, которые и реализуют цикл ожидания. Цикл ожидания добавлен после процедуры переключения светодиода. Выполняя цикл ожидания, программа сначала читает значение бита PD0, а затем проверяет его на равенство единице. Если PD0 не равно единице (кнопка нажата), то цикл ожидания повторяется. Если PD0 равно единице (кнопка отпущена) то цикл ожидания прерывается, управление перейдет на начало основного цикла.

4. Лабораторная № 4

4.1 Бегущие огни

Постановка задачи

«Разработать автомат «Бегущие огни» для управления составной гирляндой из восьми отдельных гирлянд. Устройство должно обеспечивать «движение» огня в двух разных направлениях. Переключение направления «движения» должно осуществляться при помощи переключателя».

4.2 Схема

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

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

4.3 Алгоритм

Для создания эффекта «бегущих огней» удобнее всего воспользоваться операторами сдвига, которые имеются в системе команд любого микроконтроллера. Такие операторы сдвигают содержимое одного из регистров микроконтроллера на один разряд влево или вправо. Если сдвигать содержимое регистра и после каждого сдвига выводить новое содержимое в порт РВ, подключенные к нему светодиоды будут загораться поочередно, имитируя бегущий огонь. Алгоритм работы бегущих огней может разный. Один из возможных алгоритмов в самых общих чертах будет выглядеть следующим образом:

Считать состояние переключателя управления.

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

Если контакты замкнуты, перейти к процедуре сдвига влево.

После окончания полного цикла сдвига (восемь последовательных сдвигов) перейти к началу алгоритма, то есть к пункту 1.

Таким образом, все время, пока контакты переключателя разомкнуты, программа будет выполнять сдвиг вправо. Если состояние переключателя не изменилось, сдвиг в прежнем направлении продолжается. Если замкнуть контакты переключателя, то все время, пока они замкнуты, будет выполняться сдвиг влево. Как при сдвиге вправо, так и при сдвиге влево после каждого полного цикла сдвига (8 шагов) происходит проверка переключателя. Если его состояние не такое же, как и прежде, то направление сдвига не изменяется. В противном случае программа меняет направление сдвига.

Выполнение алгоритма сдвига

Рис. 1. Схема автомата «Бегущих огней»

Посмотрим теперь, как выполняется сам алгоритм сдвига. Сдвиг влево и сдвиг вправо выполняются аналогично. Ниже приводится обобщенный алгоритм для сдвига влево и сдвига вправо, снабженный комментариями.

Записать в рабочий регистр начальное значение. В качестве начального значения используется двоичное число, у которого один из разрядов равен единице, а остальные разряды равны нулю. Для сдвига вправо нам нужно число с единицей в самом старшем разряде (0b10000000)Для сдвига влево в единицу устанавливается младший разряд(0 b 0 0 0 0 0 0 0 l).

Вывести значение рабочего регистра в порт РВ.

Вызнать подпрограмму задержки. Задержка нужна для того, чтобы скорость «бега» огней была нормальная для глаз наблюдателя. Если бы не было задержки, то скорость «бега» была бы столь велика, что мы бы не увидели движения огней. С точки зрения наблюдателя мерцание огней выглядело бы как слабое свечение всех светодиодов.

Сдвинуть содержимое рабочего регистра вправо (влево) на один разряд.

Проверить, не окончился ли полный цикл сдвига (8 шагов).

Если полный цикл сдвига не закончен, перейти к пункту 2 данного алгоритма. Это приведет к тому, что пункты 2, 3, 4, 5 и 6 повторятся 8 раз, и лишь затем завершится полный цикл сдвига.

5. Лабораторная 5

5.1 Использование таймера

Постановка задачи

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

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

Итак, заново сформулируем нашу задачу:

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

5.2 Схема

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

5.3 Алгоритм

Как известно, в микроконтроллере ATtiny2313 имеются два встроенных таймера-счетчика. Поэтому сначала нам нужно выбрать, какой из них мы будем использовать. Исходить будем из заданного времени задержки 200 мс. Как известно, для формирования временных интервалов таймер/счетчик просто подсчитывает тактовые импульсы от системного генератора.

Частота сигнала этого генератора в нашем случае равна 4 МГц. А период импульсов 1/4 = 0,25 мкс. Для того, чтобы получить на выходе 200 мс, необходимо иметь коэффициент деления, равный 200*103/0,25*106=800*103 (восемьсот тысяч раз).

Микросхема ATtiny2313 содержит два таймера. Один восьмиразрядный и один шестнадцатиразрядный. Восьмиразрядный таймер имеет максимальный коэффициент пересчета 28=256, а шестнадцатиразрядный -- 216=65536. То есть даже шестнадцатиразрядного таймера нам не хватит для формирования требуемой задержки. Придется воспользоваться предварительным делителем. Этот делитель производит предварительное деление тактового сигнала перед тем, как тот поступит на вход таймера/счетчика.

Программным путем можно выбрать один из четырех фиксированных коэффициентов деления (см. приложение). Выберем самый большой возможный коэффициент деления предделителя (1024). Тогда на его выходе мы получим сигнал с частотой 4-106/1024 = 3906 Гц. Период такого сигнала будет равен 1/3906 = 0,256-10"3 с или 0,256 мс. Именно этот сигнал поступает на вход нашего таймера, который обеспечивает окончательное деление. Посчитаем коэффициент деления, который наш таймер должен нам обеспечить: 200/0,256 ~ 780. Такой коэффициент пересчета нам может обеспечить только таймер Т1.

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

Записать в счетный регистр таймера Т1 нулевое значение.

Начать цикл проверки содержимого счетного регистра. В теле цикла программа должна многократно считывать содержимое счетного регистра таймера и проверять, не достигло ли оно своего конечного значения (то есть значения 780).

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

Выйти из подпрограммы задержки.

5.4 Использование прерываний по таймеру

Постановка задачи

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

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

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

5.5 Схема

Схему оставим без изменений.

Алгоритм

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

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

Все функции управления «движением огней» выполняет процедура обработки прерывания. При каждом вызове прерывания процедура производит сдвиг «огней» на один шаг в нужном направлении.

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

Второй коэффициент деления (780) мы помещаем в специальный системный регистр -- регистр совпадения. Сравнение содержимого счетного регистра с содержимым регистра совпадения будет происходить на аппаратном уровне. В режиме «сброс при совпадении» таймер работает следующим образом. Сразу после запуска значение счетного регистра начнет увеличиваться. Когда это значение окажется равным значению регистра совпадения, таймер автоматически сбросится и продолжит работу с нуля. В момент сброса таймера формируется запрос на прерывание.

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

Алгоритм основной программы:

Настроить стек и порты ввода--вывода микроконтроллера.

Настроить таймер и систему прерываний.

Записать в рабочий регистр исходное значение.

Разрешить работу таймера.

Разрешить прерывания.

Перейти к выполнению основного цикла.

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

Алгоритм процедуры обработки прерывания:

Проверить состояние переключателя режимов.

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

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

Вывести содержимое рабочего регистра в порт РВ, предварительно проинвертировав его.

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

6. Лабораторная №6

6.1 Формирование звука

Постановка задачи

В общем случае задача формирования звука не составляет большого труда. Достаточно взять за основу схему с мигающим светодиодом (см. раздел 4.5), подключить вместо светодиода звуковой излучатель (например, телефонный капсюль), а в соответствующей программе (листинг4.7) поменять константу задержки таким образом, чтобы частота «мигания» повысилась и достигла звукового диапазона.

Диапазон частот, которые может услышать человек, лежит в пределах примерно от 50 Гц до 15 кГц. Светодиод в упомянутой выше программе мигает с частотой 4 Гц. Если уменьшить время задержки в 1000 раз, то можно получить частоту сигнала на выходе, равную 4 кГц. Эта частота как раз входит в звуковой диапазон.

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

Допустим, мы имеем семь кнопок (датчиков). Сформулируем задачу следующим образом:

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

6.2 Схема

Поставленная выше задача прекрасно решается при помощи уже известного нам микроконтроллера ATtiny2313. Выберем его и на этот раз. Микроконтроллер имеет два встроенных таймера/счетчика. Какой же из таймеров использовать нам? Для формирования звука лучше подходит шестнадцатиразрядный таймер. Чем больше разрядов, тем с большей точностью можно выбирать его коэффициент деления.

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

Прежде всего, нам нужно отказаться от предварительного деления. Если частота кварцевого генератора и код, помещаемый в регистр совпадения, останутся такими же, как в предыдущем примере (в программе «Бегущие огни»), то в новом варианте частота повысится более чем в тысячу раз и как раз попадет в нужный нам диапазон.

Теперь определимся с тем, как наш сигнал будет попадать на внешний вывод микроконтроллера. Конечно, это можно сделать программно, при помощи процедуры обработки соответствующего прерывания. Но микроконтроллер предусматривает прямой вывод сигнала на один из своих выходов. Причем предусмотрены отдельные выходы для каждого из каналов совпадения. Для канала А подобный выход называется ОС1 А. Он совмещен с третьим разрядом порта РВ и является альтернативной функцией данного контакта.

Подключение и отключение сигнала совпадения к внешнему выводу ОС1А производится программным путем. Это позволяет программе в нужный момент включать или выключать звук. Так как для вывода звука мы будем использовать один из разрядов порта РВ, то для подключения датчиков воспользуемся другим портом. А именно портом PD. Вариант принципиальной схемы описанного выше устройства показан на рис.

Как видно из рисунка, мы снова применили внешний кварцевый резонатор (Q1), естественно, не забыв при этом цепи согласования (Cl, С2). При подключении датчиков используется та же схема, что использовалась до сих пор для подключения контактов переключателя. Датчики подключаются ко всем разрядам порта PD. При этом для правильной работы датчиков для каждого разряда порта PD должны быть активизированы встроенные резисторы нагрузки.

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

Однако подобная схема имеет и свой недостаток. В отсутствие звукового сигнала на выходе 15 микроконтроллера обязательно нужно установить низкий логический уровень. Высокий логический уровень приведет к тому, что транзистор VTI будет постоянно открыт. Это вызовет недопустимо большой ток через головку VF1. Постоянно протекающий ток через обмотку динамика вызовет излишнюю потерю мощности и может даже вызвать выход из строя как транзистора, так и динамика. При составлении программы мы должны учесть этот момент.

6.3 Алгоритм

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

Однако схема построена таким образом, что ничто не мешает одновременно замкнуться сразу нескольким контактам. Возникает вопрос: что делать в этом случае? Самый правильный ответ -- обеспечить систему приоритетов. При замыкании нескольких контактов программа должна реагировать лишь на один из них. На тот, приоритет которого выше.

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

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

7. Лабораторная №7

7.1 Программная среда AVR Studio

компьютер микропроцессор программа отладчик

Общие сведения

Отладка программы

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

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

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

В процессе выполнения программы под управлением отладчика программист может на экране компьютера:

· видеть содержимое любого регистра микроконтроллера;

· видеть содержимое ОЗУ и EEPROM;

· наблюдать за последовательностью выполнения команд, контролируя правильность отработки условных и безусловных переходов;

· наблюдать за работой таймеров, отработкой прерываний.

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

Существует три основных вида отладчиков:

· программные;

· аппаратные;

· комбинированные программно-аппаратные.

7.2 Программный отладчик

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

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


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

  • Анализ развития и производства микропроцессоров. История их появления. Типология основные пользовательские характеристики и принцип их действия. Перспективы развития современных микропроцессорных технологий и особенности мирового рынка полупроводников.

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

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

    курсовая работа [139,4 K], добавлен 24.06.2011

  • Краткая история развития микропроцессора как важнейшего элемента любого персонального компьютера. Сущность, значение, функциональные возможности процессоров. Особенности микропроцессоров Pentium, Intel i80386 и i80486. Применение и значение сопроцессора.

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

  • Экскурс в историю развития компьютерных микропроцессоров. Основные характеристики, свойства и технологии производства. Первые процессоры, революционная "трешка". Основные конкуренты Intel на рынке микропроцессоров. Революция номер два: шестое поколение.

    реферат [338,6 K], добавлен 17.12.2010

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

    курсовая работа [4,7 M], добавлен 26.03.2009

  • Классификации архитектур вычислительных систем. Организация компьютерных систем. Устройство центрального процессора. Принципы разработки современных компьютеров. Эволюция микропроцессорных систем. Увеличение числа и состава функциональных устройств.

    дипломная работа [1,4 M], добавлен 29.01.2009

  • Логические функции и структура микропроцессоров, их классификация. История создания архитектуры микропроцессоров x86 компании AMD. Описание К10, система обозначений процессоров AMD. Особенности четырёхъядерных процессоров с микроархитектурой К10 и К10.5.

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

  • Характеристика микропроцессоров Intel и AMD. Развитие и сравнение производительности микропроцессоров. Штаб-квартира компании AMD, ее производственные мощности. Описание бесплатной операционной системы Linux и ее возможности. Способы ввода информации.

    контрольная работа [25,4 K], добавлен 19.02.2009

  • Понятия и принцип работы процессора. Устройство центрального процессора. Типы архитектур микропроцессоров. Однокристальные микроконтроллеры. Секционные микропроцессоры. Процессоры цифровой обработки сигналов. Эволюция развития микропроцессоров Intel.

    реферат [158,8 K], добавлен 25.06.2015

  • Семь поколений процессоров. Технология производства микропроцессоров. Сравнительные характеристики процессоров AMD и Intel на ядре Clarkdale. Квазимеханические решения на основе нанотрубок. Одновременная работа с Firefox и Windows Media Encoder.

    дипломная работа [2,2 M], добавлен 11.06.2012

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