- Вложения
-
- main.c
- (2.21 КБ) 654 скачивания
Подключение кнопок через АЦП
- Сообщения: 172
- Зарегистрирован: Пн мар 19, 2012 13:04:11
Ребят, столкнулся с такой проблемой, Смог подключить только 4 кнопки к ацп, хотя нужно подключить гораздо больше, именно 21, знаю, что считывать с входов ацп нужно записью в ADMUX, но никак не могу понять, как это сделать, подскажите пожалуйста.
- Реклама
- Сообщения: 172
- Зарегистрирован: Пн мар 19, 2012 13:04:11
Или может кто нибуль подскажет, как к одному порту можно подключить много кнопок?
Программу внимательно не смотрел, вроде структура верная. Возможно надо поколдовать с порогами (с которыми сравниваются значения АЦП).
Подключал 20 штук, работало, можно и больше. Главное чтобы номиналы резисторов были поточнее, хотя у меня 5% стояли.
Подключал 20 штук, работало, можно и больше. Главное чтобы номиналы резисторов были поточнее, хотя у меня 5% стояли.
- Сообщения: 172
- Зарегистрирован: Пн мар 19, 2012 13:04:11
А свой исходник дать не можешь? Или может расскажешь как ты подключал?
- Сообщения: 172
- Зарегистрирован: Пн мар 19, 2012 13:04:11
А свой исходник дать не можешь? Или может расскажешь как ты подключал?
- Реклама
Исходника сейчас нет, система голая (только поставил), документы где-то в общем бардаке затерялись... Но схема была самая обычная.
- Сообщения: 172
- Зарегистрирован: Пн мар 19, 2012 13:04:11
В общем у меня задача, что бы кнопки зажигали диоды. Но портов не хватает на всю систему. Я думаю настроить кнопки через АЦП, остальные порты освободиь для диодов. Думаю сделать так, считываю пин порта ( в атмеге 128 АЦП подключен к порту F) и если на него подано напряжение, то запускаем АЦП и находим через уровень напряжения какая кнопка нажата, иначе сканируем след пин и так далее, узнав какая кнопка нажата зажигаем диод. Может поможешь с реализацией? У меня сроки горят, а я совем новичек.
- Сообщения: 321
- Зарегистрирован: Пн окт 18, 2010 21:18:21
если просто зажигать диоды от кнопки, то можно проще - т.к. каждый пин может быть и входом и выходом, то настраиваем пины на выход в состоянии "1", led при этом не светится. Каждые 20-50мСек переводим порт в состояние вход с подтяжкой и проверяем на 0xff ну или каждый пин в отдельности на "0" (в случае если кнопка нажата) После проверки возвращаем порт в исходное состояние и если кнопка была нажата, соответствующий пин переводим в "0" вот led и загорелся. Есть один недостаток - led всегда будет загораться пока нажата кнопка, даже если повторным нажатием он должен выключаться. Если интересно могу поискать исходники
под все это безобразие, делал давно, сразу не найду.
под все это безобразие, делал давно, сразу не найду.
- Вложения
-
- Безымянный.jpg
- схема примерно такая
- (112.53 КБ) 325 скачиваний
- Сообщения: 202
- Зарегистрирован: Пт июн 04, 2010 21:58:36
Есть микросхемы специально предназначенные для управления светодиодами типа М66313FP у нее последовательный вход для сигнала и параллельный выход на 32 светодиода. 15-20 портов + 5 микросхем = 160 светодиодов. И разводку легче делать, так как к микросхеме только 3-4 проводника вести.
Когда я был маленький, - микросхемы были большими. Имели четыре ножки и две ручки - для переноски.
Вот мой вариант.
Код:
После строки READ2 идет примерно такая-же структура, только с другими кодами и в конце АЦП переключается на 1-й канал...
А вот так подключены кнопки:
Код:
Код: Выделить всё
CLR KEY_CODE
IN R16,ADCH ;читаем АЦП
LSR R16 ;делим на 8, с меньшими числами проще работать
LSR R16
LSR R16
INC ADC_CHANNEL ;переключаем номер канала
ANDI ADC_CHANNEL,0x01 ;
BREQ READ1 ;если 1-й читаем кнопки
RJMP READ2 ;если 0-й - переменный резистор
READ1: CPI R16,0x00 ;0 - кнопки не нажаты
BRNE K01
RJMP NO_KEY
K01: CJNE R16,0x01,PC+3 ;первая кнопка (cjne - макрос: CJNE="CPI @0,@1"+"BRNE @2")
LDI KEY_CODE,KEY_ENTER
RJMP KEY_0
K02: CJNE R16,0x02,PC+3 ;вторая
LDI KEY_CODE,KEY_JOGR
RJMP KEY_0
K03: CJNE R16,0x03,PC+3 ;третья
LDI KEY_CODE,KEY_JOGL
RJMP KEY_0
[...]
K22: CJNE R16,0x1C,PC+3
LDI KEY_CODE,KEY_CH2
RJMP KEY_0
K23: CJNE R16,0x1E,PC+3
LDI KEY_CODE,KEY_CH1
KEY_0:
SBI GPIOR0,KEY_PRESSED ;ставим флаг что кнопка была нажата
NO_KEY:
OUTI ADMUX,0x00 ;переключаем канал (0)
RETI
А вот так подключены кнопки:
- Вложения
-
- ADC_KEYS.PNG
- (25.62 КБ) 249 скачиваний
Для чего использовать АЦП? Как же матричная клавиатура?
Боевой ватник.
Че, много портов лишних есть?Cat писал(а):Для чего использовать АЦП? Как же матричная клавиатура?
Тоже мне, нашли дефицит. А что покажет АЦП если нажать сразу несколько кнопок? Резисторы надо подбирать... ИМХО матричная проще, хотя я может малость не в теме.Engineer_Keen писал(а): Че, много портов лишних есть?
Боевой ватник.
Ну да, фигню покажет, но это же для в основном для ПДУ используется, а не для синтезаторов, так что все нормально. Ну а резисторы, это еще как программу написать, у меня 5% работают...
Как с надежностью данного решения?
Вот такое милое изделие, 140 руб, займет всего 8 ножек. http://chip-nn.ru/find.php?f=%EA%EB%E0% ... 2%F3%F0%E0
Вот такое милое изделие, 140 руб, займет всего 8 ножек. http://chip-nn.ru/find.php?f=%EA%EB%E0% ... 2%F3%F0%E0
Боевой ватник.
Ну, год работает, сбоев нет, правда в комнатных условиях. Там изначально 3 пальчика AA, т.е. питание 4.5В, при нажатии контроллер еще белым светиком (Vf=3V) моргает, так вот когда батарейки садятся так что он уже не моргает, кнопки все равно пашутCat писал(а):Как с надежностью данного решения?
А у меня всего 6 ножек, из них 1 ресет, 1 светодиод, 2 для RS485 (TX+R/W), остается 2Cat писал(а):Вот такое милое изделие, 140 руб, займет всего 8 ножек. http://chip-nn.ru/find.php?f=%EA%EB%E0% ... 2%F3%F0%E0
Лучше светодиоды подключить через сдвиговые регистры, а кнопки матрицей. Через АЦП и резисторы больше десятка кнопок лучше не подключать, потому что возрастают требования к их контактам.
C0FFEE=12648430
ты про АЦП? Если да, то такое решение стоит в некоторых автомагнитолах, кнопки на руле, передние анели телевизоров.Cat писал(а):Как с надежностью данного решения?
Почему теоретически?
Проверено работает!



