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

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Вымогатель припоя
Сообщения: 546
Зарегистрирован: Вс дек 30, 2012 00:32:06
Откуда: Николаев / Украина

Сообщение forfrends »

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

Сообщение Vov123 »

Ну а в чём проблема,ацп на борту имеется,цепляй хоть 10 кнопок.
Реклама
Вымогатель припоя
Сообщения: 546
Зарегистрирован: Вс дек 30, 2012 00:32:06
Откуда: Николаев / Украина

Сообщение forfrends »

Можно кратко о том что такое АЦП и пример?
Я только начинающий... многого еще не знаю
Сделать своими руками всегда интересней чем просто купить и пользоваться
Контактная информация:
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

Кратко и для начинающих можно прочитать вот этой книгн http://log-in.ru/books/prakticheskoe-pr ... pparatura/ на стр.223
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Сообщения: 546
Зарегистрирован: Вс дек 30, 2012 00:32:06
Откуда: Николаев / Украина

Сообщение forfrends »

Книга недоступна для скачиваня...
Спс, уже нашел в другом месте
Сделать своими руками всегда интересней чем просто купить и пользоваться
Контактная информация:
Реклама
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Сообщение 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;} 
Реклама
Вымогатель припоя
Сообщения: 546
Зарегистрирован: Вс дек 30, 2012 00:32:06
Откуда: Николаев / Украина

Сообщение forfrends »

Спасибо!
dm211, это Си?
Сделать своими руками всегда интересней чем просто купить и пользоваться
Контактная информация:
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

Пример использования на C в WinAVR можно найти здесь http://knigi.tr200.ru/v.php?id=1450523 на стр.162
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Сообщение dm211 »

forfrends писал(а):Спасибо!
dm211, это Си?
Да, этот код для CVAVR, идея взята с китайской платы с LCD и клавиатурой.
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение 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;
Контактная информация:
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Сообщение dm211 »

Гоняю этот алгоритм в деле и вынужден признать,что он не идеален,не чётко срабатывает как надо всегда, может у кого то есть другой алгоритм работы кнопок,повешенных на одну ножку мк на ADC ?
Вымогатель припоя
Сообщения: 546
Зарегистрирован: Вс дек 30, 2012 00:32:06
Откуда: Николаев / Украина

Сообщение 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) не имею представления.
Можете помочь? Приведите пример в Ассемблере
Сделать своими руками всегда интересней чем просто купить и пользоваться
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6339
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

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

Сообщение forfrends »

Jack_A, спасибо, буду испарвляться :)
Я имел в виду двоичный :)
Не знал что приведенные примеры равнозначны. Это решает проблему! Спасибо!
Сделать своими руками всегда интересней чем просто купить и пользоваться
Контактная информация:
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Сообщение 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% случаев.
Вам выше советовали считать значение АЦП в переменную и сравнивать в корректном порядке.
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Сообщение dm211 »

phanis писал(а):Лучше читать значение Ацп в переменную, а после сравнивать ее значение(переменной).
Совет земляка пригодился, так норм работает, ложных переключений как раньше нет.
Друг Кота
Аватара пользователя
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

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

forfrends писал(а):Си, увы, я не знаю, пытаюсь сейчас освоить Ассемблер.
Забейте в ассемблер и забудьте его как кошмарный сон.
Вот здесь я выкладывал проект, где кнопки опрашиваются через АЦП: http://radiokot.ru/forum/viewtopic.php? ... 1#p1550161
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Забейте в ассемблер и забудьте его как кошмарный сон.
Поковырятья с ассемблером надо. Хотя бы для того, чтобы осознать, что 0b00111111,0x3F, 63 и '?' - одно и то же. Людям, которые сразу начинали с высокоуровневых языков, это дается с трудом...
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Ответить

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