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

Прерывания по любому фронту


DrobyshevAlex

Рекомендуемые сообщения

Почитал несколько статей по прерываниям, но ответа не нашел :)

Суть примерно следущая. мк Attiny2313. Две кнопки на INT0 и INT1. Включаю прерывания по смене лог уровня

Цитата

0 1 Any logical change on INT1 generates an interrupt request.

MCUCR |= (1 << ISC10) | (1 << ISC00);

GIMSK |= (1 << INT1) | (1 << INT0);

Прерывание срабатывает только по одному фронту. Если я подтягиваю к +5 и кнопка подает 0, прерывание срабатывает, но когда я отпускаю кнопку не срабатывает, не меняя прошивку, я подтягиваю на 0 ногу мк, а кнопка пропускает +5 - прерывание тоже срабатывает. То есть да, по любому уровню срабатывает :) Но я бы хотел что бы я мог отследить и нажатие и отпускание кнопки.

На всякий случай пробовал сбросить ISC11 и ISC01 - результата нет.

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

Я могу как то отследить нажатие кнопки прерыванием и отпускание?

Я конечно могу в основном цикле мониторить отпущена ли кнопка, но как то это дико))

 

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

2 часа назад, DrobyshevAlex сказал:

Почитал несколько статей по прерываниям, но ответа не нашел ...

Вы ещё одна жертва "поверхностного программирования" :)

Читать надо даташиты. Там английским по белому написано, как настраиваются регистры управления прерываниями и что можно получить, а что - нет. Читайте. Экономит массу времени, а подобные вопросы вообще не возникают.

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

3 часа назад, DrobyshevAlex сказал:

Прерывание срабатывает только по одному фронту

этого не может быть

#include <avr/io.h>
#include <avr/interrupt.h>

ISR (INT0_vect){
PORTB ^= (1<<PB0);
}

int main(void)
{
	DDRB |= (1<<PB0);
	PORTD |= (1<<PD2); 
	MCUCR |= (1<<ISC00); // внешнее прерывание int0 по любому изменению уровня
	GIMSK |= (1<<INT0);
	GIFR |= (1<<ISC00);
	sei(); 
   
    while (1);
}

прижимаем int0 к земле - на PB0 лог.1

отжимаем - на PB0 лог.0

PB0 применил для наглядности, а так просто флаг заводим и все. кнопка нажата (прижата к земле) flag_butt будет равен 1, если отжата flag_butt=0

uint8_t flag_butt;

ISR (INT0_vect){
	flag_butt ^= (1<<0);
}

 

Изменено пользователем Berg
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Так я так и проверяю, тоже для наглядности вывод на ноге мк меняю. нажал он сменился бросил - нет :) Нажал еще раз опять сменился.

Настройки я показал выше, с даташита брал.

Единственная разница в том что я GIFR (В данном случае по даташиту это EIFR как я понял) не трогал. Я так понял из даташита, это само ставится при наступлении события и очищается при вызове прерывания. То есть это имеет смысл если не использовать ISR а обрабатывать в цикле или если надо сбросить флаг прерывания не из этого прерывания)

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

12 часа назад, DrobyshevAlex сказал:

Я могу как то отследить нажатие кнопки прерыванием и отпускание?

Конечно можете!

но время считать все равно придется:

если вы настроите прерывание на ноге на которой кнопка на фронт(любой), вы в этом прерывании должны будете это-же прерывание запретить на время чуть больше чем максимальное время дребезга, И

запустить таймер на это "время чуть больше чем максимальное время дребезга", И

в этом прерывании таймера считать значение кнопки (ноги) для дальнейшего использования - зафиксировать нажатие - или ложное срабатывание если уровень не изменился от предыдущего(!), И(обязательно!)

вновь разрешить прерывание на кнопке-ноге, а таймер соответственно запретить или выключить!

 

Это понятно, несколько сложнее чем просто:

Запустите таймер на 10мс и в прерывании от него опрашивайте кнопки.

Но экономит процессорное время, правда совсем чуть-чуть, Главное же в том что нет постоянных прерываний от неактивной кнопки, которые могут стать причиной разных плохо прогнозируемых побочных эффектов!

Изменено пользователем ruhi
дополнение

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

Да я понимаю все это. Я делал уже это года три назад и прекрасно работало, но сейчас решил опять заняться, у меня не осталось исходников прошлых. Дело в том что я вроде делаю все верно, но в протиусе нет дребезга, я даже конденсаторы цеплял на всякий случай) Я создал тему так как несколько часов убил безрезультатно, думаю может я что то упускаю в каком то регистре. 

Эх... форум все же помогает)) Вот вставил сюда кусок кода, и увидел где моя ошибка. При чем вчера выше я написал без ошибки, а в коде ошибка

MCUSR |= (1 << ISC00) | (1 << ISC10);

Всем спасибо! Все работает!

Изменено пользователем DrobyshevAlex
Ссылка на комментарий
Поделиться на другие сайты

В протеусе. В железе и так работало я писал) Я просто вчера ночью в одной букве региста опечатался когда писал прошивку так как прошлая канула в лету с винчестером)

Изменено пользователем DrobyshevAlex
Ссылка на комментарий
Поделиться на другие сайты

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...