Побеждаем delay()

Тема в разделе "Arduino & Shields", создана пользователем rff-ei, 18 сен 2016.

  1. rff-ei

    rff-ei Гик

    Часто бывает ,что нужно во время паузы или какого то цикла выполнять независимый от кадра программы код , узнать состояние пина , задать импульс на выходе определенной частоты и т.д. хороший помощник в этом библиотека 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
    }
     
    Последнее редактирование: 18 сен 2016
  2. noevile

    noevile Гик

    ммммм .. прерывание по таймеру .. занятно
    а что если надо сделать несколько разных циклических процедур с разными временными циклами?
     
  3. rff-ei

    rff-ei Гик

    я пробовал сделать несколько
    void Timer1_action()
    void Timer2_action()
    void Timer3_action()
    особо не разбирался ,но инициализировать их в одно время не удалось
    может как раз и нужно задавать разные значения в этой строке
     
  4. qwone

    qwone Гик

    Если вы решили параллелить задачи с помощью прерывания то надо учитывать 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();  
      }
    }
     
    Последнее редактирование: 18 сен 2016
    rff-ei нравится это.
  5. rff-ei

    rff-ei Гик

    здорово ! надо попробовать
     
  6. Onkel

    Onkel Гуру

    для ардуинщиков, не желающих вникать в работу нативных таймеров (и лишающих тем самым себя огромного удовольствия), есть библиотека ticker , позволяющая задавать любое к-во периодически вызываемых (квази таймеры вроде как) функций с периодом вызова от 1 мс, встречал в esp2866, но вроде они есть для всех ардуин.
     
  7. ИгорьК

    ИгорьК Гуру

    ... Javascript at Espruino (Iskra JS).
    Не все разделяют одинаковые удовольствия :)
     
  8. rff-ei

    rff-ei Гик

    Это вы зря ! я стараюсь вникнуть во все то что связано с микроконтроллерами ,но начинаю может быть с хвоста )) Неправильные коты тоже едят с хвоста ,оставляя вкусное на закуску
     
  9. rff-ei

    rff-ei Гик

    @Onkel поясните пожалуйста ,что делает эта строка
    Timer1.pwm(9, 512);
    это частота работы таймера ? тогда как она влияет на его работу
    или для чего то устанавливается шим на 9 пине ,но тогда там не должно быть значение выше 255 ?
    Наверное это частота ТИКОВ в сек
     
    Последнее редактирование: 19 сен 2016
  10. rff-ei

    rff-ei Гик