AndreyVN 0 9 января, 2018 Опубликовано 9 января, 2018 · Жалоба Всем привет! Не могу запустить внешнее прерывание Atmega64 int0 по низкому уровню. По фронту- работает, по спаду - работает т.е. аппаратная часть и настройки регистров в порядке. Что может быть не так при работе от низкого уровня? Еще ниже надо?! :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
АлександрК 0 9 января, 2018 Опубликовано 9 января, 2018 · Жалоба Какой длительности уровень? Прерывание по низкому уровню генерируется тогда, когда уровень удерживается достаточно долго, чтобы МК перешел к обработке прерывания. МК может быть занят обработкой другого прерывания. И когда МК освободится, то уровень может уже измениться и прерывание будет пропущено. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndreyVN 0 9 января, 2018 Опубликовано 9 января, 2018 · Жалоба Какой длительности уровень? Прерывание по низкому уровню генерируется тогда, когда уровень удерживается достаточно долго, чтобы МК перешел к обработке прерывания. МК может быть занят обработкой другого прерывания. И когда МК освободится, то уровень может уже измениться и прерывание будет пропущено. Да, это я видел в даташите, у меня низкий уровень висит непрерывно. В моем случае АЦП, которое запрашивает прерывание и МК - разные устройства. АЦП запросил прерывание и повис в нуле, МК мог быть выключен, МК включили, он увидел внешнее IRQ получасовой давности и приступил к обработке. Если пользоваться перепадами - возникает зависон в момент включения. В даташите есть что-то невнятное о наличии тактирования для прерывания от постоянного уровня. Какое тактирование? Тактовый генератор самого МК? У меня он работает непрерывно, МК не спит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
АлександрК 0 9 января, 2018 Опубликовано 9 января, 2018 · Жалоба В даташите есть что-то невнятное о наличии тактирования для прерывания от постоянного уровня. Где написано? Приведите цитату. Если прерывание не запускается при включении питания, то, может быть, вновь сбросить биты ISC300 ISC301 в регистре EICRA (хотя при включении они и так должны быть сброшены), сбросить флаг и разрешить прерывание? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndreyVN 0 10 января, 2018 Опубликовано 10 января, 2018 · Жалоба Где написано? Приведите цитату. Если прерывание не запускается при включении питания, то, может быть, вновь сбросить биты 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"). Не отработана пока версия о том, что летящие подряд прерывания блокируют фоновую программу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
АлександрК 0 10 января, 2018 Опубликовано 10 января, 2018 · Жалоба Не отработана пока версия о том, что летящие подряд прерывания блокируют фоновую программу. Если есть сомнения, то нужно набросать простую программку, обрабатывающую только INT0 (и больше НИКАКОГО кода), и, при обработке прерывания, "мигающая светодиодом". Убедиться в том, что INT0 запускается нормально, что МК исправен, какие регистры и как нужно установить и т.д., а потом можно разобраться с "летящими подряд прерываниями". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PeterD 0 10 января, 2018 Опубликовано 10 января, 2018 (изменено) · Жалоба Не отработана пока версия о том, что летящие подряд прерывания блокируют фоновую программу. Возможно вы просто висите в прерывании по низкому уровню т.к. событие непрерывное.... Изменено 10 января, 2018 пользователем PeterD Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndreyVN 0 10 января, 2018 Опубликовано 10 января, 2018 · Жалоба Возможно вы просто висите в прерывании по низкому уровню т.к. событие непрерывное.... Да, проверил, прерывание по низкому уровню благополучно генерится, "косяк" в обработке. Спасибо за обсуждение! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg1978 1 11 января, 2018 Опубликовано 11 января, 2018 · Жалоба Делать прерывание все-таки по фронту. Если вы предполагаете ситуацию, когда МК включили при низком уровне на внешнем прерывании, тогда да, обработки не будет, так как нужна смена сигнала. Этот момент тоже легко решается. Проверкой пина внешнего прерывания. Если низкий уровень, считываем данные, после этого АЦП перезапустится и программа будет штатно работать от внешнего прерывания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться