Часто бывает ,что нужно во время паузы или какого то цикла выполнять независимый от кадра программы код , узнать состояние пина , задать импульс на выходе определенной частоты и т.д. хороший помощник в этом библиотека Timer1 вот ссылка на нее http://playground.arduino.cc/Code/Timer1 а ниже привожу свой небольшой пример: Код (C++): #include <TimerOne.h> int cifra=0; int sostoyanie_knopki; void setup() { Timer1.initialize(500000); // период (1000000) 1секунда по умолчанию Timer1.pwm(9, 512); //без нее все работает не понял зачем это Serial.begin(9600); pinMode(13, OUTPUT); pinMode(5, INPUT_PULLUP);//кнопка на 5 пине //подтянута к +5в Timer1.attachInterrupt(Timer1_action); } void Timer1_action() { digitalWrite(13, !digitalRead(13));//LED500 миллисекунд горит, 500 - нет sostoyanie_knopki= digitalRead(5);// считываем каждые полсекунды состояние кнопки Serial.print("cikl ");//каждые 500 миллисек отправляем значение в порт Serial.println(cifra); Serial.print("sostoyanie_knopki ");// отправляем значение в порт if(sostoyanie_knopki==1) { Serial.println("------------");// } else { Serial.println("!! NAJATA !!");// } } void loop() { for(int a=0;a<10000;a++) { cifra=a; delay(100);//даже если задать 10000 все будет работать Serial.println(a);//через каждые 100 миллисек отправляем в порт } // пока мы тут что-нибудь делаем, светодиод мигeт сам по себе // каждые 500 миллисек отправляем в порт значение кнопки и изменяемую переменную cifra }
ммммм .. прерывание по таймеру .. занятно а что если надо сделать несколько разных циклических процедур с разными временными циклами?
я пробовал сделать несколько void Timer1_action() void Timer2_action() void Timer3_action() особо не разбирался ,но инициализировать их в одно время не удалось может как раз и нужно задавать разные значения в этой строке
Если вы решили параллелить задачи с помощью прерывания то надо учитывать 1 таймер- 1 прерывание 1 задача. на каждую задачу свой таймер. Ну кроме основного потока. Другой вариает millis() или ваш аналог millis() на таймере. Вот код-шаблон для трех параллельных задач. Код (C++): //#1 void setup1(){ } void loop1(){ } //#2 void setup2(){ } void loop2(){ } //#3 void setup3(){ } void loop3(){ } void setup() { //#1 setup1(); //#2 setup2(); //#3 setup3(); } void loop() { static uint32_t MILLIS ; MILLIS = millis() ; //#1 1000 миллисекунд вычислит. поток 1 static uint32_t future1 = 0 ; if (MILLIS>=future1) { future1 = MILLIS + 1000 ; loop1(); MILLIS = millis() ; } //#2 200 миллисекунд вычислит. поток 2 static uint32_t future2 = 0 ; if (MILLIS>=future2) { future2 = MILLIS + 200 ; loop2(); MILLIS = millis() ; } //#3 100 миллисекунд вычислит. поток 3 static uint32_t future3 = 0 ; if (MILLIS>=future3) { future3 = MILLIS + 100 ; loop3(); } }
для ардуинщиков, не желающих вникать в работу нативных таймеров (и лишающих тем самым себя огромного удовольствия), есть библиотека ticker , позволяющая задавать любое к-во периодически вызываемых (квази таймеры вроде как) функций с периодом вызова от 1 мс, встречал в esp2866, но вроде они есть для всех ардуин.
Это вы зря ! я стараюсь вникнуть во все то что связано с микроконтроллерами ,но начинаю может быть с хвоста )) Неправильные коты тоже едят с хвоста ,оставляя вкусное на закуску
@Onkel поясните пожалуйста ,что делает эта строка Timer1.pwm(9, 512); это частота работы таймера ? тогда как она влияет на его работу или для чего то устанавливается шим на 9 пине ,но тогда там не должно быть значение выше 255 ? Наверное это частота ТИКОВ в сек