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

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


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

Как уловить нажатие кнопки на 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;
			
		}

 

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

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

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

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

Реклама: АО КОМПЭЛ, ИНН: 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 серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

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

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

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

if (PINB4 == 1)

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

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

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

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

Литиевые батарейки и аккумуляторы от мирового лидера  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 пользователей онлайн

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

  • Сообщения

    • @Владислав2 опередят хейтеры)
    • Да какие обиды. Если успею только найти с ламповой темы... Меня опередят 100 процент.  Всё верно. У вас стерео. Тюльпаны втыкаем в буфер. В буфере на каждый вход с тюльпана идёт дорожка, или проводок. Ободок  тюльпана - это масса. На входе саба есть разъём тюльпан мама. Вот к его контактам надо подключить 2 сопротивления. 330 Ом и 150 Ом последовательно. Проводок, или дорожку от центра тюльпана  вх. саба отпаиваем, или разрываем. Припаиваем туда 330 Ом. В среднюю точку припаиваем провод вх. саба, или соединяем с разорванной дорожкой вх. саба. При печатном монтаже. Второй резистор 150 Ом, одним концом сидит на массе, второй конец соединяем с 330 Ом. Свободным.  
    • Тут на счет скин-эффекта разговоры были. Лично столкнулся. Нужен был дроссель на воздухе 1,7 мкГн. Намотал проводом сечением то ли 1, то ли 0,75 мм2, длина провода примерно 70 см. Короче, нагрев был очень ощутимый. Синус, частота 800 кГц, ток действующий порядка 6-7 Ампер. Сейчас купил кабель с 6 жилами сечением 0,5 мм2, пока еще не опробовал. Может позже скину данные. Вот график (синий) сопротивления первоначального провода в диапазоне 50 кГц - 2 МГц. Для справки, провод 0,75 мм2 длиной 70 см на постоянном токе должен иметь около 18 мОм сопротивления.
    • @Владислав2 ...без обид, нарисуй схему) я чтобы шарил в этой теме я б не спрашивал) у меня 3,5 из звуковой уходит на саб на два тюльпана.
    • Психологически легче считать частями бака, как и было на аналоговых указателях: четверть бака, полбака, три четверти, полный. И просто держать в голове, что четвертинки гарантированно хватает на X км по городу или Y по трассе. 
    • Давно распаян, увы.
×
×
  • Создать...