Обработка кнопок

Тема в разделе "Микроконтроллеры AVR", создана пользователем Valer5, 27 окт 2022.

  1. Valer5

    Valer5 Нуб

    Пробую написать программу для обработки кнопок на Си и CVAVR. Микроконтроллер Attiny2313.
    При нажатии кнопки на PD.3 включаю таймер Т0 и в переменную k1 заношу значение TCNT0.
    При отпускании кнопки останавливаю таймер и заношу в k2 следующее значение TCNT0.
    По разнице хочу определить прошедшее время, поделив разницу на период
    Код (C++):

    while (1)

      {
          // Place your code here
    if(!PIND.3)
       {
         TCCR0B=0x05 ,k1=TCNT0,PORTB=k1;
          if(PIND.3)
        { TCCR0B=0x00, k2=TCNT0;

       /* if(TCNT0==20)  { sec+=1;}
          else          {sec+=10;}*/

        }
       }
    }
    }
    При симуляции в Протеусе получаю одинаковые значения k1 и k2. Кто подскажет, почему?
     
  2. parovoZZ

    parovoZZ Гуру

    Никакими cvavr лучше не пользоваться. В ней есть фичи, которые стандартом Си не поддерживаются. После перехода на нормальную иде могут ждать необъяснимые сюрпризы.
     
    DetSimen нравится это.
  3. Valer5

    Valer5 Нуб

    Кроме cvavr ни с какими компиляторами не знаком. Овладевать новыми, увы, возраст и состояние памяти не позволяют. Да и cvavr пользуюсь несколько лет и больших непоняток не было. Были ошибки по неграмотности, поэтому и сейчас жду, может кто и намекнёт, куда смотреть. С уважением.
     
  4. parovoZZ

    parovoZZ Гуру

    Для AVR есть родная MicrochipStudio. Ничего сверхъестественного в ней нет.
     
    mednagolov нравится это.
  5. parovoZZ

    parovoZZ Гуру

    По коду - не верный алгоритм. Вторую проверку условия надо вынести в секцию else первой.
     
  6. Рокки1945

    Рокки1945 Гуру

    Как сделать обработку нефиксируемой кнопки - нажал первый раз один, нажал во второй раз ноль?
    Без прерываний....
     
  7. SergeiL

    SergeiL Оракул Модератор

    Кнопок то сколко?
     
  8. Рокки1945

    Рокки1945 Гуру

    одна кнопка без фиксации
    Алгоритм - нажал в первый раз - переменная стала TRUE
    нажал в следующий раз - переменная FALSE
    и так по кругу
     
  9. mednagolov

    mednagolov Гик

    Кроме самих нажатий нужно подумать о такой вещи как *дребезг контактов кнопки*
    Как планируите давить дребезг , апаратно или программное ?
    а это два разных кода будет.
     
  10. SergeiL

    SergeiL Оракул Модератор

    Н у я то понятно, конечно программно, и даже для одной кнопки вставил бы любимую функцию с вертикальными счетчиками.
    Зато потом, можно добавить еще 7 кнопок или входов , или смешанно. Без добавления чего либо в код, в плане обработки дребезга.
     
  11. Рокки1945

    Рокки1945 Гуру

    а можно просто логику - дребезг потом
     
  12. SergeiL

    SergeiL Оракул Модератор

    Так а в логике то какие вопросы?
    У меня есть флаг, который выставляется в 1 при нажатии; и флаг, который выставляется в 1 при отпускании.
    Если флаг перешел в 1 - делаем but=!but, и сбрасываем флаг. Флаг на отпускание тут и не нужен, можно не обрабатывать.
    Была же моя тема про устранение дребезга, там и другие варианты предлагали.
     
    Рокки1945 нравится это.
  13. Рокки1945

    Рокки1945 Гуру

    Спасибо
    Посмотреть вложение 25686 upload_2022-11-10_17-6-56.png
    upload_2022-11-11_9-18-19.png
     
    Последнее редактирование: 11 ноя 2022
  14. SergeiL

    SergeiL Оракул Модератор

    Готовый пример с устранением дребезга есть тут
     
    mednagolov и Рокки1945 нравится это.
  15. Рокки1945

    Рокки1945 Гуру

    у меня на работе в ртосе просто рс-триггер стоит - там такой хвост куча переменных - да работает - но слишком много забивать а тут всего 1 флажок
     
    Последнее редактирование: 11 ноя 2022
  16. SergeiL

    SergeiL Оракул Модератор

    а дребезг?
     
  17. Рокки1945

    Рокки1945 Гуру

    устраняется программно
     
    Последнее редактирование: 11 ноя 2022
  18. parovoZZ

    parovoZZ Гуру

    Серьёзно? Я думал дребезг можно подавить периодом опроса...Даже у самой убитой кнопки дребезг не превышает 10-12 мс. Достаточно опрашивать её раз в 20мс и всё остальное получится автоматически.
    Оказывается библиотеки нужны. Ну я и лошара.
     
    Последнее редактирование: 10 ноя 2022
  19. parovoZZ

    parovoZZ Гуру

    Код (C++):
    if (BTN)
    {
    if (oldBTN)
    {
    // какой-то код
    // взводим флаг
    // если флаг взведён, то инвертируем его
    oldBTN = false; // блокируем повторное выполнение кода, если состояние BTN не изменилось
    }
    }
    else
    {
    oldBTN = true;
    }
    сколько бы кнопку не держал, код выполнится всего один раз. Или я не понял вопроса?
     
    Рокки1945 нравится это.
  20. mednagolov

    mednagolov Гик

    Да это же какой то ЦЕРИТЕЛИзьм какой то....:confused:
    ОДНОфлагизьм - вот наше всё ...!...)))
    Код (C++):
    //строки 5,8,12,нужны только для наглядности примера


    const int bip = 5 ;       // ПИПИКАЛКА подключен к D5  
    const int but_plus = 2;      // кнопка +
    boolean flag = false;      // флаг кнопки плюс
    int Tmax=35;   // НУ пусть будет - условная максимальная температура
    //
    void setup() {//****
    pinMode(but_plus,INPUT);   // пин кнопки плюс
    pinMode(bip,OUTPUT);      //пин на ПИПИКАЛКУ
        }//****
    //
    void loop() {//**
    // обработка кнопок
    // опрос кнопка плюс конечно в теле цикла таймера на милис  ...
      if (digitalRead(but_plus) ==0 && flag == false){ flag=true;tone(bip,1300,200); }
    if (digitalRead(but_plus) ==1) { flag=false; }
    //тут куча всякого нужного кода
    //
    //тут неожидано нужно что то выполнить по нажатию кнопки +
    if(flag==true){Tmax++;delay(500); }   //автоповтор 500
    //
    // и увсё!
    //
    // кнопку быстро блимкаем - Tmax один раз добавится. Удержим - будет самоповтор.
    //
    //
    }//**END