2,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 raquo ;; Приєднання файлу описів
. 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; Здійснюємо запис вмісту регістра
<...