Страница 3 из 3

Re: Светодиод и кнопка

Добавлено: 29 окт 2014, 19:27
AntonChip
Scroodge писал(а):И почему ты вот эту строчку закомментировал? //adc_bufer = ADCH; // Считываем ADC
Тут буфер уже не нужен, кстати ИОН посмотри как подключен, вход PC1

Re: Светодиод и кнопка

Добавлено: 04 дек 2014, 17:57
Alex_och
Почему-то не могу добавить коментарий в уроках уже второй день. Спроршу здесь.
Подскажите как сделать.
Задача кода такая:
при нажатии кнопки (№1 PD0) с фиксацией плавно загорается светодиод (работаеи ШИМ, с этим я разобрался),
при этом если нажать кратковременно другую кнопку (№2 PD1) - светодиод должен потухнуть (можно просто уйти в ноль без ШИМ, типа экстренного выключения), а если нажать эту же кнопку (№2 PD1) опять кратковременно, тогда светодиод должен опять загорется (возобновится работа).

Здесь нужно использовать прерывания или что-то подобное описанное в занятии 2?

Часть моего кода (Attiny 2313, но это не важно):

Код: Выделить всё

while(1)
{
if((PIND&(1 << PD0)) == 0)  //если включен выключатель
 {if (i < 255)
   {i=i+1;              // Плавное включение подсветки пола салона до 100% 
    OCR1A=i;                 
    _delay_ms(4);
  }
  }
 else
    if (i>0)      
     {i=i-1;                       // плавно тужнет светодиод
      OCR1A=i;
      _delay_ms(4);      
     }
  }

Re: Светодиод и кнопка

Добавлено: 17 май 2015, 11:32
Andrei993
ПОДСКАЖИТЕ как сделать вычисление основных математических операций (сложение вычитание умножение деление возведение в степень). Стенд - калькулятор.
Матрица кнопок 4x4.
вот так матрица скажем
+123
-456
*789
/^0=
Не знаю как на с++ записать эти вычисления чтобы производились

Светодиод и кнопка

Добавлено: 10 ноя 2015, 09:24
RowNiz
Доброе время суток. Требуется помощь, в решение проблемы.
Проблема в том что необходима сделать чтоб про нажатии кнопки загорался светодиод
а при втором нажатии этой же кнопки тух. Но что я толка не придумывал не получается. Помогите пожалуйста.

Re: Светодиод и кнопка

Добавлено: 10 май 2017, 13:42
Maxim
Добрый день!
Смотрел урок 1 - рис 2.
Вопрос: Как сделать удержание кнопок в произвольном порядке, т.е. нажимаешь соответствующую кнопку горит Led.При повторном нажатии - гаснет.
И так со всеми кнопками независимо включать и выключать светодиоды.
Как фиксировать одну кнопку я понял исходя из урока №2.
А вот как зафиксировать больше 2х не знаю. (голова распухла)
Прошу помощи.
Спасибо

Re: Светодиод и кнопка

Добавлено: 13 май 2017, 10:49
AntonChip

Код: Выделить всё

  if((PIND&(1 << PD0)) == 0)  // если кнопка нажата
  {
  while((PIND&(1 << PD0)) == 0){} // ждем отпускания кнопки
  _delay_ms(50);
  PORTB ^= (1 << PB0); // переключаем светодиод
  }
  if((PIND&(1 << PD1)) == 0)  // если кнопка нажата
  {
  while((PIND&(1 << PD1)) == 0){} // ждем отпускания кнопки
  _delay_ms(50);
  PORTB ^= (1 << PB1); // переключаем светодиод
  }

Re: Светодиод и кнопка

Добавлено: 13 май 2017, 19:38
Maxim
AntonChip писал(а):

Код: Выделить всё

  if((PIND&(1 << PD0)) == 0)  // если кнопка нажата
  {
  while((PIND&(1 << PD0)) == 0){} // ждем отпускания кнопки
  _delay_ms(50);
  PORTB ^= (1 << PB0); // переключаем светодиод
  }
  if((PIND&(1 << PD1)) == 0)  // если кнопка нажата
  {
  while((PIND&(1 << PD1)) == 0){} // ждем отпускания кнопки
  _delay_ms(50);
  PORTB ^= (1 << PB1); // переключаем светодиод
  }
Огромное спасибо, проверил, код работает. Добавляя этот блок 4 раза в бесконечный цикл while(1) и меняя в каждом блоке от PD0 до PD3 всё заработало идеально и независимо. Сам я тоже решил эту проблему, Но думаю, что потребление тока в моем случае гораздо выше.
Вот мой код:

Код: Выделить всё

/*
 * Gcc_switch 1led.c
 *
 * Created: 10.05.2017 14:24:41
 * Author : maxvest
 */ 

#define F_CPU 1000000
#include <avr/io.h>
#include <util/delay.h>

	/* оъбявление переменных flag... для временного хранения 
	   прикосновения-снятия пальца с контактов сенсоров т.е. 0 или 1*/
	unsigned char flag0=0, flag1=0, flag2=0, flag3=0;
		
	/* объявление переменных val... для временного хранения 
	   количества нажатия- отжатия кнопок для исключения дребезга контакта - 30 измерений*/
	unsigned char val0=0, val1=0, val2=0, val3=0;	
	
	
	/* блок переключения пинов PORTB*/
	void swPINB0()
	{
		PORTB ^= (1<<0);
		PORTB ^= (1<<4);
	}   
	void swPINB1()
	{
		PORTB ^= (1<<1);
		PORTB ^= (1<<5);
	}
	void swPINB2()
	{
		PORTB ^= (1<<2);
		PORTB ^= (1<<6);
	}
	void swPINB3()
	{
		PORTB ^= (1<<3);
		PORTB ^= (1<<7);
	}
	
	/* блок проверки прикосновения-снятия пальца с контактов сенсоров т.е. 0 или 1*/
	void button0()
	{
		if (!(PIND & (1<<0)))	// проверка на 0 те. нажата то условие сразу за условием (см схему в Протеусе)
		{
			if ( flag0 == 0)		// фиксирование НЕ нажатие, если ДА  то >> 1.1
			{
				if (val0 == 30) // проверка количества опроса (30 раз в сек)
 				{	flag0 = 1;    //1.1 
					val0 = 0;
					return;
				}
				val0++;
			} 
			else val0 = 0;
		} 
		else
		{
			if ( flag0 == 1)	// фиксирование нажатия, если нет то count =0
			{
				if (val0==30)
				{	flag0=0;
					val0=0;
					swPINB0();
				}
				val0 ++;
			}
			else val0=0;	
			
		}
	}
	void button1()
	{
		if (!(PIND & (1<<1)))	// проверка на 0 те. нажата то условие сразу за условием (см схему в Протеусе)
		{
			if ( flag1 == 0)		// фиксирование НЕ нажатия, если ДА  то >> 1.1
			{
				if (val1 == 30) // проверка количества опроса (30 раз в сек)
				{	flag1 = 1;    //1.1
					val1 = 0;
					return;
				}
				val1 ++;
			}
			else val1 = 0;
		}
		else
		{
			if ( flag1 == 1)	// фиксирование нажатия, если нет то count =0
			{
				if (val1 == 30)
				{	flag1 = 0;
					val1 = 0;
					swPINB1();
				}
				val1 ++;
			}
			else val1=0;
			
		}
	}
	void button2()
	{
		if (!(PIND & (1<<2)))	// проверка на 0 те.- если нажата то условие сразу за условием
		{
			if ( flag2 == 0)		// фиксирование НЕ нажатие, если ДА  то >> 1.1
			{
				if (val2 == 30) // проверка количества опроса (30 раз в сек)
				{	flag2 = 1;    //1.1
					val2 = 0;
					return;
				}
				val2++;
			}
			else val2 = 0;
		}
		else
		{
			if ( flag2 == 1)	// фиксирование нажатия, если нет то count =0
			{
				if (val2==30)
				{	flag2=0;
					val2=0;
					swPINB2();
				}
				val2 ++;
			}
			else val2=0;
			
		}
	}
	void button3()
	{
		if (!(PIND & (1<<3)))	// проверка на 0 те. если нажата то условие сразу за условием 
		{
			if ( flag3 == 0)		// фиксирование НЕ нажатия, если ДА  то >> 1.1
			{
				if (val3 == 30) // проверка количества опроса (30 раз в сек)
				{	flag3 = 1;    //1.1
					val3 = 0;
					return;
				}
				val3++;
			}
			else val3 = 0;
		}
		else
		{
			if ( flag3 == 1)	// зафиксирование нажатия, если нет то count =0
			{
				if (val3==30)
				{	flag3=0;
					val3=0;
					swPINB3();
				}
				val3 ++;
			}
			else val3=0;
			
		}
	}
	
int main(void)
{	
	DDRB = 0xFF;	// настройка PORTB на выход 
	PORTB = 0xF0;	// устанавливаем на этих выходах 1111 0000(управляющий младший нимбл 0, на индикаторы -старший нимбл 1)
	DDRD = 0x0F;	// настройка ножки PD0, PD1, PD2, PD3  на вход	
	PORTD |= (1<<0)|(1<<1)|(1<<2)|(1<<3);	// подтягиваем к этим входах внутренние PULL_rezistor'ы 
	
	while(1)
	{
		button0();
		button1();
		button2();
		button3();
	}		
}
Еще раз благодарю Вас antonchip за помощь, давай вам бог здоровья и удачи
_
PS. А вот как вставить со своего компа схему протеус не нашел. Жаль хотел поделиться схемой сенсорного выключателя.

Re: Светодиод и кнопка

Добавлено: 14 май 2017, 20:39
Maxim
к посту #47
[imgИзображение
][/img]
Здесь при выключенном свете горят синие точечные диоды в качестве ночной подсветки, При прикосновении к датчику зажигается свет, ну например в кухне. Вокруг кнопки вспыхивает голубой или какой-либо другой ореол света, а точечный индикатор гаснет. При выключении, происходит с точность на оборот.