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

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


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

Реклама: ООО ТД Промэлектроника, ИНН: 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

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

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

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

Первая ошибка а точнее предупреждалка: не объявлена частота на которой будет работать мк. Из за этого ваши делеи будут неправильно работать. Вторая ошибка; неправильно обозван обработчик прерывания, в студии название отличается от 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 пользователей онлайн

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

  • Сообщения

    • Здравствуйте. Чтобы не открывать новую тему по примитивному вопросу. На фото выше справа вверху стоит ионистор. На этой плате никаких элементов памяти я не вижу, поэтому скорее всего питание с ионистора подается вверх - на плату с МК.   Правильно ли я понимаю, что ионистор нужен для хранения текущего времени, а рабочая программа хранится в eeprom или flash на плате с МК (или в кишках самого МК)? Вопрос связан с тем, что прежде чем чинить эту LOGO, надо знать, сохранилась ли в нем программа. А чтобы узнать, сохранилась ли в нем программа, надо иметь соответствующую приблуду. Приблуду можно сотворить и самому, но если программа все-таки хранится в sram с питанием от ионистора, то никакого смысла делать приблуду нет, как и чинить LOGO. Просьба просветить, кто в курсе месте хранения рабочей программы в siemens logo. LOGO само собой старый: 6ED1052-1MD00-OBA5  
    • Против разумной, никаких. Кашкаровшина к ней не относится.
    • Таки делаю правильно, из за 50 гигов диск не попру никуда.
    • Доступ к файлам проекта, серверной части и график дизайнеру есть?
    • Эта платка напрямую к УСБ подключается, я через Arduino IDE заливал тот код, как в статье. Может правда панели плохие. Ножки не смог к плате припаять, припой вообще не ложился, поэтому проводочки только. Спасибо, а второй конденсатор обычный на 100 нанофарад? диод который уже у меня есть, его можно оставить? А код через арудино также заливать?
    • Проблема со щелчками в SMSL SU-1 - ошибка проектирования. Поставили туда модный разъём USB-C, но все кабели для них тонкие и дешёвые, практически без экранирования, и они прекрасно ловят наводки от сети в виде тихих раздражающих щелчков. Особенно если кабель лежит на силовых проводах от другой техники. Старые же USB-C кабели от принтеров и сканеров имеют хорошее плетёное экранирование и наводкам не подвержены. Поэтому меняйте свои ужасные SMSL SU-1 на прекрасный TOPPING DX-1, там ещё и усилитель для наушников есть.
    • "Умные" по форумам не шляются . Оформление в корпусе надо знать для начала .  А так , если не хватает естественной конвекции добавляют дополнительную . Тепловые трубки , антифриз и т.п. . Но это будет ставится в предполагаемый конструктив .   
×
×
  • Создать...