Цитата(Nosaer @ Feb 8 2015, 06:37)

По задумке, 3 таймера счетчика активированы на PC0, PD0, PE0.
Настроены на захват длительности импульса по падающему фронту.
Ну и соответственно при запуске все три ничего не считают.
Счетные пины портов с входом таймера жестко не связаны, а соединяются через систему событий. А вот выход генерации у таймеров (PWM) уже связан жестко с конкретным пином.
Например, выход частоты с таймера TCC0 поступает на пин PС0 жестко, его никак нельзя поменять на какой-то другой пин (правда в описании упоминается возможность выхода на область PС0-PC3, но лично мне этого сделать не удалось). Поэтому, если вы рассчитываете вывести наружу частоту, генерируемую таймером, то должны позаботиться, чтобы пин PС0 под другие цели не был занят.
Напротив, если вы расчитываете использовать таймер не для генерации сигнала, а исключительно для счета внешних сигналов, то вход для такого сигнала можно подключить не только на порт PС, но и на
любой из пинов портов PС, PD, PE, PF.
А связь между конкретным пином и таймером производится через систему событий, имеющую 8 каналов.
Делается это так:
1) выбираете нужный вам пин среди портов С,D,E,F. Пусть это будет PF3. Устанавливаете ему чувствительность:
PORT
F.PIN3CTRL = PORT_OPC_PULLDOWN_gc | PORT_ISC_FALLING_gc; // Pull-down, sense falling edge PF3
2) Выбираете канал передачи события, пусть это будет канал 0. Направляете на него импульс с PF3
EVSYS.
CH0MUX = EVSYS_CHMUX_PORT
F_PIN3_gc; // EV channel 0 <- PF3 (sensor)
3) Выбирате таймер, пусть это будет таймер TCC0. Устанавливаете ему источником счета канал 0 событий.
TCC0.CTRLD = TC_EVACT_CAPT_gc | TC_EVSEL_
CH0_gc; // external capture <- EV channel 0
(насчет TC_EVACT_CAPT_gc не уверена, что он тут необходим)
Всё остальное не описываю, т.к. главная логика здесь такая:
PF3 --->
CH0 --->
TCC0Пин
PF3 можно заменить на другой (менять на PC0 я бы остереглась). При этом изменятся команды 1 и 2.
EV-канал
CH0 тоже можно заменить на любой от CH0 до CH7 (они все одинаковые). При этом изменятся команды 2 и 3.
Таймер
TCC0 можно заменить на любой другой. При этом изменится команда 3.
Никакие прерывания в этом механизме передачи возбуждения с пина порта на счет таймера не используются. Сама система событий EVSYS тоже вроде бы ни в какой предварительной инициализации не нуждается. А таймеры программируются общим порядком, с тем лишь единственным исключением, что в CTRLD подставляется нетипичный источник.
P.S. От одного EV-канала можно запускать на счет (или сброс) сразу несколько таймеров, если им указать этот канал в виде источника счета (или сброса), но вход EV-канала всегда может быть только один.
P.P.S. Выход с EV-канала может быть (параллельно) использован и для других целей - возбуждения прерывания или DMA. Или можно соединить два таймера в каскад, если передавать по каналу переполнение от одного из них на счетный вход другого. К моему большому сожалению его нельзя использовать для дрыгания другими ножками портов, а то бы этой системе просто цены не было!