Матричная клавиатура

Тема в разделе "Микроконтроллеры AVR", создана пользователем Aleksander1997, 11 мар 2018.

  1. Не секрет, флэша 484 bytes, ОЗУ 5 bytes
    К вечеру освобожусь, подумаю как упростить код
     
  2. parovoZZ

    parovoZZ Гуру

    Для простого опроса кнопок многовато будет. Зачем делать защиту от дребезга, если опрос идет по таймеру? Не хватает 10 мс, увеличивай период опроса. 100 Гц человек все равно не выжмет))
     
  3. mcureenab

    mcureenab Гуру

    Как учебное упражнение сойдёт.
    Но технически опрашивать сначала пины, сохранять результат в буфер, а потом опрашивать буфер как то через чур. Можно же сразу опрашивать пины и возвращать результат. А если функция опроса вызывается слишком часто, пропускать внеочередные вызовы.
    Ну будет период опроса плавать немного. Да и фиг с ним.
     
  4. parovoZZ

    parovoZZ Гуру

    Я бы через CASE сделал. А внутри уже проверка на длительность. Заодно и множественное нажатие можно отработать.
     
  5. mcureenab, можете подробнее объяснить как это реализовать
     
  6. Просто по другому в голове не укладывается, только так
    1 Вызов прерывания каждые допустим 100 мс
    2 В обработчике прерывания проверка нажатия
    3 как только закончилась проверка запрет прерывания
    4 Сохранение в переменную буфер
    5 Разрешение прерывания
    6 В бесконечном цикле (можно case, можно if) сравнение с буфером
     
  7. mcureenab

    mcureenab Гуру

    Вызов Scan() разместить в начале функции BtnGet .
    А чтобы Scan() не выполнялся слишком часто добавить условие вызова по времени

    Код (C++):

    unsigned long now_ms = millis();
    static unsigned long last_ms = now_ms;
    if ( 100 < now_ms - last_ms ) // Не раньше чем через 100 мс
    {
        last_ms = now_ms;
        Scan();
    }
    Прерывывание по таймеру удалить,

    Регулярно вызывать BtnGet. Это сейчас и так происходит.
     
  8. Спасибо
     
  9. parovoZZ

    parovoZZ Гуру

    millis() - это что? В стандартной поставке AVR GCC нет такой функции.
     
  10. a1000

    a1000 Гик

    millis() - возвращает количество миллисекунд с момента начала выполнения текущей программы на плате Arduino. Это количество сбрасывается на ноль, в следствие переполнения значения, приблизительно через 50 дней.
     
  11. mcureenab

    mcureenab Гуру

    Есть несколько реализаций этой функции для AVR. В данном случае можно не мс определять, а только тики таймера. Или даже не связываться с таймером а считать количество вызовов функции BtnGet. В данном случае BtnGet вызывается достаточно регулярно чтобы поддерживать более-менее стабильную частоту вызова Scan().
     
  12. parovoZZ

    parovoZZ Гуру

    к тому же 50 дней - это 4 байта в минус из оперативы на какую-то ненужную шляпу.