Arduino UNO разбушевалась

Выходит, вы опять не поняли, о чем речь ))

Речь идет о демонстрации. А минимальный опросный период надо брать из даташита.

Я, блин, с вами тут есть захотел ))
Пойду бутерброд сделаю с колбасой (заодно, скорее всего, люлей от своей охвачу - «нефиг наночь жрать») :smiley:

Приятного аппетита!

Спасибо.

А чё? Так можно ??? Оказывается на Arduino UNO можно организовать обработку ПРЕРЫВАНИЙ по таймеру! И с millis() не заморачиваться! Ну надо же! Как же я упустил этот момент! На компе на прерываниях собаку съел, а тут заблудился!

millis() - это и есть прерывание по таймеру, которое уже настроили за вас.

Ну удачи :sweat_smile:

И даже целый TTimerList есть.

Кто б мог подумать!?

Для Вас - мелочь. Вам можно докторскую защищать на тему МК (ели ещё не защитили). А для меня - новый, интереснейший этап в изучении.

Спасибо!

Избавиться бы от него в loop.

Никто не запрещает. Но если у вас проблемы (как в этой теме) - я думаю рано вам еще.
Для начала научитесь оперировать millis(), успешно избавляться от delay() и тп. Потом как работать с таймерами напрямую само придет… :wink:

Чего там избавляться? Не используйте - и всех делов. Думаете, с прерываниями по таймеру у вас проблем будет меньше? Отнюдь :wink:

:slight_smile:
Да ну. Мутная тема эти прерывания. Есть очередь их, есть запрет на них. Есть аппаратные и там мало-мальски понятно - attachInterrupt(0, irread, FALLING);.
А по таймеру? Где команда attachInterrupt(999, irread);. И почему они не аппаратные? Ведь таймеры физически существуют в окрестностях МК?

Ну пусть побултыхается, что нам жалко? ))

Если это про меня, то бултыхаться придется, когда я в прерывания попытаюсь загнать обращение к BMP180, избавляясь при этом от строки 47, если в этой строке задержка не может быть фиксированной.
В строке 44 запрашивается status, это время задержки, как я понял, через которое надо запросить температуру в строке 48. Если эту задержку МОЖНО сделать фиксированной (всегда 255 мс), то ее можно отсчитать без delay(status), а затем выполнить строку 48. А если нельзя, то придется побултыхаться вдвойне. Анологично с запросом давления.

Обращение к BMP180
#include <SFE_BMP180.h>
#include <Wire.h>
// #include <SPI.h>
SFE_BMP180 pressure;
int st;
bool trigger, start_bmp180;
double cur_p, cur_t;
void setup()
{
  pinMode(13, OUTPUT);
  digitalWrite(13, 0);
  Wire.begin();
  pressure.begin();
  Serial.begin(9600);
}

void loop()
{
  //для тактового генератора
  static uint32_t period = 500;
  static uint32_t moment;

  //для BMP180
  char status;
  double T, P;

  if (millis() - moment >= period)
  {
    moment = millis();
    trigger = !trigger;
    digitalWrite(13, trigger);
    if (trigger) //пришел как бы секундный импульс
    {
      st++;
      if (st == 5)
      {
        start_bmp180=true;
        st = 0;
      }
    }
  }
  if (start_bmp180) //запуск BMP180
  {
    status = pressure.startTemperature();
    if (status != 0)
    {
      delay(status);
      status = pressure.getTemperature(T);
      if (status != 0)
      {
        //Переменная T скоро испортится.
        //ее надо срочно прочитать
        if (T > 0)
        {
          cur_t = T;
        }
        status = pressure.startPressure(3);
        if (status != 0)
        {
          delay(status);
          status = pressure.getPressure(P, T);
          if (status != 0)
          {
            //получаем текущее давление P и переводим миллибары в мм рт. ст.
            cur_p = P * 0.750063783; //миллибары в мм рт. ст.
          }
        }
      }
    }
    String stroka = String(cur_t, 2);
    stroka += " ";
    stroka += String(cur_p, 2);
    Serial.println(stroka);
    start_bmp180 = false;
  }
}

Наслаждайтесь :sweat_smile:

Спасибо. Предвкушаю это. Сначала попробую в строках 47 и 60 вместо delay(status) поставить delay(255); Надеюсь, будет работать. Тогда попытаюсь избавиться от delay с применением millis(). Ну а затем - прерывания.

Конечно. Это же совсем другое дело. Это же уже и не delay() вовсе )))