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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
cvid
Родился
Сообщения: 9
Зарегистрирован: Вт сен 09, 2008 12:03:19

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

Сообщение cvid »

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

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

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

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

Сообщение ikarab »

Я советую через резистор 300 ом если кнопки на землю или на питание ногу замыкают. Ну и подтяги в соответствующую сторону.
Реклама
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

ИМХО фиксировать надо не факт нажатия, а факт отпускания кнопки и ес-но подтяжку как говорил предыдущий оратор.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18647
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

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

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

Мой уютный бложик... заходите!
Реклама
Эиком - электронные компоненты и радиодетали
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение 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);//кнопку отжали?ждём когда успокоятся контакты.
};
}
Реклама
cvid
Родился
Сообщения: 9
Зарегистрирован: Вт сен 09, 2008 12:03:19

Сообщение cvid »

1. watchdog не использую (выключен)
2. подтянул через резистор 4к7 на "+"

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

Всем спасибо.
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»