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

Помощь с кодом


brusel

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

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

#define F_CPU 1200000UL
#define OUT PB2
#define LED PB0
#define BUTTON1 PB4 
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
  // Пины кнопок
  DDRB &= ~((1<<BUTTON1)); // входы
  PORTB |= (1<<BUTTON1); // подтянуты
  // Пин светодиода
  DDRB |= (1<<LED)|(1<<OUT); // выход
  PORTB &= ~((1<<LED)|(1<<OUT)); // выключен
  
    while (1) 
    {
        _delay_ms (50); // антидребезг
        if ( (PINB & (1<<BUTTON1)) == 0 )    // если нажата кнопка
          {
          PORTB |= ((1<<OUT)|(1<<LED));           //вкл
          }
          _delay_ms (1000);                       // пауза 
          PORTB &= ~((1<<OUT)|(1<<LED));          //выкл
    }
}

 

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

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

Паузу в несколько секунд сделайте там же, где и "вкл" :) 

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

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

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

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

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

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

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

Правильно? В протеусе вроде работает. Пауза где-то 7-8 сек.

#define F_CPU 1200000UL
#define OUT PB2
#define LED PB0
#define BUTTON1 PB4 
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
  // Пины кнопок
  DDRB &= ~((1<<BUTTON1)); // входы
  PORTB |= (1<<BUTTON1); // подтянуты
  // Пин светодиода
  DDRB |= (1<<LED)|(1<<OUT); // выход
  PORTB &= ~((1<<LED)|(1<<OUT)); // выключен
  
    while (1) 
    {
        _delay_ms (50); // антидребезг
        if ( (PINB & (1<<BUTTON1)) == 0 )    // если нажата кнопка
          {
          PORTB |= ((1<<OUT)|(1<<LED));           //вкл
          _delay_ms (45000);                       // пауза 
          }
          PORTB &= ~((1<<OUT)|(1<<LED));          //выкл         
    }
}

 

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

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

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

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

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

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

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

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

11 hours ago, brusel said:

Пауза где-то 7-8 сек.

Значит неправильно настройки заданы. Пауза должна быть 45 секунд. И вообще, на кой для такой простейшей задачи целый МК?

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

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

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

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

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

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

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

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

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

Грубо говоря, есть. Опрос кнопок будет выполняться с интервалом в 50 мс, что не даст среагировать на дребезг. Правда, 50 мс вряд ли хватит, надо хотя бы 100 мс. Но делать антидребезг на задержках - костыль. Гораздо оптимальнее опрашивать состояние портов через промежутки времени. Допустим, 10 раз в секунду. Это отлично фильтрует дребезг.

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

Just now, IMXO said:

нет здесь никакого антидребезга!

Как же нет, если есть? Опрос состояния контактов кнопки с интервалами, заведомо больше, чем длительность дребезга - это и есть защита от последнего. Например, во многих проектах опрашивают пины кнопок по таймеру каждые 50-100 мс, сразу формируя коды нажатий - и никаких проблем не возникает и возникнуть не может!

При желании могу привести и диаграммы, но думаю, вы и сами понимаете, что поспешили с утверждением... Вот и ув. @BARS_ в ту же дуду...

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

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

4 hours ago, BARS_ said:

Пауза должна быть 45 секунд

А час задержки сможет эта функция отработать _delay_ms(3600000)?

Я не спец в AVR, но должен же быть какой-то предел, максимально возможная задержка у _delay_ms() ...

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

Just now, Yurkin2015 said:

должен же быть какой-то предел, максимально возможная задержка у _delay_ms()

65536 мс

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

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

2 hours ago, ARV said:

Например, во многих проектах опрашивают пины кнопок по таймеру каждые 50-100 мс, сразу формируя коды нажатий - и никаких проблем не возникает и возникнуть не может!

может и возникает.

ситуация первая : кнопка не нажата, на линии проходит импульсная помеха в момент опроса пина = включение таймера

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

так что нет у товарища антидребезга.

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

Just now, Yurkin2015 said:

Это потому, что аргумент у _delay_ms() имеет размер 2 байта?

Нет, аргумент имеет тип float, но реализация сделана так, что более догую задержку не отрабатывает

Just now, IMXO said:

так что нет у товарища антидребезга

Мда...

Just now, IMXO said:

ситуация первая

Расскажите про алгоритм подавления дребезга для этой ситуации.

Наиболее оптимальный, как я понимаю, заключается в сравнении состояния пина ДО и ПОСЛЕ некоторой задержки. Если вам известен алгоритм 100% безошибочного обнаружения нажатий кнопок в условиях сильного дребезга и помех - хотел бы узнать о нем.

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

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

23 minutes ago, IMXO said:

ситуация первая

Это не антидребезг, а борьба с импульсными помехами на линии.

 

24 minutes ago, IMXO said:

ситуация вторая:

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

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

дребезг это и есть импульсные помехи на линии.

причем здесь повторное нажатие , читайте не по диагонали

1 hour ago, ARV said:

 хотел бы узнать о нем.

я пользую примерно такой:

Spoiler

struct button_type {
  unsigned jitter         :8; // Для подавления дребезга
  unsigned old            :1; // Старое состояния пина
  unsigned new            :1; // Состояния пина
  unsigned pressed        :1; // Состояние кнопоки
  unsigned oldpressed     :1; // Старое состояния кнопоки
  unsigned justPressed    :1; // Кнопка только что нажата
  unsigned justReleased;  :1; // Кнопка только что отпущена
  unsigned     :1;
  unsigned     :1;
} m_Batton;

unsigned int tamer=0;
unsigned char task=0;

void Task_Button (void)
{
//**опрос кнопки
  m_Batton.new=0;
  if( (PINB & (1<<BUTTON1)) == 0 ) m_Batton.new=1;

//** подавление дребезга  
  if(m_Batton.new==m_Batton.old)
    { 
      if (m_Batton.jitter<5) 
        {m_Batton.jitter++;}
       else
        {m_Batton.pressed=m_Batton.new;} 
    }
   else
    {
      m_Batton.jitter=0;
    }
   m_Batton.old=m_Batton.new;

//*** фиксация фронтов нажатия/отпускания
  if(!m_Batton.oldpressed && m_Batton.pressed)
     {m_Batton.justPressed=1;}

  if(m_Batton.oldpressed && !m_Batton.pressed)
     {m_Batton.justReleased=1;} 
   m_Batton.oldpressed=m_Batton.pressed;
}

 

применительно к задаче ТС получим

Spoiler

int main(void)
{
  // Пины кнопок
  DDRB &= ~((1<<BUTTON1)); // входы
  PORTB |= (1<<BUTTON1); // подтянуты
  // Пин светодиода
  DDRB |= (1<<LED)|(1<<OUT); // выход
  PORTB &= ~((1<<LED)|(1<<OUT)); // выключен
  
    while (1) 
    {
        _delay_ms (1); // 
        Task_Button (); 

        if(task==2) {m_Batton.justPressed=0;} 
        
        if(m_Batton.justPressed)
          {
           task=1;
           m_Batton.justPressed=0;
          }

        switch (task) {
         case 0:
              PORTB &= ~((1<<OUT)|(1<<LED));          //выкл 
              break;
         case 1:
              PORTB |= ((1<<OUT)|(1<<LED));           //вкл
              tamer=0; 
              task=2
              break;
         case 2:
              if(tamer<45000)
                {
                  tamer++;
                } 
                else
                 {
                   task=0;
                 }    
              break;
        default:
             task=0;
        } 
        
    
    }
}

 

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

если комментируем строку  if(task==2) {m_Batton.justPressed=0;} получаем таймер с перезапуском по фронту.

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

Мда...

А я опрашиваю кнопки раз в 100 мс и ни разу не зафиксировал ложного срабатывания за примерно лет 15, как я стал так делать. И пропуска нажатия тоже не было, во всяком случае в те моменты, когда я это делал.

Что же не так со мной?!

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

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

2 hours ago, IMXO said:

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

 

52 minutes ago, IMXO said:

читайте не по диагонали

Ну, батенька, специально для Вас разжую свой вопрос.

Состояние кнопки читается один раз во время дребезга. Возможно только два варианта.

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

Если прочитали "отпущено", то значит кнопка отпустилась. Так и останется отпущеной при следующем опросе.

Откуда "ложный запуск таймера" возьмётся?

 

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

53 minutes ago, Yurkin2015 said:

Состояние кнопки читается один раз во время дребезга

а откуда ты знаешь, что чтение точно совпадает с дребезгом?

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

1 hour ago, ARV said:

А я опрашиваю кнопки раз в 100 мс и ни разу не зафиксировал ложного срабатывания за примерно лет 15, как я стал так делать. И пропуска нажатия тоже не было, во всяком случае в те моменты, когда я это делал.

а я опрашиваю кнопки раз в 1/3 секунды, и тоже никогда проблем не имел.

в принципе пропуск возможен - когда опрос попадет точно на разомкнутую цепь во время дребезга. и это вообще не горе, подержишь кнопку нажатой, пока она не сработает в следующем цикле опроса.

а еще можно сделать так - лет 20 с гаком я такой алгоритм подсмотрел у профессиональных программистов.

опрашиваем кнопки довольно часто и имеем на каждую кнопку свой счетчик нажатого состояния.

а потом в главном цикле проверяем счетчики кнопок.

например, опрашиваем через 20 мс., а главный цикл равен, допустим, 500 мс.

тогда при длительном нажатии кнопки за 500 мс счетчик насчитает 25.

но в главном цикле делаем проверку не на все 25, а, например, на 15. если счетчик насчитал 15 или больше, то считаем, что кнопка была нажата.

а если там меньше 15 - то считаем, кнопка не была нажата.

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

в своих первых проектах я сам применял этот алгоритм со счетчиками нажатого состояния кнопок. а потом решил, что мне достаточно однократной проверки кнопок.

Мудрость приходит вместе с импотенцией...

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

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

Один челдон утверждал, что по военной приемке читать состояние пина надо несколько раз. А чтобы не было импульсных помех на пине, то RC цепь и подтяжка. Можно применять как порознь, так и вместе.

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

2 hours ago, Yurkin2015 said:

Ну, батенька, специально для Вас разжую свой вопрос. 

Состояние кнопки читается один раз во время дребезга. Возможно только два варианта.

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

1. покажите мне где в этом куске кода:

    while (1) 
    {
        _delay_ms (50); // антидребезг
        if ( (PINB & (1<<BUTTON1)) == 0 )    // если нажата кнопка
          {
          PORTB |= ((1<<OUT)|(1<<LED));           //вкл
          _delay_ms (45000);                       // пауза 
          }
          PORTB &= ~((1<<OUT)|(1<<LED));          //выкл         
    }

повторное чтение?

2. у ТС четко сформированы задача

On 24.07.2019 at 10:01, brusel said:

по нажатию кнопки на несколько секунд появлялся высокий уровень на выходах LED и OUT

читай по спадающему фронту на пине.  в коде выше  при удержании кнопки таймер работает в цикле:  работа 45сек/ пауза 50мс.

теперь, если кнопка будет отпущена в конце "работа" и в момент опроса пина при дребезге будет прочитан лог0 = будет перзапуск таймера.

так понятно или надо на картинках показывать?

1 hour ago, Starichok said:

в принципе пропуск возможен - когда опрос попадет точно на разомкнутую цепь во время дребезга. и это вообще не горе, подержишь кнопку нажатой, пока она не сработает в следующем цикле опроса. 

я об этом и говорил , но в случае задачи ТС это заранее расставленные грабли на плохо отлавливаемый баг в процессе работы.

1 hour ago, Starichok said:

а еще можно сделать так - лет 20 с гаком я такой алгоритм подсмотрел у профессиональных программистов.

опрашиваем кнопки довольно часто и имеем на каждую кнопку свой счетчик нажатого состояния.

а потом в главном цикле проверяем счетчики кнопок.

что собственно и делает код приведенный мной выше.

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

11 minutes ago, IMXO said:

если кнопка будет отпущена в конце "работа" и в момент опроса пина при дребезге будет прочитан лог0

Это всего-навсего означает, что кнопку передержали более 45 секунд, и таймер пошёл на новый круг. При чём тут дребезг?

Точно такая же ситуация будет и при идеальной кнопке без дребезга. Продержите её на миллисекунду дольше, чем 45 сек, и таймер точно так же перезапустится.

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

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

Ранее я спрашивал: что я делаю не так, если делаю так же и не имею проблем? И не один я...

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

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

то что вы не видете/ не замечаете суслика не значит что его нет.

элементарная симуляция опроса кнопки

системный тик кнопки = 100мс

первое нажатие = 120мс

второе = 430мс

дребезг=20мс

1022800334___.png.471a10827eb239c83039c44ea9780430.png

куда потерялось нажатие

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

1 hour ago, IMXO said:

куда потерялось нажатие

Никуда не потерялось - просто система не чувствует короткие нажатия. Опять, причем тут дребезг?

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

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

Вот увеличьте немного

1 hour ago, IMXO said:

первое нажатие = 121мс

и проверьте, есть ли суслик на самом деле.

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

Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

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

    • Всем доброго! Такой вот специфический вопрос возник - как бороться с нагревом соленоида, который будет работать 24/7 ?  В чем суть: есть такие штуки, может видели - "левитирующие цветочные горшки". Если кто ещё не видел - гуглить по ключевым словам "repulsive magnetic levitation" на youtube. С программной и электронной стороны - отлично знаю, как устроено, могу собрать - проблем нет. И хочу собрать :). Но проблема вот в чём: есть у меня большие сомнения, что соленоид, запитанный 24 часа в сутки, 7 дней в неделю - сие есть хорошо. По крайней мере, придётся очень серьёзно озаботиться (как мне кажется) борьбой с нагревом такого соленоида. Есть у меня ряд идей конечно, как это сделать - но хотелось бы послушать сначала умных людей. Любым идеям буду рад!
    • Та чистая плата, я отмывал флюс когда лампы припаивал. Да хорошо, попробую мощнее бп, а не сгорит плата, там защита есть?? А то 3 А подам и мало ли пыхнет((
    • Любые керамические конденсаторы соответствующей группы. КМ-ки бывают очень разные, группы ТКЕ - П33, МП0, М47....Н90. Также и любые другие - импортные, например NP0, X7R, Y5V и другие. Назначение, пределы емкости и потери на разных частотах разные. А минимальная индуктивность - у СМД, доли нГ.
    • Я почему то думаю, что в вар.5 вам не басов не хватает, а раскачки АС (т.е. мощности). А в нём и питание пониже, и трансы у вас слабоватые. В вашем случае надо найти хороший 4 Ом низкочастотник. Потому что питание поднять нельзя - ТIPы не выдержат. Или же заменить их на те же TIPы но100-ваттные, и добавить конденсаторов в БП. (мало там у вас). Места там в корпусе вполне хватает, надо было сразу вар.6 и делать. вар.5 - он же для того, чтобы втиснуть его например в микроцентр. Теперь по вар.6.  OPA2604 звучит действительно очень сблансированно и прозрачней чем OPA134 и OPA2134. Эти помягче и "размазанней". "Гламурно" как то.  Но на выходе что у вас стоит? Не видно. Если "сладка парочка" 2SC5200 и 2SA1943, то замените их и будет вам прозрачность. С КР574УД1 6мВ на выходе - это вообще ни о чём. Но почему греются радиаторы? Какой ток покоя? Если 40-60мА, то усилитель еле тёплый на средней мощности. Может возбуд? Тогда был бы ток покоя большой. Или радиаторы маленькие? Надо не менее 5 кв.см на Ватт. Попробуйте другой входной конденсатор. Например керамику или неполярный электролит. Ещё бывает как сейчас модно два одинаковых динамика ставят на НЧ и СЧ, так вот: НЧ динамик никогда не даст прозрачной и детальной середины. Если даёт прекрасную середину, то басов не будет хватать. Чудес тут не бывает. По этой причине я разобрал Cortland F6113. Два динамика по 12 Ом. Сейчас ставлю другие. Ну, я думаю сами разберётесь что к чему.      
    • запаял 2-4 ногу звук появился но с хрипом, теперь 1ю и 7ю ногу незнаю куда подвести подскажите пожалуйста
    • К БП очень чувствительна схема. Попробуйте помощнее. А если две цифры светятся,- весьма вероятно замыкание электродов. Или плата грязная?.
    • Собрал часы на ин -14, плату заказывал с Алика. Все цифры отдают синеватым оттенком, и иногда может на лампе сразу две цифры светить - одна ярче, другая тусклее. Плата питается от микро USB 5В 2А согласно данным продавца. Собственно вопрос - возможно другой ток нужно взять для БП и тогда не будет синевы или вообще что такое происходит, плата китайская корявая(((??? Синева кажется начинается от того, что ток на лампу меньше подаётся вроде как)))  
×
×
  • Создать...