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

Модератор: boogyman

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

Сообщение:#41  Сообщение AntonChip » 29 окт 2014, 19:27

Scroodge писал(а):И почему ты вот эту строчку закомментировал? //adc_bufer = ADCH; // Считываем ADC

Тут буфер уже не нужен, кстати ИОН посмотри как подключен, вход PC1
Аватара пользователя
AntonChip
Администратор
 
Сообщения: 202
Зарегистрирован: 24 дек 2011, 21:11
Откуда: Киров

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

Сообщение:#42  Сообщение Alex_och » 04 дек 2014, 17:57

Почему-то не могу добавить коментарий в уроках уже второй день. Спроршу здесь.
Подскажите как сделать.
Задача кода такая:
при нажатии кнопки (№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);     
     }
  }
Аватара пользователя
Alex_och
Новичок
 
Сообщения: 8
Зарегистрирован: 19 ноя 2013, 09:52

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

Сообщение:#43  Сообщение Andrei993 » 17 май 2015, 11:32

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

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

Сообщение:#44  Сообщение RowNiz » 10 ноя 2015, 09:24

Доброе время суток. Требуется помощь, в решение проблемы.
Проблема в том что необходима сделать чтоб про нажатии кнопки загорался светодиод
а при втором нажатии этой же кнопки тух. Но что я толка не придумывал не получается. Помогите пожалуйста.
Аватара пользователя
RowNiz
Новичок
 
Сообщения: 3
Зарегистрирован: 14 окт 2015, 17:54
Откуда: Russia

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

Сообщение:#45  Сообщение Maxim » 10 май 2017, 13:42

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

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

Сообщение:#46  Сообщение AntonChip » 13 май 2017, 10:49

Код: Выделить всё
  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); // переключаем светодиод
  }
Аватара пользователя
AntonChip
Администратор
 
Сообщения: 202
Зарегистрирован: 24 дек 2011, 21:11
Откуда: Киров

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

Сообщение:#47  Сообщение Maxim » 13 май 2017, 19:38

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. А вот как вставить со своего компа схему протеус не нашел. Жаль хотел поделиться схемой сенсорного выключателя.
Аватара пользователя
Maxim
Новичок
 
Сообщения: 6
Зарегистрирован: 23 окт 2016, 00:32

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

Сообщение:#48  Сообщение Maxim » 14 май 2017, 20:39

к посту #47
[imgИзображение
][/img]
Здесь при выключенном свете горят синие точечные диоды в качестве ночной подсветки, При прикосновении к датчику зажигается свет, ну например в кухне. Вокруг кнопки вспыхивает голубой или какой-либо другой ореол света, а точечный индикатор гаснет. При выключении, происходит с точность на оборот.
Аватара пользователя
Maxim
Новичок
 
Сообщения: 6
Зарегистрирован: 23 окт 2016, 00:32

Пред.

Вернуться в Микроконтроллеры AVR

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

cron
Rambler's Top100