Перейти к содержанию
    

STM32 нужна помощь с кнопками

const unsigned char involtages    [] = {  35,  64,  90, 114, 139, 164, 191, 216, 237};

unsigned char GetCod()
{   
unsigned char i, j;
for(i=0;i<20;i++)  
  {                 
    delay_us(30);
    j = read_adc(ADC_cnl); 
    delay_us(30);
    if((j & 0xFE)!= (read_adc(ADC_cnl) & 0xFE)) i=0;
  }
return j;
}      

unsigned char GetCmd ()
{
  unsigned char cod;
  unsigned char i;  
  cod = GetCod();
  for (i = 0; i < sizeof(involtages); i++)
  {
     if (cod < involtages[i]) return i;
  }
  return 255;
}

Я обычно делаю так. На мелких тиньках, когда надо опросить резистивный пульт и что-то сделать с результатом. 

P.S. у меня процессору больше нечего делать, поэтому крутится в опросе АЦП.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 часов назад, mitya1698 сказал:
const unsigned char involtages    [] = {  35,  64,  90, 114, 139, 164, 191, 216, 237};

unsigned char GetCod()
{   
unsigned char i, j;
for(i=0;i<20;i++)  
  {                 
    delay_us(30);
    j = read_adc(ADC_cnl); 
    delay_us(30);
    if((j & 0xFE)!= (read_adc(ADC_cnl) & 0xFE)) i=0;
  }
return j;
}      

unsigned char GetCmd ()
{
  unsigned char cod;
  unsigned char i;  
  cod = GetCod();
  for (i = 0; i < sizeof(involtages); i++)
  {
     if (cod < involtages[i]) return i;
  }
  return 255;
}

Я обычно делаю так. На мелких тиньках, когда надо опросить резистивный пульт и что-то сделать с результатом. 

P.S. у меня процессору больше нечего делать, поэтому крутится в опросе АЦП.

 

Это для меня что то сложно, так много переменных. В понедельник куплю резисторы и продолжим, выложу результаты АЦП.  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Привет всем, вобщем купил резюки и кондер и установил. Все заработало по каналу АЦП : простой - 4095 (3.3в), вверх - 0, set - 2068, вниз - 3226. Мне нравиться.

А вот дальше у меня не получается. Выкладываю файл. В статике у меня по адресу посылается бит для активации меню - это работает. Далее должно по тому же адресу заменятся бит для передвижения по меню и тд.. и это у меня не получается.

Замена бита только при нажатии, а в простое должен быть бит который в статике. 

 

main.c

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 10.03.2023 в 13:04, quark сказал:

Потому, что в реальной программе не нужно производить сравнения значений.

Достаточно последовательно проанализировать два старших бита значения Vin.

Вполне возможно что Вы и правы.

Но в отличие от дискретного контакта, здесь могут возникнуть некоторые проблемы с подавлением "аналогового" дребезга. Для борьбы с ним сравнение уровней было бы более простым решением. Вернее, элементом решения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

36 минут назад, k155la3 сказал:

Вполне возможно что Вы и правы.

Но в отличие от дискретного контакта, здесь могут возникнуть некоторые проблемы с подавлением "аналогового" дребезга. Для борьбы с ним сравнение уровней было бы более простым решением. Вернее, элементом решения.

Вы, похоже, не поняли, о чем речь. Берется аналоговое значение Vin, и в нем анализируются два старших бита. Это самое простое решение. Проще некуда.

В этом решении не значения АЦП анализируются, а области значений - номинальные значения с большими допусками. Поэтому, такое решение очень устойчиво и по отношению к дребезгам, и к неточности резисторов, и прочему.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 часов назад, MaximDV сказал:

Все заработало по каналу АЦП : простой - 4095 (3.3в), вверх - 0, set - 2068, вниз - 3226. Мне нравиться.

Неправильно у Вас все заработалo. Должно быть: Нет нажатия - 4095, Верх - 2458, Set - 1365, Низ - 0.

Что Вы там напаяли? Нужно было использовать один резистор (2 килоом) и конденсатор (1 нанофарад). И все.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, quark сказал:

Неправильно у Вас все заработалo. Должно быть: Нет нажатия - 4095, Верх - 2458, Set - 1365, Низ - 0.

Что Вы там напаяли? Нужно было использовать один резистор (2 килоом) и конденсатор (1 нанофарад). И все.

 

Так и сделал, только 1к резистор поставил. Последовательность данных то же правильно написал. Почему есть разница в какой последовательности будут показания?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, MaximDV сказал:

Так и сделал, только 1к резистор поставил. Последовательность данных то же правильно написал. Почему есть разница в какой последовательности будут показания?

Ладно, пусть "верх"и "низ" будут наоборот.

Добавьте второй резистор 1К последовательно. чтобы получилось 2К.

Проще обрабатывать значения будет.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

52 минуты назад, quark сказал:

Вы, похоже, не поняли, о чем речь. . . . 

Это аналогично использованию 2-битного АЦП, соотв-но деление диапазона входных значений на 4 области. Что вовсе не отменяет наличие дребезга. Возможно у ТС и сложности по этой причине. Анализировать надо не 2 бита, а 4 их возможные комбинации.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, k155la3 сказал:

Анализировать надо на 2 бита, а 4 их возможные комбинации.

2 бита это и есть 4 комбинации. Они все перечислены в алгоритме. Каждое сравнение - это анализ одного бита.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня проблема выстроить логическую цепочку и привязать к действию показания АЦП. По кан шине все работает. Так как я не спец по программированию я не знаю как это сделать.

С кан шиной я работал в Кан хакере и все работало при подстановке одного бита. Осталось перенести на STM.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, MaximDV сказал:

У меня проблема выстроить логическую цепочку и привязать к действию показания АЦП. По кан шине все работает. Так как я не спец по программированию я не знаю как это сделать.

1) В схеме поставьте резистор 2К (или 1К + 1К);

2) В программе прочитайте значение Vin и выполните операцию Vin & 0x0C00;

3) После этого Vin будет иметь одно из четырех значений:

Vin = 3072 - нет нажатых кнопок

Vin = 2048 - нажата кнопка "вверх"

Vin = 1024 - нажата кнопка "Set"

Vin = 0    - нажата кнопка "вниз"

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, quark сказал:

1) В схеме поставьте резистор 2К (или 1К + 1К);

2) В программе прочитайте значение Vin и выполните операцию Vin & 0x0C00;

3) После этого Vin будет иметь одно из четырех значений:

Vin = 3072 - нет нажатых кнопок

Vin = 2048 - нажата кнопка "вверх"

Vin = 1024 - нажата кнопка "Set"

Vin = 0    - нажата кнопка "вниз"

 

 Поменял на 2к. Далее не понимаю что надо сделать. Мне надо включить Vrefint channel на STM? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, MaximDV сказал:

Далее не понимаю что надо сделать.

Далее, видимо, нужно обратиться к программисту, чтобы написал (дописал) Вам программу. Если сами совсем не можете...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 часов назад, quark сказал:

Далее, видимо, нужно обратиться к программисту, чтобы написал (дописал) Вам программу. Если сами совсем не можете...

 

Понял, принял, видимо не в ту ветку написал о помощи новичку.   

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...