Перейти к содержанию

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


Рекомендуемые сообщения

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

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

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

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

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

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

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

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

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

Не знаеш как? Спроси у Google'а !!!

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

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

#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
Ссылка на комментарий
Поделиться на другие сайты

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

Не знаеш как? Спроси у Google'а !!!

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

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

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

Не знаеш как? Спроси у Google'а !!!

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

  • 1 месяц спустя...

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

Я мало знаком со схемотехникой, но передо мной поставлена задача - написание 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
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

только пришлось использовать 6 прерываний
:crazy: А можно было обойтись одним - на таймере.

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

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

  • 3 недели спустя...

Добрый день!

У меня возникла проблема с обработкой кнопки. Использую 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;
 }
}
}

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

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

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

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

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

{

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

}

else// иначе

{

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

}

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

Изменено пользователем Mishany
Ссылка на комментарий
Поделиться на другие сайты

  • 4 недели спустя...

Мой вариант.

Прибор - 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;
//тут выполняем действия которые должны быть выполнены после любого нажатия на кнопку, например обновление данных на дисплее
}

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

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

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

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

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

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...