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

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


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

Как уловить нажатие кнопки на 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-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 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 получить ?

 

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

if (PINB4 == 1)

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

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

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

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

Я поправил свой пост. Видимо константа 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 пользователей онлайн

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

  • Сообщения

    • Не загоняйся, Нужно менять - просто поменяй и всё. Мож там вообще 1 емкость просела а тут целая формула бороды намечается 
    • Первый разобранный магнитофон  Где то даже движок от него лежит.
    • На некоторых Лого есть дисплейчик. и на нем видно все и даже в ручную при желании можно сделать коррекцию программы. Может уже хватит вздрагивать, пора ремонтировать.
    • Уважаемые товарищи, нужны схемы, либо НТД для ремонтов блоков очень срочно!!!! Всё кроме реле Р10ТМУ, уже нашёл не вашем форуме и их отремонтировали....любая помощь приветствуется
    • Все предложенные к рассмотрению источники питания работают примерно по одному принципу: сетевое напряжение выпрямляется, фильтруется (получаем чуть больше 300 вольт постоянного), затем преобразуется снова в переменное, но уже на частотах в несколько десятков килогерц, понижается на трансформаторе и снова выпрямляется. За счёт высокой частоты преобразования используется трансформатор на ферритовом, а не на стальном, сердечнике, гораздо меньших габаритов и стоимости. Минусы: значительное усложнение схемы блока и вероятность возникновения различных помех от него. Модули управления (кроме первого) также являются импульными преобразователями, с теми же достоинствами и недостатками. Если нужно по быстрому собрать некое подобие ЛБП, то уж лучше брать модуль вроде этого. Ну и блок питания к нему соответствующий. Но не очень понятно, какой практический опыт можно получить от соединения готовых модулей парой проводов.  
    • У меня больше всего вопросов вызвала необычная схема обеспечения отрицательного питания. Автор этой обстоятельной заметки пишет: For this supply to work correctly, the transformer must have a secondary voltage of at least 18V RMS.  Почему? Что будет не так с отрицательным питанием, если напряжение на трансформаторе будет меньше 18В?   https://tinyurl.com/23mlwxtt - я в простейшей эмуляции ставлю 12В пикового напряжения для трансформатора и на стабилитроне все как положено: -5.6В.
×
×
  • Создать...