• Объявления

    • admin

      Просьба всем принять участие!   24.11.2017

      На форуме разыгрывается спектроанализатор Arinst SSA-TG LC (цена 18500 руб). Просьба всем перейти по ссылке ниже и принять участие!
Alex

Подключение Кнопок К Микроконтроллерам

98 сообщений в этой теме

Alex    524

Правильно.

Посмотрите пример по ссылке, там всё просто и понятно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
mail_robot    1 207

Есть еще один способ - применить операционную систему реального времени ) Типа FreeRTOS

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

Изменено пользователем mail_robot

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    285

Я сканирую кнопки практически всегда в основном цикле . И также, в основном цикле выполняю обработку других операций , например индикацию , управление выходами и т.д.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3d_killer    3

Alex, на AtmelStudio не работает сей код(

post-192304-0-18037900-1450202789.jpg

Изменено пользователем 3d_killer

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    524

Я его писал на CV AVR.

Но его не трудно переписать под любой компилятор, немного разобравшись с ним...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3d_killer    3

mega8 нет там такого файла подключены эти:

#include <avr/io.h>

#include <avr/delay.h>

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    524

Ну подключайте какие есть. Естественно, синтаксис и подключаемые файлы у разных компиляторов могут отличаться.

Смысл в том, чтобы запустить таймер и в его обработчик добавить код сканирования кнопок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3d_killer    3

все вроде компилируется буду проверять завтра на протеусе

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Viktor26    300

Первая ошибка а точнее предупреждалка: не объявлена частота на которой будет работать мк. Из за этого ваши делеи будут неправильно работать. Вторая ошибка; неправильно обозван обработчик прерывания, в студии название отличается от CVAVR. Ну и уверен что вы забыли подключить библиотеку interrupt.h

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3d_killer    3

короче написал я код простенький для новичков (каким являюсь я), для работы с прерываниями, то что дал Алекс совершенно не для новичков, идет сопоставление констант, куча кода который новички не поймут

#include <avr/io.h>
#include <avr/interrupt.h>
//Вектор прерывания
ISR (TIMER0_OVF_vect)
{
asm("nop"); //Нет операции
}
//Предустановки
void init()
{
TCCR0 |= 0b00000001; //Делитель 1:1
TIMSK |= (1<<TOIE0); //Разрешаем прерывание по переполнению
asm("sei"); //Флаг глобального прерывания
}
//Основной цикл
int main(void)
{
init();
while(1)
{
asm("nop"); //Нет операции
}
}

Изменено пользователем 3d_killer

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Viktor26    300

Стесняюсь спросить, что полезного в этом коде?? Это вы просто переписали хелп от вашего компилятора. А где опрос кнопок с антидребезгом???

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3d_killer    3

меня интересовало реализация прерывания для опроса а не сам опрос

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Viktor26    300

Ну так она везде стандартная, просто для разных IDE обработчик прерывания может по разному называться, а как он называется можно подглядеть в хидере interrupt.h

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не слишком ли высокая частота опроса кнопок получится? Вы так дребезг будете ловить. Придется сложный фильтр делать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3d_killer    3

это как пример, делитель выставить то можно, я специально подписал, чтобы такие как я быстро разобрались

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mne_nado    0

Доброго времени суток.

Я мало знаком со схемотехникой, но передо мной поставлена задача - написание keypad для LPC82 контроллера

там 18 кнопок. 6 строк и 3 столбца

Для теста хочу обработать хотябы 1 кнопку. Первая строка это gpio 17 первый столбец это gpio 2 (Порт только один это порт 0)

Значит для 17 pin назначил DIR input значение 0

Для 2 pin назначил output значение 1

while(1)
{
read value pin 17
if(value == 1)
{
 write to uart (button press)
set value pin 17 = 0; //типо скинули
}
}

Чет так не работает сколько не юлозел железкой по кнопке . GPIO_Init() есть

Есть еще там как я понял встроенный гистерезис для pin-а

Можно еще как то по прерываниию это сделать если есть примеры пришлите пожалуйста буду очень благодарен

Мне надо фиксировать нажатие отжатие

Пользуюсь IDE LPCXpresso и lib82_chip

.

Изменено пользователем mne_nado

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mail_robot    1 207

кмк вам стоит ознакомится с темой поподробнее. Ваш код полная фигатория и даже комментировать его не вижу смысла. фраза - дайтекод тут не работает

особенно вот это порадовало

set value pin 17 = 0; //типо скинули

Изменено пользователем mail_robot

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mne_nado    0

keypad готова только пришлось использовать 6 прерываний (1 прерывание на строку). Как их мультиплексировать не знаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    524
только пришлось использовать 6 прерываний
:crazy: А можно было обойтись одним - на таймере.

Правильно Вам сказали - почитайте тему, благо тут страничек немного.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Purple    0

Добрый день!

У меня возникла проблема с обработкой кнопки. Использую ATmega48PA-PU, подключил светодиод на первую ножку PORTC, а на вторую ножку подключил кнопку. Обычный простой код.

В Атмел Студио все замечательно, без ошибок и тестировал все ок. Но в реале при нажатие на кнопку, светодиод загорается, а когда отжимаю кнопку он продолжает гореть и не гаснет.

Вроде, код без ошибок, но все же.

Может кто поможет разобраться с ситуацией.

Привожу код программы:

#define  F_CPU 4000000UL
#include <avr/io.h>
int main(void)
{ DDRC=0x01;
PORTC=0x02;
while(1)
{
 if(!(PINC & 0x02))
 {
  PORTC|=0x01;
 }
 else
 {
  PORTC&=0xFE;
 }
}
}

Заранее спасибо всем откликнувшимся...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Sergey-Ufa    545

У любых механических контактов существует такое явление как дребезг. При отладке в студии его естественно нет. Дребезг нужно подавлять либо программно, либо схемотехнически. Гугл в помощь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Mishany    42

if((PINC&(1<<2)==0)//если на 2 порту 0

{

PORTC|=(1<<1);//установка 1 на 1 порту

}

else// иначе

{

PORTC&=~(1<<1);//сбрасываем в 0 первый порт

}

и почитайте про битовые операции! и рекомендации оформления кода

Изменено пользователем Mishany

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
POlSS0N    2

Мой вариант.

Прибор - PIC16f877a

Кнопки подключены к RA2, RA3, RA5, RA6.

Чтобы кнопки работали конкретно на порту А кроме описанного необходимо еще и перевести эти выводы, принадлежащие модулю АЦП, в режим цифровых входов, написав

PCFG1 = 1;PCFG2 = 1;PCFG3 = 1;

Итак, алгоритм на мой взгляд очень простой, читабельный и легко расширяемый. Я на нем целую систему меню построил без особого труда.

1)В заголовочном файле создаем переменные типа unsigned char status, содержащую различные флаги, и inputwait, которая обеспечивает защиту от дребезга контактов

2) В заголовочном же файле для красоты и удобства определяем следующие макросы:

#define ISPUSH (status & 0b00000010)//проверяет, была ли нажата кнопка
#define SETPUSH (status |= 0b00000010)//устанавливает флаг, что кнопка была нажата
#define GETPUSH (status &= 0b11111101)//снимает флаг

#define IENABLED (status & 0b00000100)//проверяет, разрешена ли обработка событий кнопки
#define IENABLE (status |= 0b00000100)//разрешает
#define IDISABLE (status &= 0b11111011)//запрещает

3) Включаем прерывания таймера и настраиваем его на срабатывание каждые 65536 программных циклов.

int main(int argc, char** argv) {
...
 GIE = 1; PEIE = 1; TMR0IE = 1; TMR0IF = 0;
 PS0 = 1; PS1 = 0; PS2 = 1; PSA = 0; T0CS = 0;
...

 while (1) maincycle();
 return (EXIT_SUCCESS);
}

4) в главном цикле - добавляем процесс отслеживания событий кнопок

void maincycle() {
...
 if (IENABLED) push();
...
}

5) прерывание

interrupt void isr() {
 if (TMR0IF) {
   inputwait--;
   if (inputwait == 0) IENABLE;//разрешаем обработку событий кнопок
   TMR0IF = 0;
 }
//тут могут быть обработчики других прерываний
}

6) сам процесс обработки нажатий-отпусканий

void push() {
 if (ISPUSH) {//если кнопка была нажата
   if (PORTA == 0) {//а теперь отпущена
     GETPUSH;//фиксируем отпускание
     inputwait = 20;
     IDISABLE;//отключаем обработку событий нажатия на 20 тиков
   }
 } else {
     switch (PORTA) {
       case 2:
         //тут наши действия по нажатию кнопки вверх
         release();
         break;
       case 4:
         //тут наши действия по нажатию кнопки вниз
         release();
         break;
       ...//и так далее
   }
 }
}

7) вспомогательная функция release фиксирующая нажатие и отключающая обработку событий кнопки на 10 тиков

void release() {
 inputwait = 10;
 IDISABLE;
 SETPUSH;
//тут выполняем действия которые должны быть выполнены после любого нажатия на кнопку, например обновление данных на дисплее
}

Вот собственно и всё.

Уверен, нечто подобное будет актуально и для других контроллеров.

Несколько иной алгоритм разве что следует сделать для многокнопочных панелей, опрашивая разные ряды по очереди.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
PeterBr    0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас