Обсуждаем контроллеры компании Atmel.
Ответить

Проблема с кнопкой на ATTiny13A

Сб июн 12, 2021 00:19:11

Проблема с кнопкой
При нажатие на кнопку лампочка гаснет как будто аттини зависает
Отпускаешь кнопку всё работает в штатном режиме
Писал в Arduino IDE для загрузки в аттини использую библиотеку MicroCore
Может кто сталкивался
Код:
#include <EEPROM.h>
#define INIT_ADDR 50  // номер резервной ячейки
#define INIT_KEY 50
#define LAMPA_POV PB0
#define SIGNAL_POV PB1
#define SIGNAL_BLIZ PB3
#define KNOPKA_YARK PB4
void yarkost();
bool state;
byte bri = 125;
uint32_t btnTimer, myTimer1, timeCounter;
void setup() {
  pinMode(SIGNAL_BLIZ, INPUT); // объявляем пин 7 как вход
  pinMode(LAMPA_POV, OUTPUT);
  pinMode(SIGNAL_POV, INPUT); // объявляем пин 6 как вход
  pinMode(KNOPKA_YARK, INPUT_PULLUP); // кнопка настройки яркости
  if (EEPROM.read(INIT_ADDR) != INIT_KEY) {
    EEPROM.write(INIT_ADDR, INIT_KEY);
    EEPROM.put(0, bri);
  }
}
void loop() {
  boolean test;
  boolean  pov = digitalRead(SIGNAL_POV);
  boolean  bliz = digitalRead(SIGNAL_BLIZ);
  static bool flag1 = false;
  state = !digitalRead(KNOPKA_YARK);
  if (state && !flag1 && millis() - btnTimer > 100 && bliz == 1 ) {   
    flag1 = true;
    btnTimer = millis();
  }
  if (state && flag1 && millis() - btnTimer > 600 && bliz == 1) {
    btnTimer = millis();
    yarkost();
  }
  if (!state && flag1 && millis() - btnTimer > 500) {
    flag1 = false;
    btnTimer = millis();
  }
  switch (pov) {
    case 0:
      analogWrite(LAMPA_POV, 255);
      while (digitalRead(SIGNAL_BLIZ) == 1) {
        EEPROM.get(0, bri);
        bliz = digitalRead(SIGNAL_BLIZ);
        pov = digitalRead(SIGNAL_POV);
        analogWrite(LAMPA_POV, bri);
        if (pov == 1 || bliz == 0) break;
      }
      break;
    case 1:
      test = 0;
      while (test == 0) {
        pov = digitalRead(SIGNAL_POV);
        if ( pov == 1) {
          analogWrite(LAMPA_POV, 255);
          myTimer1 = millis();
        } else if ( millis() - myTimer1 < 2000 && pov < 1 ) {
          analogWrite(LAMPA_POV, 0);
        } else {
          test = test + 1;
        }
      }
      break;
  }
}

void yarkost() {
  static bool flag = true;
  uint32_t morgalka, regyark;
  byte yark;
  bri = 0;
  yark = 0;
  while (state && flag && yark < 3) {
    state = !digitalRead(KNOPKA_YARK);
    morgalka = millis();
    while (millis () - morgalka < 400) {
      analogWrite(LAMPA_POV, 0);
    }
    while (millis() - regyark > 500 && state && flag) {
      state = !digitalRead(KNOPKA_YARK);
      bri += 25;
      bri = constrain(bri, 0, 255);
      EEPROM.put(0, bri);
      morgalka = millis();
      while (millis () - morgalka < 700) {
        analogWrite(LAMPA_POV, bri);
      }
      regyark = millis();
      if (bri == 250) {
        analogWrite(LAMPA_POV, 0);
        while (yark != 10) {
          analogWrite(LAMPA_POV, bri);
          morgalka = millis();
          while (millis () - morgalka < 300) {
            analogWrite(LAMPA_POV, 0);
          }
          morgalka = millis();
          while (millis () - morgalka < 200) {
            analogWrite(LAMPA_POV, 255);
          }
          yark += 1;
          state = !digitalRead(KNOPKA_YARK);
        }
      }
    }
  }
}

Re: Проблема с кнопкой на ATTiny13A

Сб июн 12, 2021 09:16:13

МК не может выполнять две программы одновременно (по крайней мере "одноядерные" АВРки).
Т.е. или регулирование или обработка кнопки.
Как вариант - ставится регулирование на АППАРАТНЫЙ ШИМ (на основе одного из таймеров).
Или обработчик индикации делается на основе прерывания от системного таймера.
Тогда обработка кнопы идет независимо от обработки индикатора.
В остальном - естественно обработчик индикации "зависнет" до завершения обработчика кнопки.
8)

Re: Проблема с кнопкой на ATTiny13A

Сб июн 12, 2021 09:31:56

Код:
if (state && !flag1 && millis() - btnTimer > 100 && bliz == 1 )

Для себя хочу понять как лучше писать код, с millis() - btnTimer > 100 && bliz == 1 тут все понятно... Интересует state и !flag, эти равносильно если написать:
Код:
state ==false;
flag1!=true;

Re: Проблема с кнопкой на ATTiny13A

Сб июн 12, 2021 09:48:42

Я б не советовал таких наворотов в проверке условия делать...
"...логические выражения вычисляются слева направо.
Гарантируется, что как только обнаружится элемент, значение которого устанавливает ложность всего выражения как целого, вычисление данного выражения прекращается..."
:roll:

Re: Проблема с кнопкой на ATTiny13A

Пн июн 14, 2021 11:43:35

Интересует state и !flag, эти равносильно если написать:
Код:
state ==false;
flag1!=true;

Нет. Не равносильно. К тому же вы перепутали. ! - означает НЕ. Просто переменная в if означает что она НЕ 0 (false). А с оператором !, наоборот, что она 0 (false) и только ноль. Булевые типы - расширение языка Си, поэтому изначально было именно 0. stdbool.h добавил определения false как 0, а true как 1. Но если flag1, к примеру типа char, он может быть равен 2 и более. И если он скажем 2, то flag1 == true не будет выполнятся, а if (!flag) будет.
В итоге state и !flag можно расписать так:
Код:
state != false;
flag == false;
Ответить