; ОЗУ и заканчивая первым, то
; переходим на метку 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 с.