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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 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 пользователей онлайн

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

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