98
таймера могут определяться значением в OCRnA, ICRn или иметь фиксирован-
ные значения. Если OCRnA задает верхний предел счета в режиме ШИМ, то он
не может использоваться для генерации ШИМ-сигналов. Однако верхний пре-
дел в этом случае имеет двойную буферизацию, тем самым допуская изменение
его значения в произвольный момент времени. Если верхний предел счета
яв-
ляется постоянным значением, то альтернативно можно использовать регистр
ICRn, освобождая регистр OCRnA для функции широтно-импульсной модуля-
ции.
Доступ к 16-разр. регистрам. Регистры TCNTn, OCRnA/B/C и ICRn яв-
ляются 16-разрядными, поэтому доступ к ним через 8-разр. шину данных AVR
ЦПУ может быть осуществлен с помощью двух инструкций чтения или записи.
У каждого 16-разр. таймера имеется
свой 8-разр. регистр для временного хра-
нения старшего байта данных. Во время доступа к 16-разр. регистрам одного
таймера используется один и тот же временный регистр. Чтение/запись млад-
шего байта инициирует 16-разр. операцию чтения/записи. Если выполняется
запись младшего байта 16-разр. регистра, то за один такт ЦПУ одновременно
записываются и
младший байт, и старший байт из временного регистра. Если
выполняется чтение младшего байта 16-разр. регистра, то за один такт ЦПУ па-
раллельно с чтением младшего байта происходит копирование старшего байта
16-регистра во временный регистр.
Не все 16-разрядные регистры используют временный регистр для копи-
рования старшего байта. Чтение 16-разр. регистров OCRnA/B/C не
связано с
использованием временного регистра.
Таким образом, чтобы записать данные в 16-разр. регистр, необходимо
сначала записать старший байт, а затем младший. А при чтении 16-разр. реги-
стра, наоборот, сначала считывается младший байт, а затем старший.
Ниже приведен пример на Ассемблере, показывающий, как осуществлять
доступ к 16-разр. регистрам таймера. В примере предполагается
, что во время
обновления временного регистра не возникает прерываний. Аналогично может
быть выполнен доступ к регистрам OCRnA/B/C и ICRn.
...
; Установка TCNTn = 0x01FF
ldi r17,0x01
ldi r16,0xFF
out TCNTnH,r17
out TCNTnL,r16
; Чтение TCNTn в r17:r16
in r16,TCNTnL
in r17,TCNTnH
...
В примере на Ассемблере значение TCNTn возвращается парой регистров
r17:r16. При этом следует обратить внимание на проблему, которая связана с
необходимостью выполнения двух инструкций для получения доступа к 16-
разр. регистру. Если после выполнения первой инструкции доступа 16-разр. ре-
гистра происходит прерывание и в процедуре обработки прерывания также