Таймер. Применение таймера. Виды прерывания таймера



 

В микроконтроллерах AVR может быть до 4х таймеров/счетчиков (ТС). Разрядность этих таймеров 8 или 16 бит (т.е. они могут считать до 28=256 или до 216=65536). Обычно их используют для точного формирования временных интервалов, подсчета импульсов на выводах микроконтроллера, формирования последовательности импульсов. Таймеры способны вырабатывать запросы на прерывания, при этом освобождая процессор от необходимости опроса состояния таймеров.

Что умеют таймеры

· Тикать с разной скоростью, подсчитывая время

· Считать входящие извне импульсы (режим счетчика)

· Тикать от внешнего кварца на 32768гц

· Генерировать несколько видов ШИМ сигнала

· Выдавать прерывания (по полудесятку разных событий) и устанавливать флаги

Разные таймеры имеют разную функциональность и разную разрядность

Если таймер считает импульсы от тактового генератора, или от своего внутреннего, то их еще можно пропустить через предделитель.

То есть еще до попадания в счетный регистр частота импульсов будет делиться. Делить можно на 8, 32, 64, 128, 256, 1024. Так что если повесишь на Т/С2 часовой кварц, да пропустишь через предделитель на 128, то таймер у тебя будет тикать со скоростью один тик в секунду.

Удобно! Также удобно юзать предделитель когда надо просто получить большой интервал, а единственный источник тиков это тактовый генератор процессора на 8Мгц, считать эти мегагерцы задолбаешься, а вот если пропустить через предделитель, на 1024 то все уже куда радужней.

Для сброса предделителей достаточно записать бит PSR10 в регистре SFIOR. Бит PSR10 будет сброшен автоматически на следующем такте.

Весь результат накапливается в счетном регистре TCNTх, где вместо х номер таймера.

Если в восьмиразрядный регистр надо положить число, то нет проблем OUT TCNT0,Rx. Для 2-байтного регистра так не получится. Таймер считает независимо от процессора, поэтому мы можем положить вначале один байт, он начнет считаться, потом второй, и начнется пересчет уже с учетом второго байта.

Решение: Запись в старший регистр (TCNTxH) ведется вначале в регистр TEMP. Этот регистр чисто служебный, и нам никак недоступен.

Что в итоге получается: Записываем старший байт в регистр TEMP (для нас это один хрен TCNTxH), а затем записываем младший байт. В этот момент в реальный TCNTxH заносится ранее записанное нами значение. То есть два байта, старший и младший, записываются одновременно! Менять порядок нельзя!

  CLI                        ; Запрещаем прерывания, в обязательном порядке!

  OUT TCNT1H,R16 ; Старший байт записался вначале в TEMP

  OUT TCNT1L,R17 ; А теперь записалось и в старший и в младший!

  SEI                         ; Разрешаем прерывания

«Зачем запрещать прерывания? Да чтобы после записи первого байта, программа случайно не умчалась не прерывание, а там кто-нибудь наш таймер не изнасиловал. Тогда в его регистрах будет не то, что мы послали тут (или в прерывании), а черти что» ©

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

Главным регистром для таймера является TCCRx. Для Т/С0 и Т/С2 это TCCR0 и TCCR2 соответственно, а для Т/С1 это TCCR1B. Нас пока интересуют только первые три бита этого регистра: CSx2.. CSx0, вместо х подставляется номер таймера. Они отвечают за установку предделителя и источник тактового сигнала.

У разных таймеров немного по разному, поэтому опишу биты CS02..CS00 только для таймера 0

· 000 — таймер остановлен

· 001 — предделитель равен 1, то есть выключен. таймер считает тактовые импульсы

· 010 — предделитель равен 8, тактовая частота делится на 8

· 011 — предделитель равен 64, тактовая частота делится на 64

· 100 — предделитель равен 256, тактовая частота делится на 256

· 101 — предделитель равен 1024, тактовая частота делится на 1024

· 110 — тактовые импульсы идут от ножки Т0 на переходе с 1 на 0

· 111 — тактовые импульсы идут от ножки Т0 на переходе с 0 на 1

 

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

За прерывания от таймеров отвечают регистры TIMSК, TIFR. А у более крутых AVR, таких как ATMega128, есть еще ETIFR и ETIMSK — своего рода продолжение, так как таймеров там поболее будет.

TIMSK это регистр масок. То есть биты, находящиеся в нем, локально разрешают прерывания. Если бит установлен, значит конкретное прерывание разрешено. Если бит в нуле, значит данное прерывание накрывается тазиком. По дефолту все биты в нуле.

На данный момент нас тут интересуют только прерывания по переполнению. За них отвечают биты

· TOIE0 — разрешение на прерывание по переполнению таймера 0

· TOIE1 — разрешение на прерывание по переполнению таймера 1

· TOIE2 — разрешение на прерывание по переполнению таймера 2

Регистр TIFR это непосредственно флаговый регистр. Когда какое то прерывание срабатывает, то выскакивает там флаг, что у нас есть прерывание. Этот флаг сбрасывается аппаратно когда программа уходит по вектору. Если прерывания запрещены, то флаг так и будет стоять до тех пор пока прерывания не разрешат и программа не уйдет на прерывание.

Чтобы этого не произошло флаг можно сбросить вручную. Для этого в регистре TIFR в него нужно записать 1!

 


Дата добавления: 2018-04-05; просмотров: 685; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!