Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 23.02.2013, 01:06  
Dimitrij
Временная регистрация
 
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
Dimitrij на пути к лучшему
По умолчанию Помогите с обработкой кнопок через ADC в CVAVR

Есть код обработки кнопок через ADC:
PHP код:
#define K5 0
#define K4 118
#define K3 160
#define K2 182
#define K1 194  
#define K0 213 // для ненажатого состояния 

/*------ Выводы кнопок -----------------------------------------*/
#define KEYt PINA.6
/*------ -------------------------------------------------------*/
unsigned char read_adc(unsigned char adc_input);
char find 0;

unsigned char KEYPRESS ()
{
unsigned char Key,KeyTmp;   // нажатая клавиша
delay_ms(35);
if(
read_adc(6)‹K0)
{
  
delay_ms(15); //дребезг контактов
  
KeyTmp=read_adc(6);
  if(
KeyTmpK0)
    {
    if(
KeyTmpK1){
        if(
KeyTmpK2){
            if(
KeyTmpK3){
              if(
KeyTmpK4)Key=3;
              else 
Key=4;}
            else 
Key=1;}
        else 
Key=2;}            
    else 
Key=5;
    }                                       
}
else 
Key=0;
        
delay_ms(75);
    return(
Key);    
    } 
В непрерывном цикле:
PHP код:
if(PINA.5==0find 1;
else 
find 0
Все работает нормально. Но мне нужно, чтобы при установленной переменной find==1 и нажатых кнопках K4 или К5, Key=3; или Key=4; отрабатывались непрерывно. А при find==0 - одинарно.
Не могу сообразить, как это сделать?
Реклама:
Dimitrij вне форума  
Непрочитано 23.02.2013, 01:34  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Помогите с обработкой кнопок через ADC в CVAVR

Мощный код. Особенно обработка дребезга повеселила. Есть лишнее время в цикле, можно хотя бы примитивное усредненение сделать. Да и обработка нажатия должна быть с каким-то допуском +/-.
Easyrider83 вне форума  
Непрочитано 23.02.2013, 01:48  
Dimitrij
Временная регистрация
 
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
Dimitrij на пути к лучшему
По умолчанию Re: Помогите с обработкой кнопок через ADC в CVAVR

Сообщение от Easyrider83 Посмотреть сообщение
Мощный код. .
Я прошу помощи, а не критики!
Dimitrij вне форума  
Непрочитано 23.02.2013, 13:48  
whoim
Почётный гражданин KAZUS.RU
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: Помогите с обработкой кнопок через ADC в CVAVR

Сообщение от Dimitrij Посмотреть сообщение
Я прошу помощи
Сообщение от Easyrider83 Посмотреть сообщение
Есть лишнее время в цикле
Сообщение от Easyrider83 Посмотреть сообщение
примитивное усредненение сделать
Сообщение от Easyrider83 Посмотреть сообщение
обработка нажатия должна быть с каким-то допуском +/-
Сообщение от Easyrider83 Посмотреть сообщение
обработка дребезга
не? маловато?
whoim вне форума  
Непрочитано 23.02.2013, 13:54  
_guardianangel
Почётный гражданин KAZUS.RU
 
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,140
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
_guardianangel на пути к лучшему
По умолчанию Re: Помогите с обработкой кнопок через ADC в CVAVR

Dimitrij,
PHP код:
KeyboardEventTypeDef keyboard_status(void)
{
    
uint16_t *puiKeyBoardData adc_GetData(KEYBOARD_CHANEL);
    if (
puiKeyBoardData)
    {
        if ((*
puiKeyBoardData ›= UL_MIN) && (*puiKeyBoardData ‹= UL_MAX)) return (PRESS_LEFT);
        if ((*
puiKeyBoardData ›= UD_MIN) && (*puiKeyBoardData ‹= UD_MAX)) return (PRESS_DOWN);
        if ((*
puiKeyBoardData ›= UR_MIN) && (*puiKeyBoardData ‹= UR_MAX)) return (PRESS_RIGHT);
        if ((*
puiKeyBoardData ›= UU_MIN) && (*puiKeyBoardData ‹= UU_MAX)) return (PRESS_UP);
        if ((*
puiKeyBoardData ‹= DEFENCE_OFFSET)) return (NO_PRESS);
    }
    else
    {
        return (
UNKNOWN);
    }
    return (
ERROR_KBD);

Код рабочий, диапазоны значений АЦП рассчитывал исходя из 10 процентного допуска резисторов делителя. Это не сложно, если, конечно, закон Ома не забыли )))).

Последний раз редактировалось _guardianangel; 23.02.2013 в 14:04.
_guardianangel вне форума  
Непрочитано 23.02.2013, 13:56  
_guardianangel
Почётный гражданин KAZUS.RU
 
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,140
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
_guardianangel на пути к лучшему
По умолчанию Re: Помогите с обработкой кнопок через ADC в CVAVR

P.S. Еще использую усреднение по 8 выборкам. Тупо суммирую 8 отсчетов и сдвигаю влево на 3 разряда. Прямо в прерывании АЦП.
_guardianangel вне форума  
Непрочитано 23.02.2013, 20:03  
Dimitrij
Временная регистрация
 
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
Dimitrij на пути к лучшему
По умолчанию Re: Помогите с обработкой кнопок через ADC в CVAVR

Спасибо, но вопрос был о том, как сделать, чтобы одна и та же кнопка отрабатывалась однократно или многократно, в зависимости от установленного флага. Может, я не так изначально поставил вопрос, но смысл такой:
Кнопки К4 и К5 управляют перестройкой частоты. При одинарном нажатии на кнопку, частота перестраивается +- на один шаг. А мне нужно, чтобы при установленном флаге find и одинарном нажатии на кнопку, частота перестраивалась автоматически до сброса флага (автопоск станции). Даже желательно, чтобы автопоиск включался не сразу, а при удержании кнопки в течении 1-2 секунд.
А код опроса ADC переписать, если нужно, не вопрос.
Dimitrij вне форума  
Непрочитано 02.03.2014, 05:43  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Помогите с обработкой кнопок через ADC в CVAVR

Можно так:

Код:
 
#define K4 118
#define K3 160
#define K2 182
#define K1 194
#define K0 213

unsigned char KEYPRESS(void) 
{ 
unsigned char c;
c = read_adc(6);
if(c ‹ K4)  return 5;
if(c ‹ K3)  return 4;
if(c ‹ K2)  return 3;
if(c ‹ K1)  return 2;
if(c ‹ K0)  return 1;
return 0;
} 

void main(void)
{
unsigned char b = 0;
unsigned char k;

begin:
k = KEYPRESS();
switch(k)
{
case 1:
if(b == 0)      Press_1();      // одиночное срабатывание
if(b == 39)     Press_Find();   // одиночное срабатывание после 2-х сек. удержания
if(b == 40)     Press_1();      // непрерывный повтор с интервалом 50 мс после 2-х сек. удержания 
break;

case 2:
if(b == 0)      Press_2();
break;

case 3:
if(b == 0)      Press_3();
break;

case 4:
if(b == 0)      Press_4();
break;

case 5:
if(b == 0)      Press_5();
break;
}
if(b ‹ 40) b++;
if(k == 0) b = 0;
delay_ms(50);
goto begin;
}
Условие срабатывания по нужным вам флагам добавите сами.
Godzilla82 вне форума  
Сказали "Спасибо" Godzilla82
MasterMushi (11.01.2016)
Непрочитано 02.03.2014, 10:13  
proba60
Вид на жительство
 
Аватар для proba60
 
Регистрация: 26.10.2009
Сообщений: 379
Сказал спасибо: 47
Сказали Спасибо 146 раз(а) в 93 сообщении(ях)
proba60 на пути к лучшему
По умолчанию Re: Помогите с обработкой кнопок через ADC в CVAVR

не хотел заводить новую тему из за одного вопроса ,поэтому размещу здесь Почему вот это работает в CV

int tim=50;
delay_ms (tim);

а вот это не работает
int tim=50;
delay_us (tim);
__________________
..истина где то рядом..
proba60 вне форума  
Непрочитано 02.03.2014, 12:31  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Помогите с обработкой кнопок через ADC в CVAVR

Сообщение от proba60 Посмотреть сообщение
а вот это не работает
int tim=50;
delay_us (tim);
Потому, что delay_ms() построена так:

Имеется процедура задержки на 1 мс. В регистр Y загружается количество раз, которое будет вызываться процедура. И потом в цикле вызывается процедура задержки на 1 мс указанное количество раз.

Процедура задержки на 1 мс - это пустой цикл. Количество раз выполнения которого расчитывается на этапе компиляции в зависимости от тактовой частоты.

Код:
_delay_ms:
	adiw r26,0
	breq __delay_ms1
__delay_ms0:
	__DELAY_USW 0x7D0
	wdr
	sbiw r26,1
	brne __delay_ms0
__delay_ms1:
	ret
__DELAY_USW - это как раз макрос пустого цикла, который выполняется 1 мкс.
А 0x7D0 - это количество итераций, равное CLK / 4000.

Функция delay_us() - это всего один цикл. На самом деле всё тот же макрос __DELAY_USW. Параметр которого расчитывается на этапе компиляции.

Если хотите - делайте свой аналог delay_us.
Например:

Код:
i = 1;
do {i--;} while(i);
Одна итерация цикла выполнится за 6 тактов.
Общее время выполнения на 2 такта больше.

Соответственно при тактовой частоте 1 Мгц минимальная задержка 8 мкс.

При таком подходе нужно смотреть ассемблерный листинг. Потому, что количество тактов на 1 итерацию цикла может существенно измениться. Например, если компилятор разместит перемнную i в регистрах X-Z количество тактов может стать 4.
И наоборот, при нехватке регистров количество тактов может возрасти до 14 и более (за счёт размещения переменной в памяти).
Godzilla82 вне форума  
Сказали "Спасибо" Godzilla82
proba60 (02.03.2014)
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с обработкой кнопок в CVAVR Dimitrij Песочница (вопросы новичков) 14 11.11.2013 21:36
ADC для ATXmega128A1 - помогите найти ошибку в коде Fogtech AVR 21 25.02.2013 12:01
Как совместить управление LCD, LED через 74hc595 в CVAVR Dimitrij Микроконтроллеры, АЦП, память и т.д 0 21.02.2013 19:27
Помогите с обработкой нажатия кнопки pic12f629 alexandr-nimnul Микроконтроллеры, АЦП, память и т.д 5 18.10.2009 13:15
Помогите с измерением переменного напряжения ATMega,ADC,RMS nerozero Микроконтроллеры, АЦП, память и т.д 5 11.01.2009 19:17


Часовой пояс GMT +4, время: 20:04.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot