МК Атмега8 не реагирует на нажатие кнопок

Обсуждаем контроллеры компании Atmel.
Ответить
valera0141
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вс мар 08, 2015 20:32:35

МК Атмега8 не реагирует на нажатие кнопок

Сообщение valera0141 »

Подскажите пожалуйста. Написал тестовую прошивку в CVAVR. К мк подключены 2 кнопки (порт D1 и D7) и светодиоды к оставшимся портам. Светодиоды горят все (работают как надо), а на кнопки ни как не реагирует. Пробовал кнопку на плюс и наминус кидать с подтягиваюшим резистом и без.
Спойлер#define led13 PORTD.5
#define led14 PORTD.6
#define led15 PORTB.0
#define led16 PORTB.2
#define led17 PORTB.1
#define led18 PORTB.3
#define led19 PORTB.4
#define led20 PORTB.5

#define button1 PIND.7
#define button2 PIND.1

void fullLedDeactive ()
{
led1=0;led2=0;led3=0;led4=0;led5=0;led6=0;led7=0;led8=0;led9=0;led10=0;led11=0;led12=0;led13=0;led14=0;led15=0;led16=0;led17=0;led18=0;led19=0;led20=0;
}

void fullLedActive ()
{
led1=1;led2=1;led3=1;led4=1;led5=1;led6=1;led7=1;led8=1;led9=1;led10=1;led11=1;led12=1;led13=1;led14=1;led15=1;led16=1;led17=1;led18=1;led19=1;led20=1;
}

void main(void)
{
DDRB = 0b11111111;
DDRC = 0b1111111;
DDRD = 0b01111101;

PORTD.7 = 1;
PORTD.1 = 1;

while (1)
{
if (button1 == 0 & button2 != 0)
{
effect--;
if (effect < 0)
effect = 0;
}
else if (button1 != 0 & button2 == 0)
{
effect++;
if (effect > 2)
effect = 2;
}
else if (button1 == 0 & button2 == 0)
{
effect=2;
}
else
{
if (effect == 0)
{
fullLedActive();
}
if (effect == 1)
{
fullLedDeactive();
}
if (effect == 2)
{
fullLedActive();
delay_ms(100);
fullLedDeactive();
delay_ms(100);
}
}
}
}
Реклама
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: МК Атмега8 не реагирует на нажатие кнопок

Сообщение Z_h_e »

Поглядите про & и &&.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
valera0141
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вс мар 08, 2015 20:32:35

Re: МК Атмега8 не реагирует на нажатие кнопок

Сообщение valera0141 »

Z_h_e писал(а):Поглядите про & и &&.
Пробовал дажет так if (button1 == 0), но тоже не реагирует
codenamehawk
Вымогатель припоя
Сообщения: 528
Зарегистрирован: Вт фев 09, 2010 17:52:26

Re: МК Атмега8 не реагирует на нажатие кнопок

Сообщение codenamehawk »

Схему покажите. Похоже не хватает подтягивающего резистора.
Реклама
Эиком - электронные компоненты и радиодетали
valera0141
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вс мар 08, 2015 20:32:35

Re: МК Атмега8 не реагирует на нажатие кнопок

Сообщение valera0141 »

codenamehawk писал(а):Схему покажите. Похоже не хватает подтягивающего резистора.
Собрано по этой схеме, подтягивающие резисторы стоят на 10к.
Изображение
Реклама
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: МК Атмега8 не реагирует на нажатие кнопок

Сообщение pyzhman »

...
Docendo discimus
Реклама
codenamehawk
Вымогатель припоя
Сообщения: 528
Зарегистрирован: Вт фев 09, 2010 17:52:26

Re: МК Атмега8 не реагирует на нажатие кнопок

Сообщение codenamehawk »

Сократите программу до одной кнопки и одного светодиода, должно работать.
Да и протеус справится с такой схемой.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: МК Атмега8 не реагирует на нажатие кнопок

Сообщение Demiurg »

При включении кнопки:
По схеме общий плюс (один вывод кнопки на плюс, второй на пин МК, один вывод резистора на пин МК, второй на минус). Активный сигнал - единица.

Код: Выделить всё

#define KEY_1 0
#define KEY_1_PIN PIND

if (KEY_1_PIN & (1<<KEY_1) == 1)
// if (KEY_1_PIN & (1<<KEY_1)) // аналогично
// действие, если кнопка нажата.

if (KEY_1_PIN & (1<<KEY_1) == 0)
//if (!(KEY_1_PIN & (1<<KEY_1))) // аналогично
// действие, если кнопка отжата.
По схеме общий минус (один вывод кнопки на минус, второй на пин МК, один вывод резистора на пин МК, второй на плюс питания). Активный сигнал - ноль.

Код: Выделить всё

if (KEY_1_PIN & (1<<KEY_1) == 1)
// if (KEY_1_PIN & (1<<KEY_1)) // аналогично
// действие, если кнопка отжата.

if (KEY_1_PIN & (1<<KEY_1) == 0)
//if (!(KEY_1_PIN & (1<<KEY_1))) // аналогично
// действие, если кнопка нажата.

Код: Выделить всё

//==================
#define set_bit(reg, bit)  reg |= (1<<(bit))    // Установка бита.
#define clr_bit(reg, bit)	reg &= (~(1<<(bit))) // Сброс бита.
#define switch_bit(reg, bit)  reg ^= (1<<(bit)) // Переключение бита.
//------------------------------------------------------------------------
#define check_bit(reg, bit) (reg & (1<<bit))    // Проверка бита.
//==================

//==================
//#define KEY1_PRESSED() ((KEYS1_PIN & (1<<BIT_KEY1) == 0)
//#define KEY1_UNPRESSED() ((KEYS1_PIN & (1<<BIT_KEY1) == 1)

#define Set_Is_Key_Esc_Pressed()   !(check_bit (KEY_ESC_PIN,   KEY_ESC))   // Low level.
#define Set_Is_Key_Enter_Pressed() !(check_bit (KEY_ENTER_PIN, KEY_ENTER)) // Low level.
#define Set_Is_Key_Minus_Pressed() !(check_bit (KEY_PLUS_PIN, KEY_MINUS))  // Low level.
#define Set_Is_Key_Plus_Pressed()  !(check_bit (KEY_MINUS_PIN, KEY_PLUS))  // Low level.

//#define Set_Is_Key_Esc_Pressed()   check_bit (KEY_ESC_PIN,   KEY_ESC)   // High level.
//#define Set_Is_Key_Enter_Pressed() check_bit (KEY_ENTER_PIN, KEY_ENTER) // High level.
//#define Set_Is_Key_Minus_Pressed() check_bit (KEY_PLUS_PIN, KEY_MINUS)  // High level.
//#define Set_Is_Key_Plus_Pressed()  check_bit (KEY_MINUS_PIN, KEY_PLUS)  // High level.

// При работе с буфером входов (расширение ввода-вывода):
// #define Set_Is_Key_Stop_Pressed()   check_bit (inputs_buf [0], KEY_STOP)
//==================
Аватара пользователя
sporeon
Открыл глаза
Сообщения: 52
Зарегистрирован: Вс фев 20, 2011 21:05:17
Контактная информация:

Re: МК Атмега8 не реагирует на нажатие кнопок

Сообщение sporeon »

Demiurg писал(а):При включении кнопки:
По схеме общий плюс (один вывод кнопки на плюс, второй на пин МК, один вывод резистора на пин МК, второй на минус). Активный сигнал - единица.

Код: Выделить всё

#define KEY_1 0
#define KEY_1_PIN PIND

if (KEY_1_PIN & (1<<KEY_1) == 1)
// if (KEY_1_PIN & (1<<KEY_1)) // аналогично
// действие, если кнопка нажата.

if (KEY_1_PIN & (1<<KEY_1) == 0)
//if (!(KEY_1_PIN & (1<<KEY_1))) // аналогично
// действие, если кнопка отжата.
Товарищ на кодвижне пишет, там не нужно заморачиваться с битовыми операциями.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: МК Атмега8 не реагирует на нажатие кнопок

Сообщение Demiurg »

Я не писал на кодевижне, но не думаю, что там не скомпилируется этот код.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: МК Атмега8 не реагирует на нажатие кнопок

Сообщение COKPOWEHEU »

я бы все-таки рекомендовал пользоваться такой платформо-зависимой экзотикой по минимуму.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: МК Атмега8 не реагирует на нажатие кнопок

Сообщение Demiurg »

AVR-Studio, AVR Toolchain - компилируется без проблем.
Ответить

Вернуться в «AVR»