Асинхронная работа таймера-счетчика 0
Регистр асинхронного состояния - ASSR
Разряд |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
|
- |
- |
- |
- |
AS0 |
TCN0UB |
OCR0UB |
TCR0UB |
ASSR |
Чтение/запись |
Чт. |
Чт |
Чт |
Чт |
Чт./Зп. |
Чт |
Чт |
Чт |
|
Исх. значение |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
- Разряд 3 - AS0: Разрешение асинхронного тактирования таймера-счетчика 0
Если AS0 = 0, то таймер счетчик 0 тактируется сигналом синхронизации ввода-вывода - clkI/O. Если AS0 = 1, то таймер-счетчик 0 тактируется низкочастотным кварцевым генератором, связанного с задающим кварцем через выводы TOSC1 и TOSC2. При изменении значения AS0 содержимое регистров TCNT0, OCR0 и TCCR0 может быть нарушено.
- Разряд 2 - TCN0UB: Флаг занятости таймера-счетчика 0 при обновлении
Если таймер-счетчик 0 работает асинхронно и выполнена запись в TCNT0, то данный флаг устанавливается. После того, как содержимое TCNT0 обновляется из временного регистра, данный флаг сбрасывается аппаратно. Следовательно, когда TCN0UB=0, в TCNT0 может быть выполнена запись нового значения.
- Разряд 1 - OCR0UB: Флаг занятости регистра порога сравнения при обновлении
Если таймер-счетчик 0 работает асинхронно и выполнена запись в регистр OCR0, то данный флаг устанавливается. По завершении обновления OCR0 из временного регистра данный флаг сбрасывается аппаратно. Если OCR0UB=0, то это означает готовность регистра OCR0 к записи нового значения.
- Разряд 0 - TCR0UB: Флаг занятости регистра управления таймера-счетчика 0 при обновлении
Если таймер-счетчик 0 работает асинхронно и выполнена запись в регистр TCCR0, то данный флаг устанавливается. По завершении обновления TCCR0 из временного регистра данный флаг сбрасывается аппаратно. Если TCR0UB=0, то это означает готовность регистра TCCR0 к записи нового значения.
Если выполнить запись в любой из трех регистров таймера-счетчика 0, когда соответствующий флаг занятости установлен, то обновляемое значение может быть нарушено и может стать причиной несанкционированного возникновения прерывания.
Механизм чтения TCNT0, OCR0 и TCCR0 различный. Если выполняется чтение TCNT0, то считывается фактическое значение таймера. Если же считывается значение OCR0 или TCCR0, то фактически считывается содержимое временного регистра.
Асинхронная работа таймера-счетчика 0
Если таймер-счетчик 0 работает асинхронно, то необходимо учесть некоторые особенности.
- Предупреждение: При переключении между асинхронным и синхронным тактовыми источниками таймера-счетчика содержимое регистров TCNT0, OCR0 и TCCR0 может быть нарушено. Во избежание этого необходимо придерживаться следующей безопасной последовательности переключения:
- Отключить прерывания таймера-счетчика 0 путем сброса бит OCIE0 и TOIE0.
- Выбрать необходимый тактовый источник с помощью бита AS0
- Выполнить запись новых значений в TCNT0, OCR0 и TCCR0.
- При переходе в асинхронный режим тактирования дождаться сброса флагов TCN0UB, OCR0UB и TCR0UB.
- Сбросить флаги прерывания таймера-счетчика 0
- При необходимости разрешить прерывания
- Генератор оптимизирован под использование часового кварцевого резонатора на частоту 32768 Гц. Подключение внешнего тактового сигнала к выводу TOSC1 может сказаться на некорректности работы таймера. Тактовая частота ЦПУ должна быть минимум в четыре раза выше частоты данного генератора.
o Запись в любой из регистров TCNT0, OCR0 или TCCR0 происходит за два положительных фронта TOSC1, т.к. данные предварительно помещаются во временный регистр, а затем передаются по назначению. Программист должен предусмотреть, чтобы до окончания передачи содержимого временного регистра к назначенному регистру не выполнилась еще одна запись в. этот регистр. Каждый из трех упомянутых регистров имеют свои индивидуальные временные регистры. Это означает, что, например, запись в TCNT0 не влияет на процесс записи в регистр OCR0. Чтобы определить в какой регистр была выполнена запись, реализован регистр асинхронного состояния ASSR.
- Если экономичный режим или расширенный дежурный режим вводится после записи в TCNT0, OCR0 или TCCR0, то программист должен дождаться завершения обновления записанного регистра, в случае если таймер-счетчик 0 используется для пробуждения из этих режимов. Иначе микроконтроллер перейдет в режим сна прежде чем вступят в силу желаемые изменения. Это особенно важно, если прерывание по результату сравнения таймера-счетчика 0 используется для пробуждения микроконтроллера, т.к. функция отработки условия совпадения блокируется после записи в OCR0 или TCNT0. Если цикл записи не заканчивается и микроконтроллер переводится в режим сна прежде чем OCR0UB станет равным нулю, то микроконтроллер больше не будет прерываться при выполнении условия сравнения и, следовательно, не сможет пробудиться.
- Если таймер-счетчик 0 используется для пробуждения микроконтроллера из экономичного режима или расширенного дежурного режима, то, если требуется перевести данный микроконтроллер снова в один из этих режимов, необходимо учесть несколько особенностей. Для сброса логики прерываний требуется один такт TOSC1. Если интервал времени между пробуждением микроконтроллера и повторным вводом режима сна меньше чем один период TOSC1, то прерывание в дальнейшем не возникнет и микроконтроллер не сможет пробудиться. Если программист не уверен в прохождении достаточного времени перед повторным вводом в экономичный режим или расширенный дежурный режим, то необходимо придерживаться следующей последовательности действий, которая гарантирует прохождение одного периода TOSC1:
- Запись значения в TCCR0, TCNT0 или OCR0.
- Ожидание сброса соответствующего флага занятости при обновлении в регистре ASSR.
- Ввод экономичного или расширенного дежурного режима.
- Если выбрана асинхронная работа, то генератор на 32768 Гц таймера-счетчика 0 находится постоянно включенным, за исключением режима выключения и дежурного режима микроконтроллера. После сброса при подаче питания или пробуждения из режима выключения и дежурного режима программист должен учитывать, что для возобновления нормальной стабильной работы данного генератора требуется минимум 1 секунда. Таким образом, программисту рекомендуется включить задержку минимум на 1 сек. перед использованием таймера-счетчика 0 после подачи питания или выхода из режима выключения или дежурного режима. Содержимое всех регистров таймера-счетчика 0 необходимо рассматривать как потерянное после подачи питания или пробуждения из указанных выше режимов из-за нестабильности тактового сигнала при запуске независимо от того, какой асинхронный источник используется (генератор или внешний сигнал на выводе TOSC1).
- Выход микроконтроллера из экономичного и расширенного дежурного режимов при асинхронном тактирования таймера-счетчика 0 происходит в следующей последовательности. Если выполняется условие прерывания, то инициируется процесс пробуждения следующим тактом синхронизации таймера, т.е. таймер минимум на 1 изменит свое состояние, прежде чем процессор получит доступ к его состоянию. После пробуждения микроконтроллер задерживается на 4 такта синхронизации ЦПУ, а затем переходит на вектор обработки прерывания, а по завершении процедуры его обработки возвращается к выполнению инструкции, следующей за SLEEP.
- Чтение регистра TCNT0 сразу после пробуждения из экономичного режима (Power-save) может дать некорректный результат. Поскольку TCNT0 тактируется от асинхронного источника TOSC, то чтение TCNT0 должно быть выполнено через регистр, синхронизированный с внутренней синхронизацией ввода-вывода. Синхронизация выполняется каждый нарастающий фронт на TOSC1. При пробуждении из экономичного режима активизируется снова синхронизация ввода-вывода (clkI/O) и при чтении TCNT0 фактически будет считываться предыдущее значение (которое записано перед вводом в режим сна) до следующего нарастающего фронта на TOSC1. Фаза тактового сигнала TOSC после выхода из экономичного режима непредсказуема, т.к. зависит от момента пробуждения микроконтроллера. С учетом этого, при чтении содержимого TCNT0, рекомендуется соблюдать следующую последовательность действий:
- По усмотрению записать произвольное значение или в регистр OCR0 или в TCCR0.
- Дождаться сброса флага занятости при обновлении, соответствующего выбранному в п.1 регистру.
- Выполнить чтение TCNT0.
- Во время асинхронной работы синхронизация флагов прерываний асинхронного таймера требует три такта синхронизации ЦПУ плюс один такт синхронизации таймера. Таким образом, как минимум таймер должен изменить свое состояние на 1 прежде чем процессор сможет считать его содержимое, вызывающее установку флагов прерываний. Выход генератора прямоугольных импульсов OC0 привязан к синхронизации таймера и не синхронизирован с тактированием ЦПУ.
Регистр маски прерываний таймеров-счетчиков - TIMSK
Разряд |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
|
OCIE2 |
TOIE2 |
TICIE1 |
OCIE1A |
OCIE1B |
TOIE1 |
OCIE0 |
TOIE0 |
TIMSK |
Чтение/запись |
Чт./Зп. |
Чт./Зп. |
Чт./Зп. |
Чт./Зп. |
Чт./Зп. |
Чт./Зп. |
Чт./Зп. |
Чт./Зп. |
|
Исх. значение |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
- Разряд 1 - OCIE0: Разрешение прерывания по результату сравнения таймера-счетчика 0
Если OCIE0=1, а также установлен бит I в регистре статуса, то прерывание по результату сравнения таймера-счетчика 0 активизируется. В этом случае прерывание возникает, если обнаруживается совпадение значения таймера-счетчика 0 с порогом сравнения, т.е. когда установлен флаг OCF0 в регистре флагов прерываний таймеров-счетчиков TIFR.
- Разряд 0 - TOIE0: Разрешение прерывания по переполнению таймера-счетчика 0
Если TOIE0=1, а также установлен бит I в регистре статуса, то прерывание по переполнению таймера-счетчика 0 разрешается. В этом случае запрос на прерывание генерируется, если обнаруживается переполнение таймера-счетчика 0, т.е. когда установлен флаг TOV0 в регистре флагов прерываний таймеров-счетчиков TIFR.
Регистр флагов прерываний таймеров-счетчиков - TIFR
Разряд |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
|
OCF2 |
TOV2 |
ICF1 |
OCF1A |
OCF1B |
TOV1 |
OCF0 |
TOV0 |
TIFR |
Чтение/запись |
Чт./Зп. |
Чт./Зп. |
Чт./Зп. |
Чт./Зп. |
Чт./Зп. |
Чт./Зп. |
Чт./Зп. |
Чт./Зп. |
|
Исх. значение |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
- Разряд 1 - OCF0: Флаг совпадения таймера-счетчика 0
OCF0 равен лог. 1, если обнаруживается совпадением между значением таймера-счетчика 0 и данными в регистре OCR0 (регистр порога сравнения). OCF0 сбрасывается аппаратно при переходе на соответствующий вектор прерывания. Альтернативно, флаг OCF0 может быть сброшен путем записи в него лог. 1. Если установлены бит I в регистре SREG, бит OCIE0 (разрешено прерывание по выполнению условия сравнения таймера-счетчика 0) и флаг OCF0, то генерируется прерывание по выполнению условия сравнения таймера-счетчика 0.
- Разряд 0 - TOV0: Флаг переполнения таймера-счетчика 0
Флаг TOV0 устанавливается, если в таймере-счетчике 0 возникает переполнение. Флаг TOV0 сбрасывается аппаратно при переходе на соответствующий вектор прерывания. Альтернативно, флаг TOV0 сбрасывается путем записи в него лог. 1. Если установлены бит I в регистре SREG, бит TOIE0 (разрешено прерывание по переполнению таймера-счетчика 0) и флаг TOV0, то генерируется прерывание по переполнению таймера-счетчика 0. В режиме ШИМ данный флаг устанавливается, если таймер-счетчик 0 изменяет направление счета на значении 0x00.
|