Запишемо набір частот 100-300-500-700-900 Гц І переведемо цей набір в набір періодів: 10-3-2-14-11 (мс) і потрібні нам тривалості 5-15-1-07-05 (мс)

Ми не можемо в байт записати число з плаваючою крапкою Але можемо висловити тривалості в мікросекундах: 5000-1500-1000-700-500 (мкс) Правда, при цьому ми потрапляємо в халепу з іншим аспектом – як ви памятайте, ми передавали ціле число в змінну, а передати вдавалося тільки байт Давайте спробуємо один «фокус» Він може вийти, може не вийти Якщо не вийде, постараємося придумати щось інше

Суть цього «фокусу», думаю, прояснить наступний малюнок:

Передане змінної число ми зберігаємо таким, щоб вистачило байта Про це говорить присвоювання pause = 50 А для отримання необхідної тривалості імпульсу нам потрібно помножити його на 100

Цим займається доданий цикл, який повторюється 100 разів Такий цикл називається рахунковим

Рис 2316 Спосіб отримання тривалості імпульсу 5000 мс

Щоб цикл став рахунковим, слід налаштувати програмний елемент While

Рис 2317 Налаштування циклу для організації лічильного циклу

У програмі Flowcode можна реалізувати три різновиди циклів: While, Do.until і рахунковий Останній цикл на мовах високого рівня називають циклом For Він виконується задана кількість разів, і змінна для підрахунку числа проходів входить до його складу

Переконаємося, що цей прийом дає належний результат Перевіримо фрагмент програми

Рис 2318 Перевірка на «живому» макеті довгих пауз

Тривалість імпульсу 5 мс (з невеликою помилкою), як ми і планували Надалі для перевірки програми можна використовувати компютер Оскільки перевірка в програмі ISIS дала аналогічний результат

Подвійна перевірка знадобилася тому, що ми «здійснювали маневр» для обходу проблеми І, якби помилилися, то могли зайти в реалізації програми занадто далеко, коли повертатися вже важко

Рис 2319 Перевірка в програмі ISIS (Proteus)

Наступний, що цікавить нас діапазон частот: 1-10 кГц Він відповідає періодам: 1000-330 – 200-140-110 (мкс) У цьому випадку ми можемо повторити свій маневр, використовуючи лічильний цикл 10 разів А в масив записати значення (половина тривалості, поділена на 10): 50-16-10-7-6

Мікроконтролер, особливо при використанні кварцового резонатора для створення тактового генератора, досить точно може відтворити набір частот Але при створенні програми ми округляли значення, обчислюючи період і тривалості імпульсів, що дає приблизне відповідність частоти Мало того, навіть у першому експерименті на макетної платі, задаючи паузу в 10 мкс, ми могли бачити помилку Ця помилка, щоб не повертатися до цього питання, виникає з причини, яку я постараюся показати зараз

Для цього візьмемо найпростішу програму:

Рис 2320 Найпростіша програма, що використовує паузу

Ми нічого не робимо в програмі, крім паузи в 1 мкс Зайдемо в програмі Flowcode в пункт основного меню Чіп Виберемо розділ Перегляд ASM.. В відкривається вікні ви побачите всю програму, написану на асемблері Але я наведу лише основну частину програми:

int main()

{

/ / Ініціалізація MCUSR = 0x00

90: 14 be            out  0x34, r1    52 wdt_disable()

92: 88 e1            ldi  r24, 0x18   24

94: 0f b6            in   r0, 0x3f    63

96: f8 94            cli

98: 80 93 60 00      sts  0x0060, r24

9c: 10 92 60 00      sts  0x0060, r1

a0: 0f be            out  0x3f, r0    63 milliseconds can be achieved

*/ void

_delay_loop_2(uint16_t  

{

count)

  asm

volatile (

a2:

84

e0

ldi

r24,

0x04

4

a4:

90

e0

ldi

r25,

0x00

0

a6:

01

97

sbiw

r24,

0x01

1

a8:

f1

f7

brne

-4

0xa6

<main+0x16>

aa:

ff

cf

rjmp

-2

0xaa

<main+0x1a>

000000ac <_exit>:

ac: f8 94            cli

000000ae < stop_program>:

ae: ff cf            rjmp -2         0xae < stop_program>

Я не буду розповідати вам про кожну з команд на асемблері, я хочу тільки сказати, що цих команд досить багато І кожна команда виконується за один або кілька тактів тактового генератора мікроконтролера Навіть при частоті 20 МГц один такт займає 005 мкс Десять таких тактів займуть 05 мкс Таким чином, до запитаної нами паузі в 1 мікросекунду додасться вимушена затримка на виконання цієї операції, співмірна з самою паузою

Програма Flowcode дуже зручна для вивчення мови програмування Сі Трохи вище того місця, де ви можете побачити програму на асемблері, ви побачите розділ Перегляд С..

int main()

{

/ / Ініціалізація MCUSR = 0x00

wdt_disable()

/ / Ініціалізація коду переривання

/ / Затримка

/ / Затримка: 1 us delay_us (1)

mainendloop: goto mainendloop

}

Я і в цьому випадку привів лише основну частину програми Виконуючи найпримітивніші операції, як наведена вище, ви легше і швидше освоїте мову Сі І зможете так само перейти при бажанні до освоєння мови асемблера

Ті, хто використовує програму KTechlab, можуть переконатися, що і їм доступна підказка і для мови високого рівня, і для асемблера

Вивчати написання коду програми на Сі чи асемблері зручніше в програмі AVRStudio для тих, хто вибрав AVR-контролер, або в MPLAB, якщо це PIC-контролер Але слід мати на увазі, що написання тексту може залежати від використовуваного компілятора Переносячи програму з Flowcode в інше середовище розробки, ви, можливо, будете змушені вносити виправлення Часом це досить прості виправлення, як заміна trisa на TRISA або навпаки, але іноді потрібно більш складна правка

Ви можете потренуватися в кодуванні на Сі і в самій програмі Flowcode Тільки перевірку слід виконувати або на «живий» макетної платі, або в програмі ISIS

Для використання мови Сі в програмі Flowcode є програмний елемент Сі-код Він додається в програму, як будь-який інший програмний елемент Варто тільки памятати, що всі елементи програми беруть участь в налагодженні Flowcode, крім вставок на мові Сі і асемблері Так йде справа в останній на сьогоднішній день версії Кажуть, що в наступних версіях це буде змінено Але поки це так, і не слід цього забувати

Відкриваючи елемент блоку вставки на мові Сі, ви опиняєтеся в текстовому редакторі, де можете написати текст програми, а можете, як зробив я, скопіювати його Я спробував вставити затримку з попереднього прикладу, замінивши 1 мкс на 1500 мкс

Подивимося, чи вийде щось з цієї заміни

Рис 2321 Вставка блоку на мові Сі в програму

Після трансляції тексту (хоча весь текст, крім однієї команди, довелося викинути) перевіримо в програмі ISIS, чи буде тривалість імпульсу 15 мс

Рис 2322 Перевірка роботи вставки на мові Сі в ISIS

Сама вставка працює, а обдурити програму не вийшло Те число, 1500, яке я додав у функцію затримки, перетворилося, схоже, в залишок від цього числа розміром не більше байта

Але це «до слова» Якщо ви захочете отримати досить точний генератор, то знадобиться або модифікувати програму, підганяючи часи, або використовувати програму на асемблері, вираховуючи кількість операцій і отримані затримки, або використовувати вбудовані таймери Мені здається, що за наявності відкаліброваного осцилографа або частотоміра, простіше «підігнати» програму Але це лише моя думка

Джерело: Гололобов ВН, – Самовчитель гри на паяльнику (Про електроніці для школярів і не тільки), – Москва 2012