Прерывание по нажатию кнопки самодельной клавиатуры

osetroff
Offline
Зарегистрирован: 27.08.2014

Подскажите, пожалуйста, на arduino UNO можно ли сделать так, чтобы при нажатии кнопки самодельной клавиатуры (какая кнопка нажата определяется уровнем напряжения, считываемым на аналоговом входе,например, A0), происходило еще и общее прерывание, например INT0 на pin2?

Нужно для оперативной обработки нажатия на клавиши.

Благодарю.

Клапауций 070
Offline
Зарегистрирован: 26.09.2015

соединить пины

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

osetroff пишет:
Нужно для оперативной обработки нажатия на клавиши.

У Вас настолько тяжелые вычисления, что время цикла loop превышает требуемое время реакции на нажатие клавиши?

osetroff
Offline
Зарегистрирован: 27.08.2014

Так?

osetroff
Offline
Зарегистрирован: 27.08.2014

Просто привык делать все хорошо.

Клапауций 070
Offline
Зарегистрирован: 26.09.2015

так, что бы на пине был логический сигнал.

*какой мудак, вообще, придумал кнопочный джойстик назвать клавиатурой и парить этим мосг неофитам дуино.

a5021
Offline
Зарегистрирован: 07.07.2013

Заводить механические контакты на входы внешних прерываний -- это довольно порочная практика. Дребезг контактов может приводить к малообъяснимым эффектам, последствия которых будут непрогнозируемыми.

osetroff
Offline
Зарегистрирован: 27.08.2014

Благодарю за предупреждение.

А ответ на мой вопрос у вас есть?

Клапауций 070
Offline
Зарегистрирован: 26.09.2015

osetroff пишет:

Благодарю за предупреждение.

А ответ на мой вопрос у вас есть?

хм. я думал, ты понял что делать - соедини любой цифровой пин с пином прерывания, дёргай цифровыми пином пин прерывания по любым событиям - будь то состояния аналогового входа или что другое.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

osetroff, компаратор нужен. Он будет сравнивать напряжение питания и напряжение на аналоговом пине. Как только на аналоговом напряжение станет меньше -компаратор дёрнет прерывание. Можно попробовать использовать внутренний компаратор контроллера, у него есть своё собственное прерывание. Тогда один пин, даже скажу конкретно -6й нужно будет отдать под образцовое +5 вольт прямо с места питания  клавиатуры (или просто подтянуть вход внутренней подтяжкой, но это глючнее). Это будет неинвертирующий вход (+). А второй вход 7й, соединить с аналоговым входом, это будет (-). Есть вариант назначить один из аналоговых входов инвертирующим входом компаратора, тогда придётся в прерывании немножко пожонглировать битовыми операциями переназначая этот пин то на компаратор, то на аналоговый вход. 

osetroff
Offline
Зарегистрирован: 27.08.2014

Поясню, вот какой у меня

void loop(){

//keyb обработка нажатий на клав

if (_keyb_pressed) {..... _keyb_pressed=FALSE;}

//main цикл обработки данных

do {..... if (_keyb_pressed) break; .....} while (....);

//pwrdown спим 8sec

if (_keyb_pressed==FALSE) {pwrdown (_8s);}

}

При нажатии на клавиатуру, в прерывании устанавливается _keyb_pressed=TRUE;

Из основного цикла вылетим по проверке.

Из pwrdown вылетим по прерыванию.

Т.е. цель - максимально короткий отклик на реакцию пользователя.

osetroff
Offline
Зарегистрирован: 27.08.2014

Клапауций 070 пишет:

дёргай цифровыми пином пин прерывания по любым событиям - будь то состояния аналогового входа или что другое.

Это - аппаратный вопрос, т.е. не программный.

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

osetroff
Offline
Зарегистрирован: 27.08.2014

dimax пишет:

osetroff, компаратор нужен.

Благодарю, сейчас попробую в этом разобраться и попробовать!

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

osetroff, возможно там придётся изрядно повозится.. В принципе по-умолчанию компаратор включен, можете поэксперементировать без чтения талмудов. Подайте на 7 ногу gnd, на 6 ногу +питания. И командой Serial.print (bitRead(ACSR,ACO)) ; выведите что на выходе компаратора. Должна быть лог.1, а если поменять провода наоборот -лог.0

Клапауций 070
Offline
Зарегистрирован: 26.09.2015

osetroff пишет:

Это - аппаратный вопрос, т.е. не программный.

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

кому должно?

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

osetroff пишет:
Это - аппаратный вопрос, т.е. не программный. При нажатии на клавишу, автоматически должно вызываться прерывание.

У Вас "клавиши" не защищены от дребезга (аппаратно), поэтому прерываний там может оказаться несколько...

osetroff
Offline
Зарегистрирован: 27.08.2014

dimax пишет:

Тогда один пин, даже скажу конкретно -6й нужно будет отдать под образцовое +5 вольт прямо с места питания  клавиатуры (или просто подтянуть вход внутренней подтяжкой, но это глючнее). Это будет неинвертирующий вход (+). А второй вход 7й, соединить с аналоговым входом, это будет (-).

В power-down только int0,int1 и pinchange.

Может и можно по pin change, но сложно.

 

Выводы:

Есл клавиш мало, то делаем цифровую клаву с прерываниями по pin change.

Вообще, клава должна быть цифровой, а не аналоговой!

 

У меня заработало по схеме (INT0 по RISING)

 

НО: после просыпания arduino проходит некоторое время, и, если пользователь долбит по клавишам быстро, то на аналоговом входе уже ловим напряжение отпущеной клавиши -> могут быть ошибки.

И еще, почему-то все замечательно работает от внешнего питания, и зависает при питании от USB через CH340G.

Надо бы как-то фильтровать помехи. Как?

osetroff
Offline
Зарегистрирован: 27.08.2014

Код для двух клавиш

#define _kbd_level 100
volatile int _kbd_pressed;
ISR(INT0_vect) { EIMSK&=~(1<<INT0);EIFR|=1;_kbd_pressed=analogRead(A0);}
//enable int0
#define _int0en  EIMSK&=~(1<<INT0);EIFR|=1;\
                _kbd_pressed=0;EICRA&=~(1<<ISC00)|(1<<ISC01);EICRA|=(1<<ISC00)|(1<<ISC01);\
                EIMSK|=(1<<INT0)

void setup() {
  //adcoff;
  pinMode(A0,INPUT);
  pinMode(2,INPUT);
  _int0en;
}

void loop() {
if (_kbd_pressed>_kbd_level) {
  if (_kbd_pressed>550) {
    //right
   
  } else {
    //left
   
  }
}
//enable int0
_int0en;
//main

// pwrdown
if (_kbd_pressed<_kbd_level) pwrdown(_8s,b0);
}

Эволюция клавиатуры:

1. Все кнопки на один аналоговый вход.

2. Каждой кнопке свой pin и прерывание по pin change.

3. Доп микросхемы (контроллер клавиатуры).

Правильно понимаю?

Благодарю всех за поддержку!