Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 13
  1. #1
    Новичок
    Регистрация
    14.01.2010
    Сообщений
    9
    Вес репутации
    178

    По умолчанию Клавиатура и дребезг контактов.

    Надо соорудить маленькую клавиатурку.

    Нашел пример матричной клавиатуры и библиотечки к ней, но она хороша, когда надо использовать много кнопок.
    http://www.arduino.cc/playground/Main/KeypadTutorial

    Для клавиатуры из 3х кнопок проще использовать 3 пина ардуины, на которые комутировать лог. "1" и readDigitalPin();

    Но как обстоят дела с дребезгом контактов и как определять что кнопка зажата на долгое время (как при настройке часов) и в этом случае изменять какое-то значение не плавно, а с каким-то промежутком?

  2. #2
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,379
    Вес репутации
    10

    По умолчанию Re: Клавиатура и дребезг контактов.

    Попробуй сделать с резистивными кнопками http://www.compcar.ru/forum/showthread.php?t=4640

  3. #3
    Новичок
    Регистрация
    14.01.2010
    Сообщений
    9
    Вес репутации
    178

    По умолчанию Re: Клавиатура и дребезг контактов.

    спасибо, буду иметь ввиду.

  4. #4
    Пользователь
    Регистрация
    10.03.2009
    Сообщений
    68
    Вес репутации
    200

    По умолчанию Re: Клавиатура и дребезг контактов.

    Цитата Сообщение от nevsky Посмотреть сообщение
    Но как обстоят дела с дребезгом контактов и как определять что кнопка зажата на долгое время
    Я для этих целей пользуюсь прерываниями:
    Код:
    #define sbi(port, bit) (port) |= (1 << (bit))
    #define cbi(port, bit) (port) &= ~(1 << (bit))
    
    // Ножка, на которой кнопка
    #define  BUT 1
    
    // сколько времени запущены
    volatile  unsigned long  uptime = 0;
    
    // нажата ли кнопка
    volatile byte	pressed = 0;
    
    // Через сколько секунд считать, что кнопка нажата
    #define  PRESSED  2
    
    void setup()
    {
      // поддтягиваем кнопку к +5В - т.е. кнопка между выводом BUT и землей (0В)
      digitalWrite(BUT, HIGH);
    
      TCCR1A = 0;
      // устанавливаем /8 - получается 16MHz/8
      // т.е. счетчик таймера увеличивается на одно значение каждые  
      // 0,0000005 секунд
      cbi(TCCR1B, CS12);
      sbi(TCCR1B, CS11);
      cbi(TCCR1B, CS10);
    
      // устанавливаем начальное значение счетчика в 65535 - 20000 = 45535 = 0xB1DF
      // т.е. прерывание будет раз 0.01 секунду
      // (16MHz/8/20000 - 100 раз в секунду)
      TCNT1 = 0xB1DF;
    
      // разрешаем прерывания таймера по переполнению
      sbi(TIMSK1, TOIE2);
    }
    
    ISR(TIMER1_OVF_vect)
    {
    // храним число прерываний = для 
    static  unsigned  char loop_cnt = 0; 
    
      // заново устанавливаем счетчик 
      TCNT1 = 0xB1DF;
    
      loop_cnt++;
      if (loop_cnt == 100) // секундный интервал
      {
        uptime++;
        loop_cnt = 0;
        
        // для наглядности моргаем светодиодом на 13-й ноге
        digitalWrite(13, !digitalRead(13));
        
        // проверяем, как долго нажата кнопка - если более PRESSED секунд - то устанавливаем, что нажата
    static unsigned char	tp_cnt = 0;
        if (digitalRead(BUT) == 0)
        {
            // нажата
    	tp_cnt++;
            if (tp_cnt > PRESSED)
    	{
    	    pressed = 1;
    	}
        }
        else
        {
          // отжата 
          pressed = 0;
          tp_cnt = 0;
        }
        
      }
    
    }
    
    void loop()
    {
      // тут проверяем, нажата ли кнопка более PRESSED секунд
      if (pressed)
      {
        // делаем то, что надо
      }
    }
    В данном примере кнопка считается нажатой, если её держат 2 секунды.
    Я думаю дальше понятно что и как.

    Используя uptime можно легко считать секунды - тоже тут применимо.

    Вообще существет либа для антидребезга - Debounce
    http://www.arduino.cc/en/Tutorial/Debounce
    Последний раз редактировалось AMurchick; 24.03.2010 в 18:07.
    TOYOTA CAMRY - NEXUS 7

  5. #5
    Новичок
    Регистрация
    14.01.2010
    Сообщений
    9
    Вес репутации
    178

    По умолчанию Re: Клавиатура и дребезг контактов.

    Я думал о прерываниях, но немного в другую сторону, внешнее прерывание по нажатию на кнопку.

    А прерывание по переполнению и читать нажата или нет, это хороший вариант.

    можно делать несколько интервалов

    Код:
    #define  PRESSED_ONE  1
    #define  PRESSED_TWO 2
    ...
    ...
    ...
    if (tp_cnt > PRESSED_ONE && tp_cnt < PRESSED_TWO) {
    /// Кратковременное нажатие
    }
    
    if (tp_cnt > PRESSED_TWO) {
    /// Долгое нажатие
    }
    только сократить временной интервал, не секунду, а 0.25

    Код:
    if (loop_cnt == 25)
    если надо использвать uptime, то
    Код:
    if (loop_cnt == 100) {
     uptime++;
    }
    
    if (loop_cnt == 25) {
    ...
    спасибо всем.

  6. #6
    Пользователь
    Регистрация
    10.03.2009
    Сообщений
    68
    Вес репутации
    200

    По умолчанию Re: Клавиатура и дребезг контактов.

    Цитата Сообщение от nevsky Посмотреть сообщение
    Я думал о прерываниях, но немного в другую сторону, внешнее прерывание по нажатию на кнопку.
    Я тоже по началу так думал.
    Но дребезг контактов будет порождать кучу прерываний.
    Так что работу по прерыванию таймера с клавиатурой - эту идею я вынес ("спёр") очень давно, когда отладчиком шарился в ПЗУ Ямахи MSX2 году эдак в 91-м ))
    TOYOTA CAMRY - NEXUS 7

  7. #7
    Пользователь
    Регистрация
    05.03.2009
    Сообщений
    29
    Вес репутации
    192

    По умолчанию Re: Клавиатура и дребезг контактов.

    Получается для того что бы исключить дребезг надо делать задержки по времени, не проще ли применять бездребезговые кнопки или они не нашего формата будут?

  8. #8
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,379
    Вес репутации
    10

    По умолчанию Re: Клавиатура и дребезг контактов.

    Получается для того что бы исключить дребезг надо делать задержки по времени, не проще ли применять бездребезговые кнопки или они не нашего формата будут?
    Тогда наверно проще использовать конденсатор параллельно кнопке.

  9. #9
    Пользователь
    Регистрация
    05.03.2009
    Сообщений
    29
    Вес репутации
    192

    По умолчанию Re: Клавиатура и дребезг контактов.

    Цитата Сообщение от Chip Посмотреть сообщение
    Тогда наверно проще использовать конденсатор параллельно кнопке.
    Кроме конденсатора можно использовать RS-триггер или библиотеку Bounce. Программный способ не удобен задержками в реакции.

  10. #10
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,379
    Вес репутации
    10

    По умолчанию Re: Клавиатура и дребезг контактов.

    Цитата Сообщение от Азимут Посмотреть сообщение
    Кроме конденсатора можно использовать RS-триггер или библиотеку Bounce. Программный способ не удобен задержками в реакции.
    Если RS-триггер проще в реализации чем конденсатор, то можно и его использовать

Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •