Timer1
- Войдите на сайт для отправки комментариев
Всем привет!
Прошу помочь понять библиотеку таймера
#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 ); какой смысл этой команды?
я неправильно выразился, извиняюсь
смысл digilatWrite я понимаю, но почему digitalRead в первой степени?
Ладно, помогу недалеким.
https://prog-cpp.ru/c-operation/
Самое интересное тут то, что в сравнении с кем-то Вы тоже недалекий) Но за объяснение человеку, только начавшему изучение программирования, спасибо!
Самое интересное тут то, что в сравнении с кем-то Вы тоже недалекий)
воспринимайте это как "не далекий" - в смысле близкий :)
Qwone, а на первый вопрос ответишь?
//**/ 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 байт. */Какой еще вопрос?
Цитата из первого поста:
я вот одного не понимаю, почему у них в коде два разных вывода? то есть они назначают 10 как аутпут, а до этого в команде pwm они работают с 9м.
я тоже не понимаю
Там так устроена библиотека. В ней два механизма. Этот метод void pwm(char pin, unsigned int duty)- прямое мигание на выводе.
void attachInterrupt(void (*isr)(), unsigned long microseconds) - дергать функцию пользователя.
почему digitalRead в первой степени?
Это ошибка, должен быть в кубе.