Timer1

nail2007
Offline
Зарегистрирован: 08.12.2017

Всем привет!

Прошу помочь понять библиотеку таймера

#include <TimerOne.h> 



void setup() 

Timer1.initialize(); // 1 секунда по умолчанию - то, что надо 
Timer1.pwm(9, 512); // полсекунды светимся (512 / 1024), на полсекунды гасим 

pinMode(10, OUTPUT); 
Timer1.attachInterrupt(Timer1_action); 

void Timer1_action() 

// LED секунду горит, секунду - нет 
digitalWrite(10, !digitalRead(10)); 

void loop() 

// пока мы тут что-нибудь делаем, светодиоды мигают сами по себе 
}

Этот пример нашел на одном сайте, я вот одного не понимаю, почему у них в коде два разных вывода? то есть они назначают 10 как аутпут, а до этого в команде pwm они работают с 9м.

И еще один вопрос: если открыть в ардуино иде библиотеку таймер1, то там есть такая команда digitalWrite( 13, digitalRead( 13 ) ^ 1 ); какой смысл этой команды?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

nail2007 пишет:
какой смысл этой команды?
Считайте что это вроде ЕГЭ. Вот вы не прошли, так как гуглом и Интернетом пользоваться не умеете.

nail2007
Offline
Зарегистрирован: 08.12.2017

я неправильно выразился, извиняюсь

смысл digilatWrite я понимаю, но почему digitalRead в первой степени?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ладно, помогу недалеким.

^ исключающее ИЛИ - бинарная операция, результат которой равен 1, если только один из двух операндов равен 1 (в общем случае если во входном наборе операндов нечетное число единиц).

https://prog-cpp.ru/c-operation/

nail2007
Offline
Зарегистрирован: 08.12.2017

Самое интересное тут то, что в сравнении с кем-то Вы тоже недалекий) Но за объяснение человеку, только начавшему изучение программирования, спасибо! 

b707
Offline
Зарегистрирован: 26.05.2017

nail2007 пишет:

Самое интересное тут то, что в сравнении с кем-то Вы тоже недалекий)

воспринимайте это как "не далекий" - в смысле близкий :)

Qwone, а на первый вопрос ответишь?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

b707 пишет:
Qwone, а на первый вопрос ответишь?
Какой еще вопрос? Если про TimerOne.h , то у меня свои решения этой проблемы.

//**/
unsigned long mill;// переменная для millis()
typedef void (*pDo)() ;// тип -функция обработчик
//------Cl_Led----------------------
// класс светодиод
class Cl_Led {
  protected:
    const byte pin;
    bool led;
    unsigned long past, time;
    byte state; //0 выкл/ 1 вкл / 2 мигать
    /*установить в состояние*/
    void stand(byte state_) {
      past = mill;
      state = state_;
      switch (state) {
        case 0: // выкл
          digitalWrite(pin, led = LOW);
          break;
        case 1: // вкл
          digitalWrite(pin, led = HIGH);
          break;
        case 2:// мигать
          digitalWrite(pin, led = !led);
          break;
        case 3:// короткое выключение
          digitalWrite(pin, led = LOW);
          break;
        case 4:// короткое включение
          digitalWrite(pin, led = HIGH);
          break;
      }
    }
  public:
    /*конструктор*/
    Cl_Led(byte pin_): pin(pin_) {}
    /*инициализация-вставить в setup()*/
    void init() {
      pinMode(pin, OUTPUT);
      OFF();
    }
    /*работа-вставить в loop()*/
    void run() {
      if (state == 2 && mill - past >= time)stand(2);
      if (state == 3 && mill - past >= time)stand(1);
      if (state == 4 && mill - past >= time)stand(0);
    }
    /*включить*/
    void ON() {
      stand(1);
    }
    /*коротко включить*/
    void ON(unsigned long time_) {
      time = time_;
      stand(4);
    }
    /*выключить*/
    void OFF() {
      stand(0);
    }
    /*коротко выключить*/
    void OFF(unsigned long time_) {
      time = time_;
      stand(3);
    }
    /*мигать*/
    void blink(unsigned long time_ = 200) {
      time = time_;
      stand(2);
    }
};
//------Cl_Btn----------------------
// класс кнопка
class Cl_Btn {
  protected:
    const byte pin;
    pDo Do;//обработчик
    bool bounce = 0;
    bool btn = 1, oldBtn;
    unsigned long past;
  public:
    /*конструктор*/
    Cl_Btn(byte pin_, pDo Do_): pin(pin_), Do(Do_) {}
    /*инициализация-вставить в setup()*/
    void init() {
      pinMode(pin, INPUT_PULLUP);
    }
    /*работа-вставить в loop()*/
    void run() {
      bool newBtn = digitalRead(pin);
      if (!bounce && newBtn != btn) {
        bounce = 1;
        past = mill;
      }
      if (bounce && mill - past >= 10) {
        bounce = 0 ;
        oldBtn = btn;
        btn = newBtn;
        if (!btn && oldBtn) Do();
      }
    }
};
//-----компоновка----------------------
Cl_Led Led(/*пин*/13);
void DoBtn1() {
  Led.ON(200);
  Serial.println("DoBtn1");
}
void DoBtn2() {
  Led.OFF(200);
  Serial.println("DoBtn2");
}
void DoBtn3() {
  Led.blink();
  Serial.println("DoBtn3");
}
Cl_Btn Btn1(/*пин*/2,/*обработчик*/DoBtn1);
Cl_Btn Btn2(/*пин*/3,/*обработчик*/DoBtn2);
Cl_Btn Btn3(/*пин*/4,/*обработчик*/DoBtn3);
//-----main-----------------------
int main() {
  init();
  // setup()
  Serial.begin(9600);
  Led.init();
  Btn1.init();
  Btn2.init();
  Btn3.init();
  for (;;) {
    // loop()
    mill = millis();
    Led.run();
    Btn1.run();
    Btn2.run();
    Btn3.run();
  }
  return 0;
}
/*Скетч использует 2814 байт (9%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 251 байт (12%) динамической памяти, оставляя 1797 байт для локальных переменных. Максимум: 2048 байт.
*/

 

b707
Offline
Зарегистрирован: 26.05.2017

qwone пишет:

Какой еще вопрос?

Цитата из первого поста:

я вот одного не понимаю, почему у них в коде два разных вывода? то есть они назначают 10 как аутпут, а до этого в команде pwm они работают с 9м.

 

я тоже не понимаю

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Там так устроена библиотека. В ней два механизма. Этот метод void pwm(char pin, unsigned int duty)- прямое мигание на выводе.

void attachInterrupt(void (*isr)(), unsigned long microseconds) - дергать функцию пользователя.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

nail2007 пишет:

почему digitalRead в первой степени?

Это ошибка, должен быть в кубе.