Форум РадиоКот https://radiokot.ru/forum/ |
|
Обработка нажатия кнопки в AVR... https://radiokot.ru/forum/viewtopic.php?f=20&t=39341 |
Страница 15 из 15 |
Автор: | infinity19891 [ Пт фев 17, 2017 08:45:11 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
Неужели никто не поможет? |
Автор: | ARV [ Пт фев 17, 2017 09:50:47 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
infinity19891 писал(а): забыл как кнопки опрашивать. настраиваете любой таймер на прерывание каждые 15 миллисекунд. заводите volatile-переменную btn, которая будет содержать номера кнопок. в прерывании таймера записываете в эту переменную содержимое порта, к которому подключены кнопки. в основном цикле смотрите в нужные моменты эту переменную и в зависимости от того, какие там значения, делаете то или это...Код: #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 [ Пт фев 17, 2017 10:04:47 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
Немного не понятна, что означает сия фраза : infinity19891 писал(а): забыл как кнопки опрашивать Состояние входа не знаете как опросить, или что ? И что значит "забыли" ? В даташите на камень полюбому расписаны регистры, отвечающие за порты. Может стоит туда заглянуть, чтобы вспомнить ? |
Автор: | infinity19891 [ Пт фев 17, 2017 10:50:14 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
ARV, Спасибо большое! |
Автор: | Alexeyslav [ Пт фев 17, 2017 18:17:45 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
ИМХО, это немного неправильный алгоритм. Чтобы не вышло чего боком, переменную btn перед тем как передать в CASE надо скопировать! Иначе представьте что переменная изменится посреди CASE... прерывание-то может произойти в любой момент. И ещё завести надо две переменные - одна предыдущее состояние а другая, рабочая, будет содержать флаги нажатия кнопок. В прерывании произвести XOR с предыдущим состоянием, там где текущее =1 и XOR тоже даёт =1 соответствующий бит в рабочем регистре установить. В итоге, имеем в рабочем регистре факты нажатия кнопок, независимо от того сколько их удерживают. При проверке и отработке процедуры по нажатию кнопки сбросить 1 в рабочем регистре. Впрочем, я бы всеравно усложнил обработчик - Проверяем состояние порта по маске(надо ли? может сразу воспользоваться BST/BLD), копируем бит в флаг С, и даём команду ROL. В итоге, кнопки могут быть расположены на любом порту и заданы дефайнами, а результат ложится в один регистр компактно. Кнопки потом можно переназначать дефайнами, а внутреннее представление останется неизменным. |
Автор: | ARV [ Пт фев 17, 2017 18:24:11 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
Alexeyslav писал(а): Иначе представьте что переменная изменится посреди CASE... и что будет? ничего ровным счетом: используется переменная ровно в одном месте - switch(btn), именно в этот момент из нее будет взято значение, помещено в регистр и далее будет вестись работа уже с этим регистром. переменная пусть себе меняется хоть сто раз - отработает только то ее значение, что было в момент обращения. ну а новое - в новой итерации цикла. не надо паники! |
Автор: | infinity19891 [ Ср фев 22, 2017 01:25:17 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
В общем жесть. Мутил-мутил, и намутил такого... при этом всё собралось, но ниодна нажатая кнопка не даёт никаких результатов. Бьюсь уже который день. Прошу помощи у знающих. Проект прилагается, создан в AVR Studio 4, на C. Помогите сделать кнопки рабочими... Вложение:
|
Автор: | Alexeyslav [ Ср фев 22, 2017 12:34:12 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
Оно и понятно... смотрел-смотрел исходник и НЕ НАШЁЛ того места где у тебя кнопки вообще проверяются. Лучше в таких случаях ставить себе вопрос: а почему оно ДОЛЖНО работать? и мысленно доказать что оно ДОЛЖНО работать, в процессе найдёшь причину. |
Автор: | infinity19891 [ Чт фев 23, 2017 01:04:16 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
Alexeyslav, за время написания, сборки устройства и основной работы, уже кипит мозг. Я не могу найти ошибку, потому и прошу о помощи, ибо нет сил уже, туплю. |
Автор: | ARV [ Чт фев 23, 2017 10:32:49 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
infinity19891 писал(а): за время написания, сборки устройства и основной работы, уже кипит мозг. Я не могу найти ошибку у меня сложилось впечатление, что вы откуда-то надергали файлов и свалили все в кучу, ожидая, что в этой помойке зародится жизнь. в частности, мой "пример" опроса кнопок вы просто кинули в общую кучу даже не задумавшись, что теперь в вашем проекте 2 функции main! думаю, вам стоит подумать о том, как нанять кого-либо для написания программы по вашему заданию, иначе ваш мозг выкипит полностью без всякого результата, разве что крышку сорвет паром. |
Автор: | infinity19891 [ Пт фев 24, 2017 13:17:18 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
ARV, Ваш пример я не скинул просто в проект, скачайте и посмотрите. Функция main по всему проекту только в основном файле, main.c. Далее. Я всё прекрасно понимаю, что проще человека обвинить неизвестно в чём, нежели помочь ему. А я просто очень давно не писал ничего. Так что спасибо вам за помощь. |
Автор: | Zhuk72 [ Пт фев 24, 2017 14:29:58 ] |
Заголовок сообщения: | 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: // если не нажато ни одной кнопки или нажато сразу несколько } } } |
Автор: | infinity19891 [ Чт мар 02, 2017 22:57:02 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
Zhuk72, да, вы правы. Только этот файлик случайно оказался в архиве, и отношения ко всей программе не имеет. Похоже запутал этим людей. Всё касающееся кнопок в файле sw.c. Но никак не получается правильно построить опрос кнопок, и сделать чтобы всё работало как надо. Потому и прошу помощи. |
Автор: | Аlex [ Пт янв 11, 2019 15:56:05 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
По кнопкам сюда - https://radiokot.ru/forum/viewtopic.php?f=61&t=79801 |
Страница 15 из 15 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |