Страница 1 из 1

Один порт - несколько кнопок

Добавлено: Вс июл 21, 2013 12:57:21
forfrends
Всем добрый день!
Вспомнилось мне что раньше в CD-плеерах использовалась интересная система управления, а точнее к кнопкам управления шло всего два провода "Общий" (минус) и "Дата" через который подавался сигнал от той или иной кнопки. Кнопки имели общий минус, даллее через резисторы разного сопротивления подключались к "Дата".
примерно так:
Изображение
То есть, получалось что плеер определял через какое сопротивление поступает сигнал, и уже от этого определял какое действие делать.
Вот и у меня возникла мысль - а не попробывать ли то же самое на МК?
Ведь таким способом можно хоть десяток кнопок прицепить и занять всего 1 порт :shock:
шучу, конешно, :))) 10 штук никто вешать не будет, но вот 2-3 кнопки в самый раз!
Поэтому решил спросить у нашего всезнающего форума, возможно ли такое сделать?
Или это будет не практично, точнее размер программы/ее сложность не оправдают усилий, и проще использовать больше выводов от контроллера?
можете привести пример кода?
Просто у меня возникла в этом насущная необходимость.
Делаю небольшую схемку на Тини13, свободной остается только 1 порт, а надо две кнопки прицепить. Тиньку 2313 брать не хочется - размером больше, да и половина портов будет висеть без дела...

Re: Один порт - несколько кнопок

Добавлено: Вс июл 21, 2013 13:05:29
Vov123
Ну а в чём проблема,ацп на борту имеется,цепляй хоть 10 кнопок.

Re: Один порт - несколько кнопок

Добавлено: Вс июл 21, 2013 13:10:21
forfrends
Можно кратко о том что такое АЦП и пример?
Я только начинающий... многого еще не знаю

Re: Один порт - несколько кнопок

Добавлено: Вс июл 21, 2013 13:24:33
Vov123
Кратко и для начинающих можно прочитать вот этой книгн http://log-in.ru/books/prakticheskoe-pr ... pparatura/ на стр.223

Re: Один порт - несколько кнопок

Добавлено: Вс июл 21, 2013 13:31:30
forfrends
Книга недоступна для скачиваня...
Спс, уже нашел в другом месте

Re: Один порт - несколько кнопок

Добавлено: Вс июл 21, 2013 13:40:02
dm211

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

   
  if (read_adc(0)<65) {key=5;}  //  5  RIGT
  else if (read_adc(0)<218){key=3; }  //  3  ВВЕРХ
  else if (read_adc(0)<392){key=4; }  //  4  ВНИЗ
  else if (read_adc(0)<600){key=2; }  //  2  LEFT
  else if (read_adc(0)<871){key=1; }  //  1  select
  else{key=0;} 

Re: Один порт - несколько кнопок

Добавлено: Вс июл 21, 2013 13:48:03
forfrends
Спасибо!
dm211, это Си?

Re: Один порт - несколько кнопок

Добавлено: Вс июл 21, 2013 13:50:39
Vov123
Пример использования на C в WinAVR можно найти здесь http://knigi.tr200.ru/v.php?id=1450523 на стр.162

Re: Один порт - несколько кнопок

Добавлено: Вс июл 21, 2013 13:57:34
dm211
forfrends писал(а):Спасибо!
dm211, это Си?
Да, этот код для CVAVR, идея взята с китайской платы с LCD и клавиатурой.

Re: Один порт - несколько кнопок

Добавлено: Вс июл 21, 2013 14:51:35
phanis
Лучше читать значение Ацп в переменную, а после сравнивать ее значение(переменной).
Спойлер

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

enum{ KEY_NULL, KEY_RIGHT, KEY_UP, KEY_DOWN,  KEY_LEFT, KEY_SELECT};

#define RIGHT_MAX   65
#define UP_MAX     218
#define DOWN_MAX   392
#define LEFT_MAX   600
#define SELECT_MAX 871

/**********************/

unsigned int ADC_value;

  ADC_value = read_adc(0);  // читаем значение анал.входа в переменную  ADC_value

       if ( ADC_value < RIGHT_MAX ) {key = KEY_RIGHT; }  //  5  RIGHT
  else if ( ADC_value < UP_MAX    ) {key = KEY_UP;    }  //  3  UP
  else if ( ADC_value < DOWN_MAX  ) {key = KEY_DOWN;  }  //  4  DOWN
  else if ( ADC_value < LEFT_MAX  ) {key = KEY_LEFT;  }  //  2  LEFT
  else if ( ADC_value < SELECT_MAX) {key = KEY_SELECT;}  //  1  SELECT
  else key = KEY_NULL;

Re: Один порт - несколько кнопок

Добавлено: Чт июл 25, 2013 18:07:09
dm211
Гоняю этот алгоритм в деле и вынужден признать,что он не идеален,не чётко срабатывает как надо всегда, может у кого то есть другой алгоритм работы кнопок,повешенных на одну ножку мк на ADC ?

Re: Один порт - несколько кнопок

Добавлено: Чт июл 25, 2013 18:11:26
forfrends
Вот, наконец-то дело дошло до практики, а то все руки не доходили...
Си, увы, я не знаю, пытаюсь сейчас освоить Ассемблер.
phanis писал(а):Лучше читать значение Ацп в переменную, а после сравнивать ее значение(переменной).
Однозначно согласен, вот только в Ассемблере у меня не получается. Точнее я не знаю как сделать сравнение такой конструкции:

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

 if (read_adc(0)>63) {key=1;}  //  (если... то... выполнить Действие 1)
 else if (read_adc(0)>127){key=2; }  //  (если... то... выполнить Действие 2)
 else if (read_adc(0)>191){key=3; }  //  (если... то... выполнить Действие 3)
 else{key=0;}
Все дело в том что значение АЦП (использую только старший байт) у меня хранится в РОН в двуичном виде в виде 0b00000000.
Как это значение сравнить с 63 (0b00111111) или с 127 (0b01111111) не имею представления.
Можете помочь? Приведите пример в Ассемблере

Re: Один порт - несколько кнопок

Добавлено: Чт июл 25, 2013 20:24:09
Jack_A
forfrends писал(а):у меня хранится в РОН в двуичном виде в виде 0b00000000.
Как это значение сравнить с 63 (0b00111111) или с 127 (0b01111111) не имею представления.
Можете помочь? Приведите пример в Ассемблере
двуичном -- это двуличном или двоичном ? :)
Сто пятьдесят раз говорили уже об этом. В регистре хранится комбинация 'нулей' и 'единичек', ни более ни менее, а как ее интерпретировать -- представление этой инфы может быть различным как удобно программисту : binary, hex, octal, ASCII .
так что cpi r16,0b00111111 cpi r16,0x3F cpi r16,63 cpi r16,'?' при компиляции даст абсолютно один и тот же код. В данном случае выделенный красным вариант наиболее читабелен.

Re: Один порт - несколько кнопок

Добавлено: Чт июл 25, 2013 20:37:40
forfrends
Jack_A, спасибо, буду испарвляться :)
Я имел в виду двоичный :)
Не знал что приведенные примеры равнозначны. Это решает проблему! Спасибо!

Re: Один порт - несколько кнопок

Добавлено: Чт июл 25, 2013 21:42:42
a_skr
if (read_adc(0)>63) {key=1;} // (если... то... выполнить Действие 1)
else if (read_adc(0)>127){key=2; } // (если... то... выполнить Действие 2)
else if (read_adc(0)>191){key=3; } // (если... то... выполнить Действие 3)
else{key=0;}
зачем такое написали? две проверки из середины просто никогда не выполнятся.
PS. в 99.9% случаев.
Вам выше советовали считать значение АЦП в переменную и сравнивать в корректном порядке.

Re: Один порт - несколько кнопок

Добавлено: Пт июл 26, 2013 08:47:10
dm211
phanis писал(а):Лучше читать значение Ацп в переменную, а после сравнивать ее значение(переменной).
Совет земляка пригодился, так норм работает, ложных переключений как раньше нет.

Re: Один порт - несколько кнопок

Добавлено: Сб июл 27, 2013 12:37:46
Барсик
forfrends писал(а):Си, увы, я не знаю, пытаюсь сейчас освоить Ассемблер.
Забейте в ассемблер и забудьте его как кошмарный сон.
Вот здесь я выкладывал проект, где кнопки опрашиваются через АЦП: http://radiokot.ru/forum/viewtopic.php? ... 1#p1550161

Re: Один порт - несколько кнопок

Добавлено: Сб июл 27, 2013 19:45:16
YS
Забейте в ассемблер и забудьте его как кошмарный сон.
Поковырятья с ассемблером надо. Хотя бы для того, чтобы осознать, что 0b00111111,0x3F, 63 и '?' - одно и то же. Людям, которые сразу начинали с высокоуровневых языков, это дается с трудом...