Перейти к содержанию
    

Внешнее прерывание Atmega64

Всем привет!

 

Не могу запустить внешнее прерывание Atmega64 int0 по низкому уровню.

По фронту- работает, по спаду - работает т.е. аппаратная часть и настройки регистров в порядке.

 

Что может быть не так при работе от низкого уровня? Еще ниже надо?! :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какой длительности уровень?

Прерывание по низкому уровню генерируется тогда, когда уровень удерживается достаточно долго, чтобы МК перешел к обработке прерывания. МК может быть занят обработкой другого прерывания. И когда МК освободится, то уровень может уже измениться и прерывание будет пропущено.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какой длительности уровень?

Прерывание по низкому уровню генерируется тогда, когда уровень удерживается достаточно долго, чтобы МК перешел к обработке прерывания. МК может быть занят обработкой другого прерывания. И когда МК освободится, то уровень может уже измениться и прерывание будет пропущено.

 

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

 

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

он увидел внешнее IRQ получасовой давности и приступил к обработке. Если пользоваться перепадами - возникает зависон в момент включения.

 

В даташите есть что-то невнятное о наличии тактирования для прерывания от постоянного уровня. Какое тактирование? Тактовый генератор самого МК?

У меня он работает непрерывно, МК не спит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В даташите есть что-то невнятное о наличии тактирования для прерывания от постоянного уровня.

Где написано? Приведите цитату.

Если прерывание не запускается при включении питания, то, может быть, вновь сбросить биты ISC300 ISC301 в регистре EICRA (хотя при включении они и так должны быть сброшены), сбросить флаг и разрешить прерывание?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Где написано? Приведите цитату.

Если прерывание не запускается при включении питания, то, может быть, вновь сбросить биты 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").

 

Не отработана пока версия о том, что летящие подряд прерывания блокируют фоновую программу.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не отработана пока версия о том, что летящие подряд прерывания блокируют фоновую программу.

Если есть сомнения, то нужно набросать простую программку, обрабатывающую только INT0 (и больше НИКАКОГО кода), и, при обработке прерывания, "мигающая светодиодом". Убедиться в том, что INT0 запускается нормально, что МК исправен, какие регистры и как нужно установить и т.д., а потом можно разобраться с "летящими подряд прерываниями".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не отработана пока версия о том, что летящие подряд прерывания блокируют фоновую программу.

Возможно вы просто висите в прерывании по низкому уровню т.к. событие непрерывное....

Изменено пользователем PeterD

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно вы просто висите в прерывании по низкому уровню т.к. событие непрерывное....

 

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

 

Спасибо за обсуждение!

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...