Генератор сигналов синусоидальной формы


ГЕНЕРАТОР СИГНАЛОВ СИНУСОИДАЛЬНОЙ ФОРМЫ

Пояснительная записка к курсовой работе

по дисциплине «Микропроцессорная техника»


Реферат


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

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

Цель работы - закрепление теоретических знаний в области программирования микроконтроллеров.

Курсовая работа выполнена в текстовом редакторе Microsoft Word 2007.


Содержание


Введение

. Микроконтроллеры AVR. Назначение и внутренняя структура

.1 Структура микроконтроллеров AVR

.2 Периферийные устройства микроконтроллеров AVR

.2.1 Порты ввода/вывода (I/O)

1.2.2 Прерывания (INTERRUPTS)

.2.3 Таймеры/счетчики (TIMER/COUNTERS)

1.2.4 Сторожевой таймер (WDT)

.2.5 Аналоговый компаратор (AC)

.2.6 Аналого-цифровой преобразователь (A/D CONVERTER)

.2.7 Универсальный последовательный приемопередатчик (UART или USART)

.2.8 Последовательный периферийный интерфейс SPI

.2.9 Двухпроводной последовательный интерфейс TWI

.2.10 Тактовый генератор

.2.11 Сброс при снижении напряжения питания (BOD)

. Описание ATtiny2313

. Способы генерации аналоговых сигналов

.1 Генерация аналоговых сигналов с помощью ШИМ

.2 Генерация аналоговых сигналов с помощью R-2R матрицы

. Разработка программ генерации синусоидального напряжения

.1 Хранение значений синусоиды в памяти программ

.2 Хранение значений синусоиды в ОЗУ. Применение косвенной адресации

.3 Хранение значений синусоиды в энергонезависимой памяти (EEPROM)

Заключение

Библиографический список


Введение


Цифровые микросхемы к настоящему времени достигли впечатляющего быстродействия при приемлемом токе потребления. Наиболее быстрые из цифровых микросхем обладают скоростью переключения порядка 3..5 нс. (серия микросхем 74ALS). В то же время приходится платить за быстродействие микросхем повышенным током потребления. Исключением являются микросхемы, построенные на основе КМОП технологии (например, микросхемы серий 1564, 74HC, 74AHC). В этих микросхемах потребляемый ток прямо пропорционален скорости переключения логических вентилей в микросхеме. Т.е. микросхема автоматически увеличивает ток потребления, если от нее требуется большее быстродействие, поэтому в настоящее время подавляющее большинство микросхем выпускается именно по этой технологии.

Часто цифровые устройства выполняют достаточно сложные задачи. Возникает вопрос, раз микросхемы достигли такого высокого быстродействия, то нельзя ли использовать одну и ту же микросхему многократно? Тогда можно будет обменивать быстродействие микросхем на сложность решаемой задачи. Именно этот обмен и позволяют осуществлять микропроцессоры. В этих микросхемах многократно используется одно и то же устройство - АЛУ (арифметико-логическое устройство). Поэтому возможен обмен предельного быстродействия микроконтроллера на сложность реализуемого устройства. Именно по этой причине стараются максимально увеличить быстродействие микропроцессоров, что позволяет реализовывать все более сложные устройства в одном и том же объеме.

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

В наибольшей степени все вышеперечисленные свойства проявляются в однокристальных микроЭВМ или как их чаще называют по области применения: микроконтроллерах. В микроконтроллерах на одном кристалле объединяются все составные части компьютера: микропроцессор (часто называют ядро микроконтроллера), ОЗУ, ПЗУ, таймеры и порты ввода-вывода.


1. Микроконтроллеры AVR. Назначение и внутренняя структура


.1 Структура микроконтроллеров AVR


Микроконтроллеры AVR содержат: быстрый RISK-процессор, два типа энергонезависимой памяти (Flash-память программ и память данных EEPROM), оперативную память RAM, порты ввода/вывода и различные периферийные интерфейсные схемы.


Рисунок 1 - Структура микроконтроллеров AVR


Сердцем микроконтроллеров AVR является 8-битное микропроцессорное ядро или центральное процессорное устройство (ЦПУ), построенное на принципах RISC-архитектуры. Основой этого блока служит арифметико-логическое устройство (АЛУ). По системному тактовому сигналу из памяти программ в соответствии с содержимым счетчика команд (Program Counter - PC) выбирается очередная команда и выполняется АЛУ. Во время выбора команды из памяти программ происходит выполнение предыдущей выбранной команды, что и позволяет достичь быстродействия 1 MIPS на 1 МГц.

Идея RISC - это тщательный подбор команд, которые можно было бы выполнить за один такт. Таким образом, упрощается аппаратная реализация процессора, сокращается число транзисторов, снижается потребляемая мощность и цена.

АЛУ подключено к регистрам общего назначения РОН (General Purpose Registers - GPR). Регистров общего назначения всего 32, они имеют байтовый формат, то есть каждый из них состоит из восьми бит. РОН находятся в начале адресного пространства оперативной памяти, но физически не являются ее частью. Поэтому к ним можно обращаться двумя способами (как к регистрам и как к памяти). Такое решение является особенностью AVR и повышает эффективность работы и производительность микроконтроллера.

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

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


1.2 Периферийные устройства микроконтроллеров AVR


Периферия микроконтроллеров AVR включает: порты (от 3 до 48 линий ввода и вывода), поддержку внешних прерываний, таймеры-счетчики, сторожевой таймер, аналоговые компараторы, 10-разрядный 8-канальный АЦП, интерфейсы UART, JTAG и SPI, устройство сброса по понижению питания, широтно-импульсные модуляторы.


.2.1 Порты ввода/вывода (I/O)

Порты ввода/вывода AVR имеют число независимых линий "вход/выход" от 3 до 53. Каждая линия порта может быть запрограммирована на вход или на выход. Мощные выходные драйверы обеспечивают токовую нагрузочную способность 20 мА на линию порта (втекающий ток) при максимальном значении 40 мА, что позволяет, например, непосредственно подключать к микроконтроллеру светодиоды и биполярные транзисторы. Общая токовая нагрузка на все линии одного порта не должна превышать 80 мА (все значения приведены для напряжения питания 5 В).

Архитектурная особенность построения портов ввода/вывода у AVR заключается в том, что для каждого физического вывода (пина) существует 3 бита контроля/управления, а не 2, как у распространенных 8-разрядных микроконтроллеров (Intel, Microchip, Motorola и т.д.). Это позволяет избежать необходимости иметь копию содержимого порта в памяти для безопасности и повышает скорость работы микроконтроллера при работе с внешними устройствами, особенно в условиях внешних электрических помех.


.2.2 Прерывания (INTERRUPTS)

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

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

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

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

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


.2.3 Таймеры/счетчики (TIMER/COUNTERS)

Микроконтроллеры AVR имеют в своем составе от 1 до 4 таймеров/счетчиков с разрядностью 8 или 16 бит, которые могут работать и как таймеры от внутреннего источника тактовой частоты, и как счетчики внешних событий.

Их можно использовать для точного формирования временных интервалов, подсчета импульсов на выводах микроконтроллера, формирования последовательности импульсов, тактирования приемопередатчика последовательного канала связи. В режиме ШИМ (PWM) таймер/счетчик может представлять собой широтно-импульсный модулятор и используется для генерирования сигнала с программируемыми частотой и скважностью. Таймеры/счетчики способны вырабатывать запросы прерываний, переключая процессор на их обслуживание по событиям и освобождая его от необходимости периодического опроса состояния таймеров. Поскольку основное применение микроконтроллеры находят в системах реального времени, таймеры/счетчики являются одним из наиболее важных элементов.


.2.4 Сторожевой таймер (WDT)

Сторожевой таймер (WatchDog Timer) предназначен для предотвращения катастрофических последствий от случайных сбоев программы. Он имеет свой собственный RC-генератор, работающий на частоте 1 МГц. Как и для основного внутреннего RC-генератора, значение 1 МГц является приближенным и зависит прежде всего от величины напряжения питания микроконтроллера и от температуры.

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


.2.5 Аналоговый компаратор (AC)

Аналоговый компаратор (Analog Comparator) сравнивает напряжения на двух выводах (пинах) микроконтроллера. Результатом сравнения будет логическое значение, которое может быть прочитано из программы.

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


.2.6 Аналого-цифровой преобразователь (A/D CONVERTER)

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


.2.7 Универсальный последовательный приемопередатчик (UART или USART)

Универсальный асинхронный или универсальный синхронно/асинхронный приемопередатчик (Universal Synchronous/Asynchronous Receiver and Transmitter - UART или USART) - удобный и простой последовательный интерфейс для организации информационного канала обмена микроконтроллера с внешним миром. Способен работать в дуплексном режиме (одновременная передача и прием данных). Он поддерживает протокол стандарта RS-232, что обеспечивает возможность организации связи с персональным компьютером.


.2.8 Последовательный периферийный интерфейс SPI

Последовательный периферийный трехпроводный интерфейс SPI (Serial Peripheral Interface) предназначен для организации обмена данными между двумя устройствами. С его помощью может осуществляться обмен данными между микроконтроллером и различными устройствами, такими, как цифровые потенциометры, ЦАП/АЦП, FLASH-ПЗУ и др. С помощью этого интерфейса удобно производить обмен данными между несколькими микроконтроллерами AVR.

Кроме того, через интерфейс SPI может осуществляться программирование микроконтроллера.


.2.9 Двухпроводной последовательный интерфейс TWI

Двухпроводной последовательный интерфейс TWI (Two-wire Serial Interface) является полным аналогом базовой версии интерфейса I2C (двухпроводная двунаправленная шина) фирмы Philips. Этот интерфейс позволяет объединить вместе до 128 различных устройств с помощью двунаправленной шины, состоящей из линии тактового сигнала (SCL) и линии данных (SDA).


.2.10 Тактовый генератор

Тактовый генератор вырабатывает импульсы для синхронизации работы всех узлов микроконтроллера. Внутренний тактовый генератор AVR может запускаться от нескольких источников опорной частоты (внешний генератор, внешний кварцевый резонатор, внутренняя или внешняя RC-цепочка). Минимальная допустимая частота ничем не ограничена (вплоть до пошагового режима). Максимальная рабочая частота определяется конкретным типом микроконтроллера и указывается Atmel в его характеристиках, хотя практически любой AVR-микроконтроллер с заявленной рабочей частотой, например, в 10 МГц при комнатной температуре легко может быть "разогнан" до 12 МГц и выше.


.2.11 Сброс при снижении напряжения питания (BOD)

Схема BOD (Brown-Out Detection) отслеживает напряжение источника питания. Если схема включена, то при снижении питания ниже некоторого значения она переводит микроконтроллер в состояние сброса. Когда напряжение питания вновь увеличится до порогового значения, запускается таймер задержки сброса. После формирования задержки внутренний сигнал сброса снимается и происходит запуск микроконтроллера.

2. Описание ATtiny2313


ATtiny2313 - низкопотребляющий 8 битный КМОП микроконтроллер с RISC архитектурой. Выполняя команды за один цикл, ATtiny2313 достигает производительности 1 MIPS при частоте задающего генератора 1 МГц, что позволяет разработчику оптимизировать отношение потребления к производительности.

AVR ядро объединяет богатую систему команд и 32 рабочих регистра общего назначения. Все 32 регистра непосредственно связаны с арифметико-логическим устройством (АЛУ), что позволяет получить доступ к двум независимым регистрам при выполнении одной команды. В результате эта архитектура позволяет обеспечить в десятки раз большую производительность, чем стандартная CISC архитектура.

ATtiny2313 имеет следующие характеристики: 2 КБ программируемой в системе Flash память программы, 128 байтную EEPROM память данных, 128 байтное SRAM (статическое ОЗУ), 18 линий ввода - вывода общего применения, 32 рабочих регистра общего назначения, однопроводный интерфейс для встроенного отладчика, два гибких таймера/счетчика со схемами сравнения, внутренние и внешние источники прерывания, последовательный программируемый USART, универсальный последовательный интерфейс с детектором стартового условия, программируемый сторожевой таймер со встроенным генератором и три программно инициализируемых режима пониженного потребления. В режиме Idle останавливается ядро, но ОЗУ, таймеры/счетчики и система прерываний продолжают функционировать. В режиме Power-down регистры сохраняют свое значение, но генератор останавливается, блокируя все функции прибора до следующего прерывания или аппаратного сброса. В Standby режиме задающий генератор работает, в то время как остальная часть прибора бездействует. Это позволяет очень быстро запустить микропроцессор, сохраняя при этом в режиме бездействия мощность.

Прибор изготовлен по высокоплотной энергонезависимой технологии изготовления памяти компании Atmel. Встроенная ISP Flash позволяет перепрограммировать память программы в системе через последовательный SPI интерфейс или обычным программатором энергонезависимой памяти. Объединив в одном кристалле 8-битное RISC ядро с самопрограммирующейся в системе Flash памятью, ATtiny2313 стал мощным микроконтроллером, который дает большую гибкость разработчикам микропроцессорных систем.

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


3. Способы генерации аналоговых сигналов


.1 Генерация аналоговых сигналов с помощью ШИМ


Для генерации импульсов используется режим быстрой ШИМ с переменным заполнением импульсов на выходе OC1A (PB1). Для получения из цифрового ШИМ-сигнала сигнала синусоидальной формы на выходе должен быть предусмотрен аналоговый фильтр.

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

ШИМ в сочетания с аналоговым фильтром может использоваться для генерации аналоговых выходных сигналов, т.е. в качестве цифро-аналогового преобразователя (ЦАП). В качестве основы используется последовательность прямоугольных импульсов с постоянным периодом следования (фиксированная частота преобразования). Для генерации различных аналоговых уровней регулируется заполнение импульсов и, таким образом, изменяется длительность импульсов. Если необходимо сформировать высокий аналоговый уровень, то длительность импульса увеличивают и наоборот.

Усреднение аналогового сигнала за один период (с помощью аналогового фильтра) позволяет сгенерировать аналоговый сигнал. При заполнении импульсов 50% аналоговый сигнал равен половине напряжения питания, а при 75%-ом заполнении импульсов - аналоговый сигнал равен 75% от напряжения питания.

Аналоговый ФНЧ можно выполнить с помощью простого пассивного RC-фильтра. Фильтр удаляет несущую высокую частоту ШИМ и, таким образом, формирует аналоговый сигнал. Настроечная частота фильтра должна быть выбрана достаточно высокой, чтобы не исказить форму аналогового сигнала. В то же время настроечная частота должна быть достаточно низкой для минимизации пульсаций от несущей частоты ШИМ.


Рисунок 2 - Низкочастотный RC-фильтр


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

В микроконтроллерах AVR для генерации ШИМ-сигналов используются таймеры-счетчики. Для изменения несущей частоты ШИМ изменяется частота синхронизации таймера и вершина счета. Повышение частоты синхронизации и/или снижение вершины счета приводят к повышению частоты переполнения таймера и, как следствие, увеличивается частота ШИМ. Максимальной разрешающей способности (вершина счета 255) соответствует максимальная частота ШИМ 250 кГц. Дальнейшее увеличение частоты ШИМ возможно путем уменьшения разрешающей способности, но в этом случае сокращается количество шагов при установке заполнения импульсов от 0 до 100%.

Изменение содержимого регистра сравнения (OCR) влияет на заполнение импульсов. Увеличение значения OCR увеличивает заполнение импульсов. До достижения счетчиком значения из регистра OCR ШИМ-выход находится в высоком состоянии, затем переходит в низкое состояние до достижения вершины счета, после чего счетчик переходит в нулевое состояние и цикл повторяется. Такой способ генерации у AVR-микроконтроллеров получил название быстрой ШИМ.

Рисунок 3 - Значения счетчика и ШИМ-выход


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


.2 Генерация аналоговых сигналов с помощью R-2R матрицы


Если к цифро-аналоговому преобразователю не предъявляются серьёзные требования, то его можно сделать самостоятельно из обычных резисторов. Называется такой ЦАП - R-2R. Своё название он получил из-за номиналов применяемых в нём резисторов с сопротивлениями R и 2*R. Сопротивления по идее могут быть любыми, но в разумных пределах. Если поставить очень большие сопротивления, например, по несколько мегаом, то нагрузка которая подключена к выходу, внесет существенные искажения в сигнал. Напряжение начнёт проседать. В курсовой работе используются резисторы, сопротивление которых 1Ком и 2Ком.

Если есть много резисторов одного сопротивления, то получить сопротивление вдвое меньшее, можно просто включив параллельно два одинаковых резистора. Для такого ЦАП желательно использовать резисторы с 1%-м допуском.

Рисунок 4 - ЦАП R-2R


Каждый вход ЦАП имеет свой «вес». Входы расположены в порядке уменьшения веса слева направо. Левый вход оказывает самое большое влияние на выходной сигнал, следующий за ним вдвое меньше и так далее. Ну а самый последний (правый) вход изменяет выходной сигнал на ничтожные милливольты. Если известна комбинация бит, поступающая на вход ЦАП, то рассчитать напряжение очень легко. Предположим, что на входе у нас число 10010101 тогда выходное напряжение можно рассчитать по формуле:



Согласно формуле, напряжение на выходе будет равно 2.91 вольта. Uпит - напряжение питания микроконтроллера. При расчете использовалось значение 5 вольт. Таким образом, восьмибитный ЦАП способен выдать 256 различных напряжений с шагом около 20 милливольт, что вполне неплохо.

К преимуществам таких ЦАП можно отнести:

1)возможность увеличения разрядности;

)неплохая частота дискретизации;

)схемотехническая простота и повторяемость.

Недостатки:

)качество ЦАП сильно зависит от применяемых резисторов;

)сопротивление ключей порта микроконтроллера вносят искажения;

)громоздкость на плате


4. Разработка программ генерации синусоидального напряжения


.1 Хранение значений синусоиды в памяти программ


Микроконтроллеры AVR имеют отдельную память данных и отдельную память программ.

Память программ (Flash ROM или Flash ПЗУ) предназначена для хранения последовательности команд, управляющих функционированием микроконтроллера, и имеет 16-ти битную организацию. Все AVR имеют Flash-память программ, которая может быть различного размера - от 1 до 256 КБайт. Ее главное достоинство в том, что она построена на принципе электрической перепрограммируемости, т. е. допускает многократное стирание и запись информации. Программа заносится во Flash-память AVR как с помощью обычного программатора, так и с помощью SPI-интерфейса, в том числе непосредственно на собранной плате. Возможностью внутрисхемного программирования (функция ISP) через коммуникационный интерфейс SPI обладают все микроконтроллеры AVR, кроме Tiny11 и Tiny28.

Гарантированное число циклов перезаписи Flash-памяти у микроконтроллеров AVR второго поколения составляет не менее 10 тыс. циклов при типовом значении 100 тыс. циклов. (В официальной технической документации Atmel Corp. указывается значение 10 тыс. циклов.).

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


;************************************************************

;Генератор сигнала синусоидальной формы

;Хранение значений синусоиды в памяти программ

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

;************************************************************

.nolist; Отменяем листинг всех подсоединяемых файлов

.include "tn2313def.inc"; Присоединение файла описаний

.list; Разрешение листинга

.def temp=r16; Регистр для хранения промежуточных данных

.def temp1=r17; Регистр для хранения текущего значения синусоиды

;--------------------------- Начало программного кода---------------------------

.cseg; Выбор сегмента памяти команд

.org 0; Установка счетчика команд в 0

;--------------------------- Инициализация стека-----------------------------------temp,RAMEND; Выбор адреса вершины стекаSPL,temp; Запись его в регистр стека

;-------------------------- Инициализация портов ввода-вывода ---------------

ldi temp,0; Записываем ноль в регистр temp

out DDRD,temp; Записываем этот ноль в DDRD (порт D на ввод)

out DDRA,temp; Записываем ноль в DDRA (порт A на ввод)

ldi temp,0xFF; Записываем число $FF в регистр temp

out PortD,temp; Записываем temp в PortD (включаем подтяжки порта D)

out PortA,temp; Записываем temp в PortA (включаем подтяжки порта A)

out DDRB,temp; Записываем temp в DDRB (порт B на вывод)

; ----------------------------- Инициализация компаратора-----------------------

ldi temp,0x80 ACSR,temp;Выключение компаратора

;------------------------------ Основной цикл программы------------------------:temp,0; Записываем ноль в регистр tempZH,High(Array*2); Запись старшего и младшего байта начальногоZL,Low(Array*2); адреса массива в регистровую пару Z:r17, Z+; Загрузка с постинкрементом в r17(temp1)

; содержимого ячейки, адрес которой хранится в

; регистровой паре ZPortB,temp1; Вывод текущего значения синусоиды в порт PBtemp,255; Проверка счетчика (temp1) на равенство 255t1; Если равно 255, то переходим на метку t1Temp; Увеличиваем счетчик на единицуP1; Безусловный переход на метку P1

;--------------------- Массив значений периода синусоиды --------------------

; Массив состоит из 256 чисел, то есть один период синусоиды строится по

; 256-ти точкам

Array:

.db128,131,134,137,140,144,147,150,153,156,159,162,165,168,171,174,177,180,182,185,188,191,194,196,199,201,204,206,209,211,214,216,218,220,222,224,226,228,230,232,234,236,237,239,240,242,243,244,246,247,248,249,250,251,251,252,253,253,254,254,254,255,255,255

.db255,255,255,255,254,254,253,253,252,252,251,250,249,248,247,246,245,244,242,241,240,238,236,235,233,231,229,227,225,223,221,219,217,215,212,210,208,205,203,200,197,195,192,189,187,184,181,178,175,172,169,167,164,160,157,154,151,148,145,142,139,136,133,130

.db126,123,120,117,114,111,108,105,102,99,96,92,89,87,84,81,78,75,72,69,67,64,61,59,56,53,51,48,46,44,41,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,8,7,6,5,4,4,3,3,2,2,1,1,1,1

.db1,1,1,2,2,2,3,3,4,5,5,6,7,8,9,10,12,13,14,16,17,19,20,22,24,26,28,30,32,34,36,38,40,42,45,47,50,52,55,57,60,62,65,68,71,74,76,79,82,85,88,91,94,97,100,103,106,109,112,116,119,122,125,128


4.2 Хранение значений синусоиды в ОЗУ. Применение косвенной адресации


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

Адрес байта при обращении к SRAM может быть указан в коде команды с обращением к SRAM (прямая адресация) или предварительно записан в пару регистров X, Y или Z (косвенная адресация). Обращение к SRAM может выполняться с использованием адреса, хранящегося в регистре-указателе стека.

Байт для записи в SRAM поступает из регистра общего назначения. Байт, считанный из SRAM, поступает в регистр общего назначения.

В адресное пространство SRAM кроме адресов, по которым выполняется обращение к ячейкам памяти SRAM, включены 32 адреса для обращения к регистрам общего назначения (адреса от $00 до $1F) и 64 адреса для обращения к регистрам ввода-вывода (адреса от $20 до $5F).

Первой ячейке SRAM соответствует адрес $60.

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

Для всех способов адресации доступны все 32 регистра общего назначения, 64 регистра ввода-вывода и 128 байтов памяти данных SRAM микросхемы Attiny2313.


;*************************************************************

;Генератор сигнала синусоидальной формы

;Хранение значений синусоиды в ОЗУ

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

;*************************************************************

.nolist; Отменяем листинг всех подсоединяемых файлов

.include "tn2313def.inc"; Присоединение файла описаний

.list; Разрешение листинга

.def temp1=r16; Главный рабочий регистр

.def temp2=r17; Регистр для хранения текущего значения синусоиды

;--------------- Резервирование ячеек памяти (SRAM)------------------------

.dseg; Выбираем сегмент ОЗУ

.org 0x60; Устанавливаем текущий адрес сегмента

buf: .byte 64; Резервируем 64 байта в ОЗУ под массив чисел со ;значениями четверти периода синусоиды

;--------------------------- Начало программного кода----------------------------

.cseg; Выбор сегмента памяти команд

.org 0; Установка счетчика команд в 0

;------------------------- Инициализация стека-------------------------------------temp1,RAMEND; Выбор адреса вершины стекаSPL,temp1; Запись его в регистр стека

;--------------------- Инициализация портов ввода-вывода -------------------

ldi temp1,0; Записываем ноль в регистр temp

out DDRD,temp1; Записываем этот ноль в DDRD (порт D на ввод)

out DDRA,temp1; Записываем ноль в DDRA (порт A на ввод)

ldi temp1,0xFF; Записываем число $FF в регистр temp

out PortD,temp1; Записываем temp в PortD (включаем подтяжки порта D)

out PortA,temp1; Записываем temp в PortA (включаем подтяжки порта A)

out DDRB,temp1; Записываем temp в DDRB (порт B на вывод)

; ---------------------------- Инициализация компаратора-------------------------

ldi temp1,0x80 ACSR,temp1;Выключение компаратора

;-----------------------------Основной цикл программы---------------------------

ldi XH, high(buf); В регистровую пару X записываем адрес

ldi XL, low(buf); начала буфера ОЗУ

ldi ZH, high(mas*2); В регистровую пару Z записываем старший и

ldi ZL,low(mas*2); младший байт начального адреса массива

ldi temp1,0; Записываем ноль в temp1, регистр будет

; работать как счетчик

;---------------------------- Косвенная запись в память---------------------------

nn:

lpm temp2,Z+; Загрузка с постинкрементом в r17(temp1)

; содержимого ячейки, адрес которой хранится

; в регистровой паре Z

st X+,temp2;Совершаем запись содержимого регистра

; temp2 в ОЗУ по адресу, который хранится

; в регистровой паре X

inc temp1; Увеличиваем значение счетчика на единицу

cpi temp1,64; Проверка счетчика на равенство 64

brne nn; Если не равно 64, то переходим на метку nn,

; если равно 64, то есть если в ОЗУ записались

;все числа массива, то переходим на метку start

;---------------------- Косвенное чтение из памяти-------------------------

start:

ldi XH, high(buf); В регистровую пару X записываем адрес

ldi XL, low(buf); начала буфера ОЗУ

;-------------------------- Первая четверть синусоиды----------------------------

nn1:

ld temp2, X+; Чтение байта из ячейки ОЗУ, адрес которой

; хранится в регистровой паре X и запись

; прочитанного байта в регистр temp2. Затем

; содержание регистровой пары X увеличивается

; на единицу

out PortB,temp2; Вывод текущего значения синусоиды в порт РВ

dec temp1; Уменьшаем значение счетчика на единицу

cpi temp1,0; Сравниваем с нулем

brne nn1; Если не равно нулю, то переходим на метку nn1,

; если равно нулю, то есть если из ОЗУ были

; прочитаны и отправлены на порт B все 64 числа, то

; переходим на метку nn2

;---------------------- Вторая четверть синусоиды------------------------------

nn2:

ld temp2, -X; Чтение байта из ячейки ОЗУ, адрес которой

; хранится в регистровой паре X и запись

; прочитанного байта в регистр temp2. Затем

; содержание регистровой пары X уменьшается

; на единицу

out PortB,temp2; Вывод текущего значения синусоиды в порт РВ

inc temp1; Увеличиваем значение счетчика на единицу

cpi temp1,64; Сравниваем с 64

brne nn2; Если не равно 64, то переходим на метку nn2,

; если равно 64, то есть если из ОЗУ были

; прочитаны и отправлены на порт B все 64 числа,

; начиная с последнего числа массива, записанного в

; ОЗУ и заканчивая первым, то

; переходим на метку nn3

; ------------------------- Третья четверть синусоиды------------------------------

nn3:

ld temp2, X+; Чтение байта из ячейки ОЗУ, адрес которой

; хранится в регистровой паре X и запись

; прочитанного байта в регистр temp2. Затем

; содержание регистровой пары X увеличивается

; на единицу

com temp2; Выполняем побитную инверсию регистра temp2 для

; получения отрицательной полуволны синусоиды

out PortB,temp2; Вывод текущего значения регистра temp2 в порт РВ

dec temp1; Уменьшаем значение счетчика на единицу

cpi temp1,0; Сравниваем с нулем

brne nn3; Если не равно нулю, то переходим на метку nn3,

; если равно нулю, то есть если из ОЗУ были

; прочитаны и отправлены на порт B все 64

; числа, начиная с начального адреса буфера ОЗУ, то

; переходим на метку nn4

;---------------------- Четвертая четверть синусоиды---------------------------

nn4:

ld temp2, -X; Чтение байта из ячейки ОЗУ, адрес которой

; хранится в регистровой паре X и запись

; прочитанного байта в регистр temp2. Затем

; содержание регистровой пары X уменьшается

; на единицу

com temp2; Выполняем побитную инверсию регистра temp2 для

; получения отрицательной полуволны синусоиды

out PortB,temp2; Вывод текущего значения регистра temp2 в порт РВ

inc temp1; Увеличиваем значение счетчика на единицу

cpi temp1,64; Сравниваем с 64

brne nn4; Если не равно 64, то переходим на метку nn4,

; если равно 64, то есть если из ОЗУ были

; прочитаны и отправлены на порт B все 64 числа,

; начиная с последнего числа массива, записанного в

; ОЗУ и заканчивая первым, то выполняется

; переход на метку start

rjmp start

;-------------------Массив значений четверти синусоиды-----------------

; Массив состоит из 64 чисел, то есть одна четверть синусоиды строится по

; 64-ём точкам

mas:

.db128,131,134,137,140,144,147,150,153,156,159,162,165,168,171,174,177,180,182,185,188,191,194,196,199,201,204,206,209,211,214,216,218,220,222,224,226,228,230,232,234,236,237,239,240,242,243,244,246,247,248,249,250,251,251,252,253,253,254,254,254,255,255,255


.3 Хранение значений синусоиды в энергонезависимой памяти (EEPROM)


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

EEPROM имеет обособленное адресное пространство. При обращении к EEPROM адрес записывается в регистр адреса EEAR. Байт, предназначенный для записи, заносится в регистр данных EEDR. Байт, полученный при чтении, поступает в этот же регистр. Для управления процедурами записи и чтения используется регистр управления EECR.

Для записи байта в EEPROM необходимо:

)записать адрес в регистр адреса;

)записать байт в регистр данных;

)установить в единичное состояние разряд EEMWE регистра EECR

)при EEMWE=1 установить в единичное состояние разряд EEWE регистра EECR

Процедура записи выполняется в зависимости от величины напряжения питания за 2,5 - 4 мс. При завершении записи разряд EEWE регистра EECR аппаратно сбрасывается в нулевое состояние.

Разряд EEMWE сохраняет единичное состояние в течение 4-ех тактов после установки и аппаратно сбрасывается в нулевое состояние.

Для чтения байта из EEPROM необходимо:

)записать адрес в регистр адреса;

)установить в единичное состояние разряд EERE регистра EECR.

Считанный байт поступает в регистр данных. Разряд EERE регистра EECR аппаратно сбрасывается в нулевое состояние.


;************************************************************

;Генератор сигнала синусоидальной формы

;Хранение значений синусоиды в энергонезависимой памяти (EEPROM)

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

;*************************************************************

.nolist; Отменяем листинг всех подсоединяемых файлов

.include "tn2313def.inc"; Присоединение файла описаний

.list; Разрешение листинга.def data=r17

.def addres=r18; Указатель адреса в EEPROM

.def count=r19; Регистр передачи данных

.def temp=r20; Главный рабочий регистр

.def data=r21; Регистр передачи данных

;------------------ Резервирование ячеек памяти (EEPROM)--------------------

.eseg; Выбираем сегмент EEPROM

.org 0x08; Устанавливаем текущий адрес сегмента

bufr: .byte 64; Буфер для хранения массива

;-------------------------- Начало программного кода-----------------------------

.cseg; Выбор сегмента памяти команд

.org 0; Установка счетчика команд в 0

;--------------------------- Инициализация стека-----------------------------------temp,RAMEND; Выбор адреса вершины стекаSPL,temp; Запись его в регистр стека

;-----------------------Инициализация портов ввода-вывода -------------------

ldi temp,0; Записываем ноль в регистр temp

out DDRD,temp; Записываем этот ноль в DDRD (порт D на ввод)

out DDRA,temp; Записываем ноль в DDRA (порт A на ввод)

ldi temp,0xFF; Записываем число $FF в регистр temp

out PortD,temp; Записываем temp в PortD (включаем подтяжки порта D)

out PortA,temp; Записываем temp в PortA (включаем подтяжки порта A)

out DDRB,temp; Записываем temp в DDRB (порт B на вывод)

; ----------------------------- Инициализация компаратора-----------------------

ldi temp,0x80 ACSR,temp;Выключение компаратора

; ---------------------------- Проверка записи в EEPROM------------------------

; Поскольку память EEPROM предназначена для долговременного хранения

; данных, то мы можем записать в неё массив один раз, а затем,

; проверять записан ли массив при повторном запуске программы. Если

; окажется, что массив не записан, то выполнится переход в цикл

; записи массива, если записан, то сразу в цикл чтения

ldi addres,0x08; Записываем в регистр addres начало сегмента EEPROM

mm:

cli; Запрещаем все прерывания

sbic EECR,EEWE;Проверяем готовность EEPROM

rjmp mm ;Если не готов, то ждем (переходим на метку mm)

out EEAR,addres ;Записываем адрес в регистр адреса

sbi EECR,EERE;Устанавливаем бит разрешения чтения

in data,EEDR; Помещаем прочитанный байт в регистр data

cpi data,128; Сравниваем с 128

breq start; Если равно, т.е если массив уже записан в EEPROM,

; то переходим на метку start, если не равно, то

;переходим на метку Write

; ---------------------------- Запись массива в EEPROM--------------------------

Write:

ldi addres,bufr; Записываем в регистр addres начало сегмента EEPROM

ldi ZH,high(mas*2); В регистровую пару Z записываем старший и

ldi ZL,low(mas*2); младший байт начального адреса массива

m8:

lpm data,Z+; Загрузка с постинкрементом в r17(temp1)

; содержимого ячейки, адрес которой хранится

; в регистровой паре Z

nn1:

cli; Запрещаем все прерывания

sbic EECR,EEWE; Проверяем готовность EEPROM

rjmp nn1 ; Если не готов, то ждем

out EEAR,addres; Записываем адрес в регистр адреса

out EEDR, data; Записываем данные в регистр данных

sbi EECR,EEMWE; Устанавливаем бит разрешения записи

sbi EECR,EEWE; Устанавливаем бит записи

inc addres; Увеличиваем адрес в EEPROM

inc count; Увеличиваем значение счетчика на единицу

cpi count,64; Сравниваем с 64

brne m8; Если не равно, то переходим на метку m8, если

; равно, то есть если в EEPROM записались все 64

;числа массива, то переходим на метку start

; --------------------------------- Чтение из EEPROM-------------------------------

start:

ldi count,0; Обнуляем счетчика

ldi addres,bufr; Записываем в регистр addres начало сегмента EEPROM

;-------------------------------- Первая четверть синусоиды------------------------------

m1:

cli; Запрещаем все прерывания

sbic EECR,EEWE; Проверяем готовность EEPROM

rjmp m1; Если не готов, то ждем (переходим на метку m1)

out EEAR,addres; Записываем адрес в регистр адреса

sbi EECR,EERE; Устанавливаем бит разрешения чтения

in data,EEDR; Помещаем прочитанный байт в регистр data

inc addres; Увеличиваем адрес в EEPROM на единицу

nop; Нет операции

out PortB,data; Вывод текущего значения синусоиды в порт PB

inc count; Увеличиваем значение счетчика на единицу

cpi count,64; Сравниваем с 64

brne m1; Если не равно 64, то переходим на метку m1, если

; равно 64, то есть если из EEPROM были прочитаны

; и отправлены на порт B все 64 числа начиная с

; первого числа массива, записанного в EEPROM и

; заканчивая последним, то переходим на метку m2

;--------------------------- Вторая четверть синусоиды---------------------------

m2:

cli; Запрещаем все прерывания

sbic EECR,EEWE; Проверяем готовность EEPROM

rjmp m2; Если не готов, то ждем (переходим на метку m2)

out EEAR,addres; Записываем адрес в регистр адреса

sbi EECR,EERE; Устанавливаем бит разрешения чтения

in data,EEDR; Помещаем прочитанный байт в регистр data

dec addres; Уменьшаем адрес в EEPROM на единицу

nop; Нет операции

out PortB,data; Вывод текущего значения синусоиды в порт PB

dec count; Уменьшаем значение счетчика на единицу

cpi count,0; Сравниваем с 0

brne m2; Если не равно нулю, то переходим на метку m2,

; если равно нулю, то есть если из EEPROM были

; прочитаны и отправлены на порт B все 64 числа,

; (чтение массива с конца), то переходим на метку m3

;---------------- ------------ Третья четверть синусоиды---------------------------

m3:

cli; Запрещаем все прерывания

sbic EECR,EEWE; Проверяем готовность EEPROM

rjmp m3; Если не готов, то ждем (переходим на метку m3)

out EEAR,addres; Записываем адрес в регистр адреса

sbi EECR,EERE; Устанавливаем бит разрешения чтения

in data,EEDR; Помещаем прочитанный байт в регистр data

inc addres; Увеличиваем адрес в EEPROM на единицу

com data; Выполняем побитную инверсию регистра data для

; получения отрицательной полуволны синусоиды

out PortB,data; Вывод текущего значения регистра data в порт PB

inc count; Увеличиваем значение счетчика на единицу

cpi count,64; Сравниваем с 64

brne m3; Если не равно 64, то переходим на метку m3, если

; равно 64, то есть если из EEPROM были прочитаны,

; инвертированы и отправлены на порт B все 64 числа

; начиная с первого числа массива, записанного в

; EEPROM и заканчивая последним, то переходим на

; метку m4

; ------------------------ Четвертая четверть синусоиды-------------------------

m4:

cli; Запрещаем все прерывания

sbic EECR,EEWE; Проверяем готовность EEPROM

rjmp m4; Если не готов, то ждем (переходим на метку m4)

out EEAR,addres; Записываем адрес в регистр адреса

sbi EECR,EERE; Устанавливаем бит разрешения чтения

in data,EEDR; Помещаем прочитанный байт в регистр data

dec addres; Уменьшаем адрес в EEPROM на единицу

com data; Выполняем побитную инверсию регистра data для

; получения отрицательной полуволны синусоиды

out PortB,data; Вывод текущего значения регистра data в порт PB

dec count; Уменьшаем значение счетчика на единицу

cpi count,0; Сравниваем с 0

brne m4; Если не равно нулю, то переходим на метку m4,

; если равно нулю, то есть если из EEPROM были

; прочитаны, инвертированы и отправлены на порт B

; все 64 числа (чтение массива с конца), то переходим

; на метку start

rjmp start

;------------------- Массив значений четверти синусоиды----------------------

; Массив состоит из 64 чисел, то есть одна четверть синусоиды

; строится по 64-ём точкам

mas:

.db128,131,134,137,140,144,147,150,153,156,159,162,165,168,171,174,177,180,182,185,188,191,194,196,199,201,204,206,209,211,214,216,218,220,222,224,226,228,230,232,234,236,237,239,240,242,243,244,246,247,248,249,250,251,251,252,253,253,254,254,254,255,255,255


Заключение


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

микроконтроллер генерация синусоида сигнал


Библиографический список


1.Евстифеев А.В. Микроконтроллеры AVR семейств Tiny и Mega фирмы «ATMEL». М.: Издательский дом «Додэка-XXI», 2011. 560 с.

2.Гребнев В.В. Микроконтроллеры семейства AVR фирмы Atmel. М.: ИП РадоиСофт, 2010. 176 с.

.Белов А.В. Микроконтроллеры AVR в радиолюбительской практике. СПб.: Наука и Техника, 2007. 352 с.

.Голубцов М.С. Микроконтроллеры AVR: от простого к сложному. М.: СОЛОН-Пресс, 2009. 288 с.


Теги: Генератор сигналов синусоидальной формы  Курсовая работа (теория)  Информационное обеспечение, программирование
Просмотров: 29312
Найти в Wikkipedia статьи с фразой: Генератор сигналов синусоидальной формы
Назад