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

Обсуждаем контроллеры компании Atmel.
Ответить
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение 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)?
Вложения
Снимок.JPG
(84.42 КБ) 290 скачиваний
Реклама
akl
Друг Кота
Сообщения: 4468
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Вы не привели частоту тактирования таймера.
Таймер, настроенный на захват с "noise canceler" будет давать задержку на 4 такта. Плюс задержка от входа в обработчик для инверсии. Полпериода частоты 40 кГц составит 12,5 мкс, т.е. при такте таймера 1 мкс (1МГц) будет примерно такая задержка.
Значение TCNT1 в ICR1 переписывается аппаратно, только условие задано странное, хотя и допускаю, что не правильно его понимаю. Т.е. таймер насчитал какое-то, отличное от 0, значение; при наступлении события захвата перенес его в ICR1. При входе в обработчик сравнивается с 0, а нуля нет, т.е. и PB1 не надо менять.
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Абсолютно верно! Вывод PB1 в прерывании не должен инвертироваться, а он это делает, т.е. в ICR1 находится 0. Только не пойму почему.
Частота контроллера 16Мгц.
Предделитель таймера 1.
Дальнейшая логика: период тика таймера (одного инкремента счетного регистра) 1/16Мгц=625пико сек. 1/40кГц = 25микро сек. Тогда за один период 40кГц у меня влезет 25 мк/625п = 400. Если я сбрасываю счетный регистр в прерывании, то в следующем прерывании (при всех задержках: 4 такта на подавление шума + тактов 10 на все про все с входом в прерывание) в счетном регистре и регистре ICR1 должно быть около 400. Но не как в ICR1 не 0.
akl
Друг Кота
Сообщения: 4468
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

eess9 писал(а):1/16Мгц=625пико сек. 1/40кГц = 25микро сек. Тогда за один период 40кГц у меня влезет 25 мк/625п = 400.
Уточню, период будет 62,5 наносек
eess9 писал(а):...это мой баг или глюк протеуса (версия 7.6)?
Вы правы; поэтому, глюк.
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Ну что сказать по этому поводу: поставил версию 7.7 и тоже самое.
7.10, к сожалению, не стала.

Буду пробовать в железе
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Народ, в железе тоже самое.
Закомитил все не относящееся к таймеру 1.
Где моя ошибка? Почему прерывание по захвату вызывается, а при этом в ICR1 находится 0 (инверсия PC3 происходит с частотой 40кГц, т.е я вижу меандр 20кГц на этом выводе)?
Вложения
Lance_ATmega88.c
(3.08 КБ) 500 скачиваний
Реклама
Ответить

Вернуться в «AVR»