Выходит, вы опять не поняли, о чем речь ))
Речь идет о демонстрации. А минимальный опросный период надо брать из даташита.
Я, блин, с вами тут есть захотел ))
Пойду бутерброд сделаю с колбасой (заодно, скорее всего, люлей от своей охвачу - «нефиг наночь жрать») ![]()
Приятного аппетита!
Спасибо.
А чё? Так можно ??? Оказывается на Arduino UNO можно организовать обработку ПРЕРЫВАНИЙ по таймеру! И с millis() не заморачиваться! Ну надо же! Как же я упустил этот момент! На компе на прерываниях собаку съел, а тут заблудился!
millis() - это и есть прерывание по таймеру, которое уже настроили за вас.
Ну удачи ![]()
И даже целый TTimerList есть.
Кто б мог подумать!?
Для Вас - мелочь. Вам можно докторскую защищать на тему МК (ели ещё не защитили). А для меня - новый, интереснейший этап в изучении.
Спасибо!
Избавиться бы от него в loop.
Никто не запрещает. Но если у вас проблемы (как в этой теме) - я думаю рано вам еще.
Для начала научитесь оперировать millis(), успешно избавляться от delay() и тп. Потом как работать с таймерами напрямую само придет… ![]()
Чего там избавляться? Не используйте - и всех делов. Думаете, с прерываниями по таймеру у вас проблем будет меньше? Отнюдь ![]()
![]()
Да ну. Мутная тема эти прерывания. Есть очередь их, есть запрет на них. Есть аппаратные и там мало-мальски понятно - 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;
}
}
Наслаждайтесь ![]()
Спасибо. Предвкушаю это. Сначала попробую в строках 47 и 60 вместо delay(status) поставить delay(255); Надеюсь, будет работать. Тогда попытаюсь избавиться от delay с применением millis(). Ну а затем - прерывания.
Конечно. Это же совсем другое дело. Это же уже и не delay() вовсе )))