Воскресенье, 23.06.2024, 14:44
| RSS
[SEARCH_TITLE]
[SEARCH_FORM]
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Архив - только для чтения
Таймер / Счетчик 0 в ATmega8
GroverДата: Вторник, 18.03.2008, 13:12 | Сообщение # 1








Зарегистрирован 04.02.2008
Группа: Опытные
Сообщений: 130
Город: Воронеж
Статус: Offline
Таймер/Счетчик0 – это самый простой таймер или счетчик в семействе микроконтроллеров AT. У него нет дополнительных наворотов, он просто считает.

Сразу разберу, почему называется «таймер/счетчик». На самом деле Таймер/счетчик – аппаратная часть МК, которая подсчитывает количество каких-либо импульсов. Таких импульсов может быть два вида: 1. Генератор МК; 2. Импульсы на ножке МК.

Подробнее:

1. Генератор МК. Как все уже знают, МК работает с определенной частотой, которая определяется выбранным генератором (внутренним или внешним). Так вот, в этом режиме импульс для таймера подается от этого генератора с той же частотой. Именно этот режим работы таймера/счетчика и называется Таймером.
2. Импульсы на ножке МК . Значение таймера/счетчика изменяется в зависимости от состояния сигнала на определенной ножке. Т.е. считает количество импульсов на ножке. Этот режим называют Счетчиком.

Как же работает Таймер/Счетчик? Элементарно! В памяти МК есть кусочек отведенный для таймера, называется регистр TCNT0. Этот регистр, при запуске равен 0, при появлении импульса от генератора или ножки МК, значение регистра увеличивается на 1. Так как регистр TCNT0 восьмиразрядный, то его максимальное значение равно 0xFF. После того как Таймер/Счетчик насчитал 256 импульсов (0xFF) он сбрасывается на 0 и начинает все заново.

Тут начинается самое интересное! Таймер/Счетчик0 при переполнении и сбросе регистра вызывает TCNT0 прерывание. С какой частотой будет выполняться прерывание не сложно посчитать. Для этого частоту работы МК надо разделить на 256 (максимальное значение таймера). К примеру, частота ATmega8 по умолчанию (заводские настройки) составляет 1МГц, отсюда 1000000/256= 3906,25 раз в секунду будет вызываться прерывание. Многовато??? Для этого существуют пределители. Хитрое слово, но все элементарно на деле. Пределитель заставляет таймер реагировать не на каждый импульс, а через n – раз. Эээээ….

В ATmega8 для Таймера/Счетчика0 можно устанавливать пределители 8, 64, 256, 1024. Таким образом таймер0 будет считать не все импульсы подряд, а только 8-ой, 64-ый, 256-ой и 1024-ый соответственно. Посчитаем на примере, 1000000/8/256= 488,28125 Герц. – это с пределителем 8. и 1000000/1024/256= 3,814697265625 в секунду с пределителем 1024 – думаю, что формула ясна.

Таким образом, знаю частоту работы МК можно высчитывать частоту срабатывания прерываний. Кстати прерывание называется «прерывание по переполнению таймера0».

Одна трудность: пределитель нельзя использовать в режиме счетчика, только если таймер работает от генератора МК. Это плохо, но для подобных целей используются другие таймеры/счетчики.

Теория вроде закончилась. Далее…

Я рекомендую: как только вы решили изучить новую функцию в МК, сразу открывать регистры управления этой функцией. Вот и сейчас мы отправимся к ним в гости. И так:

Наш таймер (Таймер/счетчик0 в ATmega8) использует всего 4 регистра: TCCR0, TCNT0, TIMSK, TIFR. Два из них принадлежат только нашему таймеру, а оставшимися он пользует по совместительству.

TCCR0 – самый главный регистр у данного таймера. Он управляет его пределителем, источником импульсов (такта) и включением/выключением.

Вот такой он симпатичный. Из 8 разрядов используются только первые три. В табличке все ясно и понятно:

Тут должно быть все понятно. Поясню только нижние две строки. Внешний источник от пина Т0 – это и есть та нога МК, на которой ожидается импульс. Счетчик может считать не только 0 и 1, но и снижение или повышение питания – это удобно в большинстве случаев.
TCNT0 – еще проще. В это регистре хранится значение таймера/счетчика на данный момент, его можно считывать и устанавливать в необходимое значение. Его внешний вид:

TIMSK – Это регистр используется по совместительству. Таймер/счетчик0 использует только один бит0 под названием TOIE0, все остальные регистры используются другими функциями МК.

Если бит TOIE0 установлен (1), то прерывание по переполнению разрешено. Ну и 0 прерывание запрещает. Т.е. когда необходимо можно отключить прерывание, но счетчик будет продолжать считать.

TIFR – еще один регистр, используемый по совместительству. В нем нас интересует только бит 0 – TOV0.

Этот бит является сигнализатором. Он устанавливается в 1 при срабатывании прерывания и сбрасывается, когда прерывание начинает выполняться, точнее еще раньше – в момент перенаправления программы по вектору прерывания.

Ну это все что я могу сказать о таймере/счетчике0. Это только поверхностные сведения, вполне достаточные для начала работы с таймером. Для подробной информации читайте даташит.

Ах, да, чуть не забыл – маленький примерчик:

Code

// Функция, которая будет выполняться при срабатывании прерывания.

ISR (TIMER0_OVF_vect)

{

//Чаво хотим, таво и пишим.

}

main (void)

{

TCCR0 |= _BV(CS01); //Запускаем таймер с пределителем 8

TIMSK |= _BV(TOIE0); // Разрешаем прерывание по переполнению

sei (); // Разрешаем глобальные прерывания МК

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

for (;;)

sleep_mode();

return (0);

}

Это была первая статья из серии о таймерах.

Жду ваших комментариев и писем.

оригинал статьи: http://groversuper.ucoz.ru/publ/3-1-0-3

Прикрепления: 6651718.png (6.1 Kb) · 3674455.png (23.0 Kb) · 3712481.png (5.9 Kb) · 6450306.png (7.6 Kb) · 9481470.png (7.7 Kb)


--------
GroverSuper.ucoz.net - мои странички.
 
  • Страница 1 из 1
  • 1
Поиск: