Страница 1 из 1

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

Добавлено: Сб янв 21, 2017 15:07:51
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);
}
}
}
}

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

Добавлено: Сб янв 21, 2017 15:28:03
Z_h_e
Поглядите про & и &&.

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

Добавлено: Сб янв 21, 2017 15:31:02
valera0141
Z_h_e писал(а):Поглядите про & и &&.
Пробовал дажет так if (button1 == 0), но тоже не реагирует

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

Добавлено: Сб янв 21, 2017 17:58:49
codenamehawk
Схему покажите. Похоже не хватает подтягивающего резистора.

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

Добавлено: Сб янв 21, 2017 19:19:53
valera0141
codenamehawk писал(а):Схему покажите. Похоже не хватает подтягивающего резистора.
Собрано по этой схеме, подтягивающие резисторы стоят на 10к.
Изображение

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

Добавлено: Сб янв 21, 2017 19:48:21
pyzhman
...

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

Добавлено: Вс янв 22, 2017 13:48:31
codenamehawk
Сократите программу до одной кнопки и одного светодиода, должно работать.
Да и протеус справится с такой схемой.

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

Добавлено: Вс янв 22, 2017 17:34:36
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)
//==================

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

Добавлено: Вс янв 22, 2017 18:22:22
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))) // аналогично
// действие, если кнопка отжата.
Товарищ на кодвижне пишет, там не нужно заморачиваться с битовыми операциями.

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

Добавлено: Вс янв 22, 2017 18:26:53
Demiurg
Я не писал на кодевижне, но не думаю, что там не скомпилируется этот код.

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

Добавлено: Вс янв 22, 2017 18:57:02
COKPOWEHEU
я бы все-таки рекомендовал пользоваться такой платформо-зависимой экзотикой по минимуму.

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

Добавлено: Вс янв 22, 2017 19:04:30
Demiurg
AVR-Studio, AVR Toolchain - компилируется без проблем.