Ми успішно використовували LFSR-генератор псевдовипадкових чисел пристрої Tiny в проекті 2, але початкове значення LFSR було фіксованим. Це означає, що при кожному включенні схеми вона генерує одну і ту ж послідовність. Тепер покажемо, як можна вбудувати 16-розрядний LFSR в таке невеликий пристрій, як ATtinyl3 (при цьому канал АЦП буде задавати початкове значення). Це дає різні початкові значення для LFSR при кожному включенні ланцюга, тому послідовності виявляться “більш випадковими”. 16-розрядний LFSR може успішно генерувати випадкові числа (за винятком 0) з періодичністю 65535, однак для цього відводи повинні бути в певних позиціях. Ν-розрядний регістр з періодом 2 “-1 називається максимальним LFSR, саме він застосований у цьому проекті. Рандомизация виходу LFSR добре помітна за різними кольорами RGB-світлодіоди і звукам з динаміка.

Специфікація проекту

Мета – реалізувати LFSR на пристрої Tiny і продемонструвати його випадкову роботу за допомогою RGB-світлодіоди і динаміка. Схема повинна працювати при напрузі в 3 В. Управління інтенсивністю світіння світлодіодів (Для генерування випадкових кольорів) здійснюється знову-таки за допомогою широтноімпульсної модуляції (як у проекті 3). Випадковий звук генерується подачею в динамік сигналу звукового діапазону. Блок-схема пристрою наведена на рис. 2.30.

Рис. 2.30. Блок-схема генератора випадкових кольорів і звуків

Опис пристрою

На рис. 2.31 показана принципова схема пристрою. МАХ756 – це підвищувальний перетворювач постійної напруги, який в даному випадку видає напругу 5 В від джерела живлення 3 В. Якщо вхідна напруга перевищить 5 В, то вихідна напруга підвищиться у відповідності зі вхідним. Це може призвести до пошкодження інших частин схеми (включаючи і сам МАХ756), тому потрібно, щоб вхідна напруга ніколи не перевищувало 5 В. Діод D1 і котушка L1 потрібні для роботи МАХ756. Контролер ATtinyl3 має всі функції, необхідні для нашого проекту. Використовуваний светодіод- це RGB-світлодіод із загальним анодом (В корпусі SMD), підключеним до джерела живлення. R5, R6 і R7 працюють як обмежуючі ток резистор> и для червоного, синього і зеленого світлодіодів (відповідно) і мають опір по 100 Ом кожен. Елемент Т1 (2SD789) – це і-р-і-транзистор, який дає сигнал на динамік. Він необхідний, тому що контакти вводу / виводу пристрою AYR можуть дати тільки 40 мА, а цього для динаміка недостатньо. Динамік, використаний нами, має потужність 0,5 Вт і опір 8 Ом. Щоб розсіюється динаміком потужність перебувала в допустимих межах, послідовно з ним потрібно включити резистор 10 Ом. Висновок РВ4 контролера працює як “плаваючий” канал АЦП, щоб отримати початкове значення для LFSR.

Псевдовипадкові числа формуються за допомогою 16-розрядного LFSR- генератора Фібоначчі. Ці числа служать для зміни кольору RGB-світлодіоди і тону в динаміці кожні півсекунди. Кольори створюються за допомогою програмно генерується ШІМ-сигналу з 10 рівнями (на відміну від 256 рівнів, використаних у проекті 2). Це означає, що світлодіод зможе видавати максимум 10x10x10 кольорів (але відображатися будуть тільки 16 з них). Тон в динаміці генерується за допомогою меандру змінної частоти. Було вибрано дев’ять різних частот звуку.

Рис. 2.31. Принципова схема генератора випадкових кольорів і звуків (динамік 80 м / 0,5 Вт включений послідовно з резистором 10 Ом)

Конструкція

Компонування плати (і принципову схему) можна завантажити за посиланням: www.avrgenius.com/tinyavrl.

Друкована плата однобічна (на стороні компонентів є всього декілька перемичок). Розміщення компонентів показано на рис. 2.32, а сторона пайки – на рис. 2.33. На розпаяних платі RGB-світлодіод змонтований на стороні компонентів.

Рис. 2.32. Плата генератора випадкових кольорів і звуків (сторона компонентів)

Рис. 2.33. Плата генератора випадкових кольорів і звуків (сторона друкованих провідників)

Програмування

Відкомпільований вихідний код (разом з файлом MAKEFILE) можна завантажити за посиланням: www.avrgenius.com/tinyavrl.

Тактова частота дорівнює 9,6 МГц. Контролер запрограмований за допомогою STK500 в режимі програмування ISP. Пояснимо найважливіші фрагменти коду.

while(1)

{

// Очікування початкового значення від АЦП if (i == 4)

{

// Це програмний код для LFSR

bit = (reg & 0x0001) ”((reg & 0x0004) » 2)

”((reg & 0x0008) » 3)Л((Гед & 0x0020) »5); reg = (reg »1) | (bit« 15);

// Генерує звук код PORTB | = 1 «3; delay (t);

PORTB 8с = ~ (1 «3); delay (t);

}

}

Лістинг 2.4 – це основний нескінченний цикл програми. Він починає виконуватися тільки тоді, коли значення i дорівнює 4, т. Е. В якості початкового значення береться четверте значення АЦП. Переривання АЦП відбувається чотири рази і при цьому значення i кожен раз збільшується на одиницю. Коли значення i сягає чотирьох, значення плаваючого каналу АЦП присвоюється змінної гед і переривання АЦП відключається. Мінлива гед – це 16-розрядне ціле число, яке і реалізує LFSR. Відводами для LFSR обрані біти 16, 14, 13 і 11 (якщо рахувати від самого молодшого біта). Код, що генерує звук, просто формує прямокутний сигнал обраної частоти.

// Процедура обробки переривання за переповненням Timer0 ISR (TIM0_OVF_vec t)

{

//for color if(e==9)

{Е = 0;

// Початок нового циклу

PORTB = PORTB| (1«2) | (1«1) | (1«0) ;

}

abc () ;

// Час зміни – приблизно півсекунди

j++;

if(j==128)

{

а = reg% 9; // отримати нове значення для звуку t = pgm_read_word (d + a);

а = гед% 16; // отримати нове значення для кольору

blue = pgm_read_byte(k+a);

red = pgm_read_byte(1+a);

green = pgm_read_byte(m+a);

j=0;

}

}

Лістинг 2.5 – це процедура обробки переривання за переповненням TimerO. Вона виконує дві основні функції. По-перше, вона реалізує програмну широтно-імпульсну модуляцію (як у проекті 2), а по-друге, після кожних 128 переповнень вона вибирає нове значення кольору і тону звуку (за допомогою операції залишку від цілочисельного ділення змінної reg). У масиві d зберігається дев’ять звуків (у вигляді тимчасових затримок для прямокутного сигналу), тому взявши modulo9 від змінної reg, ми призначимо змінної а випадкове значення від Про до 8. Потім відповідна змінна масиву d зберігається в t, яка використовується як змінна затримки в головному нескінченному циклі. Точно так само є 16 кольорів, і операція moduioi6 від змінної reg задає змінної а випадкове значення від 0 до 15. Відповідні рівні інтенсивності кожного кольору (з масивів k, 1 і т) зберігаються у відповідних змінних blue, red і green. TimerO має попередній дільник, щоб 128 переривань відбувалися приблизно за 0,5 с. Функції pgm_read_byte (для 8-бітових змінних) і pgm_read_word (для 16-бітових змінних) вибирають константи з пам’яті програм. Щоб заощадити пам’ять даних, потрібно зберігати незмінні значення в пам’яті програм (вказавши атрибут progmem при їх оголошенні). Інші подробиці ви можете побачити в повному вихідному коді.

Джерело: Гадре, Д., Цікаві проекти на базі мікроконтролерів tinyAVR / Дхананья Гадре, Нігула Мелхотра: Пер. з англ. – СПб .: БХВ-Петербург, 2012. – 352 с .: іл. – (Електроніка)