Страница 1 из 1
Один порт - несколько кнопок
Добавлено: Вс июл 21, 2013 12:57:21
forfrends
Всем добрый день!
Вспомнилось мне что раньше в CD-плеерах использовалась интересная система управления, а точнее к кнопкам управления шло всего два провода "Общий" (минус) и "Дата" через который подавался сигнал от той или иной кнопки. Кнопки имели общий минус, даллее через резисторы разного сопротивления подключались к "Дата".
примерно так:

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

шучу, конешно,

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 и '?' - одно и то же. Людям, которые сразу начинали с высокоуровневых языков, это дается с трудом...