Страница 1 из 1

ATmega88 схема захвата таймера 1

Добавлено: Вс ноя 17, 2013 16:11:22
eess9
Привет всем!
Объясните мне пожалуйста, т.к. я окончательно запутался. На PB0 (ICP1) подается частота 40кГц со скважностью 50%. Лапа настроена на вход.
Код в main:

Код: Выделить всё

DDRB |= (1<<PB1);
TIMSK1 |= (1<<ICIE1);
TCCR1B |= (ICES1)|(1<<ICNC1)|(1<<CS10);
sei();
Прерывание таймера:

Код: Выделить всё

ISR(TIMER1_CAPT_vect)
{
	TCNT1 = 0;
	Timer1calibrate = ICR1;
	if (Timer1calibrate == 00) { PORTB ^= (1<<PB1);}
}
Т.е. в каждом прерывании происходит инверсия бита PB1.
Симулирую в протеусе. На картинке: канал А - PB0, а канал B - PB1.
Но вот чего странно:
1. бит ICES1 установлен, т.е. захват должен происходить по нарастающему фронту сигнала. Тогда почему вход в прерывание и инверсия PB1 осуществляется по спадающему фронту?
2. В прерывании фактически написано

Код: Выделить всё

if (ICR1 == 00) { PORTB ^= (1<<PB1);}
, т.е. в ICR1 значение счетного регистра TCNT1 не перегружается.
Вопрос: это мой баг или глюк протеуса (версия 7.6)?

Re: ATmega88 схема захвата таймера 1

Добавлено: Вс ноя 17, 2013 17:06:37
akl
Вы не привели частоту тактирования таймера.
Таймер, настроенный на захват с "noise canceler" будет давать задержку на 4 такта. Плюс задержка от входа в обработчик для инверсии. Полпериода частоты 40 кГц составит 12,5 мкс, т.е. при такте таймера 1 мкс (1МГц) будет примерно такая задержка.
Значение TCNT1 в ICR1 переписывается аппаратно, только условие задано странное, хотя и допускаю, что не правильно его понимаю. Т.е. таймер насчитал какое-то, отличное от 0, значение; при наступлении события захвата перенес его в ICR1. При входе в обработчик сравнивается с 0, а нуля нет, т.е. и PB1 не надо менять.

Re: ATmega88 схема захвата таймера 1

Добавлено: Вс ноя 17, 2013 17:24:48
eess9
Абсолютно верно! Вывод PB1 в прерывании не должен инвертироваться, а он это делает, т.е. в ICR1 находится 0. Только не пойму почему.
Частота контроллера 16Мгц.
Предделитель таймера 1.
Дальнейшая логика: период тика таймера (одного инкремента счетного регистра) 1/16Мгц=625пико сек. 1/40кГц = 25микро сек. Тогда за один период 40кГц у меня влезет 25 мк/625п = 400. Если я сбрасываю счетный регистр в прерывании, то в следующем прерывании (при всех задержках: 4 такта на подавление шума + тактов 10 на все про все с входом в прерывание) в счетном регистре и регистре ICR1 должно быть около 400. Но не как в ICR1 не 0.

Re: ATmega88 схема захвата таймера 1

Добавлено: Пн ноя 18, 2013 07:03:29
akl
eess9 писал(а):1/16Мгц=625пико сек. 1/40кГц = 25микро сек. Тогда за один период 40кГц у меня влезет 25 мк/625п = 400.
Уточню, период будет 62,5 наносек
eess9 писал(а):...это мой баг или глюк протеуса (версия 7.6)?
Вы правы; поэтому, глюк.

Re: ATmega88 схема захвата таймера 1

Добавлено: Пн ноя 18, 2013 12:17:06
eess9
Ну что сказать по этому поводу: поставил версию 7.7 и тоже самое.
7.10, к сожалению, не стала.

Буду пробовать в железе

Re: ATmega88 схема захвата таймера 1

Добавлено: Ср ноя 20, 2013 17:31:14
eess9
Народ, в железе тоже самое.
Закомитил все не относящееся к таймеру 1.
Где моя ошибка? Почему прерывание по захвату вызывается, а при этом в ICR1 находится 0 (инверсия PC3 происходит с частотой 40кГц, т.е я вижу меандр 20кГц на этом выводе)?