Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Время детектирования прерывания pin change
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
frz
Вобщем имеется ATMega48 и необходимо детектировать короткие внешние импульсы(100-200нс). Тактовая частота 1МГц.
Вопрос в следующем: можно ли для этого использовать прерывание PCINT ? В датащите не нашёл ничего толкового - написано лишь что изменение состояния пинов детектируется асинхронно. Но всеже должно быть какое-то время детектирования, которое гарантированно приводило бы к генерации прерывания?
defunct
Цитата(frz @ Mar 21 2010, 16:06) *
Вобщем имеется ATMega48 и необходимо детектировать короткие внешние импульсы(100-200нс). Тактовая частота 1МГц.
Вопрос в следующем: можно ли для этого использовать прерывание PCINT ?

Без внешних компонентов нельзя. см. раздел Pin Change Interrupt Timing, кстати там на рисунке 11-1 видно, что схема захвата PCINT - синхронная, т.к. защелка и триггер тактируются clk.

Цитата
В датащите не нашёл ничего толкового - написано лишь что изменение состояния пинов детектируется асинхронно. Но всеже должно быть какое-то время детектирования, которое гарантированно приводило бы к генерации прерывания?

Чтобы гарантировано получить PCINT нужна такая частота тактирования МК, чтобы период одного такта был хотя бы в два раза меньше длительности импульса - т.е. 20Mhz в вашем случае.

Если все же тактовая останется 1Mhz, то самым простым решением будет использование возможности встроенного компаратора + простейший аналоговый запоминающий элемент посторенный на кондике и диоде. По прерыванию от компаратора - переключить пин компаратора на вывод и разрядить запоминающий элемент.
smac
Цитата(defunct @ Mar 22 2010, 03:27) *
Без внешних компонентов нельзя. см. раздел Pin Change Interrupt Timing, кстати там на рисунке 11-1 видно, что схема захвата PCINT - синхронная, т.к. защелка и триггер тактируются clk.

Вопрос не совсем в тему, но в принципе про PCINT. Чем тактируется упомянутая схема захвата при уходе контроллера в Power Down, что-то в даташите не могу найти нужной информации, может быть кто знает?
aaarrr
Цитата(smac @ Mar 22 2010, 07:44) *
Вопрос не совсем в тему, но в принципе про PCINT. Чем тактируется упомянутая схема захвата при уходе контроллера в Power Down, что-то в даташите не могу найти нужной информации, может быть кто знает?

Ничем не тактируется:
Цитата
Pin change interrupts on PCINT23...0 are detected asynchronously. This implies that these interrupts can be used for
waking the part also from sleep modes other than Idle mode.
defunct
Цитата(aaarrr @ Mar 22 2010, 07:02) *
Ничем не тактируется:

если придерживаться схемы figure 11-1 Pin Change Interrupt Timing, то без тактирования PCIF не установится никогда, и прерывание не произойдет.
Но стоит обратить внимание на промежуточный сигнал pcint_in_(x) который действительно асинхронен клоку. Логичнее всего было бы по этому сигналу запустить тактовый генератор, ну а далее следуя схеме - нативно сгенерится PCINT.
=GM=
Цитата(frz @ Mar 21 2010, 14:06) *
ATMega48 и необходимо детектировать короткие внешние импульсы(100-200нс). Тактовая частота 1МГц: можно ли для этого использовать прерывание PCINT?

Возникла идея, как расширить короткий импульс, чтобы он сработал. Нужно поставить таймер2 в асинхронный режим, записать в него 0хFF и подать короткий импульс на TOSC1. Таймер асинхронно сработает от фронта импульса, возникнет переполнение и проц на него отреагирует обычным образом. Идею сам не проверял, но противопоказаний простым глазом не вижу.
=GM=
Цитата(defunct @ Mar 22 2010, 04:16) *
если придерживаться схемы figure 11-1 Pin Change Interrupt Timing, то без тактирования PCIF не установится никогда, и прерывание не произойдет

Если придерживаться схемы, то непонятно, как отслеживаются фронты 1-0. Вывод: схема не совсем адекватная.
frz
Цитата(=GM= @ Mar 26 2010, 22:18) *
Возникла идея, как расширить короткий импульс, чтобы он сработал. Нужно поставить таймер2 в асинхронный режим, записать в него 0хFF и подать короткий импульс на TOSC1. Таймер асинхронно сработает от фронта импульса, возникнет переполнение и проц на него отреагирует обычным образом. Идею сам не проверял, но противопоказаний простым глазом не вижу.

Асинхронник занят своим делом.. Сама проблема неочень актуальна - внешний транзистор + кондёр+ подтягивающий резистор= надёжная генерация прерывания + защита контроллера от неприятностей на линии.
Просто было интересно как именно оно детектируется - всёже асинхронно или синхронно, было неочень понятно из датащита.
Александр Куличок
Цитата
Возникла идея, как расширить короткий импульс, чтобы он сработал. Нужно поставить таймер2 в асинхронный режим, записать в него 0хFF и подать короткий импульс на TOSC1. Таймер асинхронно сработает от фронта импульса, возникнет переполнение и проц на него отреагирует обычным образом. Идею сам не проверял, но противопоказаний простым глазом не вижу.

Возникнут проблемы с переходом в асинхронный режим. Так как после установки бита AS2, данные в регистры таймера пишутся асинхронным клоком. Кроме того, после возникновения условий прерывания (переполнения тснт), процесс пробуждения контроллера начинается только со следующего такта (асинхронного)
=GM=
Процесс пробуждения здесь ни при чём, необходимо детектировать импульсы много короче импульсов тактовой частоты.

Для детектирования импульса достаточно дождаться изменения содержимого TCNT2.
Александр Куличок
Цитата
Процесс пробуждения здесь ни при чём

Это меня увели в сторону рассуждения про выход из Power down по PCINT.

И все же, проблема с переходом в асинхронный режим остается. Ведь для обновления регистров таймера2 (TCNT2, OCR2 и TCCR2) нужно будет подать на TOSC1 как минимум 2 фронта.
=GM=
С чего бы?
ILYAUL
Цитата(=GM= @ Apr 19 2010, 00:13) *
С чего бы?

При рабюте таймер счётчика в асиинхроном режиме установка флагов прерываний от него производится с тактовым сигналом процессора
Поэтому потребуется 3 такта процессора + один период тактового сигнала таймера. Поэтому состояние счётчика к моменту когда можно будет прочитать регистры изменится на 1. Т.е вместо 1 в TCNT будет 2.
=GM=
Ничего не понимаю. То пишут об обновлении регистров таймера2 TCNT2, OCR2 и TCCR2, хотя нужен только TCNT2, при чём здесь остальные регистры?
То пишут о прерываниях. Зачем там прерывания по большому счёту? Задача стоит отловить короткий импульс. Ну так, читайте регистр таймера2 в цикле, сравнивайте, есть изменения - значит поймали короткий импульс.
ILYAUL
Цитата(=GM= @ Apr 19 2010, 15:18) *
Ничего не понимаю. То пишут об обновлении регистров таймера2 TCNT2, OCR2 и TCCR2, хотя нужен только TCNT2, при чём здесь остальные регистры?
То пишут о прерываниях. Зачем там прерывания по большому счёту? Задача стоит отловить короткий импульс. Ну так, читайте регистр таймера2 в цикле, сравнивайте, есть изменения - значит поймали короткий импульс.

Написал о том , что если детектировать по прерыванию , как озаглавлен пост , то поймается только второй импульс.
=GM=
1. Там спрашивалось можно ли использовать pin change interrupt для детектирования 0.1-0.2 мкс импульсов. Ответ: для импульсов короче 2 мкс - нельзя.

2. Мною была озвучена версия, как всёж-таки на голом проце отдетектировать короткий импульс (пост #6), используя асинхронный таймер.

3. Задачка носит налёт академичности, поскольку один внешний триггер легко решает проблему.
Александр Куличок
Цитата
Ничего не понимаю. То пишут об обновлении регистров таймера2 TCNT2, OCR2 и TCCR2, хотя нужен только TCNT2, при чём здесь остальные регистры?

Я привел все регистры таймера2, которые требуют наличия внешнего такта для обновления. И нужен будет не только TCNT2, а еще и TCCR2, так как после перехода в асинхронный режим его содержимое нужно выставить заново.

Впрочем, вот 2 цитаты из даташита, которые все объясняют:
Цитата
Warning: When switching between asynchronous and synchronous clocking of Timer/Counter2, the Timer Registers TCNT2, OCR2x, and TCCR2x might be corrupted. A safe procedure for switching clock source is:
a. Disable the Timer/Counter2 interrupts by clearing OCIE2x and TOIE2.
b. Select clock source by setting AS2 as appropriate.
c. Write new values to TCNT2, OCR2x, and TCCR2x.
d. To switch to asynchronous operation: Wait for TCN2xUB, OCR2xUB, and TCR2xUB.
e. Clear the Timer/Counter2 Interrupt Flags.
f. Enable interrupts, if needed.


Цитата
When writing to one of the registers TCNT2, OCR2x, or TCCR2x, the value is transferred to a temporary register, and latched after two positive edges on TOSC1. The user should not write a new value before the contents of the temporary register have been transferred to its destination.


Цитата
То пишут о прерываниях. Зачем там прерывания по большому счёту?

По-большому счету - не нужны. Разве чтобы не пропустить пачку из 256 импульсов.Но тогда зачем писать в него FF и ждать, когда проц отреагирует обычным образом (пост#6)?
Цитата
Задачка носит налёт академичности, поскольку один внешний триггер легко решает проблему

С этим никто и не спорит, да и автору поста она никакой пользы не несет, так как таймер у него все равно занят. Просто хочется предостеречь остальных читателей, которые, возможно, возьмут этот метод на заметку.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.