Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Внешнее прерывание Atmega64
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
AndreyVN
Всем привет!

Не могу запустить внешнее прерывание Atmega64 int0 по низкому уровню.
По фронту- работает, по спаду - работает т.е. аппаратная часть и настройки регистров в порядке.

Что может быть не так при работе от низкого уровня? Еще ниже надо?! :-)
Александр1
Какой длительности уровень?
Прерывание по низкому уровню генерируется тогда, когда уровень удерживается достаточно долго, чтобы МК перешел к обработке прерывания. МК может быть занят обработкой другого прерывания. И когда МК освободится, то уровень может уже измениться и прерывание будет пропущено.
AndreyVN
Цитата(Александр1 @ Jan 9 2018, 16:25) *
Какой длительности уровень?
Прерывание по низкому уровню генерируется тогда, когда уровень удерживается достаточно долго, чтобы МК перешел к обработке прерывания. МК может быть занят обработкой другого прерывания. И когда МК освободится, то уровень может уже измениться и прерывание будет пропущено.


Да, это я видел в даташите, у меня низкий уровень висит непрерывно.

В моем случае АЦП, которое запрашивает прерывание и МК - разные устройства. АЦП запросил прерывание и повис в нуле, МК мог быть выключен, МК включили,
он увидел внешнее IRQ получасовой давности и приступил к обработке. Если пользоваться перепадами - возникает зависон в момент включения.

В даташите есть что-то невнятное о наличии тактирования для прерывания от постоянного уровня. Какое тактирование? Тактовый генератор самого МК?
У меня он работает непрерывно, МК не спит.
Александр1
Цитата(AndreyVN @ Jan 9 2018, 16:40) *
В даташите есть что-то невнятное о наличии тактирования для прерывания от постоянного уровня.

Где написано? Приведите цитату.
Если прерывание не запускается при включении питания, то, может быть, вновь сбросить биты ISC300 ISC301 в регистре EICRA (хотя при включении они и так должны быть сброшены), сбросить флаг и разрешить прерывание?
AndreyVN
Цитата(Александр1 @ Jan 9 2018, 16:55) *
Где написано? Приведите цитату.
Если прерывание не запускается при включении питания, то, может быть, вновь сбросить биты ISC300 ISC301 в регистре EICRA (хотя при включении они и так должны быть сброшены), сбросить флаг и разрешить прерывание?


Пардон, это касается как раз перепадов.
Note that recognition of falling or rising edge interrupts on INT7:4 requires the presence of an I/O clock, described in “Clock Systems and their Distribution” on page 37.

Пересадил Int0 на Int1 - такая же картина, по спаду - работает, по низкому уровню - нет.

Инициализация прерывания производится не сразу, там много кода, инициализируются LCD экран, таймеры, карта памяти, только потом очередь доходит
до внешних IRQ и долгожданного asm("SEI").

Не отработана пока версия о том, что летящие подряд прерывания блокируют фоновую программу.
Александр1
Цитата(AndreyVN @ Jan 10 2018, 09:10) *
Не отработана пока версия о том, что летящие подряд прерывания блокируют фоновую программу.

Если есть сомнения, то нужно набросать простую программку, обрабатывающую только INT0 (и больше НИКАКОГО кода), и, при обработке прерывания, "мигающая светодиодом". Убедиться в том, что INT0 запускается нормально, что МК исправен, какие регистры и как нужно установить и т.д., а потом можно разобраться с "летящими подряд прерываниями".
PeterD
Цитата(AndreyVN @ Jan 10 2018, 09:10) *
Не отработана пока версия о том, что летящие подряд прерывания блокируют фоновую программу.

Возможно вы просто висите в прерывании по низкому уровню т.к. событие непрерывное....
AndreyVN
Цитата(PeterD @ Jan 10 2018, 11:23) *
Возможно вы просто висите в прерывании по низкому уровню т.к. событие непрерывное....


Да, проверил, прерывание по низкому уровню благополучно генерится, "косяк" в обработке.

Спасибо за обсуждение!
demiurg1978
Делать прерывание все-таки по фронту. Если вы предполагаете ситуацию, когда МК включили при низком уровне на внешнем прерывании, тогда да, обработки не будет, так как нужна смена сигнала. Этот момент тоже легко решается. Проверкой пина внешнего прерывания. Если низкий уровень, считываем данные, после этого АЦП перезапустится и программа будет штатно работать от внешнего прерывания.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.