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

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


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

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

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

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

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

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

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

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

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

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 пользователей онлайн

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

  • Сообщения

    • Согласен, очень криво объяснил. Это работа трёх вольтовой линии, просто на диод шотки сдвоенный, на один анод приходит сигнал напрямую с трансформатора, а на второй через дроссель. Вольт/деление 5 вольт в клетке, тайминг по моему 10 МС. Третья фотография это сигнал на катодах уровень земли ровно по центру экрана. Но все линии по итогу в порядке 3.3 в, 5, в, 12 в и -12 в. Нагрузить все линии не могу сразу ,так как тут же выгорают транзисторы (имеется нагрузка 250 ватт по 10 ампер на каждую линию за исключением-12в), поэтому нагружаю 3.3 вольтовую линию на 10 ампер,  подключаю переменный резистор 50 ватт на 15 ом на 5 вольтовую линию и постепенно довожу до той той картины с перекосом (это гдето  50 ватт общее). По поводу микросхемы, вверху имеется скрин где между импульсами проскакивает мини импульс, если так можно сказать, он проскакивает и на одной  и на второй ноге (7,8). Микросхема не tl 494, а lw4933/abx942.1/c9421646. Далее они приходят на базы транзисторов 945g  коллекторы этих транзисторов соединены с  выводами трансформатора. Просто схема типовая, легче мне кажется просто привести фото самого блока, для тех кто разбирается будет гораздо информативне.  Диод шотки по 12 вольтовой линии был подгоревший, заменил на донора. Приводить скрины не буду что бы не захламлять тему. В итоге, пока все так же, при достижении определенной нагрузки суммарно где-то 50 ватт, появляется этот "выброс и перекос". По этому имеются мысли на два варианта, это микросхема , этот мини импульс между периодами, на низкой нагрузке особо не влияет, но при достижении определенной приводит с самовозбуждению входной цепи и непроизвольному открытию транзистора нижнего плеча. Либо дело в "горячей части", плавающий дефект в обвязке силовых ключей.  Спасибо за ответ.
    • @Gomerchik а вы контролировали как меняется уровень сигнала на А1 ардуины?
    • Спасибо за совет. Автором данного проекта я не являюсь, мне нужно было воссоздать уличный датчик для метеостанции взамен пропавшего(( Из разного найденного в интернете этот проект работает с моей станцией Орегон (спасибо автору). В понедельник попробую последовать Вашему совету. Но все равно куча непоняток  как блин это работает)) Если дело в неправильной отправки команды, то как на это влияет подключение датчика температуры? Если совсем не подключать таймер, то передача идет один раз (как и прописано в программе), станция принимает и отображает, но минут через сколько-то естественно станция уже ни чего не показывает, но с таймером питание полностью не пропадает с ардуинки, но передача сигнала каким-то образом работает по таймеру.  В моем понимании данная команда подается один раз потому, что таймер должен отключать питание МК после передачи сигнала и каждые 43 сек снова подавать питание (так того требует станция).  Ардуино передает показания температуры отключается полностью и 43 секунды мк не работает.  Сейчас у меня питание пока сделано на подпитке от солнечной батареи, но пару пасмурных дней и аккумулятор съедается до отключения(
    • thickman Так и сделаю. Вытащу из бу БП.  Буду знать, как отличить. Благодарю. Заменил транзисторы на IRFB20N50K. Картина стала, совсем другой.  Похоже трудность не в драйвере, на момент подвозбуда, переходные процессы, в нем, завершены. Увеличил затворные резисторы до 50ом, стало немного лучше.  Не понятно, почему верхний ключ греется несколько сильнее. Возможно, стоит посмотреть ток в коллекторе.  Снабберные емкости временно удалил, изменений не произошло.  Замена ТГР на другой, на кольце MSTN-16A-TH, так же, результата не принесла.   irfb20n50k.pdf
    • А что нить из ассортимента активных щупов производства СССР..))
    • Типа такого: https://aliexpress.ru/item/2044864227.html?sku_id=58855020183
×
×
  • Создать...