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

Программирование на С (кнопки)


tifaso

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

Ситуация следующая есть несколько кнопок и светодиодов. Нужно при помощи Atmega8 создать переключатель. То есть допустим нажали одну кнопку включился один светодиод ну и зафиксировать что эта кнопка нажата, а при нажатии другой кнопки нужно отключить светодиод у той кнопки и как бы программно вырубить ранее  нажатую кнопку и включить только что нажатую кнопку и её светодиод. Естественно вместе с этим будут потом выполнятся и множество других скриптов, но с их написанием я уже разберусь сам. 

Мне главное как то разобраться и понять как написать условие на такой переключатель.

Если что работаю в Atmel Studio 6

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

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

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

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

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

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

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

@yaroslav.s Подробней можно на примере, а то как то не совсем понятно как это в коде выглядит.

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

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

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

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

Easyelectronic, уроки для начинающих.
А вообще сначала прорисуйте блок схему процесса, а потом уже на код переложится.

Текущий сетап: BBB-AD-H6.1-Nataly2014-AudioPro

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

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

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

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

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

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

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

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

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

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

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

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

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

@Добрый дядя Можно и такую схему собрать. Это я так понимаю переключатель программ из советского телевизора. Вроде бы должен работать по такому же принципу как я и хотел сделать переключатель. А вывода уже направить на микросхему и выполнять нужные действия. Но это нужно время чтобы собрать и проверить. Ну да ладно если что напишу.

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

)) интересно как вы будете писать функции когда элементарное не можете сделать.. 

Банальный пример..

If (knopka1 == 1){

Led1=1

Led2=0

}

If( knopka2==1){

Led2=1

Led1=0

}

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

@Yuriy.pv Ну по логике да как то так спасибо конечно я как то сразу не допер. Ну в коде я уже это смогу исполнить. Вроде бы всё понял. А функции мне пока и не нужны. Здесь будет всё простенько на нескольких условиях и несколько действий.

Ну всё всем спасибо навели на правильную мысль теперь я уже всё сделаю сам своими руками.

Но есть ещё один вопросик по скольку светодиодов можно вешать на вывод микросхемы. Имеется ввиду если допустим будет по 20 светодиодов не будет ли перегруза на микросхему. Только тут они будут не постоянно гореть, а всячески мигать в разных режимах. Признаюсь хочу сделать гирлянду к новому году с нуля. Уже всё давно закуплено осталась только сборка. Ну и конечно же начать я решил с главного это сам контроллер режимов и включения гирлянды. Времени у меня не так много, а работы с ней ещё очень много поэтому я начал делать далеко заранее.

И нужен ли стабилизатор 78L05 для микросхемы если я буду её питать от блока питания на 5 вольт 2 ампера. Ведь по сути 5 вольт мы уже имеем на входе, а ограничение по току вроде как и не нужно единственное стоит добавить конденсатор на входе по питанию для фильтра думаю и всё что нужно.

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

Читайте в сторону внешних прерываний. Контроллер зафиксирует изменение состояния на своей ноге и вызовет обработчик, в коде которого и напишете включение того или иного светодиода. А бомбить ифами в основном цикле while - это не наш путь, оставте его ардуинщикам

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

1 hour ago, tifaso said:

по 20 светодиодов не будет ли перегруза на микросхему

Будет.

1 hour ago, tifaso said:

хочу сделать гирлянду к новому году с нуля.

"С нуля"?  А чем твоя гирлянда будет отличаться от уже известных?

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

@_abk_ Понятно тогда нужно будет сделать команды на реле подключенные к выводам микросхемы и уже от них передавать прямиком эти команды к светодиодам.

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

@yaroslav.s Спасибо понятно.

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

52 minutes ago, tifaso said:

зато это сделано своими руками

Тогда что мешает на "чужих" схемах  посмотреть схемотехнические решения, довольно стандартные, кстати? 

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

3 минуты назад, _abk_ сказал:

на "чужих" схемах  посмотреть схемотехнические решения,

Зачем, это надо искать , напрягаться, а тут спросил и все готово , разжевано и в рот положено...

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



if ( (PINX & 0b00001111) != 0) { //проверяем нажатие кнопки
temp = (PINX & 0b00001111); // записываем состояние порта в временную переменную, вдруг с ней что делеать еще нужно будет
PORTY = temp << 0; //Зажигаем светодиод, тушим предыдущий - одно условие кнопки и светодиоды должны быть высажены в идентичной последовательности. 
_delay_ms(50);
}
 Один из самых простых примеров

 

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

		  if (~PINB & (1<<1))
			{
			  while(~PINB & (1<<1));
			  if (PINC)
				{
				  PORTC &= ~(1<<1);
				}
			  else
				{
				  PORTC |= (1<<1);
				  PORTC &= ~(1<<2);
				  PORTC &= ~(1<<3);
				  PORTC &= ~(1<<4);
				  
				  PORTB &= ~(1<<2);
				  PORTB &= ~(1<<3);
				  PORTB &= ~(1<<4);
				}
		  if (~PINB & (1<<2))
		      {
			  while(~PINB & (1<<2));
			  if (PINC)
			      {
				    PORTC &= ~(1<<2);
			      }
			  else
			      {
				  PORTC &= ~(1<<1);
				  PORTC |= (1<<2);
				  PORTC &= ~(1<<3);
				  PORTC &= ~(1<<4);
				  
				  PORTB &= ~(1<<1);
				  PORTB &= ~(1<<3);
				  PORTB &= ~(1<<4);
			      }
		       }
		   if (~PINB & (1<<3))
		       {
			    while(~PINB & (1<<3));
			    if (PINC)
			      {
				  PORTC &= ~(1<<3);
			      }
			    else
			      {
				  PORTC &= ~(1<<1);
				  PORTC &= ~(1<<2);
				  PORTC |= (1<<3);
				  PORTC &= ~(1<<4);
				  
				  PORTB &= ~(1<<1);
				  PORTB &= ~(1<<2);
				  PORTB &= ~(1<<4);
			      }
		       }
		   if (~PINB & (1<<4))
		       {
			    while(~PINB & (1<<4));
			    if (PINC)
			      {
				  PORTC &= ~(1<<4);
			      }
			    else
			      {
				  PORTC &= ~(1<<1);
				  PORTC &= ~(1<<2);
				  PORTC &= ~(1<<3);
				  PORTC |= (1<<4);
				  
				  PORTB &= ~(1<<1);
				  PORTB &= ~(1<<2);
				  PORTB &= ~(1<<3);
			      }
		       }			   				
			}

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

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

Дам несколько общих советов, которые уж точно не повредят.

Во-первых, соредоточьте работу с кнопками в отдельной функции (в крайнем случае, макросе), чтобы в результате получать от функции код нажатой кнопки. Т.е. спрячьте все действия с портом и пинами порта внутри функции.

Во-вторых, стоит так же сосредоточить работу с выходными сигналами в отдельной функции.

Примерно так (заготовка кода):

#define KEY_1 1
#define KEY_2 2
// выше - "коды" кнопок, могут быть любыми числами, отличными от нуля
// сколько кнопок - столько кодов
  
uint8_t get_button(void); // эта функция вернет "код" нажатой кнопки или 0, если не нажато ни одной
void led_switch(uint8_t led); // эта функция включит указанный светодиод, погасив остальные, если номер светодиода 0, все погаснут

// "главный" код

uint8_t key;
while(1){
  key = get_button();
  
  if(key) led_switch(0);

  switch(key){
      case KEY_1:
        led_switch(1);
        break;
      case KEY_2:
        led_switch(2);
        break;
        // и так далее
    }
}

Как видите, по "главному" коду понятно без комментариев, что и как работает: получили код кнопки, сравнили код с возможными вариантами, для каждого найденного варианта сначала гасим все светодиоды, а затем включаем нужный.

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

Функции опроса кнопок и управления светодиодами тоже будут несложными. Для кнопок: считали пины, выделили "нажатые", вернули найденный результат. Возможно, здесь же побороли дребезг. Для светодиодов не сложнее: если номер 0 - тупо вывели в порт светодиодов все "нули" (или единицы - смотря как светодиоды включены), если номер не 0, то сдвинули единичку на это значение и вывели уже в порт это значение.

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

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

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

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

В программировании невозможно без системного подхода. Муторно - да, но не обойтись.

Вы сами должны назначить порты и пины. Например, для светодиодов все очень просто, если они все на одном порту (пусть PORTD):

void led_switch(uint8_t led){
	if(led == 0)
		PORTD = 0xFF; // считаем, что единица гасит светодиод
	else 
		PORTD &= ~(1<<(led-1));
}

Для кнопок предлагаю вам подумать самостоятельно.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

Чего то я с этим кодом уже запутался окончательно. Никак не могу сообразить как правильно записать данный переключатель. То на одном то на другом зависаю по пол дня.

#define KEY_1 1
#define KEY_2 2
#define KEY_3 3
#define KEY_4 4
// выше - "коды" кнопок, могут быть любыми числами, отличными от нуля
// сколько кнопок - столько кодов

uint8_t get_button(void); // эта функция вернет "код" нажатой кнопки или 0, если не нажато ни одной
void led_switch(uint8_t led); // эта функция включит указанный светодиод, погасив остальные, если номер светодиода 0, все погаснут
			if(led == 0)
			PORTC = 0b1111111;
			else
			PORTC &= ~(1<<(led-1));
// "главный" код

uint8_t key;
while(1){
	key = get_button();
	
	if(key) led_switch(0);

	switch(key){
		case KEY_1:
		led_switch(1);
		if (~PINB & (1<<1))
		{
			if(led == 1)
			PORTC |= (1<<1);
			else
			PORTC &= ~(1<<(led-1));
		}
		}
		break;
		case KEY_2:
		led_switch(2);
		break;
		case KEY_3:
		led_switch(3);
		break;
		case KEY_4:
		led_switch(4);
		break;
	}
}	

Попытался как то вписать на одну из кнопок, но никак не пойму толи верно толи нет. Можешь хоть для одной кнопки полный пример приложить. Я так ещё походу не скоро пойму как делать честно сказать уже с прошлой осени пытаюсь записать этот переключатель и до сих пор не догоню как это сделать.

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

Нужно не пытаться наугад, а осознанно изучать язык Си. Вот я вам привел пример функции

void led_switch(uint8_t led){
	if(led == 0)
		PORTD = 0xFF; // считаем, что единица гасит светодиод
	else 
		PORTD &= ~(1<<(led-1));
}

а вы тут же делаете из нее вот это:

void led_switch(uint8_t led); // эта функция включит указанный светодиод, погасив остальные, если номер светодиода 0, все погаснут
			if(led == 0)
			PORTC = 0b1111111;
			else
			PORTC &= ~(1<<(led-1));

Как говорится, найдите отличия. При таком ПОНИМАНИИ вы никогда не добьётесь результата. Я, разумеется, могу написать вам рабочий код для решения вашей задачи, но не хочу это делать, т.к. считаю, что вы самостоятельно должны продвигаться вперед, а не на шее тех, кто и так умеет.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

всё можно сделать  по другому  ну я так понимаю что нужно чтобы переключались каналы.Я бы сделал кнопки в прерывании  по таймеру.Или сделал бы всего навсего 2 кнопки одна шагала увеличивая каналы(+).Другая уменьшала(-).Ну конечно при умолчании 1 канал(0).

Как Шариков говорил взять и всё поделить.

 

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

@Ivan Rusev А в прерывании по таймеру это как примерно хоть выглядеть будет в коде.

Мне больше по душе переключатель с отдельной кнопкой на каждый канал.И светодиоды индикации отображающие какой канал включен.

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

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

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

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

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

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

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

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

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

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

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

×
×
  • Создать...