Як визначити тактову частоту мікроконтролера, avr, programming

Тактова частота, на якій працює мікроконтролер AVR. визначає швидкість його роботи. Для деяких realtime додатків (наприклад для бібліотеки V-USB) тактова частота критично важливий параметр, від якого залежить - буде програма працездатна чи ні. Тому важливо вміти визначати тактову частоту, на якій працює мікроконтролер.

[На що впливає тактова частота мікроконтролера? ]

Відповідь на це питання проста - на швидкість роботи. Тривалість кожного такту мікроконтролера AVR зазвичай відповідає часу виконання однієї інструкції на мові асемблера (хоча є інструкції асемблера, час виконання яких становить 2, 3, і навіть 4 такту). Тобто чим вище тактова частота, тим швидше мікроконтролер працює, тим точніше його реакція на зовнішні події. Для додатків реального часу (наприклад для програмної роботи з протоколом USB через бібліотеку V-USB) буває потрібно дуже точно знати тривалість виконання кожної інструкції програми.

Крім того, в ядро ​​AVR вбудовано безліч периферійних апаратних пристроїв - АЦП, UART, SPI, I2C і багато іншого. Робота всіх цих вузлів залежить від тактової частоти. Наприклад, Ви не зможете точно задати швидкість роботи UART (RS-232), якщо не знаєте його тактову частоту.

Для обчислення затримок в програмі часто використовують зручні макроси-функції delay_us і delay_ms. Коректність їх роботи безпосередньо залежить від того, наскільки робоча частота мікроконтролера AVR відповідає програмної константі F_CPU.

Таким чином, важливо знати, як формується тактова частота, і вміти визначати її дійсне значення. Давайте розберемо найпопулярніші варіанти тактирования мікроконтролера AVR, щоб навчитися визначати робочу тактову частоту.

Дуже часто (і це відноситься до макетним платам AVR-USB-MEGA16, AVR-USB162, AVR-USB162MU, metaboard, userial [1]) робоча тактова частота AVR точно дорівнює частоті кварцового резонатора (або просто кварцу), який підключений до мікроконтролеру. В цьому випадку фьюз (або програмно) вимкнений вбудований переддільник тактової частоти (prescaler). Нижче представлені приклади зовнішнього вигляду кварцових резонаторів з маркуванням, де цифрами вказана робоча частота кварцового резонатора.

Як визначити тактову частоту мікроконтролера, avr, programming

Як визначити тактову частоту мікроконтролера, avr, programming

На фотографії зліва показаний фрагмент старого варіанту макетної плати AVR-USB-MEGA16 з кварцовим резонатором на 16 МГц. Багато прикладів програм і готові прошивки скомпільовані саме для цієї частоти кварцу. Справа показаний новий варіант AVR-USB-MEGA16 з кварцом на 12 МГц.

Програми, що працюють з USB на макетної платі AVR-USB-MEGA16, обов'язково повинні враховувати тактову частоту мікроконтролера, т. Е. Повинні бути скомпільовані точно на ту частоту кварцу, який встановлений на макетної платі, інакше програма працювати не буде. Причина проста - інтерфейс USB має строгі параметри за часом, т. Е. Параметри сигналів D +, D- по тривалості логічних рівнів 0 і 1 повинні бути дуже точно витримані. Ці параметри для макетних плат AVR-USB-MEGA16 контролюються бібліотекою V-USB, коли програмно на низькому рівні обробляється протокол USB. Точність витримується за рахунок віртуозно написаного коду на мові асемблера, де тривалості сигналів підібрані потрібною кількістю команд NOP. Тому робота програми жорстко прив'язана до частоті кварцового резонатора, і прошивка мікроконтролера повинна бути скомпільована точно на робочу тактову частоту. Для бібліотеки V-USB ці частоти можуть бути 12, 15, 16, 16.5, 20 МГц (найчастіше використовуються частоти 12 і 16 МГц).

У програмі тактова частота задається спеціальними константами (наприклад F_CPU), які потім перевіряються препроцесором компілятора - щоб правильно підключити потрібний модуль коду. Константа F_CPU часто задається в makefile, і передається компілятору через опції командного рядка. Константа може бути також задана в заголовки програми на мові C (так званому хедері, файлі з розширенням * .h).

Будьте уважні, коли вибираєте в програмі тактову частоту для мікроконтролера - якщо Ви випадково запрограмуєте мікроконтролер, який працює на частоті 12 МГц, не тієї прошивкою (наприклад, яка розрахована на роботу з частотою 16 МГц), то отримаєте непрацездатний пристрій USB, що не буде визначатися операційною системою. Дуже багато питань користувачів (чому моє пристрій USB не працює.) Пов'язано з некоректною тактовою частотою прошивки.

Як визначити тактову частоту мікроконтролера, avr, programming

На цьому фото показана макетна плата metaboard з мікро контролером ATmega328-PU і кварцовим резонатором на 16 МГц. Тут теж для додатків USB використовується програмна обробка протоколу на основі бібліотеки V-USB. Тому все, що було сказано з приводу частоти кварцу для макетної плати AVR-USB-MEGA16, в рівній мірі відноситься і до metaboard.

Як визначити тактову частоту мікроконтролера, avr, programming

На цій фотографії показаний фрагмент макетної плати AVR-USB162 з встановленим кварцом на 16 МГц. Тут використовується мікроконтролер AT90USB162 з апаратним інтерфейсом USB, тому він набагато швидше справляється з завданням обробки протоколу USB, ніж звичайний мікроконтролер AVR. Тут теж важлива тактова частота, на якій працює мікроконтролер - для додатків USB можна використовувати кварци на частоти 8 або 16 МГц, але програма дуже строго повинна це враховувати.

[Робота мікроконтролера від внутрішнього тактового генератора]

Для додатків, де не потрібно точно генерувати необхідні інтервали часу, або коли не треба отримати максимальну швидкодію мікроконтролера AVR, можна використовувати вбудований в мікроконтролер RC -генератори. Частота цього генератора дорівнює 8 МГц, за замовчуванням вона поділена на 8, і в результаті мікроконтролер працює на частоті 1 МГц. Дільник може бути запрограмований на різні коефіцієнти розподілу, і також може бути відключений, так що максимальна робоча тактова частота мікроконтролера може бути 8 МГц. Гідність такого генератора в тому, що не потрібно використовувати зовнішній кварцовий резонатор, схема спрощується, кінцеве радіоелектронний пристрій можна зробити дешевше у виробництві. Недолік у тому, що неточність RC-генератора обмежує область застосування такого варіанту отримання тактової частоти.

Варіант роботи генератора (RC-генератор, зовнішній кварц, коефіцієнт ділення частоти) визначається фьюз мікроконтролера AVR. Фьюз мікроконтролера AVR можуть бути змінені тільки за допомогою зовнішнього вибору програм (інтерфейси ISP, JTAG, або може бути застосований так званий "паралельний" інтерфейс програмування). Більшість мікроконтролерів AVR, які виходять із заводів Atmel, поставляються налаштованими на роботу від внутрішнього генератора, з включеним дільником на 8, т. Е. При подачі живлення вони відразу почнуть працювати на частоті 1 МГц. У деяких межах тактову частоту можна підлаштовувати програмно за допомогою запису значень констант в спеціальний настроювальний регістр. Детальніше про фьюз і настройку тактирования мікроконтролера AVR Ви можете дізнатися з даташіта на Ваш мікроконтролер.

Деякі мікроконтролери дозволяють для отримання тактової частоти використовувати PLL. Ця абревіатура розшифровується як Phase Locked Loop, що означає фазова автопідстроювання частоти, ФАПЧ. Сенс цього всього в тому, що мікроконтролер працює від внутрішньої тактової частоти, яка генерується шляхом множення і ділення частоти внутрішнього RC-генератора, причому частота RC-генератора підлаштовується програмно. Хороший приклад використання такого генератора - додатки V-USB з мікро контролером ATtiny45 (або ATtiny85), наприклад USBrelay [2]. Мікроконтролер працює на частоті 16.5 МГц, яка отримана за допомогою RC-генератора і PLL. Частота точно підлаштовується програмно по синхросигналом початку фрейма USB (так званий сигнал SOF, Start Of Frame), які мають дуже точну періодичність 1 мс. Детальніше про PLL см. Даташит мікроконтролера і вихідний код USB-Relay [2].

[Визначення тактової частоти за допомогою осцилографа]

У деяких складних випадках важко заздалегідь знати, на якій частоті працює мікроконтролер. Наприклад, не промаркований зовнішній резонатор, або Ви сумніваєтеся в тому, як запрограмували фьюз внутрішній RC-генератор.

Якщо використовується зовнішній резонатор (кварцовий або керамічний), то тактову частоту можна визначити, підключившись до вихідний ніжці тактового генератора - торкнувшись щупом одного з ніжок резонатора. Будьте уважні, підключитися треба саме до виходу генератора, і щуп осцилографа повинен мати малу вхідну ємність (чим менше, тим краще, бажано не більше 20 пФ). Зазвичай мала вхідна ємність щупа виходить, коли щуп осцилографа переключено на коефіцієнт розподілу 1:10). Щоб точно дізнатися, яка ніжка мікроконтролера є виходом, зверніться до даташіту мікроконтролера. Осцилограф покаже тактову частоту на виході генератора, і робоча тактова частота мікроконтролера буде дорівнює цій частоті з урахуванням коефіцієнта предделителя (якщо він включений фьюз або програмно).

Коли використовується внутрішній RC-генератор, і коли Ви не впевнені в тому, наскільки правильно запрограмували фьюз предделителя, може допомогти вимірювання тривалості виконання команд програми. Для цього випадку Ви можете вставити в головний цикл main програми дві прості команди установки і скидання будь-якого обраного порту мікроконтролера, і потім осциллографом виміряти отриману тривалість вихідного сигналу на цьому порте. Ось простий приклад такої програми (наведено лише фрагмент коду, що управляє ніжкою порту PB0):

Принцип визначення тактової частоти простий. У цьому прикладі коду Ви бачите дві команди, що управляють розрядом 0 порту B, які слідують один за одним (запис константи в регістр PORTB). Перша команда встановлює вихідний рівень ніжки PB0 в стан лог. 1, друга команда в лог. 0. Це вимір рівнів можна проконтролювати осцилографом, приєднавши щуп до ніжки порту PB0. Кожна команда записи в регістр PORTB компілюється в одну команду асемблера, тривалість якої можна дізнатися з даташіта на мікроконтролер. В даному прикладі будуть використовуватися команди ORI і ANDI. мають тривалість виконання 1 цикл. Таким чином, між першою і другою командою пройде час одного циклу, одного періоду тактової частоти мікроконтролера, т. Е. Тривалість імпульсу лог. 1 буде дорівнює тривалості періоду робочої тактової частоти. На малюнку спрощено показана форма сигналу на виході порту PB0 і відповідна їй тактова частота.

Як визначити тактову частоту мікроконтролера, avr, programming

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