Курсовая работа (т): Генератор сигналов синусоидальной формы

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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

; переходим на метку 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--------------------------

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

Источник: https://www.bibliofond.ru/detail.aspx?id=792226