Параллельное выполнение 2-3 задач

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

Пробуйте

#include <CyberLib.h> 

volatile int Dimmer;
uint32_t time_F1;
uint32_t time_F2;
uint32_t time_F3;
bool flag_F1on = 0;
bool flag_F2on = 0;
bool flag_F3on = 0;
bool flag_F1oF = 0;
bool flag_F2oF = 0;
bool flag_F3oF = 0;

void setup() {
  D8_Out;
  D9_Out;
  D10_Out;
  D4_In;
  D5_In;
  D6_In;
  attachInterrupt(0, blink, RISING);
}

void blink()
{
  if (D6_Read == HIGH)   {
    flag_F1on = 1;
    time_F1 = micros();
  }
  else if (D4_Read == HIGH)   {
    flag_F2on = 1;
    time_F2 = micros();
  }
  else if (D5_Read == HIGH)   {
    flag_F3on = 1;
    time_F3 = micros();
  }
}

void loop() {
  Dimmer = map(A0_Read, 0, 1023, 6000, 0);

  if (flag_F1on && micros() - time_F1 >= Dimmer) {
    time_F1 = micros();
    flag_F1on = 0;
    flag_F1oF = 1;
    D8_High;
  }
  if(flag_F1oF && micros() -time_F1 >= 100){
    D8_Low;
    flag_F1oF = 0;
  }

  if (flag_F2on && micros() - time_F2 >= Dimmer) {
    time_F2 = micros();
    flag_F2on = 0;
    flag_F2oF = 1;
    D9_High;
  }
  if(flag_F2oF && micros() -time_F2 >= 100){
    D9_Low;
    flag_F2oF = 0;
  }

  if (flag_F3on && micros() - time_F3 >= Dimmer) {
    time_F3 = micros();
    flag_F3on = 0;
    flag_F3oF =1;
    D10_High;
  }
  if(flag_F3oF && micros() -time_F3 >= 100){
    D10_Low;
    flag_F3oF = 0;
  }
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

vosara пишет:

SerialPrintLn() — при скорости 9600 около 250мкс, а при максимальной скорости около 3мкс.

Вот здесь, думаю, нужны некоторые оговорки.
9600 - это чуть больше 1 мс на символ. Т.к. PrintLn, то помимо "полезных" символов есть еще и служебные. В зависимости от длины строки это будет выполняться до нескольких десятков мс. Реально - меньше. Почему?
Потому, что Вы в своих измерениях по сути меряете не время передачи, а время копирования в буфер. Но это время не зависит от скорости передачи. Значит, при том способе, которым Вы проводите измерения, буфер переполняется и подтормаживает возвращение из функции writeln до освобождения места в буфере.
Другими словами, 250 мкс - это характеризует Ваш измерительный фрагмент программы, но никак не связано с реальной скоростью работы с портом.

vosara пишет:

DigitalWrite() — 1800мкс

DigitalRead() — 1900мкс

А тут явно что-то не то. Должно быть в пределах 5-7 мкс.

 

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

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

https://habr.com/post/141442/

Но вот сейчас посмотел Ваш анализ и на других сайтах, похоже напугал человека хтя АЦП правильно!

mag155
Offline
Зарегистрирован: 21.12.2017

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

mag155
Offline
Зарегистрирован: 21.12.2017

А библиотека эта , мы что просто по другому указываем номер пина и все намного быстрее работает.?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

mag155 пишет:
А библиотека эта , мы что просто по другому указываем номер пина и все намного быстрее работает.?

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

mag155
Offline
Зарегистрирован: 21.12.2017

Проверки при компилировании ?

mag155
Offline
Зарегистрирован: 21.12.2017

А диммер это ж переменная ??

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

mag155, посмотрите сами исходники digitalRead и digitalWrite в стандартной библиотеке Ардуино и в CyberLib, я что, исходник должен своими словами пересказывать?

mag155
Offline
Зарегистрирован: 21.12.2017

С телефона файл не открывается. Но как я понял библиотека классная.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Да, библиотека интересная, но авто очень глубоко внедряется в системные функции, в результате чего возникают конфликты с новыми версиями Arduino IDE. Лично я пользуюсь при необходимости отдельными фрагментами библиотеки.

Кстати, автор присутствует на этом форуме.

mag155
Offline
Зарегистрирован: 21.12.2017

А под каким ником ?

b707
Offline
Зарегистрирован: 26.05.2017

andriano пишет:

Кстати, автор присутствует на этом форуме.

Андриано, по-моему вы спутали с библиотекой arhat.h

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вероятно да. Я почему-то думал, что автор у них один.

bwn
Offline
Зарегистрирован: 25.08.2014

andriano пишет:

Вероятно да. Я почему-то думал, что автор у них один.

Нет, Архат позже немного ее допиливал. 

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

Авторы разные, но свою версию писал с огладкой на Cyberlib. Она была тольео под УНО, а мне нужна была версия под Мегу, заодно тогда и решил что "можно" переопределяя типовые функции Wiring получать хороший код без переработки скетчей. К сожалению, этот путь - тупиковый, ибо эффективно закрывается разработчиками Wiring от версии к версии. Потому и не работает в новых версиях.

Если переписать так, чтобы отказаться от перекрытия типовых функций, то можно добиться стабильной работы во всех версиях. Но, гораздо лучше отказаться от числовой нумерации пина, в пользу "имени" (по особенности спецфункций пина) или "структуры" (порт, бит).

mag155
Offline
Зарегистрирован: 21.12.2017

Все работает благодарю!!! Буду теперь думать как напряжение на выходе мерить от 0 до 500 вольт .

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Те, кто с таким уровнем знаний лезет мерять 500В, через некоторое время, почему-то, исчезают со всех форумов... 

b707
Offline
Зарегистрирован: 26.05.2017

DetSimen пишет:

Те, кто с таким уровнем знаний лезет мерять 500В, через некоторое время, почему-то, исчезают со всех форумов... 

тут все еще хуже... человек полгода на форуме, а вопросы до сих пор задает такие, на которые 12-летние пацаны на амперке с ходу отвечают.

Но он упорный.

mag155
Offline
Зарегистрирован: 21.12.2017

Ну хоть стопарь потом на льете помянете ?

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

DetSimen пишет:

Те, кто с таким уровнем знаний лезет мерять 500В, через некоторое время, почему-то, исчезают со всех форумов... 

На медицинских можна поискать.

 

mag155
Offline
Зарегистрирован: 21.12.2017

Ага или в морге. НЕ ДОЖДЕТЕСЬ.

mag155
Offline
Зарегистрирован: 21.12.2017

Всем привет !!! Такая задумка, сравнивать значения на одном аналоговом входе относительно другого и если значения отличаются изменять значения в переменной . Типа так работает но както медленно уж очень. Может есть какие идеии???

if (val < val1){
val3 --;
} 
 else if(val > val1){
val3 ++;
 
 }

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Медленно работает не изменение значения переменной, медленно работает чтение с аналогового входа - примерно 112 мкс с каждого.

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

mag155 пишет:

Всем привет !!! Такая задумка, сравнивать значения на одном аналоговом входе относительно другого и если значения отличаются изменять значения в переменной . Типа так работает но както медленно уж очень. Может есть какие идеии???

Паралелить?

mag155
Offline
Зарегистрирован: 21.12.2017

А если ардуино DUE. Взять она ж быстрее по идее .?

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

А может в тему по теме написать? Например в тему о выборе контролера или о быстрой работе с АЦП.

mag155
Offline
Зарегистрирован: 21.12.2017

Такой вопрос. Как сравнивать одну переменную с другой и если одна переменная больше например на 10 то плюсовать в третью переменную по одному. А если больше к примеру на 20 то плюсовать не по одному а по 5.?

b707
Offline
Зарегистрирован: 26.05.2017

Logik пишет:

А может в тему по теме написать? Например в тему о выборе контролера или о быстрой работе с АЦП.

а МАГ никогда в правильные темы не пишет. Он все в одну будет валить, чему подтверждение следующее сообщение

mag155
Offline
Зарегистрирован: 21.12.2017

Тогда тему подскажете.

mag155
Offline
Зарегистрирован: 21.12.2017

Всем привет !!! Такой вопрос: почему данная строка кода на ардуино уно работает а на меге ошибку выбивает ? Dimmer = map(A0_Read, 0, 1023, 6000, 0);
Полный код в посте 151.

b707
Offline
Зарегистрирован: 26.05.2017

mag155 пишет:
Всем привет !!! Такой вопрос: почему данная строка кода на ардуино уно работает а на меге ошибку выбивает ? Dimmer = map(A0_Read, 0, 1023, 6000, 0); Полный код в посте 151.

потому что макрос A0_read. вероятно, не определен для Меги. Перепишите эту строку со стандартным AnalogRead. может заработает

mag155
Offline
Зарегистрирован: 21.12.2017

Стандартно работает. Но скорость медленнее .

mag155
Offline
Зарегистрирован: 21.12.2017

И будет ли работать эта библиотека с ARDUINO. DUO
?

bwn
Offline
Зарегистрирован: 25.08.2014

Батюшки, я уж беспокоиться начал. Предыдущий крайний пост был, что то насчет питьсот вольт померить, а дальше тишина на месяц. Ви таки в отпуске были или измерения прошли неудачно?

mag155
Offline
Зарегистрирован: 21.12.2017

Был таки на морях вот вернулся решил продолжить.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

mag155 пишет:
Стандартно работает. Но скорость медленнее .

Вполне логично.

Иначе зачем CyberLib, если не для того, чтобы работало быстрее, чем в стандартном случае?

mag155
Offline
Зарегистрирован: 21.12.2017

Эта ж библиотека изначально вроде для меги была. Чё не работает не пойму ?

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

Cyberlib изначально был для УНО ваще-то. Для меги, если и есть, то не так давно. Далал свою как раз из-за того, что не было "для Меги" никакой вовсе. :)

kalapanga
Offline
Зарегистрирован: 23.10.2016

По сути вопроса понятно, в попадавшихся мне вариантах библиотеки этих макросов для меги просто нет. Вот и ругается.

Но любопытно почему? Просто не удосужился никто написать или с этим контроллером сложности какие-то в этом плане есть? Спрашиваю чисто из любопытства, для общего развития.

sadman41
Offline
Зарегистрирован: 19.10.2016

Наверное потому что на этом контроллере мало кто лепит вещи, в которых требовалась бы сайберлиб.

mag155
Offline
Зарегистрирован: 21.12.2017

Соответственно с DUO тоже работать не будет. Хотя судя по скорости DUO и так шустрая.

mag155
Offline
Зарегистрирован: 21.12.2017

Есть какие идеии?

b707
Offline
Зарегистрирован: 26.05.2017

mag155 пишет:
Есть какие идеии?

написать свою библиотеку для Меги по аналогу с циберлиб?

mag155
Offline
Зарегистрирован: 21.12.2017

Всем ривент !!!! Подскажите как все таки подружить МЕГУ с #include <CyberLib.h>????

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

mag155 пишет:

Всем ривент !!!! Подскажите как все таки подружить МЕГУ с #include <CyberLib.h>????

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

mag155
Offline
Зарегистрирован: 21.12.2017

Arhat109-2. Подскажите как библиотеку к ардуино мега адаптировать. Аналоговые входы не читает ?

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

Поищите на гитхабе, где-то по ARHAT_H там есть мой вариант для Меги с описанием что к чему. Компилируется нормально под ИДЕ не старше 1.6.4 (писалось под ней). Начиная, кажется с 1.6.7 ардуинщики заблокировали использованный подход подмены файла Arduino.h, поэтому разработку дальше в этом ключе тогда и забросил.

А в целом, выкиньте и то и другое (и Cyberlib и Wiring) и пишите нормально "по взрослому" .. Это всё не требуется. Достаточно типового io.h (там у меня есть стек вложений хидеров, как памятка) ..

mag155
Offline
Зарегистрирован: 21.12.2017

Ок. Благодарю буду искать.
.

mag155
Offline
Зарегистрирован: 21.12.2017

Скачал вашу библиотеку. Переустановить ардуино. До версии 1.6.4 Все работает кроме аналоговых входов. И как я понял библиотека заточен под входа от 0.До 7 го. У Мне И их больше может в этом проблема ?