Программные таймер и счетчик

Таймеры-счетчики

Таймером называется средство микропроцессора, служащее для измерения времени и реализации задержек. Основой таймера служит суммирующий счетчик, который считает количество импульсов генератора тактовой частоты.
Для таймера могут быть указаны:

  • разрядость таймера;
  • коэффициент предварительного деления;
  • диапазон изменения счетного регистра;
  • режим работы.

Разрядность таймера представляет собой разрядность двоичного счетчика, используемого для его реализации и определяет верхнюю допустимую границу счетного регистра. Например, для 8-разрядного таймера верхняя граница счетного регистра будет 2 8 -1 = 255.

Предварительный делитель – делитель частоты тактового сигнала, работающий как один или несколько последовательно соединенных T-триггеров. Таймер изменяет свое значение на 1 каждые n сигналов тактового импульса. n называют коэффициентом предварительного деления .

Зная частоту тактового генератора fosc и коэффициент предварительного деления Kpre, легко определить частоту таймера по формуле:

Время одного тика таймера соответственно будет

Полное время счета таймера (время перебора всех допустимых значений двоичного счетчика) определится как

Например, если требуется реализовать задержку 1с на 8-разрядном таймере с коэффициентом предварительного деления Kpre=1 и тактовой частотой fosc=8 МГц, имеем

tic = 0,125 мкс;
Tcount = 0,125*2 8 = 32 мкс
1с/32мкс = 31250 повторений

Широтно-импульсная модуляция

Широтно-импульсная модуляция (ШИМ) – импульсный сигнал постоянной частоты и переменной скважности.
Скважность есть отношения периода следования импульса к длительности импульса.
С помощью задания скважности (длительности импульсов) можно менять среднее напряжение на выходе ШИМ.
Обратная величина, то есть отношение длительности импульса к периоду, называется коэффициентом заполнения .

Разрядностью ШИМ называется разрядность таймера, используемого для формирования ШИМ-сигнала.
Существуют два основных режима работы ШИМ:

  • быстрый ШИМ;
  • фазовый ШИМ.
Быстрый ШИМ

Период ШИМ определяется максимальным значением, до которого считает счетчик. В этот момент ШИМ-сигнал устанавливается в «1». При достижении счетчиком значения, поданного на второй вход цифрового компаратора, осуществляется сброс выходного ШИМ-сигнала.

Фазовый ШИМ

В данном режиме счетчик работает как суммирующий и считает от 0 до максимального значения, а при достижении максимального значения работает как вычитающий, считая до 0.

При совпадении значения счетчика с некоторым установленным значением, происходит переключение выхода ШИМ.

Частотно-импульсная модуляция — сигнал переменной частоты и постоянной скважности, равной 2. При таком виде модуляции изменяется период сигнала, а длительность импульса всегда составляет половину периода.

Встроенные таймеры и счётчики AVR микроконтроллеров

Регистры таймеров-счётчиков, функции, режимы, управление прерываниями
на примере МК Atmega8 (Atmega16)

Таймер микроконтроллера – это цифровой счётчик, осуществляющий подсчёт количества подаваемых на него импульсов.
Источником импульсов для таймера-счётчика могут служить: как тактовые импульсы от внутреннего генератора МК, так и импульсы, подаваемые непосредственно на вход таймера с внешнего источника.

В МК ATmega8 (Atmega16) есть три таймера: два 8-битных – Т0 и Т2, и один 16-битный – Т1. Счёт ведётся до 255 тактовых импульсов для 8-битных счётчиков и до 65535 импульсов – для 16-битного.
Далее, если не выполняется никаких программных действий, то происходит переполнение счётчика, он сбрасывается в 0 и всё повторяется бесконечное количество раз.

Для каждого таймера можно настроить делитель частоты тактовых импульсов, и, таким образом, заставить его тактироваться не только на основной частоте МК, но и на частотах, находящихся в пропорциях от 1:8 до 1:1024 по отношению к основной. Пропорция эта называется «prescaler» и прописывается в регистре TCCRx (Timer/Counter Control Register) посредством установки значений соответствующих битов.

На примере таймера-счётчика Т2, давайте посмотрим, как выглядит этот регистр TCCR2 и каково предназначение его битов. Итак:

1. Конфигурационный регистр TCCR2

Биты CS22, CS21, CS20 (Clock Select) – задают для таймера Т2 коэффициент предделителя.
Все возможные комбинации состояний этих битов описаны в таблице ниже:

CS22 CS21 CS20 Описание
0 0 0 Источника тактирования нет, таймер остановлен
0 0 1 Тактовая частота МК
0 1 0 Тактовая частота МК/8
0 1 1 Тактовая частота МК/32
1 0 0 Тактовая частота МК/64
1 0 1 Тактовая частота МК/128
1 1 0 Тактовая частота МК/256
1 1 1 Тактовая частота МК/1024

Биты WGM21, WGM20 (Wave Generator Mode) – определяют режим работы таймера-счетчика Т2.
Всего их может быть четыре: нормальный режим (normal), сброс таймера при совпадении значения счётного регистра с содержимым регистра сравнения (CTC), два режима широтно-импульсной модуляции (FastPWM и Phase Correct PWM). Все возможные значения описаны в таблице ниже:

WGM21 WGM20 Режим работы таймера/счётчика
0 0 Нормальный режим счётчика (normal)
1 0 Сброс таймера при совпадении регистров OCR2 и TCNT2 (CTC)
0 1 ШИМ с коррекцией фазы (Phase Correct PWM)
1 1 Быстрая ШИМ (Fast PWM)

Биты COM21, COM20 (Compare Match Output Mode) – определяют поведение вывода OC2.
Если хоть один из этих битов установлен в 1, то вывод OC2 перестаёт функционировать как обычный вывод общего назначения и подключается к схеме сравнения таймера счётчика Т2. При этом его необходимо настроить как выход. Рассмотрим различные комбинации этих битов:

COM21 COM20 Режим работы вывода OC2
0 0 Вывод ОС2 отключён от таймера/счётчика
0 1 Состояние вывода меняется на противоположное при совпадении
TCNT2 и OCR2 (только в режимах Normal и CTC)
1 0 На OC2 устанавливается «0» при совпадении TCNT2 и OCR2,
и устанавливается «1» при сбросе счётчика
1 1 На OC2 устанавливается «1» при совпадении TCNT2 и OCR2,
и устанавливается «0» при сбросе счётчика

Бит регистра TCCR2 – FOC2 (Force Output Compare) предназначен для принудительной установки логического уровня на выходе OC2. Он работает только для режимов Normal и CTC. При установке бита FOC2 в единицу состояние выхода меняется в соответствии со значениями битов COM21 и COM20.

Конфигурацию регистра TCCR удобно производить в двоичном коде, т. к. каждый разряд этого кода равен соответствующему разряду регистра. Например, запись:

означает, что у счётчика выбран режим СТС со сбросом таймера при совпадении регистров OCR2 и TCNT2. Тактовая частота Т2 – это рабочая частота МК, делённая на 1024. Состояние вывода ОС2 при совпадении меняется на противоположное.
А запись:

означает, что счётчик установлен в режим Fast PWM (быстрая ШИМ). Делитель частоты отключён – таймер тикает с тактовой частотой МК. Выход ОС2 установлен в состояние логического 0.

Далее опишем по порядку остальные регистры, относящиеся ко всем трём таймерам ATmega8, 16.

2. Счётный регистр TCNT2

TCNT2 – это такой же 8-битный регистр, как и TCCR2, только все разряды в нём отведены для числа, соответствующего количеству импульсов, посчитанному счётчиком. Когда таймер-счётчик работает, то по каждому импульсу тактового сигнала значение TCNT2 изменяется на единицу. В зависимости от режима работы таймера, счётный регистр может или увеличиваться, или уменьшаться.
Содержимое регистра TCNT2 можно как читать, так изменять посредством записи в него. Запись в регистр используется при необходимости задать его начальное значение.
Когда таймер работает, изменять его содержимое TCNT2 не рекомендуется, так как это блокирует схему сравнения на один такт.

3. Регистр сравнения OCR2

OCR2 – это также 8-ми разрядный регистр. Его значение в каждом цикле сравнивается со значением счётного регистра TCNT2, и в случае совпадения, заставляет таймер выполнять какие-либо действия, как то: вызывать прерывание, менять состояние вывода OC2 и т. д. в полном соответствии с командами программного кода прошивки.
Значение OCR2 можно как читать, так и записывать.

Далее поговорим о прерываниях, источником которых являются счётчики-таймеры.
Напомню, что прерывание представляет собой определённое событие, при наступлении которого приостанавливается выполнение основной программы и вызывается функция, обрабатывающая данное прерывание.

4. Регистр флагов разрешения прерываний TIMSK

TIMSK – это общий регистр для всех трёх таймеров Atmega8, 16.

Таймер-счётчик Т2 может вызывать прерывания при следующих условиях:
1. при переполнении счётного регистра TCNT2,
2. при совпадении значения счётного регистра со значением регистра сравнения OCR2.
При этом в регистре TIMSK для таймера Т2 зарезервированы два бита: TOIE2 и OCIE2. Все остальные биты относятся к другим таймерам.

TOIE2 OCIE2 Разрешение прерываний
0 0 Все прерывания запрещены
0 1 Разрешает прерывание по событию совпадение
1 0 Разрешает прерывание по событию переполнение
1 1 Разрешает прерывания по обоим событиям

Необходимо отметить, что прерывания будут работать только тогда, когда в регистре состояния SREG разрешены общие прерывания. Это делается командой в начале программы:

sei(); //разрешение глобальных прерываний

Причём, в случае наступления прерывания, флаг глобального разрешения прерываний автоматически сбрасывается в 0, запрещая все прерывания, пока не произойдёт выход из обработчика прерывания.

Ещё один регистр, отвечающий за управление прерываниями – регистр TIFR.

5. Регистр флагов прерывания таймеров/счётчиков TIFR

TIFR также является общим регистром для всех трех таймеров-счётчиков Atmega8, 16.

TIFR – это регистр флагов. Когда срабатывает какое-то прерывание, то выскакивает статусный флаг, сигнализирующий о том, что произошло то или иное событие. Для таймера Т2 – этими событиями являются: переполнение счётного регистра TCNT2 или совпадение счётного регистра с регистром сравнения OCR2.
В эти моменты в регистре устанавливаются следующие флаги:
TOV2 – записывается 1 при переполнении счётного регистра,
OCF2 – записывается 1 при совпадении счётного регистра с регистром сравнения.
Если в эти моменты в регистре TIMSK разрешены прерывания, то микроконтроллер вызовет соответствующий обработчик.
Если прерывания запрещены, то флаг так и будет стоять до тех пор, пока программа не разрешит данный тип прерываний.
При входе в подпрограмму обработки прерывания, соответствующий прерыванию флаг регистра TIFR автоматически сбрасывается в состояние лог. 0.

Пример инициализации таймера-счётчика Т2, прописанный внутри функции main, может выглядеть следующим образом:

sei(); // Разрешение глобальных прерываний

TCCR2 = 0b00011101; /* 1. Режим СТС со сбросом таймера при совпадении регистров
OCR2 и TCNT2. 2. Тактовая частота Т2 – это рабочая частота МК, делённая на 1024.
3. Состояние вывода ОС2 при совпадении меняется на противоположное */

OCR2 = 112; // Сброс таймера произойдёт после того, как счётчик досчитает до 112

TIMSK |= (1 // В этот же момент произойдёт прерывание (по совпадению)

Следующая функция – это обработчик прерывания от таймера Т2, т. е. перечень действий, которые надо совершить в момент его возникновения. Описывается эта функция при помощи команд:

ISR (TIMER2_COMP_vect) // Если произошло прерывание по совпадению таймера Т2
<
// Действия, которые надо совершить
>

На следующих страницах рассмотрим примеры того, как можно реализовать генератор импульсов и ШИМ модулятор с использованием микроконтроллера Atmega8 (Atmega16).

Исходный код библиотеки

Для наглядности я объединил хедер и сишный файл.

//состояния таймера — неработающий, активный, отработавший
enum StateTimer ;

//структура программного таймера
typedef struct <
unsigned int time; //через какое время запустить
unsigned int period; //период повторения
enum StateTimer state; //текущее состояние
void (*pFunc)( void ); //указатель на функцию
>SoftTimer;

//максимальное число таймеров
#define MAX_TIMERS 4

//число созданных таймеров
unsigned char AmountTimers = 0;

//массив указателей на таймеры
SoftTimer* SoftTimers[MAX_TIMERS];

//функция создания программного таймера
void CreateTimer(SoftTimer *CurSoftTimer, unsigned int time, unsigned int period , enum StateTimer state, void (*pFunc)( void )) <
SoftTimers[AmountTimers] = CurSoftTimer;
CurSoftTimer->time = time;
CurSoftTimer->period = period;
CurSoftTimer->state = state;
CurSoftTimer->pFunc = pFunc;
AmountTimers++;
>

//функция проверки таймеров
void CheckTimer( void ) <
for ( unsigned char i = 0; i if (SoftTimers[i]->state == ACTIVE) <
if (SoftTimers[i]->time == 0) <
SoftTimers[i]->pFunc();
if (SoftTimers[i]->period != 0) SoftTimers[i]->time = (SoftTimers[i]->period-1);
else SoftTimers[i]->state = DONE;
>
else (SoftTimers[i]->time)—;
>
>
>

Пояснение к коду

На основании этих требований определяем структуру SoftTimer.

//состояния таймера — неработающий, активный, отработавший
enum StateTimer ;

//структура программного таймера
typedef struct <
unsigned int time; //через какое время запустить
unsigned int period; //период повторения
enum StateTimer state; //текущее состояние
void (*pFunc)( void ); //указатель на функцию
>SoftTimer;

Массив указателей на таймеры

//максимальное число таймеров
#define MAX_TIMERS 4

//число созданных таймеров
unsigned char AmountTimers = 0;

//массив указателей на таймеры
SoftTimer* SoftTimers[MAX_TIMERS];

Создание таймера

void CreateTimer(SoftTimer *CurSoftTimer, unsigned int time, unsigned int period , enum StateTimer state, void (*pFunc)( void )) <
SoftTimers[AmountTimers] = CurSoftTimer;
CurSoftTimer->time = time;
CurSoftTimer->period = period;
CurSoftTimer->state = state;
CurSoftTimer->pFunc = pFunc;
AmountTimers++;
>

Функция опроса таймеров

Функция опроса таймеров запускается в прерывании аппаратного таймера/счетчика

//функция проверки таймеров
void CheckTimer( void ) <
for ( unsigned char i = 0; i if (SoftTimers[i]->state == ACTIVE) <
if (SoftTimers[i]->time == 0) <
SoftTimers[i]->pFunc();
if (SoftTimers[i]->period != 0) SoftTimers[i]->time = (SoftTimers[i]->period-1);
else SoftTimers[i]->state = DONE;
>
else (SoftTimers[i]->time)—;
>
>
>

Тестовый проект

//программирование микроконтроллеров AVR на Си
//тестовый проект с программными таймерами
//Pashgan ChipEnable.ru

#include
#include
#include «Timers.h»
#include «bits_macros.h»

//объявляем переменные типа SoftTimer
SoftTimer timer1;
SoftTimer timer2;
SoftTimer timer3;
SoftTimer timer4;

//расписываем функции программных таймеров
void Clk1( void ) <
InvBit(PORTB, 0);
>

void Clk2( void ) <
InvBit(PORTB, 1);
>

void Clk3( void ) <
InvBit(PORTB, 2);
>

void Clk4( void ) <
InvBit(PORTB, 3);
>

int main( void )
<
//инициализация порта
PORTB = 0x00;
DDRB = 0xff;

//инициализация таймера Т0 — прерывания каждую ms
TIMSK = (1 //инициализируем таймеры
CreateTimer(&timer1, 0, 1, ACTIVE, Clk1);
CreateTimer(&timer2, 0, 2, ACTIVE, Clk2);
CreateTimer(&timer3, 0, 3, ACTIVE, Clk3);
CreateTimer(&timer4, 0, 4, ACTIVE, Clk4);

//разрешаем прерывания и тупим в цикле
__enable_interrupt ();
while (1);
return 0;
>

Заключение

Алгоритм, конечно, расточительный. Во-первых в прерывании запускается функция. Во-вторых перебор таймеров происходит последовательно — чем больше программных таймеров, тем больше времени это займет. В-третьих функции программных таймеров тоже запускаются в прерывании. Как можно оптимизировать? Не использовать много таймеров. Сделать функцию CheckTimer встраиваемой. Период работы аппаратного таймера выбрать большим. Функции программных таймеров сделать короткими.

Файлы

Comments

Программный таймер в такой реализации бесполезен без диспетчера задач.

гораздо эффективней при такой организации сделать просто «Системное время» скажем 32байтное, учитывающее каждый такт процессора. И относительно него отслеживать все процессы.

Как показала практика — реализация методом инкрементирован ия не удачная по нескольким причинам,а именно:
1) повышенный расход ресурсов (инкремент + прерывания);
2) не всегда высокая точность, т.к. прерывание не очень-то хочется делать слишком частыми. Если в качестве таймера использовать таймер RTOS — разрешающая способность выходит ну явно не лучше 1 мс, а скорее даже 5-10. Приведённые расслуждения о точности справедливы только для случая программировани я методом шагового автомата, при этом время для каждой задачи должно быть явно не больше требуемой точности.

Достоинства приведённого мною метода:
1) потребление ресурсов на таймер минимально, особенности если используется каскад таймеров с различными периодами в пределах одной функции-проверк и срабатывания одних таймеров можно легко выполнять при срабатывании других.
2) создание таймера — определение одной (счётчик) или двух переменных (счётчик и период, если T = 0, считаем, что таймер не активен; как вариант ещё — счётчик и флаг) в любой точке шагового автомата.
Недостатки:
1) для задач предельно жесткого реального времени данный метод не даём существенных преимуществ, т.к. всё равно надо работать в прерывании.
2) можно пропустить момент срабатывания таймера при малых периодах таймера и сложных, не поддающихся переписыванию на шаговый автомат.

Кстати, callback-функци и, вызываемые из прерывания — не очень хорошая идея, т.к. подходят только для очень быстрых функций.

У вас недостаточно прав для комментирования.

Встроенные системы — таймер / счетчик

Таймер — это специализированный тип часов, который используется для измерения временных интервалов. Таймер, который отсчитывает от нуля вверх для измерения прошедшего времени, часто называют секундомером . Это устройство, которое отсчитывает от заданного интервала времени и используется для генерации задержки, например, песочные часы — это таймер.

Счетчик — это устройство, которое хранит (и иногда отображает) количество раз, когда произошло конкретное событие или процесс, относительно тактового сигнала. Он используется для подсчета событий, происходящих вне микроконтроллера. В электронике счетчики могут быть легко реализованы с использованием схем регистрового типа, таких как триггер.

Разница между таймером и счетчиком

Точки, которые отличают таймер от счетчика, следующие:

таймер счетчик
Регистр увеличивается для каждого машинного цикла. Регистр увеличивается с учетом перехода от 1 до 0 в соответствии с внешним входным выводом (T0, T1).
Максимальная скорость счета составляет 1/12 от частоты генератора. Максимальная скорость счета составляет 1/24 от частоты генератора.
Таймер использует частоту внутренних часов и генерирует задержку. Счетчик использует внешний сигнал для подсчета импульсов.

Таймеры 8051 и связанные с ними регистры

У 8051 есть два таймера, Таймер 0 и Таймер 1. Они могут использоваться как таймеры или как счетчики событий. Таймер 0 и Таймер 1 имеют ширину 16 бит. Поскольку 8051 соответствует 8-битной архитектуре, к каждому 16-битному доступу обращаются как к двум отдельным регистрам младшего байта и старшего байта.

Таймер 0 Регистрация

16-разрядный регистр таймера 0 доступен как младший и старший байт. Регистр младших байтов называется TL0 (младший байт таймера 0), а регистр старших байтов называется TH0 (старший байт таймера 0). Эти регистры могут быть доступны как любой другой регистр. Например, инструкция MOV TL0, # 4H перемещает значение в младший байт таймера # 0.

Таймер 1 Регистрация

16-разрядный регистр таймера 1 доступен как младший и старший байт. Младший байтовый регистр называется TL1 (младший байт таймера 1), а старший байтовый регистр называется TH1 (старший байт таймера 1). Эти регистры могут быть доступны как любой другой регистр. Например, инструкция MOV TL1, # 4H перемещает значение в младший байт таймера 1.

TMOD (Режим таймера) Регистрация

Таймер 0 и Таймер 1 используют один и тот же регистр для установки различных режимов работы таймера. Это 8-битный регистр, в котором младшие 4 бита отведены для таймера 0, а старшие четыре бита для таймеров. В каждом случае младшие 2 бита используются для предварительной установки режима таймера, а верхние 2 бита используются для указания местоположения.

Gate — если установлено, таймер работает только при высоком INT (0,1).

C / T — бит выбора счетчика / таймера.

M1 — Режим бит 1.

M0 — бит режима 0.

ВОРОТА

Каждый таймер имеет средства запуска и остановки. Некоторые таймеры делают это с помощью программного обеспечения, некоторые с помощью аппаратного обеспечения, а некоторые имеют как программное, так и аппаратное управление. Таймеры 8051 имеют как программное, так и аппаратное управление. Запуск и остановка таймера управляются программным обеспечением с использованием инструкций SETB TR1 и CLR TR1 для таймера 1, а также SETB TR0 и CLR TR0 для таймера 0.

Инструкция SETB используется для его запуска, и она останавливается инструкцией CLR. Эти инструкции запускают и останавливают таймеры до тех пор, пока GATE = 0 в регистре TMOD. Таймеры могут быть запущены и остановлены внешним источником, сделав GATE = 1 в регистре TMOD.

C / T (ЧАСЫ / ТАЙМЕР)

Этот бит в регистре TMOD используется для определения того, используется ли таймер в качестве генератора задержки или менеджера событий . Если C / T = 0, он используется в качестве таймера для генерации задержки таймера. Источником синхронизации для создания временной задержки является частота кристалла 8051. Если C / T = 0, частота кристалла, подключенная к 8051, также определяет скорость, с которой таймер 8051 срабатывает с регулярным интервалом.

Частота таймера всегда составляет 1/12 от частоты кристалла, подключенного к 8051. Хотя различные системы на базе 8051 имеют частоту XTAL от 10 МГц до 40 МГц, мы обычно работаем с частотой XTAL 11,0592 МГц. Это связано с тем, что скорость передачи для последовательной связи 8051.XTAL = 11.0592 позволяет системе 8051 обмениваться данными с ПК без ошибок.

М1 / М2

M1 M2 Режим
13-битный режим таймера.
1 16-битный режим таймера.
1 8-битный режим автоматической перезагрузки.
1 1 Разлитый режим.

Различные режимы таймеров

Режим 0 (13-битный режим таймера)

Таймер 1 и Таймер 0 в режиме 0 работают как 8-битные счетчики (с предварительным делителем на 32). Регистр таймера сконфигурирован как 13-битный регистр, состоящий из всех 8 битов TH1 и младших 5 битов TL1. Старшие 3 бита TL1 являются неопределенными и должны игнорироваться. Установка флага запуска (TR1) не очищает регистр. Флаг прерывания таймера TF1 устанавливается, когда счетчик переходит со всех 1 на все 0. Режим 0 работает для Таймера 0 так же, как и для Таймера 1.

Режим 1 (16-битный режим таймера)

Режим таймера «1» является 16-битным таймером и является широко используемым режимом. Он функционирует так же, как 13-битный режим, за исключением того, что используются все 16 бит. TLx увеличивается, начиная с 0 до максимального значения 255. После достижения значения 255 значение TLx сбрасывается до 0, а затем значение THx увеличивается на 1. Будучи полным 16-разрядным таймером, таймер может содержать до 65536 различных значений, и он переполнится до 0 после 65 536 рабочих циклов.

Режим 2 (8-битная автоматическая перезагрузка)

Оба регистра таймера настроены как 8-битные счетчики (TL1 и TL0) с автоматической перезагрузкой. Переполнение от TL1 (TL0) устанавливает TF1 (TF0), а также перезагружает TL1 (TL0) с содержимым Th1 (TH0), которое предварительно устанавливается программным обеспечением. Перезагрузка оставляет TH1 (TH0) без изменений.

Преимущество режима автоматической перезагрузки заключается в том, что у вас может быть таймер, который всегда будет содержать значение от 200 до 255. Если вы используете режим 0 или 1, вам придется проверить код, чтобы увидеть переполнение, и, в этом случае, сбросьте таймер до 200. В этом случае драгоценные инструкции проверяют значение и / или перезагружаются. В режиме 2 микроконтроллер позаботится об этом. После того, как вы настроили таймер в режиме 2, вам не нужно беспокоиться о том, чтобы проверить, не переполнен ли таймер, и вам не нужно беспокоиться о сбросе значения, потому что оборудование микроконтроллера сделает все за вас. Режим автоматической перезагрузки используется для установления общей скорости передачи.

Режим 3 (Режим таймера разделения)

Режим таймера «3» известен как режим таймера с разделением . Когда Таймер 0 переводится в режим 3, он становится двумя отдельными 8-битными таймерами. Таймер 0 — это TL0, а таймер 1 — это TH0. Оба таймера отсчитывают от 0 до 255, а в случае переполнения сбрасываются обратно на 0. Все биты таймера 1 теперь будут привязаны к TH0.

Когда Таймер 0 находится в режиме разделения, реальный Таймер 1 (т. Е. TH1 и TL1) может быть установлен в режимах 0, 1 или 2, но он не может быть запущен / остановлен, поскольку биты, которые делают это, теперь связаны с TH0. Реальный таймер 1 будет увеличиваться с каждым машинным циклом.

Инициализация таймера

Выберите режим таймера. Рассмотрим 16-битный таймер, который работает непрерывно и не зависит от внешних выводов.

Инициализируйте TMOD SFR. Используйте младшие 4 бита TMOD и рассмотрите таймер 0. Оставьте два бита, GATE 0 и C / T 0, равными 0, поскольку мы хотим, чтобы таймер не зависел от внешних выводов. Поскольку 16-битный режим является режимом таймера 1, очистите T0M1 и установите T0M0. Фактически, единственный включаемый бит — это бит 0 TMOD. Теперь выполните следующую инструкцию —

Теперь таймер 0 находится в режиме 16-битного таймера, но таймер не работает. Чтобы запустить таймер в режиме работы, установите бит TR0, выполнив следующую инструкцию:

Теперь таймер 0 сразу начнет отсчет, увеличиваясь один раз за каждый машинный цикл.

Чтение Таймера

16-битный таймер может быть прочитан двумя способами. Либо считайте фактическое значение таймера как 16-битное число, либо вы обнаружите, когда таймер переполнен.

Обнаружение переполнения таймера

Когда таймер переполняется от своего максимального значения до 0, микроконтроллер автоматически устанавливает бит TFx в регистре TCON. Таким образом, вместо проверки точного значения таймера можно проверить бит TFx. Если установлен TF0, то таймер 0 переполнен; если установлен TF1, таймер 1 переполнен.

CAMOKAT-BETEPAHA › Блог › ПРОГРАММИРОВАНИЕ МИКРОКОНТРОЛЛЕРОВ: таймер

Для самых маленьких познавателей микроконтроллеров.
Поговорим про таймеры-счетчики микроконтроллеров AVR и конкретно ATTiny13A.
Начинающим очень сложно порой понять, как работают таймеры, в даташите столько написано про таймеры и так непонятно, что жуть. Да ещё и по-английски.

Обычно описание работы начинают как в даташите сверху вниз, а я начну снизу вверх, так более понятно начинающим.

Работа таймера-счетчика очень похожа на работу механического колесика одометра в панели приборов автомобиля. Вот и с ним будем сравнивать.

Долее по даташиту:

TCNT0 Timer/Counter Register. Это регистр таймера счетчика. Это колесико одометра. Если этому колесику придать вращение от какого нибудь сигнала, то он начнет крутиться. У колесика 255 положений, а не от нуля до девяти, как у одометра авто. Крутится он по кругу, то есть 0,1,2,3…254,255,0,1,2,3… Этот регистр открыт для чтения и записи, то есть можно считывать его значение и писать свое. простой пример: колесико должно крутится до 127, а потом сразу сбрасываться в ноль и считать дальше:

По-русски:
Если значение счетчика равно 127 if(TCNT0==127)
То сбрасываем этот же счетчик в ноль (присваиваем регистру нулевое значение )

В этом примере есть и чтение регистра TCNT0 и запись в этот же регистр.

Теперь выше по даташиту: как и чем и отчего заставить крутится это колесико одометра?

Для этого есть два способа:

1.- От тактового генератора микроконтроллера.
2. — От состояние входа( ножки) Т0

От тактового генератора:

Счетчик крутится от тактового генератора, «скорость» вращения колесика можно выбирать делителем. Отвечает за делитель регистр TCCR0B

Пример расчета «скорости»: тактовый генератор лопатит на 1,2МГц:

TCCR0B=0x00 счетчик выключен.Можно использовать это значение как выключалку таймера-счетчика
TCCR0B=0x01 счетчик лопатит на 1,2МГц: деление на единицу типа)
TCCR0B=0x02 счетчик лопатит на 150кГц: деление на 8
TCCR0B=0x03 счетчик лопатит на 18,75кГц: деление на 64
TCCR0B=0x04 счетчик лопатит на 4,688кГц: деление на 256
TCCR0B=0x05 счетчик лопатит на 1,172кГц: деление на 1024

От состоянии на входной ножке Т0 (это 7 ножка порт РВ2)

TCCR0B=0x06 по спаду сигнала
TCCR0B=0x07 по фронту сигнала

Например: на входе Т0 логический ноль. В регистре TCCR0B=0x06 стоит по спаду сигнала. Счетчик стоит. Появилась единица на входе. Счетчик почуял это и приготовился, ибо по спаду. Пропала единица — стал ноль на входе Т0 — регистр таймера счетчика TCNT0 прибавил себе единичку и опять следит за состоянием по входу Т0

Колесико то крутится, но в холостую. Надо теперь сделать так, чтоб оно делало полезную работу. А вот тут уже много возможностей.

Есть несколько основных выводов полезной работы счетчика-таймера.

Делать работу, можно если значение счетчика (колесико TCNT0) сравняется с регистром сравнения-совпадения OCR0х. Это ещё составная часть таймера счетчика, состоящая из двух равнозначных регистра OCR0A и OCR0B.
OCR0A и OCR0B — это как колесики на кодовом навесном замке. Если уж совсем так сравнивать, то это два отдельных кодовых навесных замка с одним колесиком:

То есть можно выставлять свое значение колесика замка OCR0A или OCR0B, затем крутить колесико таймера одометра TCNT0, при совпадении значений замок открывается и происходит какое либо событие. Описание этого события зависит от того, в каком режиме работы находится таймер-счетчик. От этого режима зависит алгоритм работы и взаимодействия этих регистров. Режимы можно посмотреть в мастере CodeVisionAVR:

Далее простым детским языком уже достаточно сложно объяснять, поэтому резко взрослеем, и начинаем понимать, что такое прерывание, что такое Широтно Импульсная Модуляция и что такое прерывание по переполнению таймера и как эти слова можно использовать к нашему таймеру счетчику, чтоб получить полезное действие.

Теперь примеры, созданные для среды разработки CodeVisionAVR:
значение фьюзов по умолчанию, поэтому тактовая частота равна 1.2МГц. Значения настройки портов и т.п. не указано, только мясо:

TCCR0B=0x03; //Запускаем таймер в обычном счетном режиме на 18,750 kHz
OCR0A=0xF0; // Указываем значение регистра сравнения равное 0хF0
TIMSK0=0x04;//Разрешаем выполнение прерываний по совпадению в OCR0A
#asm(«sei») // Разрешаем сами глобальные прерывания
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
<
// Здесь малюем код
TCNT0=0x00;
>

Скриншот мастера:

Описание:
Таймер-счетчик прибавляет единичку 18750 раз в секунду (то самое колесико одометра TCNT0), значение OCR0A=0xF0; как и так понятно равно F0, в десятичной системе это равно числу 240. Если колесико одометра насчитает 240 «тиков», то сработает прерывание: основной цикл программы останавливается, и начинается выполнения кода «здесь малюем код»:
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
<
// Здесь малюем код
TCNT0=0x00;
>

Внутри фигурных скобок есть сброс колесика одометра в ноль: TCNT0=0x00;, то есть после выполнения кода счетчик сбрасывается и начинается счет с нуля. И так циклично.

Этот код применяется, если необходимо производить какое либо действо через определенный точно заданный промежуток времени: делать опрос какого либо устройства, мерять температуру, сканировать состояние энкодера да еще много что можно. Ну или например, если настроить вызов прерывания ровно раз в секунду, то можно сделать секундомер. Конкретно данный пример срабатывает 18750/240=78,125 раза в секунду.

Теперь интереснее: запускаем ШИМ:

TCCR0A=0x81;//запускаем ШИМ с фазовой коррекцией и назначаем выход ножки PB0(OC0A) на выход импульсов ШИМа
TCCR0B=0x02;//частота работы таймера 150 кГц
TIMSK0=0x02;//разрешаем прерывания по переполнению таймера
#asm(«sei»)// Разрешаем сами глобальные прерывания
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
<
// Малюем код
>

Ну а здесь описание совсем короткое: на выходе PB0 микроконтроллера (ножка 5) будет присутствовать ШИМ сигнал (если будет правильно сконфигурирован этот порт на выход), с заполнением пропорционально значению регистра OCR0A
Примеры:
OCR0A=0; — ШИМа небудет, ноль на выходе
OCR0A=127; — на выходе ровный меандр с заполнением 50/50
OCR0A=255; — на выходе единица, ШИМа нет

Так как включено прерывание по переполнению таймера, то когда счетчик насчитает максимальное значение, то будет срабатывать прерывание (выполняться код «Малюем код»)
Скриншот мастера:

Теперь, освоив и поняв принцип работы таймера, несложно понять, как работает таймер в других режимах, чем отличается ШИМ с фазовой коррекцией от обычного Fast PWM и так далее и тому подобное. Но это вы уже сами.

Тест-драйв: 4 сервиса для создания таймера обратного отсчета

Одна из проверенных стратегий, которая стимулирует к целевому действию и повышает продажи — таймер обратного отсчета. Мы подобрали 4 сервиса для создания такого счетчика, протестировали функционал и готовы поделиться плюсами и минусами каждого.

Содержание

Зачем в рассылке таймер обратного отсчета

Создает чувство срочности

Таймер, секунды которого стремительно тикают в обратном направлении, создает чувство срочности и ощущение дефицита времени.

Призывает к немедленному действию

Подписчик понимает, что время действия предложения ограничено. Это стимулирует действовать немедля, а не отложить на потом и забыть.

Привлекает внимание

Цифры на счетчике меняются в непрерывном режиме — динамическое действие на фоне статичного контента письма цепляет глаз.

Чтобы не осталось сомнений: Selligent и Lynda провели исследование . Выяснилось, что рассылка с таймером приносит 10-процентное увеличение конверсий и 33-процентний рост переходов по сравнению с обычным письмом.

Мы создадим таймер, который будет считать оставшееся время до Нового года. Так что задаем одну и ту же дату окончания события — 31 декабря.

MotionMail

Сервис предназначен исключительно для создания таймеров. Регистрация занимает считанные секунды — кроме имени, фамилии и адреса электронной почты больше ничего не требуется.

В сервисе доступно 4 тарифа:

  • Free — полностью бесплатный;
  • Bootstrap подходит для маленьких компаний и стоит $10 в месяц;
  • Startup с платой $60 в месяц для начинающих предпринимателей,
  • Enterprise за $200 в месяц — вариант для крупного бизнеса.

В бесплатном тарифе предусмотрено 20 000 кредитов в месяц. Один кредит — один просмотр созданного счетчика. Как только пользователь открывает письмо с таймером — минус кредит. Если один и тот же пользователь открывает письмо, скажем, 5 раз, — минус 5 кредитов со счета. Как оказалось, превью письма с таймером в сервисе рассылок, тоже считается просмотром.

Если у вас остались неиспользованные кредиты за месяц, в тарифе Free и Bootstrap они сгорят, а в тарифах Startup и Enterprise перейдут на следующий месяц. Если кредиты закончились, предусмотрена дополнительная плата за просмотры свыше установленного максимума. Но эта функция доступна только на платных тарифах. Цена за один просмотр варьируется от $0.0001 до $0.000085.

В бесплатной версии под таймером отображается водяной знак компании, но фон и надписи можно подобрать так, что копирайт станет еле заметным. В платном тарифе водяной знак отключается.

Пользователь бесплатного тарифа может установить только один язык таймера для всего списка рассылки. В платных тарифах язык меняется автоматически в зависимости от языка браузера получателя — вы выбираете язык по умолчанию, а остальное делает система.

Интерфейс удобный и понятный, но доступен только на английском языке. Есть 4 разных дизайна. Для таймера можно задать фон, изменить цвет и размер шрифта. Код можно редактировать. Доступен предварительный просмотр таймера, который вы создали.

Чтобы сгенерировать таймер в этом сервисе, глубоких технических знаний не требуется. Достаточно прописать параметры и вставить полученный код в шаблон письма. Респонсивности можно добиться с помощью атрибута со стилевыми свойствами: style=»width:100%; height:auto;» .

Понравившийся вариант счетчика отображается в плохом качестве: отчетливо видны все пиксели вне зависимости от размера. Особенно это заметно, когда вставляешь код в шаблон письма. Попытка узнать, связано ли это с бесплатным тарифом, или неправильными настройками, не принесла результатов. В FAQ ответа на этот вопрос нет, а блог компания не ведет.

Мы попробовали другой вариант оформления и получили таймер в нормальном качестве.

Sendtric

Сервис специализируется на таймерах обратного отсчета. Плюс в том, что он абсолютно бесплатный. Единственный доступный язык интерфейса — английский, но это не сказывается на простоте в использовании. Все настройки интуитивные и понятные.

Регистрироваться не нужно. Достаточно ввести email, выбрать часовой пояс, затем дату и время события, до которого таймер будет отсчитывать время. Счетчик устанавливается не более чем на 30 дней. Он работает 60-90 секунд, а затем возвращается к началу цикла — времени, которое отображалось при открытии письма. Если подписчик откроет email повторно, таймер снова будет отображать точное время до заданного события.

Вариантов дизайна нет, но есть возможность выбрать цвет фона, текста и самого таймера. Нажимаем кнопку «Generate» и получаем код.

Редактировать код на сайте нельзя, поэтому копируем его в буфер обмена и вставляем в нужный блок шаблона письма. Не забываем про атрибут style с соответствующими значениями width и height, чтобы размер таймера менялся автоматически. Что примечательно — водяной знак под счетчиком отсутствует.

Бета-версия Pro находится в разработке. На сайте сервиса указано, что она останется полностью бесплатной. Неограниченное количество просмотров и созданных таймеров сохранится. В Pro версии будет расширенный редактор с возможностью подогнать размер, изменить фон или загрузить свой собственный. Появится превью и архив созданных таймеров, которые можно будет изменять.

Niftyimages

Сервис предназначен для создания персонализированных изображений, таймеров обратного отсчета и ленты социальных сетей в реальном времени для email кампаний. Есть FAQ для каждой категории услуг, компания ведет блог.

В сервисе доступны следующие тарифы:

  • Starter для начинающих. За $20 в месяц вы получаете 50 000 просмотров. Подписка на год стоит $192.
  • Pro для продвинутых пользователей. 250 000 просмотров за $80 в месяц или $768 за подписку на год.
  • Enterprise для больших компаний. 1 миллион просмотров за $250 в месяц, но подписка на год не предусмотрена.

Есть бесплатная пробная версия, в которой доступно 10 тысяч просмотров — ее мы и будем тестировать.

Первое, что стоит отметить, сервис отнимает просмотры по факту — если получатель увидел таймер, а не просто открыл email. Интерфейс англоязычный, русского адаптированного перевода нет. В пробной версии доступно 6 разных дизайнов.

Настройки удобные. В панели слева сначала выбираем базовые параметры: устанавливаем дату события и время, задаем часовой пояс. После этого настраиваем шрифты. Вариантов много. Указываем нужный размер, цвет шрифта и фона. Цвет надписей и цифр тоже меняется. В конце выбираем язык таймера и при необходимости загружаем собственный фон.

В конструкторе можно посмотреть, как будет выглядеть таймер. На нем нет водяного знака компании.

Мы обратили внимание, что дни, минуты и секунды указаны в родительном падеже, а часы — в именительном. Поэтому, чтобы избежать разнобоя в склонении, надписи под цифрам лучше убрать.

Теги, значения и атрибуты кода на сайте редактировать нельзя. Поэтому копируем его, вписываем нужные значения и вставляем конечный вариант кода в шаблон письма.

proTimer

Русскоязычный сервис. Чтобы попробовать демо версию, нужно указать имя и электронную почту. Через несколько секунд на почту приходит ссылка на публичный аккаунт в сервисе proTimer, где вы можете самостоятельно протестировать функционал платформы и разобраться, как добавить таймер в рассылку. В догонку приходит письмо от разработчика о том, что счетчик, созданный в демо версии, удаляется спустя 2 часа.

Сервис предоставляет два тарифных плана:

  • Эконом: за 48 рублей пользователь получает 1 таймер в месяц. Сколько таймеров используете — столько раз по 48 рублей и заплатите. В тарифе доступно 15 вариантов дизайна.
  • Безлимитный: за 199 рублей в месяц. Единственное отличие от эконом-тарифа — неограниченное количество таймеров. За указанную сумму вы можете использовать хоть 2 таймера, хоть 20.

Дизайн интерфейса выглядит просто, язык не меняется. Перед началом работы проводится короткий инструктаж-демонстрация, но разобраться в главном меню все равно сложно.

Во вкладке «Как считать» указываем дату завершения акции и выбираем время.

Переходим к следующей вкладке — «Как отображать». Выбираем подходящий дизайн, устанавливаем размер и цвет фона. Изменение шрифта не предусмотрено. Ненужные цифровые части таймера можно отключить вместе с надписями.

Предварительный просмотр результата отображается в каждой вкладке. В блоке «Как отображать» достаточно много настроек. Превью не помещается в окне и таймер пропадает из поля зрения. Чтобы увидеть, как меняется счетчик, приходится каждый раз прокруткой спускаться вниз страницы. Это не очень удобно.

В последней вкладке, «Настройки для писем», нужно выбрать, что будет отображаться, когда срок действия акции закончится. Есть 5 предложенных сервисом вариантов и возможность вставить URL своей картинки в формате PNG.

На последнем этапе можно выбрать, какого цвета будет фон под таймером. Палитры на цветовом круге нет, так что пришлось просить у Google таблицу названия цветов, чтобы выбрать шестнадцатеричный код подходящего цвета. Еще один минус в удобстве использования.

Когда все параметры указаны, нажимаем кнопку «Вставить таймер в письмо». Платформа начинает генерировать таймер. В нашем случае, процесс занял по меньшей мере 10 минут. Это долго по сравнению с другими сервисами, которые выдают результат моментально. Код, который мы получили, оказался очень громоздким. Стоит отметить, что он вставляется в исходный код письма, а не в визуальный редактор.

Цифры по итогу сбились — вместо положенных 27 дней до 31 декабря отображается 1 день.

Как вставить таймер обратного отсчета в SendPulse

Исходя из плюсов и минусов каждого сервиса, мы остановились на Niftyimages. Таймер, созданный с помощью этой платформы, мы и будем вставлять в шаблон письма SendPulse .

  • Создаем новую email кампанию. Выбираем адресную книгу, заполняем «Адрес отправителя», «Имя отправителя», указываем тему сообщения.
  • Выбираем бесплатный шаблон письма из доступных или переходим в HTML-редактор для создания своего шаблона.
  • Добавляем новый текстовый блок. Переходим к исходному коду на вкладке настроек блока. Вставляем код таймера.

Как видите, создать таймер не сложно, так что выбирайте подходящий сервис и добавляйте срочность в рассылки вместе с SendPulse !