Помогите с обработкой кнопок через ADC в CVAVR

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
akulov
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн июн 06, 2011 13:18:00

Re: Помогите с обработкой кнопок через ADC в CVAVR

Сообщение akulov »

akulov писал(а):
Барсик писал(а):Вот здесь:
Спасибо. Попробую разобраться.
Как я этот код не крутил, мне он не подходит.
Поскольку портов свободных у меня хватает, переписал код под кнопки, пока так:

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

unsigned char find = 0;
unsigned char KEYPRESS (void);
unsigned char Key;
unsigned char KEYPRESS ()
{
   if (find){
   if(!PINC.5) Key=3;
   if(!PINC.6) Key=4;}
   else
   {Key=0;
   if(!PINC.5) Key=3;
   if(!PINC.6) Key=4;}
     
   if(!PINC.3) Key=1;
   if(!PINC.4) Key=2;
   if(!PINC.7) Key=5;

 

delay_ms(150);         
return Key;
}
Но теперь получается, когда find=0, срабатывает одинарное нажание всех кнопок. А когда find=1, то при одинарном нажатии на любую кнопку, все переменные Key постоянно срабатывают. Не пойму, как можно разделить так, чтобы find относился только к Key=3 и Key=4 и не затрагивал остальные кнопки?
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Re: Помогите с обработкой кнопок через ADC в CVAVR

Сообщение Барсик »

Так. Понятно. В АЦП Вы забили... Теперь, как я понял, у Вас новая задача. Различать короткое нажатие и длинное на одну и ту же кнопку.
Вот здесь: viewtopic.php?p=1550614#p1550614 я приводил исходник: download/file.php?id=134861 в котором пример, как отличить короткое нажатие от длинного.
akulov
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн июн 06, 2011 13:18:00

Re: Помогите с обработкой кнопок через ADC в CVAVR

Сообщение akulov »

Барсик писал(а):.....как отличить короткое нажатие от длинного.
Интересный пример, буду пробовать! Что будет не ясно-напишу.
Аватара пользователя
Goodefine
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Re: Помогите с обработкой кнопок через ADC в CVAVR

Сообщение Goodefine »

Enigm писал(а):Но и не вижу смысла этого делать, когда используется всего в одном месте.

Смысл есть. Все настройки проекта (вернее модуля) в виде констант с осмысленными названиями и комментариями удобно править в хидере в одном месте. А не лазать по всему коду в поисках константы. Это сейчас там она одна. А когда их 50? Даже пусть по одному разу встречаться будут. Незадефайненная константа в тексте может быть только одна - это 0.
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
akulov
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн июн 06, 2011 13:18:00

Re: Помогите с обработкой кнопок через ADC в CVAVR

Сообщение akulov »

akulov писал(а):
Барсик писал(а):.....как отличить короткое нажатие от длинного.
Интересный пример, буду пробовать! Что будет не ясно-напишу.

С кодом разобрался, приспособил под себя. Отрабатывает и одиночное нажатие, и повтор, но только если удерживаешь кнопку. Я, так думаю, что и с АЦП получится. Но есть один нюанс. Как сделать, чтобы при одиночном нажатии на кнопку и включенной переменной find=1, кнопка отрабатывалась постоянно до изменения find (find=0)? Пробовал цикл while, но потом, почему то, не могу из него выйти. И вставлял его в разные участки кода. Фрагмент переделанного кода:

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

void key3ExecuteShort(void) // обрабатывает короткое нажатие кнопки 3
{       Tuner ();

  Key=3;   
}
и сам Key=3:

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

void Tuner (void)
{             
work=Key;

     switch(work){
            case 3:{      // увеличение частоты
//-------- Это для двух диапазонного
                    if(FFreq<=7400)StepFreq=3;
                    if(FFreq>=8750)StepFreq=5;
                    if(FFreq==7400){FFreq=8750;StepFreq=5;}
                    if(FFreq>=10800)FFreq=6576;// некрасиво, но КОРОТКО
                    FFreq=FFreq+StepFreq;
                    DLL_Freq(FFreq,StepFreq);
                  ShowFreq(FFreq);
          work=0;
                  break;}
Остальное не менял.
И, попутно, вопрос: с точки зрения загрузки контроллера и быстродействия что предпочтительней, обработка кнопок через АЦП, или через порты?
И еще, на какой тактовой частоте лучше работать, 8 или 16мГц? Просто в Протеусе при большей частоте загрузка ЦП увеличивается в 2 раза.
Может, вопросы и глупые, но на них меня "заело".
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Re: Помогите с обработкой кнопок через ADC в CVAVR

Сообщение Барсик »

akulov писал(а):Как сделать, чтобы при одиночном нажатии на кнопку и включенной переменной find=1, кнопка отрабатывалась постоянно до изменения find (find=0)? Пробовал цикл while, но потом, почему то, не могу из него выйти.
Ну и проверяйте значение этой переменной в цикле. В чём проблема то? Кто (или что) изменяет значение этой переменной?

akulov писал(а):с точки зрения загрузки контроллера и быстродействия что предпочтительней, обработка кнопок через АЦП, или через порты?
АЦП для кнопок используют не из-за быстродействия, а когда портов не хватает. А с точки зрения быстродействия, один хрен, что ждать окончания преобразования АЦП, что ждать когда кнопки устаканятся.
akulov
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн июн 06, 2011 13:18:00

Re: Помогите с обработкой кнопок через ADC в CVAVR

Сообщение akulov »

Барсик писал(а):Ну и проверяйте значение этой переменной в цикле. В чём проблема то? Кто (или что) изменяет значение этой переменной?
Значение переменной проверяю в цикле:

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

if(PINA.5==0) find = 1;
else find = 0;
а вот как ее применить для получения нужного результата?
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Re: Помогите с обработкой кнопок через ADC в CVAVR

Сообщение Барсик »

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

while(find)
{
   keyExecute(); // обработали кнопку
   // тут возможно надо вставить задержку - интервал повтора обработки кнопки
   // ........
   // проверяем, что там с нашей переменной
   if(PINA.5==0) find = 1;
   else find = 0;
   // пока find не ноль, будем крутиться в цикле.
   // как только find = 0, то выходим из цикла.
}
akulov
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн июн 06, 2011 13:18:00

Re: Помогите с обработкой кнопок через ADC в CVAVR

Сообщение akulov »

Спасибо, буду пробовать.
Аватара пользователя
Enigm
Говорящий с текстолитом
Сообщения: 1663
Зарегистрирован: Вт апр 03, 2012 20:36:41
Откуда: Сочи

Re: Помогите с обработкой кнопок через ADC в CVAVR

Сообщение Enigm »

Все еще воюете ?
Вот глянте проэкт в протэусе, Работает как нужно ?
Выключатель имитирует ваш сигнал find.
В архиве схема в протэусе и прошивка.
Если это то что вам нужно, то попробую вам обьяснить как это сделать.
Вложения
scaner.rar
(15.02 КБ) 190 скачиваний
akulov
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн июн 06, 2011 13:18:00

Re: Помогите с обработкой кнопок через ADC в CVAVR

Сообщение akulov »

Enigm писал(а):Работает как нужно ?
Да! Работает нормально.

А вот с while(find) почему то не хочет!
Аватара пользователя
Enigm
Говорящий с текстолитом
Сообщения: 1663
Зарегистрирован: Вт апр 03, 2012 20:36:41
Откуда: Сочи

Re: Помогите с обработкой кнопок через ADC в CVAVR

Сообщение Enigm »

Вобщем попробую обьяснить.
В СИ я не силен так как не воспринимаю его визуально.
А опишу логику.
Ведем новую переменную и назавем ее например ADC_off и присваиваем ей 0
создаем условие
Если ADC_off =0 то мы переходим на обработку ваших кнопок, если нет то мы обработку кнопок пропускаем.
после условия
сразу пишем чтение с порта (на который будет приходить сигнал find) в переменную find (допустим активный уровень 1)
(теперь допустим значение Key = 1 это +сканирования, а значение key=2 это - сканирования )
После чтения порта делаем условие.
Если find=1 and key=1 or find=1 and key=2 то ADC_off=1 если нет то ADC_off=0
Вот и все.
Логика такова
Как только прийдет сигнал find и будет нажата одна из двух клавиш +или - ваше ADC отключится, и перменная key зафиксируется. что будет равнятся нажатием и удерживанием кнопки.
Как только сигнал find пропадет, включится ADC считает кнопки, определит что кнопки не нажаты, и остановит счет.
Вот как то так.
Надеюсь понятно обьяяснил.
В моем примере именно так и сделанно.
Естественно это будет работать только в том случае, если переменая Key больше ни где кроме ADC не изменяется.
akulov
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн июн 06, 2011 13:18:00

Re: Помогите с обработкой кнопок через ADC в CVAVR

Сообщение akulov »

Enigm писал(а):Вобщем попробую обьяснить.
Это тот же бесконечный цикл, с которым у меня не получается.
Барсик писал(а):Код..
Что-то уменя не получается. Может подскажете, что я делаю не так? Код:

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

void key3Execute(void) // обрабатывает нажатие кнопки 3
{
    unsigned int key_long_time = KEY_LONG_TIME; // текущее количество полных циклов считывания номера кнопки
    // ждём, пока кнопку отпустят
    while(getKeyNumber())
    {
        // проверяем, как долго держат кнопку нажатой
        if(key_long_time)
        {
            // продердали недостаточно долго
            key_long_time--; // уменьшаем счётчик
        }
    }
    // кнопку отпустили
    if(key_long_time)
    {
         key3ExecuteShort(); // обрабатываем короткое нажатие кнопки 3
    }
    else
    {
        // нажатие было длительным
while(find)
{
   key3ExecuteShort(); // обработали кнопку
   // тут возможно надо вставить задержку - интервал повтора обработки кнопки
   delay_ms(50);
   // проверяем, что там с нашей переменной
   if(PINA.5==0) find = 1;
   else find = 0;
   // пока find не ноль, будем крутиться в цикле.
   // как только find = 0, то выходим из цикла.
}
    }   
}
Аватара пользователя
Enigm
Говорящий с текстолитом
Сообщения: 1663
Зарегистрирован: Вт апр 03, 2012 20:36:41
Откуда: Сочи

Re: Помогите с обработкой кнопок через ADC в CVAVR

Сообщение Enigm »

Где вы бесконечный цыкл увидели ?
У меня ведь работает.
У меня вобше все на лету.
Бесконечный цикл всего один, это тот в котором вся программа вертится , дополнительных нету.
вы переменную AdC_off=0 надеюсь до цыкла поставили ?
akulov
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн июн 06, 2011 13:18:00

Re: Помогите с обработкой кнопок через ADC в CVAVR

Сообщение akulov »

Наконец то разобрался со всеми примерами. Работают оба предложенных варианта. Узнал для себя много нового.
За помощь всем большое СПАСИБО!
Тему можно считать закрытой.
Аватара пользователя
Enigm
Говорящий с текстолитом
Сообщения: 1663
Зарегистрирован: Вт апр 03, 2012 20:36:41
Откуда: Сочи

Re: Помогите с обработкой кнопок через ADC в CVAVR

Сообщение Enigm »

Это хорошо.
Если вам будет не трудно скините свой проэктик в протеусе с хексом.
akulov
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн июн 06, 2011 13:18:00

Re: Помогите с обработкой кнопок через ADC в CVAVR

Сообщение akulov »

Enigm писал(а):скините свой проэктик в протеусе с хексом.
В файле:
Вложения
Проект.rar
(26.4 КБ) 196 скачиваний
Ответить

Вернуться в «Периферия»