Програмування в AVR Studio 5 із самого початку

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

Перейдемо до вивчення вбудованих таймерів.Вивчення переривань і особливотаймеріву мікроконтролерах представляє певну складність через їх багатофункціональність. Сьогодні постараємося розібратися у термінах та назвах.

Зміст / Contents

T0, T2– (TCNT0, TCNT2) восьмирозрядні лічильники (парні)TCNTn- лічильний регістр 8 розрядного лічильника де; n-номер лічильника

T1, T3- (TCNT1Н і TCNT1L, TCNT3H і TCNT3L) шістнадцятирозрядні лічильники (непарні)TCNTny- рахунковий регістр 16 розрядного лічильника де; n-номер лічильника y-старший (H) або молодший (L) розряд

Т1 складається з двох восьмирозрядних регістрівTCNT1Н і TCNT1L, а Т3 з двох регістрівTCNT3H і TCNT3L. ЛітероюHпозначається старший розряд, аLмолодший.

Так яктаймериє регістрами, то до них можна звертатися у будь-який момент часу, зчитувати, записувати, обнулювати та змінювати значення. Прийнято певні правила запису та читання до таймерів TCNT1Н і TCNT1L.

1. Програми запису та читання даних таймера мають бути атомарними, тобто. перед читанням чи записом ми забороняємо переривання, а після закінчення процесу знову дозволяємо. 2. При записі спочатку записується старший байт H, а потім молодший L. 3. При читанні спочатку зчитується молодший байт L, потім старший H. Наприклад: Запис даних у рахунковий регістр.

Читання даних із рахункового регістру

Чому такі правила?А все для того, щоб не спотворилися дані за той час, який піде на процес зчитування з кожного регістру. Якщо використовувати пряме читання 8-бітових регістрів TCNT1H і TCNT1L, то не можна бути впевненим, що цірегістри прочиталися одночасно. Може статися така ситуація: Лічильник містив значення $01FF, Ви вважали TCNT1H (що містить значення 01 в якусь змінну). За цей час прийшов лічильний імпульс, і вміст TCNT1L дорівнював $00, а в TCNT1H записалося значення $02.

Тепер Ви читаєте значення TCNT1L в іншу змінну, отримуєте в цій змінній значення $00 (адже таймер/лічильник вже зробив рахунок). 16-бітове значення цих змінних вийшло $0100, але на момент зчитування старшого байта вміст лічильника був $01FF, і молодший байт у Вас повинен був прочитатися як FF. Для запобігання такій ситуації служить тимчасовий регістр, що міститься у блоці таймера/лічильника. Цей регістр прозорий, тобто. діє автоматично. При зчитуванні значення регістра TCNT1L змінну, вміст TCNT1H потрапляє у цей регістр. Потім під час читання старшого байта в змінну, зчитується значення тимчасового регістру. Тимчасовий регістр абсолютно прозорий для користувача, але для його коректної роботи необхідно дотримуватися зазначеної послідовності дій. Звернення до регістрів через додатковий (буферний) регістр називається подвійною буферизацією

Таймери пов'язані з рахунковими імпульсами, які можуть бути зовнішніми та надходити на спеціальний вхід мікросхеми або формуватися власним генератором. У свою чергу, частота власного генератора може синхронізуватися зовнішнім кварцовим резонатором, а може визначатися внутрішньою RC - схемою. Після цього зовнішня частота або частота власного генератора проходять предделитель, керований регістромCLKPRастоту генератора після предделителя (прескалера) CLKPR нерідко називають тактовим сигналом (тактовою частотою) процесора (CPU). Частота, що подається на вхід таймерапозначається як CLKTnЦя частота відповідає тактовому сигналу процесора. Один лічильний імпульс збільшує значення таймера на одиницю, тому регістри TCNT є лічильними, іназиваються таймером/лічильником (ТС). Для правильної роботи таймера/лічильника за зовнішнім тактовим сигналом мінімальний час між двома перемиканнями зовнішнього тактового сигналу має бути не менше одного періоду тактового сигналу CPU. Синхронізується зовнішній тактовий сигнал наростаючим фронтом внутрішнього тактового сигналу CPU. (Це потрібно пам'ятати під час побудови частотомірів). Керуючим регістром для таймера/лічильникаTCNTє регістрTCCR.Маскою перериваннядля таймера/лічильникаTCNTслужить регістрTIMSK(регістр управління перериваннями таймера).Реєстром прапорів маски переривання TIMSK - є регістр TIFR. Запам'ятайте, що ці 3 регістри (TCCR, TIMSK, TIFR) при роботі таймера/лічильника TCNT використовуються майже завжди.

Переривання можуть викликатисяза переповнення регістра TCNT, порівняння значення регістра TCNT зі значенням спеціальних регістрів порівняння OCR, захоплення - за значеннями спеціальних регістрів захоплення ICR і визначаються режимом роботи таймера/лічильника. Крім цього запит переривання може відбуватися зі спрацьовуваннявартового таймера (Watchdog Timer) WDT.

Таймери/лічильники можуть працювати в різних режимах і виконувати різні функції. Режим роботи, тобто, поведінка таймера/лічильника і виходу сигналу збігу, визначається як режимом роботи генератора сигналів, керованого регістрамиWGM02; WGM01; WGM00(скорочений записWGM02:0), так і режимом виведення сигналу збігу, керованих регістрамиСОМ0х1; СОМ0х0(скорочений записСОМ0х1:0).Стан бітів, яких залежить режим виведення сигналу збіги, впливає послідовність підрахунку, що визначається лише станом бітів конфігурації генератора сигналів.

БітиСОМ0х1:0визначають, чи повинен вихідний сигнал ШІМ бути інвертований чи ні (інвертований чи не інвертований ШІМ).(ШИМ) Широтно-імпульсна модуляція або Pulse-width modulation (PWM).Для не-ШИМ-режимів вміст бітів СОМ0х1:0 визначає, чи повинен сигнал на виході бути встановлений в одиницю , скинутий у нуль чи переключений на протилежний стан у момент збігу

↑ Виділяють такі режими роботи таймерів:

Normal– підрахунок та переривання з переповнення. У цьому режимі при виставленому битіTOIEрегістраTIMSKвиникає запит на переривання. Умовою для переривання буде обнулення регістру таймераTCNT, яке відбувається після заповнення всіх осередків (після числа 0xFF) і фіксується апаратним підняттям прапора переповненняTOVу регістріTIFR. ПрапорTOV0у разі поводиться як дев'ятий біт, тим винятком, що він лише встановлюється, але з скидається. Використовуючи переривання з переповнення таймера, яке автоматично очищає прапорTOV0, можна збільшити коефіцієнт перерахунку програмним шляхом. Режим Normal не має інших функцій і вважається найпростішим.

Capture– (захоплення) запам'ятовування значення лічильника у спеціальному регістрі захопленняICRxза керуючим сигналом (від спеціального входу мікроконтролера(ICP)або від виходу вбудованого компаратора), де x- відповідає номеру лічильника. Одночасно із захопленням відбувається запит на переривання та перехід на вектори переривання -CAPT. Встановлюється переривання в цьому режимі бітомICIEабоTICIEу регістріTIMSK, і фіксується підняттям прапораICFу регістріTIFR.

CTC– (Clear Timer on Compare) скидання під час збігу – порівняння зі значенням спеціальних регістрів збіги OCR, які використовується у тому, щоб керувати коефіцієнтом перерахунку лічильника. Відбувається запит на переривання та перехід на вектори переривання -COMP. Регістри збігу позначаються якOCRnxyде; n - номер лічильника,x-регістр А або B (якщо регістрів збігу 2, то позначають перший як регістр A, а другий як регістр B, кожен з них може бути 16 розрядним)y- старший (H) чи молодший (L) розряд регістрів збігу.

У більшості моделей мікроконтролерів одному восьмирозрядному таймеру відповідають два восьмирозрядні регістри порівняння OCR, регістр А і регістр В. Наприклад, таймеру TCNT0 відповідають два регістри порівняння OCR0A і OCR0B. Якщо таймер шістнадцятирозрядний, то йому відповідають чотири восьмирозрядні регістри порівняння, наприклад, таймеру TCNT1 відповідають OCR1AH ​​і OCR1AL, OCR1BH і OCR1BL.

У режимі СТС виникає запит переривання, скидання таймерів (при збігу з OCR1 та OCR1A) або змінюється стан висновків мікроконтролера, які залежать від встановлених настоянок таймера.

Значення комірок регістрів TIMSK і TIFR у різних моделях мікроконтролерів мають схожі функції та назви, але можуть відрізнятися розташуванням, і при переході з одного контролера на інший труднощів не викликають.

Прапори відповідають перериванням у регістрі TIMSK. Встановлюються "1" при виконанні умов відповідного переривання.