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

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


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

Как уловить нажатие кнопки на Attiny13A ? Кнопка одним концом подключена к 5, другим к PB4. Но нажатие не фиксируется. Как зафиксировать подачу сигнала на PB4 ?

	DDRB = 0b01111;
	PORTB = 0b10000;

while (1)
	{
		
		if ((PINB & ( 1 << 4 )) == 1){ // пробовал PINB4 == 1
			
			PORTB = 0b1001;
			_delay_ms(500);
			
			PORTB = 0b1010;
			_delay_ms(500);

			PORTB = 0b1100;
			_delay_ms(500);

			// order ended...
			
			_delay_ms(1000);
			
		}
		else {
			
			PORTB = 0b0000;
			
		}

 

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

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

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

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

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

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

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

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

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

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

On 6/16/2017 at 7:23 AM, KomSoft said:

5 это наверное +5в? А порт резистором  1-10к подтянут к земле? Иначе будет ВСЕГДА считываться 1 или мусор

да, это 5V.

Резистор >6 kOm подтянут к земле. При подаче питания диодики мигают, а по кнопке нет.

Spoiler

#define F_CPU 1200000UL

#include <avr/io.h>
#include <util/delay.h>


void DoubleLedOrder(){
	
	PORTB = 0b001;
	_delay_ms(500);
	
	PORTB = 0b010;
	_delay_ms(500);

	PORTB = 0b100;
	_delay_ms(500);
	
	PORTB = 0b010;
	_delay_ms(500);
	
	PORTB = 0b001;
	_delay_ms(500);
	
	PORTB = 0b000;
	
}

int main(void)
{
	
	DDRB = 0b01111;
	PORTB = 0b10000;

	
	_delay_ms(1000);
	
	DoubleLedOrder(); // test
	
	while (1)
	{
		
		if ((PINB & ( 1 << 4 )) == 1){
			
			DoubleLedOrder();
			
		}
		
	}
	
	return 0;
	
}

 

 

0b332368ee584b2db62c1deb502d1068.png

Условие срабатывает при == 0, то есть всегда мигает, а при нажатие нет. Но а как логическую 1 получить ?

 

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

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

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

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

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

if (PINB4 == 1)

27 минут назад, Евгений Надточий сказал:

Условие не срабатывает

а и не должно срабатывать, потому что PINB4 может быть только = 4. А единице  - никогда.

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

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

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

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

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

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

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

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

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

Я поправил свой пост. Видимо константа PINB4 всегда = 4.

Типа, надо проверять неравенство нулю:

if(PINB & ( 1 << PINB4 ) !=  0)

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

8 minutes ago, Yurkin2015 said:

if(PINB & ( 1 << PINB4 ) !=  0)

Спасибо, работает.

А условие == 1 представляет из себя конкретное значение напряжения / тока ?

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

Вероятно, надо было сравнивать с 0b10000, а не с 1.

Так как выражение PINB & ( 1 << 4 ) при нажатой кнопке даст как раз число 0b10000, а просто 1 это 0b00001.

С уважением, Михаил, EEP Lab

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

4 минуты назад, Евгений Надточий сказал:

А условие == 1 представляет из себя конкретное значение напряжения ?

1 - это просто число. Сравнение двух чисел. Когда кнопка не нажата, что PINB = 00000000 в двоичном виде. Когда кнопка нажата, что PINB = 00010000, отличие в четвёртом бите. Поэтому операция

PINB & ( 1 << 4 )

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

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

  • 5 месяцев спустя...

Не знаю был такой вариант или нет , но напишу его. Пример очень простой и эффективный в принципе:

Скрытый текст
Цитата

while(1)

{

if(KEY1==0 && flg&0x01)

{

// Что то делаем

flg&=~0x01; // сбросили флаг

}

if(KEY1)flg|=0x01; 

delay_(50);

}

С телефона плохо пример писать .. но думаю понятно.

 

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

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

может запишем поровнее?

Quote

while(1)

{

if(!KEY10 && flg) flg = !flg; // сбросили флаг

if(KEY1) flg = 1; 

delay_(50);

}

метод в принципе может и работать, но для очень простых задач. Потому как прерывание программы на 50 мс ради какой то кнопотульки, это очень расточительно.

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

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

подобное решение может красиво работать только в случае использования ОС. Там логика работы позволяет (и даже рекомендует) использовать задержки. Правда не все так просто, но в целом именно так.

вот пример опроса группы кнопок с использованием ОС. Каждая может работать независимо от остальных или вместе с ними, одновременно или раздельно. В общем как угодно и все будет корректно

typedef struct
{
	GPIO_PinState New_state;
	GPIO_PinState Old_state;	
} Button_state;

typedef struct
{
	uint8_t event; // событие кнопки (кнопка нажата)
	Key_status ctrl; // контроль кнопки (запрет/разрешение считывания состояния)
} _key;

typedef struct
{
	_key Up;
	_key Down;
} Keyboard_state;

Keyboard_state Keyboard; // глобальное обьявление структуры клавиатуры

/* Start_Keyboard_Task function */
void Start_Keyboard_Task(void const * argument)
{
	
  // init Keyboard
  Button_state Up_key;
  Button_state Down_key;
	
	Keyboard.Down.event = 0;
	Keyboard.Up.event =0;
	
	Keyboard.Down.ctrl = kbENABLE;
	Keyboard.Up.ctrl =kbENABLE;
  
  const uint8_t Debounce_time = 10;
  
  // start key scan
  for(;;)
  {
			
		Up_key.New_state = HAL_GPIO_ReadPin(RSRV_1_GPIO_Port, RSRV_1_Pin);
		Down_key.New_state = HAL_GPIO_ReadPin(RSRV_2_GPIO_Port, RSRV_2_Pin);
		
		if (Up_key.New_state != Up_key.Old_state && Keyboard.Up.ctrl)
		{
			if (Up_key.New_state == GPIO_PIN_RESET) Keyboard.Up.event = 1;
			osDelay(Debounce_time);
			Up_key.Old_state = Up_key.New_state;
		}
		if (Down_key.New_state != Down_key.Old_state && Keyboard.Down.ctrl)
		{
			if (Down_key.New_state == GPIO_PIN_RESET) Keyboard.Down.event = 1;
			osDelay(Debounce_time);
			Down_key.Old_state = Down_key.New_state;
		}
	}
}

для краткости я оставил только пару кнопок, но их можно делать сколько угодно, добавляя поле в структуру и накопипастив блоков if. Да в лоб, зато предельно понятно.

чисто пример и можно переписать посимпатичнее

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

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

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

4 часа назад, mail_robot сказал:

может запишем поровнее?

метод в принципе может и работать, но для очень простых задач. Потому как прерывание программы на 50 мс ради какой то кнопотульки, это очень расточительно.

Если программа критична к времени (если нужно обслуживать динамическую индикацию в основном цикле) , то можно сделать так:

Скрытый текст

while(1)

{

if((++tmr>DELAY) && !KEY10 && flg) flg = !flg; // сбросили флаг

if(KEY1) flg = 1; 

}

PS: с телефона по ровнее не получается :) а пк лень включать :)

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

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

8 часов назад, mail_robot сказал:

вот пример опроса группы кнопок с использованием ОС. Каждая может работать независимо от остальных или вместе с ними, одновременно или раздельно. В общем как угодно и все будет корректно

Можно немного сократить цикл задачи :
 

  for(;;)
  {
		Up_key.Old_state = Up_key.New_state;
		Down_key.Old_state = Down_key.New_state;
    
		osDelay(Debounce_time);
    
		Up_key.New_state = HAL_GPIO_ReadPin(RSRV_1_GPIO_Port, RSRV_1_Pin);
		Down_key.New_state = HAL_GPIO_ReadPin(RSRV_2_GPIO_Port, RSRV_2_Pin);
		
		if (Up_key.New_state != Up_key.Old_state && Keyboard.Up.ctrl)
		{
			Keyboard.Up.event = 1;
		}
		if (Down_key.New_state != Down_key.Old_state && Keyboard.Down.ctrl)
		{
			Keyboard.Down.event = 1;
		}
	}

 

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

неа, не пойдет. Новое состояние должно запоминаться только для сработавшей кнопки, а не для всех подряд. Поэтому задержка именно внутри иф-а

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

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

1 минуту назад, mail_robot сказал:

Новое состояние должно запоминаться только для сработавшей кнопки

А оно так и будет. Если состояние кнопки не изменится, оно и не запомнится. Точнее останется прежней.

Всё пойдёт... Попробуйте, и всё заработает :)

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

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

самое главное, что функция легко масштабируется под любое количество кнопок и позволяет гибко ими управлять. Не всегда же надо иметь все кнопки активными, поэтому если ктото установил флаг блокировки, эта кнопка запрещается к опросу и event всегда будет нулевой для нее. Удобно

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

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

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

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

я чисто из спортивного интереса. Но в целом удивлен, что люди даже на довольно слабых камнях осью не брезгуют уже. Я так то с пиками уже завязал и скорее всего навсегда. Смысла нет ни по деньгам ни по ресурсам ни по гибкости применения. STM за 3 копейки убивает эту нишу под корень. А так мне пики нравились больше авров. Какие то они более душевные чтоли. Последний камень F886-ой зашил. До сих пор лежит еще штук 80 тел разных из той жизни (16, 18). 

Остался ICD3 и кит второй. Кит жалко, а вот ICD-шку думаю куда деть

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

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

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

  • 1 год спустя...

Привет! Подскажите пожалуйста. Вообще изначально задача сделать универсальную кнопку, которая с помощью джампера может подавать на вход мк либо высокий потенциал, либо сажать на землю. Сначала я нарисовал эту схему, но чего-то мне кажется что она работать не будет.

2019-05-22_15-46-16.png.018059aa74daea08e95718ceb1e94aec.png

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

2019-05-22_15-47-49.png.ecbbcfedaa8f115b0268b6f0939cb98e.png

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

1 час назад, supercelt сказал:

хотелось бы универсальности

Не вижу практического применения, но дело ваше (может, макетная плата для разработок?). Без доп.деталей не получится. Нужно использовать два переключающих джампера: один переключает резистор подтяжки к питанию или общему, второй кнопку к противоположной шине. Но можно обойтись одним переключающим джампером, подключающий вход мк к кнопке или выходу инвертора на транзисторе.

П.С. Ну и не могу не сказать про использование логики "исключающее ИЛИ" - тогда можно обойтись обычным (не переключающим) джампером.

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

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

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

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

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

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

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

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

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

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

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

  • Сообщения

    • Ин-14 довольно тусклые лампы, а у вас вокруг освещают. Синева, вероятно, от паров ртути которые содержатся в лампах, добавляются для увеличения срока службы.
    • Вначале нужно измерить 5 вольт с блока питания при подключенных часах ! , и только потом принимать решение о замене блока питания. Если не меньше 4,8 вольта - , ничего не меняйте
    • Ток ламп у Вас скорее слишком большой, вон как сияют, но БП 5 вольт на него никак повлиять не сможет, внутренний высоковольтный преобразователь влияет на это, или китайцы поставили слишком маленькие токоограничивающие резистторы.
    • Всем доброго! Такой вот специфический вопрос возник - как бороться с нагревом соленоида, который будет работать 24/7 ?  В чем суть: есть такие штуки, может видели - "левитирующие цветочные горшки". Если кто ещё не видел - гуглить по ключевым словам "repulsive magnetic levitation" на youtube. С программной и электронной стороны - отлично знаю, как устроено, могу собрать - проблем нет. И хочу собрать :). Но проблема вот в чём: есть у меня большие сомнения, что соленоид, запитанный 24 часа в сутки, 7 дней в неделю - сие есть хорошо. По крайней мере, придётся очень серьёзно озаботиться (как мне кажется) борьбой с нагревом такого соленоида. Есть у меня ряд идей конечно, как это сделать - но хотелось бы послушать сначала умных людей. Любым идеям буду рад!
    • Та чистая плата, я отмывал флюс когда лампы припаивал. Да хорошо, попробую мощнее бп, а не сгорит плата, там защита есть?? А то 3 А подам и мало ли пыхнет((
    • Любые керамические конденсаторы соответствующей группы. КМ-ки бывают очень разные, группы ТКЕ - П33, МП0, М47....Н90. Также и любые другие - импортные, например NP0, X7R, Y5V и другие. Назначение, пределы емкости и потери на разных частотах разные. А минимальная индуктивность - у СМД, доли нГ.
×
×
  • Создать...