Многозадачность с выводом на дисплей

andrey_m
Offline
Зарегистрирован: 03.03.2016

Доброго времени суток! Знающие, подскажите, пожалуйста. Хочу понять, как устроена многозадачность на Arduino. Помогите разобраться на простом примере:

Мигает светодиод с некоторой частотой. Значение этой частоты отображается на дисплее. Как реализовать, чтобы при нажатии кнопки к значению частоты прибавлялась одна секунда, и уже это значение светилось на дисплее. При этом светодиод не переставал мигать с нужной частотой.

Надеюсь, понятно объяснил. Спасибо! :)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Да ни разу не понятно! :)

Частота измеряется в единицах, обратных времени .. Но, если вам удается к частоте добавлять секунды, очень хотелось бы узнать способ .. может Нобелевку дадут .. :)

andrey_m
Offline
Зарегистрирован: 03.03.2016

Ладно, мигает с частотой 1 раз в секунду, нажимаем на кнопку - мигает с другой частотой. Суть не в этом же)

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

andrey_m пишет:

Ладно, мигает с частотой 1 раз в секунду, нажимаем на кнопку - мигает с другой частотой. 

Ну например берём BlinkWithoutDelay и добавляем функционал, что при нажатии кнопки будет менятся переменная interval (интервал между включение/выключением светодиода). То есть, будет менятся частота мигания. Значение этой же переменной можно выводить на экран.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Хыыыы... Как реализовать многозадачнось. Есть только два способа: квантование процессорного времени и мультипроцессорность :) Если у вас один процессор, то значит что ?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Ну так и "что"? :)

В смысле, что вам мешает взять означенный пример и квантовать процессорное время?

nevkon
Offline
Зарегистрирован: 20.01.2015

Берете таймер и... делаете блинк. А вывод на экран в лупе. А вообще можно сильно не заморачиваться, если конечно не ракету делаете :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andrey_m пишет:

Хочу понять, как устроена многозадачность на Arduino. Помогите разобраться на простом примере:

Никак. Люди сами делают псевдо-мультизадачность, как кто сделает, так у того и устроена.

andrey_m пишет:

к значению частоты прибавлялась одна секунда

Это невозможно. Литры с градусами не складываются.

 

 

shuser
Offline
Зарегистрирован: 14.01.2016

ЕвгенийП пишет:

Это невозможно. Литры с градусами не складываются.

Не соглашусь - частота, они же герцы, и есть переменная напрямую зависящая от времени ибо 1 Гц = 1 с−1.

т.е. для "прибавления 1 секунды" к примеру к частоте 5Гц, имеем 1/5=0,2с; 1с+0,2с=1,2с; 1/1,2с = 0,83Гц.

Литры и градусы тоже вполне складываются - Закон Гей-Люссака тому пример или "открытие Менделеева".

Связать можно всё, вопрос какие задачи ставить.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

shuser пишет:

Не соглашусь - частота, они же герцы, и есть переменная напрямую зависящая от времени ибо 1 Гц = 1 с−1.

Вы можете не соглашаться сколько Вам угодно, но Вы складываете величину размерности 1/с с величиной размерности с. Какой размерности будет результат? Можете сказать? Сколько и чего получится, если сложить 5 герц и 2 секунды?

Знаете, когда ошибся, гораздо достойнее это признать (или хотя бы промолчать), чем вертеться карасём на сковородке. Не позорьтесь.

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

ЕвгенийП пишет:

Вы можете не соглашаться сколько Вам угодно, но Вы складываете величину размерности 1/с с величиной размерности с. Какой размерности будет результат? Можете сказать? Сколько и чего получится, если сложить 5 герц и 2 секунды?

Знаете, когда ошибся, гораздо достойнее это признать (или хотя бы промолчать), чем вертеться карасём на сковородке. Не позорьтесь.

Евгений, я на работе давно практикую принцип  - на ДУРАЦКИЕ вопросы я даю ДУРАЦКИЕ ответы %)

А старая еще советская поговорка гласит - чтобы получить правильный ответ - нужно задать правильный вопрос. Если чел понимает что он хочет но еще плохо знает тему - ему указание направления достаточно. Если задают вопрос типа этого - то только время тратить......

parovoZZ
Offline
Зарегистрирован: 15.02.2016

shuser пишет:

к примеру к частоте 5Гц, имеем 1/5=0,2с;

Имеем не 0.2с, а 0.2с в степени (-1). Если изучали алгебру в 5 классе, то должны знать - разные степени не складываются.

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

andrey_m пишет:

Доброго времени суток! Знающие, подскажите, пожалуйста. Хочу понять, как устроена многозадачность на Arduino. Помогите разобраться на простом примере:

Мигает светодиод с некоторой частотой. Значение этой частоты отображается на дисплее. Как реализовать, чтобы при нажатии кнопки к значению частоты прибавлялась одна секунда, и уже это значение светилось на дисплее. При этом светодиод не переставал мигать с нужной частотой.

Надеюсь, понятно объяснил. Спасибо! :)

никак не устроена - всё гоняется в лупе по кругу: совершаем обход территории - увидел дырку в заборе, залатал, пошёл дальше. всё. (отдельная пестня - прерывания: когда рвануло где-то и нужно всё бросать и что-то делать срочно).

*конкретно твой случай реализуется так:


#include <class_noDELAY.h>
#include <class_BUTTON.h>

BUTTON BUTTON_01(3);
noDELAY nD_01;

void setup () {
pinMode(14, OUTPUT);
digitalWrite(14, 1);
nD_01.start();
}

void loop() {

static unsigned long t = 1000;
nD_01.read(t);
if (nD_01.tick) {digitalWrite(14, !digitalRead(14));}

BUTTON_01.read();
if (BUTTON_01.click_down) {t = t + 1000;}
if (BUTTON_01.retention)  {t =     1000;}

// значение t сам напечатаешь в индикатор.

}

 

shuser
Offline
Зарегистрирован: 14.01.2016

parovoZZ пишет:

shuser пишет:

к примеру к частоте 5Гц, имеем 1/5=0,2с;

Имеем не 0.2с, а 0.2с в степени (-1).

Здесь просчёт, согласен. Пример был приведён для того, чтобы показать что герцы и секунды взаимосвязаны. Да, вопрос был задан некорректно (к значению частоты прибавлялась одна секунда), но ответ (Это невозможно) тоже считаю неверным, поскольку между ними прямая зависимость.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

И что, что зависимы? Их теперь можно складывать с разными размерностями? Как гоааривал Поэт "всё ухмылялась Джоконда, мол ..."

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

Ворота пишет:
И что, что зависимы? Их теперь можно складывать с разными размерностями? Как гоааривал Поэт "всё ухмылялась Джоконда, мол ..."

ну, и нафига одевать профессорские очки, становиться у грязной доски и читать лекции нерадивым студентам, если все и так поняли, что ТС имел ввиду приращение времени в 1 секунду к существующему интервалу?

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Це ти такий тямущий, а за всiх не розписуйся

andrey_m
Offline
Зарегистрирован: 03.03.2016

Клапауций 322, Спасибо огромное, буду пробовать.

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

Ворота пишет:
Це ти такий тямущий, а за всiх не розписуйся

ок. тебя вычёркиваю - придёшь осенью на пересдачу.

andrey_m
Offline
Зарегистрирован: 03.03.2016

И вообще, спасибо всем, кто помог.

Остальным - извините за неправильную формулировку, я в своем уме, знаю, что такое частота и что такое время. Просто невнимательно писал, видимо.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Arhat109-2 пишет:

Ну так и "что"? :)

В смысле, что вам мешает взять означенный пример и квантовать процессорное время?

Мне ничего не мешает... Только мне это не нужно. Был вопрос "КАК ?" , был ответ ... и все...

Logik
Offline
Зарегистрирован: 05.08.2014

Тема вывода на экран из многозадачного приложения не раскрыта!

axill
Offline
Зарегистрирован: 05.09.2011

andrey_m пишет:

Доброго времени суток! Знающие, подскажите, пожалуйста. Хочу понять, как устроена многозадачность на Arduino. Помогите разобраться на простом примере:

Мигает светодиод с некоторой частотой. Значение этой частоты отображается на дисплее. Как реализовать, чтобы при нажатии кнопки к значению частоты прибавлялась одна секунда, и уже это значение светилось на дисплее. При этом светодиод не переставал мигать с нужной частотой.

Надеюсь, понятно объяснил. Спасибо! :)

как таковой многозадачности на ардуино нет

но ваш пример реализовать очень просто. в ардуино есть таймеры, которые могут исполнять задания в заданные моменты времени. Все остальное (отработка нажатия кнопок, отображение на дисплее и т.д) что не критично по времени исполняется внутри loop().

Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

Logik пишет:
Тема вывода на экран из многозадачного приложения не раскрыта!

А что Вы вкладываете в понятие "многозадачность"?
Или что такое задача?
Если система "Умный дом" управляет освещением, отоплением, водоснабжением.
Она однозадачна (дом один) или многозадачна (много дел)?
Я вот, например, нашел в интернете определение: "Любая многозадачность - это абстракция императивности", и все стало ясно ;)))

duinor
Offline
Зарегистрирован: 16.01.2016

axill пишет:

как таковой многозадачности на ардуино нет

но ваш пример реализовать очень просто. в ардуино есть таймеры, которые могут исполнять задания в заданные моменты времени. Все остальное (отработка нажатия кнопок, отображение на дисплее и т.д) что не критично по времени исполняется внутри loop().

Прежде чем так заявлять, нужно хотя бы понимать как работает многозадачность

А то сам не понимаешь и других в заблуждение вводишь

axill
Offline
Зарегистрирован: 05.09.2011

duino.ru пишет:

Прежде чем так заявлять, нужно хотя бы понимать как работает многозадачность

А то сам не понимаешь и других в заблуждение вводишь

прежде чем о чем то спорить стоит договориться о терминах. у автора понимание термина проистекает из контекста темы. Мой ответ дан в контексте.

Вы же пришли со своим уставом в чужой монастырь... извините... со своим определением термина в чужую тему

Википедия определяет многозадачность как свойство среды выполнения делать несколько задач в паралель. https://ru.wikipedia.org/wiki/%D0%9C%D0%BD%D0%BE%D0%B3%D0%BE%D0%B7%D0%B0...

В парадигме этого определения среда выполнения ардуино не содержит в чистом виде поддержки выполнения нескольких пользовательских задач в паралелль

Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

duino.ru пишет:

axill пишет:

как таковой многозадачности на ардуино нет

но ваш пример реализовать очень просто. в ардуино есть таймеры, которые могут исполнять задания в заданные моменты времени. Все остальное (отработка нажатия кнопок, отображение на дисплее и т.д) что не критично по времени исполняется внутри loop().

Прежде чем так заявлять нужно хотя бы понимать как работает многозадачность


Надо определиться не как работает, а что это такое, многозадачность.
Вот, например, нашел не в Википедии :)))

Многозада́чность (англ. multitasking) — свойство операционной системы или среды программирования обеспечивать возможность параллельной (или псевдопараллельной) обработки нескольких процессов.

Существует 2 типа многозадачности[1]:

Процессная многозадачность (основанная на процессах - одновременно выполняющихся программах).

Поточная многозадачность (основанная на потоках).

Еще в эту тему навязчиво лезет определение Системы Реального Времени.
После того, как определимся с терминами (футбольная или хоккейная команда Спартак  победила/проиграла в прошлогодней встрече с ...), можно двигаться дальше.

"Я так думаю!" (С)

 

duinor
Offline
Зарегистрирован: 16.01.2016

axill пишет:

прежде чем о чем то спорить стоит договориться о терминах. у автора понимание термина проистекает из контекста темы. Мой ответ дан в контексте.

Вы же пришли со своим уставом в чужой монастырь... извините... со своим определением термина в чужую тему

Википедия определяет многозадачность как свойство среды выполнения делать несколько задач в паралель. https://ru.wikipedia.org/wiki/%D0%9C%D0%BD%D0%BE%D0%B3%D0%BE%D0%B7%D0%B0...

В парадигме этого определения среда выполнения ардуино не содержит в чистом виде поддержки выполнения нескольких пользовательских задач в паралелль

До тебя так и не дошло. :))

Что такое многозадачность в чистом виде?

А по твоему как на ПК многозадачность работает? 

axill
Offline
Зарегистрирован: 05.09.2011

duino.ru пишет:

До тебя так и не дошло. :))

грубость в обращении с вашей стороны выдает отсутствие у вас умения выстраивать логику своей аргументации при спорах

не пишите мне, тупой спор с собеседником пытающемся выехать на крутости мне не интересен, в этой теме я пишу не вам, а автору темы. всего хорошего

Logik
Offline
Зарегистрирован: 05.08.2014

axill пишет:

как таковой многозадачности на ардуино нет

Когда после таких утверждение я вижу робота который под ардуиной одновременно едет, стреляет и управляется с пульта я вспоминаю анегдот "Как так?! Жопа есть, а слова такого нет".

По фактам - выполнять одновременно много действий (читай задач) востребованый случай. Под "одновременно" иметь в виду что временные интервалы действий, от начала действия до его завершения,  перекрываются во времени. Это собственно и есть многозадачность в утилитарном понимании. А вот о методах достижения этого, и стоит поумничать. По крайней мере это посолидней, чем мерится на вопросе как к герцу прибавить секунду. А то чесно слово, как 9 класс вечерней школы. 

duinor
Offline
Зарегистрирован: 16.01.2016

axill пишет:

грубость в обращении с вашей стороны выдает отсутствие у вас умения выстраивать логику своей аргументации при спорах

не пишите мне, тупой спор с собеседником пытающемся выехать на крутости мне не интересен, в этой теме я пишу не вам, а автору темы. всего хорошего

Когда у человека нет ответа, он начинает выдумывать всякие отговорки и причины.

Что грубого я написал? Я написал что не нужно вводить в залуждение людей.

А ты вместо извинения, начал всякую фигню писпть 

axill
Offline
Зарегистрирован: 05.09.2011

Logik пишет:

Когда после таких утверждение я вижу робота который под ардуиной одновременно едет, стреляет и управляется с пульта я вспоминаю анегдот "Как так?! Жопа есть, а слова такого нет".

Поддержка выполнения задач в паралель (что есть смысл общепринятого определения многозадачности) и возможность выполнения задач в паралелль это не одно и тоже. Конечно же многое можно делать "в паралелль" и на ардуине и именно об этом написано во второй части моего сообщения на которое вы сослались

зы. у робота далеко не все задачи надо делать именно паралелльно. Для робота многие задачи сделаные последовательно, но быстро - совершенно приемлемый вариант

duinor
Offline
Зарегистрирован: 16.01.2016

axill пишет:

Logik пишет:

Когда после таких утверждение я вижу робота который под ардуиной одновременно едет, стреляет и управляется с пульта я вспоминаю анегдот "Как так?! Жопа есть, а слова такого нет".

Поддержка выполнения задач в паралель (что есть смысл общепринятого определения многозадачности) и возможность выполнения задач в паралелль это не одно и тоже. Конечно же многое можно делать "в паралелль" и на ардуине и именно об этом написано во второй части моего сообщения на которое вы сослались

зы. у робота далеко не все задачи надо делать именно паралелльно. Для робота многие задачи сделаные последовательно, но быстро - совершенно приемлемый вариант

Данный ответ, только подтверждае что у тебя нет знаний в этой области

andrey_m
Offline
Зарегистрирован: 03.03.2016

Я для чего это спрашиваю. Делаю что-то вроде инкубатора, но не для яиц, а для уже вылупившихся цыплят. Требуется регулировать температуру и влажность, выводить их значения на экран. При этом нужна возможность задания требуемых значений температуры и влажности с помощью кнопки. Нажимаем на кнопку - на экране вместо текущих показаний температуры\влажности отображается значение заданной температуры+1градус (меняется переменная), нажимаем другую кнопку  - минус 1 градус. и во время вот этого ввода хотелось бы, чтобы система не переставала следить за состоянием датчиков и выдавала сигналы на исполнительные устройства. Примерно как в этом видео https://www.youtube.com/watch?v=oFPP9y1ME4g&index=2&list=PLQX7MmyZNtRWA_Vpb6UjOmtaFLSjnot1J

Logik
Offline
Зарегистрирован: 05.08.2014

axill пишет:

Поддержка выполнения задач в паралель..

От зря Вы слово "паралель" написали, ща набегут люди и скажут, что МК выполняет команды последовательно и только так. И будут формально правы. И снова "Жопа есть..." Основной вопрос собственно состоит как при всем этом удобно организовать выполнение нескольких задач в одно и тоже время. 

Кстати ардуина "из посылки" умеет крутить луп и принимать на сириал одновременно. Есть ли многозадачность?

axill
Offline
Зарегистрирован: 05.09.2011

andrey_m пишет:

Я для чего это спрашиваю. Делаю что-то вроде инкубатора, но не для яиц, а для уже вылупившихся цыплят. Требуется регулировать температуру и влажность, выводить их значения на экран. При этом нужна возможность задания требуемых значений температуры и влажности с помощью кнопки. Нажимаем на кнопку - на экране вместо текущих показаний температуры\влажности отображается значение заданной температуры+1градус (меняется переменная), нажимаем другую кнопку  - минус 1 градус. и во время вот этого ввода хотелось бы, чтобы система не переставала следить за состоянием датчиков и выдавала сигналы на исполнительные устройства. Примерно как в этом видео https://www.youtube.com/watch?v=oFPP9y1ME4g&index=2&list=PLQX7MmyZNtRWA_Vpb6UjOmtaFLSjnot1J

в вашем случае многозадачность, паралельность или что то подобное соверешнно не нужны.

вы можете спокойно обрабатывать все задачи последовательно. Производительность ардуины достаточна, чтобы для вашей задачи последовательное выполнение задач не создавало никаких проблем. Т.е. внутри loop() можете последовательно проверять состояние кнопок, считывать значения с датчиков, управлять нагревателем и выводить данные на дисплей. Все успеете

Logik
Offline
Зарегистрирован: 05.08.2014

andrey_m пишет:

Я для чего это спрашиваю. Делаю что-то вроде инкубатора, но не для яиц, а для уже вылупившихся цыплят. Требуется регулировать температуру и влажность, выводить их значения на экран. При этом нужна возможность задания требуемых значений температуры и влажности с помощью кнопки. ....

А в чем собствено проблема? пока регулируем изредка смотрим не нажата ли кнопка, если нажата - регулирование подождет, цеплята не скопытятся пока температуру отредактируем, здесь нет сложностей.

ПС. Ну вот. Не успел ;)

andrey_m
Offline
Зарегистрирован: 03.03.2016

Все понял, спасибо :)

axill
Offline
Зарегистрирован: 05.09.2011

Logik пишет:

Кстати ардуина "из посылки" умеет крутить луп и принимать на сириал одновременно. Есть ли многозадачность?

и да и нет. здесь мы упираемся в дотошное определение термина. Вот только с практической точки зрения спорить по моему нет смысла. Смысл имеет обсуждение решения для конкретной задачи. Все таки в мире микроконтроллеров не правильно (ИМХО) напрямую применять логику от персональных компьютеров. ПК ориентированы на универсальные задачи в то время как устройство на МК ориентировано на специфичную задачу

parovoZZ
Offline
Зарегистрирован: 15.02.2016

shuser пишет:

Здесь просчёт, согласен. Пример был приведён для того, чтобы показать что герцы и секунды взаимосвязаны. Да, вопрос был задан некорректно (к значению частоты прибавлялась одна секунда), но ответ (Это невозможно) тоже считаю неверным, поскольку между ними прямая зависимость.

Не прямая, а обратная.

 

И чему вас в вузах учат???

parovoZZ
Offline
Зарегистрирован: 15.02.2016

Многозадачность - есть

Многопоточности в данном классе МК - нет

Logik
Offline
Зарегистрирован: 05.08.2014

axill пишет:

Logik пишет:

Кстати ардуина "из посылки" умеет крутить луп и принимать на сириал одновременно. Есть ли многозадачность?

и да и нет. здесь мы упираемся в дотошное определение термина. Вот только с практической точки зрения спорить по моему нет смысла. 

Спорить о терминах безсмыслено. Чисто с практической точки наблюдаем: ардуино может реализовать многозадачность и она есть "из коробки".Чисто с практической точки зрения. Квантования, прерывания и т.д.  все это изнутри, это подходы и методы реализации.

axill пишет:

 Смысл имеет обсуждение решения для конкретной задачи. 

Не. Так низя. В чем сила програмирования - в абстракциях. Здесь как раз та ситуация, что конкретных решения мног - роботы ездят и стреляют и. т.д. А универсальных путей нет. Не наработаны. А те что предлагают, как те либы, ни на что не годны, разве что помигать светодиодами. Хотя бы вывод на экран из таких потоков представит - то жуть. Потому как за потоками на ПК много всего спрятано, та же синхронизация. И все это не перетянется в МК никак. И не нужн. Потому подход нужен другой. 

axill пишет:

 Все таки в мире микроконтроллеров не правильно (ИМХО) напрямую применять логику от персональных компьютеров. ПК ориентированы на универсальные задачи в то время как устройство на МК ориентировано на специфичную задачу

Да. Устройство на МК  специфично, но язык и либы универсальны и вполне могут иметь средства многозадачности. Например меня бы вполне устроил некий диспетчер, в котором бы задачи регистрировались, заявляли свои свойства, типа "вызыват меня через 100мс, допустимо опоздать не более чем на 5мс, завершусь за 10мс, не более". Диспетчер бы оптимизировал вызовы задач исходя из этих данных. Здесь ключивой момент - оптимизация. Без оптимизации у меня такая хрень работает, а вот как оптимизацию сделать...

Logik
Offline
Зарегистрирован: 05.08.2014

parovoZZ пишет:

Многозадачность - есть

Многопоточности в данном классе МК - нет

Так не сильно то и хотелось, был бы толковый подход к реализации многозадачности, а то ж каждый раз, каждый разработчик велосипед изобретает. Разумеется кривоватый выходит. 

duinor
Offline
Зарегистрирован: 16.01.2016
axill
Offline
Зарегистрирован: 05.09.2011

Logik пишет:

Например меня бы вполне устроил некий диспетчер, в котором бы задачи регистрировались, заявляли свои свойства, типа "вызыват меня через 100мс, допустимо опоздать не более чем на 5мс, завершусь за 10мс, не более". Диспетчер бы оптимизировал вызовы задач исходя из этих данных. Здесь ключивой момент - оптимизация. Без оптимизации у меня такая хрень работает, а вот как оптимизацию сделать...

так это все есть в RTOS. ее как раз в полной мере можно подвести под понятие многозадачности. Система квантует время МК между разными задачами. На железе ардуины вполлне можно использовать тот же FreeRTOS

Logik
Offline
Зарегистрирован: 05.08.2014

axill пишет:

Logik пишет:

Например меня бы вполне устроил некий диспетчер, в котором бы задачи регистрировались, заявляли свои свойства, типа "вызыват меня через 100мс, допустимо опоздать не более чем на 5мс, завершусь за 10мс, не более". Диспетчер бы оптимизировал вызовы задач исходя из этих данных. Здесь ключивой момент - оптимизация. Без оптимизации у меня такая хрень работает, а вот как оптимизацию сделать...

так это все есть в RTOS. ее как раз в полной мере можно подвести под понятие многозадачности. Система квантует время МК между разными задачами. На железе ардуины вполлне можно использовать тот же FreeRTOS

Даже близко нет. RTOS штука интересная, но тяжелая для atmeg с 2к ОЗУ. Она вытесняющая и следовательно ресурсоемкая. Все то, что выше писалось, контекст сохраняет (а в нем самое противное - стек процесса с цепочкой выхода и локальными переменными), квантование времени по приоритетам и синхронизация. Это именно путь подобный ПК. Нужна многозадачность кооперативная, как в win3.11. С переключением между задачами не по истечению кванта, а по завершению логического этапа задачи, когда задача сама отдает управление с заявкой-описанием когда её снова активизировать. Тогда и контекста нет (точней контекст - это проблема задачи, описание её состояния как конечного автомата) и синхронизация не нужна. 

andrey_m
Offline
Зарегистрирован: 03.03.2016

Тогда еще вопрос по теме: написал программу

void loop() {

  float h = dht.readHumidity();
  float t1 = dht.readTemperature();
  sensors.requestTemperatures();
  float t2 = sensors.getTempCByIndex(0);

buttonupState = digitalRead(buttonupPin);
  if (buttonupState == LOW ) {
  print_main(h, t1, t2); 
}
  else { 
  t=t+0.5;  
  print_menu(t);
  }

}

т.е. если не жать на кнопку (buttonPin == LOW) то отображается главное окно - показания с датчиков.

если нажать на кнопку ((buttonPin == HIGH), то отображается меню настройки температуры и прибавляется к температуре 0,5 градуса.

Но проболема в том, что из-за долгой первой части loop опрос кнопки происходит нечасто, так что после нажатия кнопки иногда программа не успевает считать это нажатие, потому что занята опросом датчиков. Есть методы решения такой задачи? Может, нужно не условие, а что-то другое? Прерывание?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andrey_m пишет:

 Может, нужно не условие, а что-то другое? Прерывание?

Конечно. Это вообще обычная практика, еcли кнопка без фиксации.

Logik
Offline
Зарегистрирован: 05.08.2014

А вот я бы не советовал лезть сразу к прерываниям. Если в строках 3-6 гдето тупит, то лучше разобратся где и что, возможно дело поправимое. Для начала локализовать где, для этого вставить перед и после каждого вызова Serial.println(millis()); или на экран, как Вам удобней. Глядя в хрустальный шар (Вы же ни схемы ни датчиков не сообщаете;) вижу что это sensors. Он похоже ds18b20. А у него есть специфика - конвертирование температуры 750мс. Но с этим можна боротся многими способами.

А как только полезите в прерывание, возникнет вопрос - а print_main тоже из прерывания? А там хороших ответов нет, т.к. любой вариант несет отрицательные последствия. Если ответ нет- то между нажатием кнопки и появлением меню пройдет неприятная пауза, если ответ да - то конфликт с другими print_main при одновременном выводе. И с тем и с другим тоже можна боротся, но это тоже вызовет проблемы нового уровня. "Плавали - знаем!" )))

Надо боротся с причиной а не бежать от них в прерывания.

andrey_m
Offline
Зарегистрирован: 03.03.2016

Да, датчик ds18b20 дело именно в нем (уже проверил). Там стоит задержка 750мс, как Вы верно заметили. В print_main и print_menu - просто операторы lcd.print("бла-бла"), больше там нет ничего. Никаких прерываний я не использую, поэтому решил не выкладывать весь код сюда. Второй датчик - DHT22 отрабатывает быстро, с ним большой задержки нет.

а что за способы? Опрашивать его реже? Тоже не очень хорошо...

 

вот весь код на данный момент:

// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DallasTemperature.h>
#include <OneWire.h>

#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

LiquidCrystal_I2C lcd(0x27, 16, 4);

#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

const int buttonupPin = 4;
int buttonupState = 0;
boolean buttonupLast = LOW;
boolean buttonupCurrent = LOW;
float t0 = 25;


void setup() {
  pinMode(buttonupPin, INPUT);
  Serial.begin(9600);
  Serial.println("running serial port...");
  lcd.init();
  dht.begin();
  lcd.backlight();
  sensors.begin();
};

void print_main (float h, float t1, float t2) {
  lcd.setCursor(0, 0);
  lcd.print("hum.=");
  lcd.print(h);
  lcd.print("%");
  lcd.print(" t0=");
  lcd.print(t0);
  lcd.setCursor(0, 1);
  lcd.print("t1=");
  lcd.print(t1);
  lcd.print("    ");
  lcd.print("t2=");
  lcd.print(t2);
}

void print_menu (float t) {
  //lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("        set t0=");
  lcd.print(t0);
  lcd.print("     ");
  }

void loop() {
buttonupState = digitalRead(buttonupPin);

  if (buttonupState == LOW ) {
  float h = dht.readHumidity();
  float t1 = dht.readTemperature();
  sensors.requestTemperatures();
  float t2 = sensors.getTempCByIndex(0);
  print_main(h, t1, t2); 
}
  else if (buttonupState == HIGH) { 
  t0=t0+0.5;  
  print_menu(t0);
  delay(800);
  }

}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Logik пишет:

А вот я бы не советовал лезть сразу к прерываниям. Если в строках 3-6 гдето тупит, то лучше разобратся где 

Краткие сигналы, типа однократного нажатия кнопок всегда надо обрабатывать из прерывания. Даже при очень быстром выполнении всего остального по закону Мэрфи кнопка нажмётся именно в тот момент, когда процессор занят чем-то другим.

Logik пишет:

А как только полезите в прерывание, возникнет вопрос - а print_main тоже из прерывания? А там хороших ответов нет, 

Есть! В прерывании не делаются никакие принтмэйны. Там надо просто взвести флажок, что было нажатие, а в loop этот флажок проверять. Разница в том, что он никуда не денется в отличие от кнопки, которая к моменту проверки может быть уже отжата. Флажок спокойно дождётся обработки.

Logik пишет:

Надо боротся с причиной а не бежать от них в прерывания.

Это и есть причина - кнопка может быть нажата в момент, когда процессор занят, неважно насколько быстро от там всё делает. С краткосрочными сигналами - только прерывание.