она побудована на принципі електричної перепрограмувальний, т. Е. Допускає багаторазове стирання і запис інформації. Програма заноситься в 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) на рівність 255 t1; Якщо дорівнює 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,8...