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

Как правильно подключать кнопки к AVR

Добавлено: Пн апр 06, 2009 09:52:20
cvid
Поискал на форуме - много разрозненного материала, причём одно, порой, противоречит другому. Вот и пришлось открыть новую тему. А вопрос простой: "Как правильно подключать кнопки к AVR?". Хочется узнать мнение специалистов.

P.S. : недавно возникла потребность подоткнуть к уже готовому девайсу пару кнопок. Весь код приводить не буду, но вообщем, последовательность действий такая:

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

	//Обработка кнопки menu
	
      if ((PIND & (1 << PD0)) == 0)      //Фиксирует нажатие
      {
        _delay_ms(70);        //Устранение "дребезга клавиш"
        if ((PIND & (1 << PD0)) == 0)    //Проверяет нажатие
        {
          MenuPressed = true;  //Устанавливает флаг "кнопка нажата"
        }
      }    
    
	
	//----------------------------------------------------//
И что самое интересное, при множественных быстрых нажатиях на кнопку возникает сброс МК. Что это вообще может быть и с чем это есть?

Добавлено: Пн апр 06, 2009 10:00:45
ikarab
Я советую через резистор 300 ом если кнопки на землю или на питание ногу замыкают. Ну и подтяги в соответствующую сторону.

Добавлено: Пн апр 06, 2009 10:09:29
GP1
ИМХО фиксировать надо не факт нажатия, а факт отпускания кнопки и ес-но подтяжку как говорил предыдущий оратор.

Добавлено: Пн апр 06, 2009 10:26:43
ARV
дребезг подавляется задержкой от 10 до 20 мс - многочисленная статистика утверждает, что "нормальный" контакт перестает дребезжать за это время однозначно.

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

Добавлено: Пн апр 06, 2009 13:25:10
Vov123
Ну,допустим вот так
Делаете подтяжку на вход порта,допустим порт PORTB(на выводе порта присутствует 5 вольт)
К выводу,допустим 0,подключаем кнопку,второй конец кнопки подсоеденяем на землю.
#include <delay>//подключаем библиотеку задержек
void main(void)
{
DDRB=0x00;//порт на вход
PORTB=0xFF;//подтяжка включена
while(1)
{
if(!PINB.0)++a;//нажали на кнопку?(соединили порт с землёй)сделали какое-то действие
delay_ms(200);//ждём когда улягутся контакты(подбираем эксперементально)
if(!PINB.0){};//пока кнопка остаётся нажата выполняется пустой цикл
delay_ms(200);//кнопку отжали?ждём когда успокоятся контакты.
};
}

Добавлено: Пн апр 06, 2009 19:59:21
cvid
1. watchdog не использую (выключен)
2. подтянул через резистор 4к7 на "+"

Ошибку нашёл: вместо 22нф вфигачил параллельно кнопке 0.1мкФ!!! :shock:
Решение: выдрал нафиг - естественно помогло

Всем спасибо.