Обработка нажатия кнопки в AVR...
-
infinity19891
- Встал на лапы
- Сообщения: 141
- Зарегистрирован: Вс дек 18, 2011 10:26:43
- Откуда: Пинск
Re: Обработка нажатия кнопки в AVR...
Неужели никто не поможет?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Обработка нажатия кнопки в AVR...
настраиваете любой таймер на прерывание каждые 15 миллисекунд. заводите volatile-переменную btn, которая будет содержать номера кнопок. в прерывании таймера записываете в эту переменную содержимое порта, к которому подключены кнопки. в основном цикле смотрите в нужные моменты эту переменную и в зависимости от того, какие там значения, делаете то или это...infinity19891 писал(а):забыл как кнопки опрашивать.
Код: Выделить всё
#define BTN_PORT PINB
#define BTN1 PB0
#define BTN2 PB1
#define BTN3 PB3
// и так далее, сколько там у вас кнопок
volatile uint8_t btn;
ISR(IMER0_OVF_vect){
// каждые 15-20 миллисекунд!
btn = (~BTN_PORT) & (_BV(BTN1) | _BV(BTN2) | _BV(BTN3));
}
int main(void){
// всякое разное ваше
// настройки портов и таймеров
while(1){
// всякое разное нужное
switch(btn){
case _BV(BTN1): // если нажата кнопка 1
break;
case _BV(BTN2): // если нажата кнопка 2
break;
// и так далее все кнопки
default:
// если не нажато ни одной кнопки или нажато сразу несколько
}
}
}если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Обработка нажатия кнопки в AVR...
Немного не понятна, что означает сия фраза :
Состояние входа не знаете как опросить, или что ?
И что значит "забыли" ? В даташите на камень полюбому расписаны регистры, отвечающие за порты. Может стоит туда заглянуть, чтобы вспомнить ?
infinity19891 писал(а):забыл как кнопки опрашивать
Состояние входа не знаете как опросить, или что ?
И что значит "забыли" ? В даташите на камень полюбому расписаны регистры, отвечающие за порты. Может стоит туда заглянуть, чтобы вспомнить ?
-
infinity19891
- Встал на лапы
- Сообщения: 141
- Зарегистрирован: Вс дек 18, 2011 10:26:43
- Откуда: Пинск
Re: Обработка нажатия кнопки в AVR...
ARV, Спасибо большое!
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Обработка нажатия кнопки в AVR...
ИМХО, это немного неправильный алгоритм. Чтобы не вышло чего боком, переменную btn перед тем как передать в CASE надо скопировать! Иначе представьте что переменная изменится посреди CASE... прерывание-то может произойти в любой момент. И ещё завести надо две переменные - одна предыдущее состояние а другая, рабочая, будет содержать флаги нажатия кнопок. В прерывании произвести XOR с предыдущим состоянием, там где текущее =1 и XOR тоже даёт =1 соответствующий бит в рабочем регистре установить.
В итоге, имеем в рабочем регистре факты нажатия кнопок, независимо от того сколько их удерживают. При проверке и отработке процедуры по нажатию кнопки сбросить 1 в рабочем регистре.
Впрочем, я бы всеравно усложнил обработчик - Проверяем состояние порта по маске(надо ли? может сразу воспользоваться BST/BLD), копируем бит в флаг С, и даём команду ROL. В итоге, кнопки могут быть расположены на любом порту и заданы дефайнами, а результат ложится в один регистр компактно. Кнопки потом можно переназначать дефайнами, а внутреннее представление останется неизменным.
В итоге, имеем в рабочем регистре факты нажатия кнопок, независимо от того сколько их удерживают. При проверке и отработке процедуры по нажатию кнопки сбросить 1 в рабочем регистре.
Впрочем, я бы всеравно усложнил обработчик - Проверяем состояние порта по маске(надо ли? может сразу воспользоваться BST/BLD), копируем бит в флаг С, и даём команду ROL. В итоге, кнопки могут быть расположены на любом порту и заданы дефайнами, а результат ложится в один регистр компактно. Кнопки потом можно переназначать дефайнами, а внутреннее представление останется неизменным.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Обработка нажатия кнопки в AVR...
и что будет? ничего ровным счетом: используется переменная ровно в одном месте - switch(btn), именно в этот момент из нее будет взято значение, помещено в регистр и далее будет вестись работа уже с этим регистром. переменная пусть себе меняется хоть сто раз - отработает только то ее значение, что было в момент обращения. ну а новое - в новой итерации цикла.Alexeyslav писал(а):Иначе представьте что переменная изменится посреди CASE...
не надо паники!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
infinity19891
- Встал на лапы
- Сообщения: 141
- Зарегистрирован: Вс дек 18, 2011 10:26:43
- Откуда: Пинск
Re: Обработка нажатия кнопки в AVR...
В общем жесть. Мутил-мутил, и намутил такого... при этом всё собралось, но ниодна нажатая кнопка не даёт никаких результатов. Бьюсь уже который день. Прошу помощи у знающих. Проект прилагается, создан в AVR Studio 4, на C. Помогите сделать кнопки рабочими...
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Обработка нажатия кнопки в AVR...
Оно и понятно... смотрел-смотрел исходник и НЕ НАШЁЛ того места где у тебя кнопки вообще проверяются.
Лучше в таких случаях ставить себе вопрос: а почему оно ДОЛЖНО работать? и мысленно доказать что оно ДОЛЖНО работать, в процессе найдёшь причину.
Лучше в таких случаях ставить себе вопрос: а почему оно ДОЛЖНО работать? и мысленно доказать что оно ДОЛЖНО работать, в процессе найдёшь причину.
-
infinity19891
- Встал на лапы
- Сообщения: 141
- Зарегистрирован: Вс дек 18, 2011 10:26:43
- Откуда: Пинск
Re: Обработка нажатия кнопки в AVR...
Alexeyslav, за время написания, сборки устройства и основной работы, уже кипит мозг. Я не могу найти ошибку, потому и прошу о помощи, ибо нет сил уже, туплю.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Обработка нажатия кнопки в AVR...
у меня сложилось впечатление, что вы откуда-то надергали файлов и свалили все в кучу, ожидая, что в этой помойке зародится жизнь.infinity19891 писал(а):за время написания, сборки устройства и основной работы, уже кипит мозг. Я не могу найти ошибку
в частности, мой "пример" опроса кнопок вы просто кинули в общую кучу даже не задумавшись, что теперь в вашем проекте 2 функции main!
думаю, вам стоит подумать о том, как нанять кого-либо для написания программы по вашему заданию, иначе ваш мозг выкипит полностью без всякого результата, разве что крышку сорвет паром.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
infinity19891
- Встал на лапы
- Сообщения: 141
- Зарегистрирован: Вс дек 18, 2011 10:26:43
- Откуда: Пинск
Re: Обработка нажатия кнопки в AVR...
ARV, Ваш пример я не скинул просто в проект, скачайте и посмотрите. Функция main по всему проекту только в основном файле, main.c. Далее. Я всё прекрасно понимаю, что проще человека обвинить неизвестно в чём, нежели помочь ему. А я просто очень давно не писал ничего. Так что спасибо вам за помощь.
- Zhuk72
- Сверлит текстолит когтями
- Сообщения: 1231
- Зарегистрирован: Ср янв 29, 2014 08:41:31
- Откуда: Баку
- Контактная информация:
Re: Обработка нажатия кнопки в AVR...
infinity19891 писал(а):Функция main по всему проекту только в основном файле, main.c
В switch.c загляните.
Спойлер
Код: Выделить всё
int main(void){
// всякое разное ваше
// настройки портов и таймеров
while(1){
// всякое разное нужное
switch(btn){
case _BV(BTN1): // если нажата кнопка 1
break;
case _BV(BTN2): // если нажата кнопка 2
break;
// и так далее все кнопки
default:
// если не нажато ни одной кнопки или нажато сразу несколько
}
}
}
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
-
infinity19891
- Встал на лапы
- Сообщения: 141
- Зарегистрирован: Вс дек 18, 2011 10:26:43
- Откуда: Пинск
Re: Обработка нажатия кнопки в AVR...
Zhuk72, да, вы правы. Только этот файлик случайно оказался в архиве, и отношения ко всей программе не имеет. Похоже запутал этим людей. Всё касающееся кнопок в файле sw.c. Но никак не получается правильно построить опрос кнопок, и сделать чтобы всё работало как надо. Потому и прошу помощи.