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

Не Срабатывает Прерывание По Кнопке


CJIETTOU

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

Пытаюсь разобраться с прерываниями. Подключил на отладочной плате МК Atmega128, порт А на выход на светодиоды, порт Д на вход и к нему кнопки. Хочу сделать, чтобы по нажатию кнопки светодиоды меняли состояние. Весь день лазил в инете, никак не смог разобраться, почему прерывания не срабатывают :( Вот код:

#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
bool Led_ON;
ISR(INT6_vect)
{
Led_ON = true;
}
ISR(INT7_vect)
{
Led_ON = true;
}
int main(void)
{
cli();
DDRA=0xFF;
DDRE=0;
PORTE=0xFF;

EICRB |= (0<<ISC71)|(1<<ISC70)|(0<<ISC61)|(0<<ISC60);

EIMSK |=(1<<INT7) | (1<<INT6);

sei();

while(1)
{
_delay_ms(100);
if(Led_ON) PORTA = 0;
else PORTA = 0b10101010;

}
}

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

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

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

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

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

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

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

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

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

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

Не срабатывают как? Что на выходе порта А? Давай подробней, как МК себя ведет при нажатии кнопок?

на выходе порта А все значения - ноль. Светодиоды горят через один. При нажатии кнопки напряжение на входе порта E падает до нуля, светодиоды также горят через один. В EICRB пробовал разные параметры - прерывание по возрастающему фронту, по убывающему фронту. Пробовал через INT0-3 порта D с регистром EICRA - прерывание по любому изменению логического состояния, не получилось.

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

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

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

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

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

#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
bool Led_ON;
int state=0xFF;
ISR(INT6_vect)
{
state= 0b10101010;
PORTA = state;
_delay_ms(100);

}
ISR(INT7_vect)
{
state= 0b01010101;
PORTA = state;
_delay_ms(100);

}
int main(void)
{

cli();

DDRA=0xFF;

//Индикация запуска
PORTA = 0;
_delay_ms(100);
PORTA = 0xF0;
_delay_ms(100);
PORTA = 0xFF;
_delay_ms(100);

DDRE=0;

PORTE=0xFF;

EICRB |= (1<<ISC71)|(1<<ISC70)|(1<<ISC61)|(1<<ISC60);

EIMSK |=(1<<INT7) | (1<<INT6);

sei();

Led_ON = true;
while(1)
{
_delay_ms(100);

PORTA = state;

state--;

_delay_ms(100);

}
}

Прерывание поставил по высокому уровню. Прерывание срабатывает(светодиоды загораются в нужной комбинации), но после программа не возвращается в цикл. Снова происходит индикация запуска (как будто был сброс). Не могу понять в чем проблема.

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

Касаемо первого варианта кода – используй директиву "volatile" для переменной "Led_ON". Ниже рабочий вариант для WinAVR.

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdbool.h>

#define F_CPU 8000000UL

volatile bool Led_ON;

ISR(INT6_vect)
{
if (bit_is_clear(PINE,8))
{
Led_ON = true;
}
}

ISR(INT7_vect)
{
if (bit_is_clear(PINE,9))
{
Led_ON = false;
}
}

int main(void)
{
DDRA=0xFF;
DDRE=0x00;
PORTE=0xFF;

EICRB |= (1<<ISC71)|(1<<ISC70)|(1<<ISC61)|(1<<ISC60);
EIMSK |=(1<<INT7)|(1<<INT6);

sei();

for (;
{
_delay_ms(100);
if(Led_ON)
{
PORTA = 0xff;
}
else
{
PORTA = 0x00;
}
}
}

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

Касаемо первого варианта кода – используй директиву "volatile" для переменной "Led_ON". Ниже рабочий вариант для WinAVR.

Попробовал код, после срабатывания прерывания программа все равно перезапускается.

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

Ну не знаю, не знаю. По нажатию одной из кнопок на выводах порта "А" устанавливается "лог. 1", а по нажатию другой – "лог. 0 ". Вы в какой среде отслеживаете выполнение кода? В Протеусе все отлично отрабатывает.

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

Ну не знаю, не знаю. По нажатию одной из кнопок на выводах порта "А" устанавливается "лог. 1", а по нажатию другой – "лог. 0 ". Вы в какой среде отслеживаете выполнение кода? В Протеусе все отлично отрабатывает.

Я поэтому и спрашиваю, что в коде вроде ошибок нет, а работает не так как надо. Выполнение кода отслеживаю на отладочной плате STK600 микроконтроллер Atmega128

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

Дел с STK600, к сожалению не имел. Могу только высказать предположение – необходимо смотреть эл. схему и линии "RESET". Попробуйте перекинуть кнопки на другие свободные порты.

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

Дел с STK600, к сожалению не имел. Могу только высказать предположение – необходимо смотреть эл. схему и линии "RESET". Попробуйте перекинуть кнопки на другие свободные порты.

Попробовал через порт D прерывания INT0-INT1. Изменений никаких, все равно сбрасывается.

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

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

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

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

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

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

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

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

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

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

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