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

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


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

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

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

  • Сообщения

    • А здесь всё о том как и чем делать ...
    • "Приходит мужик в магазин одежды, чтоб подобрать себе шляпу. Надевает первую попавшуюся, а она ему - как раз." А вообще не понятно. Он ему дает говорить, даже матюкаться, а анекдот не дает рассказать. Почему? (сори, если вопрос тупой, я просто не в теме радиосвязи и радиохулиганства)
    • Там на примерах видос уже с задержкой писанный, дропов нет.   уже предлагалось 
    • БОРОДА ! я там все верно написал. Просто так резисторы не горят !!! Вы видимо то же дуб дубом в этом деле как и ФАЛКОНИСТ модератор.
    • Можно скрин с программы  Victoria по проверки диска "С"  и флэшки? С диска "с" воспроизводится как? Если так же, то можно эту же флэшку вставить в телефон/фотоаппарат и проверить, с качеством записи не хуже чем на вашей камере? Если копировать видео с камеры которая подключена к компьютеру, то за сколько копируется файл например гигабайтной длинны? А если его же записать?  
    • В ГДР-овских швейных машинах позднего периода линейки Famula присутствуют модели с т.н. автоматическими функциями, они отличаются от остальных словом Electronic в названии, индексом 51 в номере модели, и наличием трёх кнопок справа: левая кнопка: положение иглы (в нажатом состоянии - игла всегда будет возвращаться вниз, в отжатом - уходить наверх) средняя: одиночный прокол - при нажатой кнопке и нажатии на педаль отрабатывается один цикл опускания и подъёма иглы правая: пониженная скорость - при нажатой кнопке, скорость ограничена фиксированным значением Электронная часть состоит из модуля Управления скоростью, модуля Позиционирования иглы и мотора с педалью. Вот схемы из той документации, что удалось добыть:     Указанные функции реализованы в модуле Позиционирования иглы (схема на стр. 22), позиция иглы отслеживается по герконовому датчику на маховике, подключенного непосредственно к модулю позиционирования (разъём X5). Модуль модуль управления скоростью (стр. 21) подключен к сети 220 через выключатель, к мотору (стр.18) и к одному из выводов педали. Модуль позиционирования подключен к модулю управления скорости (X4.2, X4.3, X4.4) и второму выводу педали (X4.1), к первому выводу педали - через X4.4.   Педаль представляет собой угольный реостат, в нажатом положении сопротивление стремится к нулю. Проблема: Не работает позиционирование иглы в крайних точках, в зависимости от положения левой кнопки (S1) - после отпускания педали игла останавливается в произвольном положении. Не работает функция т.н. Одиночного прокола - когда нажата кнопка S2, по нажатию педали маховик стоит на месте и не двигается. Не учитывая функционал этих кнопок, всё остальное исправно работает, включая функцию пониженной скорости - при нажатии правой кнопки (S3). Что было сделано: Визуальный осмотр, чистка контактов и замена электролитических конденсаторов на всех платах. Замена симистора на Модуле оборотов и всех транзисторов и микросхемы логики на Модуле позиционирования на полные аналоги. Прозвонка герконового датчика положения иглы, кнопочных переключателей S1, S2, S3, прозвонка дорожек. Эксперименты по замене сдвоенного операционного усилителя B2761 на имеющийся в наличии сдвоенный компаратор LM393 (неудачные). После этого была получена в распоряжение полностью рабочая машина аналогичной модели, используемая в дальнейшем, как референсная, и окончательно выявлен неисправный модуль - м. позиционирования. Методом кросс-замены были проверены и исключены все активные элементы: сдвоенный операционный усилитель B2761 (N1), микросхема логики D1, транзисторы V1 и V8, а также диодные сборки V2 и V7, и конденсаторы. При очередной выпайке и запайке транзистора V8 начало наблюдаться такое поведение: после включения машина отрабатывает функцию одиночного прокола (при нажатой кнопке S2), но только один раз, иногда не до конца; дальнейшие повторные нажатия педали ни к чему не приводят. При выключении питания и последующем включении, функция одиночного прокола может снова отработать один раз. После этого были пропаяны и прозвонены все элементы и дорожки по периметру, находящиеся рядом с транзистором V8, без положительного результата.     Дальнейшая работа по поиску неисправности осложняется тем, что я не очень хорошо понимаю, как работает схема Модуля позиционирования и не могу даже приблизительно сформулировать фазы её работы, в силу своей квалификации: мне непонятно подключение второго операционного усилителя N1.2 - его выход упирается в диоды V4 и V6, и его функция в этой схеме (компаратор?) работа AND-логики, в особенности элементов D1.1 и D1.2 в контексте подключения к усилителю и транзистору V8 Для прояснения ситуации, с некоторых контрольных точек, обозначенных номерами в кружках на принципиальной схеме модуля, были сняты осциллограмы на рабочем аппарате, вот они на плате: Замеры производились на прибор Fnirsi DPOX180H. Здесь канал 1 (жёлтый) - датчик позиции (геркон), точка №6, негативный контакт - X4.3 Выводы: Предположительно, управляющее напряжение на контакте X4.2. Контакты X4.1 и X4.4 соединены с соответствующими выводами реостата педали. Следующим шагом планирую последовательное выпаивание и проверку всех диодов и резисторов на плате Модуля позиционирования. Буду признателен за помощь и советы. Сам я по уровню начинающий радиолюбитель, мой опыт ограничен сборкой / мелким ремонтом и доработками БПЛА и работой с несложными схемами на базе микроконтроллеров ATMega и ESP, со схемотехникой советского периода знаком только по опыту с радиоконтрукторами и простыми транзисторными приёмниками, но очень бы хотелось разобраться, поэтому буду признателен также за ссылки на конкретные обучающие материалы по теме и методикам работы.
×
×
  • Создать...