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

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

mag155 пишет:
Так ответьте по человечески что да как, если ответ знаете .Зачем строить из себя не известно что .?

Ты, милое дитя, в каком ВУЗе учишься? В смысле КТО тебе ТАК сформулировал задание? Это щоб знать и туда мое дите не попало кады подрастеть.. :)

Цитата:
Изучил меня некий вопрос так вот как по внешнему прерыванию трех последовательных очень коротких импульсов запустить три независимых таймера и чтоб по окончанию каждого из таймеров выполнить свое действие и сбросить таймер ? Подскажите а то мочи больше нет что я только не пробовал но так чтоб три не зависимо друг от друга не получается .

Излагай внятно и четко, с примерами:

1. "что я только не пробовал" -- вот конкретно, чего НЕ пробовал и укажи;

2. "но так чтоб три не зависимо друг от друга не получается" -- вот и покажи КАК это у тебя НЕ получается (а то 3.14еть все горазды, всё там получается у тебя, просто ты в себя не веришь ни разу);

3. Что это такое (но это скорее всего к тому дебилу, что давал задание):

а) "сбросить таймер" -- куда сбросить, в мусорку? б) "чтоб по окончанию каждого из таймеров" -- что такое это "окончание каждого из таймеров" .. хде оно.. в) "очень коротких импульсов" -- это как? Полчаса - короткий импульс, не? А пару пикосекунд - сойдет? Вот так прямо и скажи "скока вешать в граммах". г) Что за "внешнее прерывание" из трех коротких импульсов .. оно что, с первого разу не попадает, как пушкари на вход в гавань? Обязателен салют из трех импульсов?

В общем, если хочешь чтобы тебе помогли, мил дитя, то ответствуй полноценно на поставленные вопросы. Или катись в Армию. Там тебя этот вопрос измучает ишо сильней. :)

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

Смысл собственно в чем. Есть три фазы сети, есть 6 тиристора на которые нужно выдавать управляющие импульсы. Есть три синхроимпульса от пересечения каждой из фаз. Задача по первому синхроимпульса подождать какое-то время которое можно менять (чем больше ждем тем меньше выходная мощность ) и так по всем трем. Все три импульса подключены на вход прерывания через диодное или то Есть каждый из них вызывает прерывание.

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

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

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

Ну то есть, Вы хотите сказать, что задание ставил вовсе не дебил, а это Вы его так особенно интерпретировали? И да, без внятного ответа на ВСЕ остальные вопросы - тут помоще6й не бываить .. так шта .. выкладывайте "что пробовали", "как оно не получилось" и т.д. или "в армию" .. :)

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

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

igorcds
Offline
Зарегистрирован: 03.12.2013

Всем привет.
В этой теме, в самом начале вроде озвучена сама идея как завести три таймера на независимое
Включение трех устройств. Это все работает и по сей день. Проблем нет. Там даже скетч есть. Так что копайте в эту сторону.
Простейший пример вроде и есть.

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

А ежели в ардуине только три таймера и один из них уже заведен - его сначала развести надо?

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

Вопрос в том как ? И возможно ли это или все же делать на трех Ардуинах?

Green
Offline
Зарегистрирован: 01.10.2015

Нет, на трёх мало. Лучше на шести. Тиристоров же шесть!

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

Либо по теме либо засунся от куда вылез.

Green
Offline
Зарегистрирован: 01.10.2015

Да, да. Тебя забыл спросить что мне делать.))) Писать без ошибок сначала научись. ППЦ!

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

mag155 пишет:
Насчет задания это моя идея. Насчет интерпретировали не когда не был буквоедом. Пробовал создавал функцию которая вызывалась прерыванием в ней определял по какому входу прерывания ждал и давал импульс ждал с помощью делей . Пробовал в функции поднимать флаг а в лупе ждал с помощью миллис и давал импульс. Лучше всего работает первый вариант но в месте где задержка по первому импульсу превышает время прихода второго импульсы начинаю пропадать .

Вы сознательно тупите и ожидаете тролления в свой адрес?!? Я же чистым русским текстом, черным по белому накатал: излагайте что делали .. хде?!? Примеры чего делали: схема, скетчи, варианты, результаты .. "умучился" он панимаишь ли.. ты не начинал даже!

nik182
Offline
Зарегистрирован: 04.05.2015

Aрдуина не догма. Если не использовать delay & millis, то можно использовать все три таймера.

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

Самое рабочее было вот так 

volatile int Dimmer;
 


void setup() {
  Serial.begin(9600);
 pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
attachInterrupt(0, blink, RISING);

}

void blink()
{
if(digitalRead(6)==HIGH)
 {
delayMicroseconds(Dimmer);
 digitalWrite(8,HIGH);
 }
else {
 digitalWrite(8,LOW);
 }
if(digitalRead(4)==HIGH)
 {
delayMicroseconds(Dimmer);
 digitalWrite(9,HIGH);
 }
else {
 digitalWrite(9,LOW);
 }
if(digitalRead(5)==HIGH)
 {
delayMicroseconds(Dimmer);
 digitalWrite(10,HIGH);
 }
else {
 digitalWrite(10,LOW);
 }

}

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

}

 

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

Но как только время задержки превышает по времени прихода следующей фазы все часть импульсов пропадают .

 

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

Потом делал вот так 



void blink()

 поднимал флаг по прерыванию а влупе 

unsigned long currentMillis = micros();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
if ( flag == 1){
digitalWrite(8,1);
}
else {
digitalWrite(8,0);
digitalWrite(ledPin, ledState);
}
}

}

 

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

Начало импульсов не смещалось при изминении интервала ?

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

?!? Этта .. чё? Попробуйте самостоятельно откомментировать каждую строчку кода что она по-вашему тут делает? Оч. любопытна. :)

mag155
Offline
Зарегистрирован: 21.12.2017
void blink()  //Обработчик прерывания 
15
{
16
if(digitalRead(6)==HIGH)// Проверяем по какому входу прошло прерывания тк обработчик срабатывает на все три 
17
 {
18
delayMicroseconds(Dimmer);// Ждем интервал 
19
 digitalWrite(8,HIGH);//Даем импульс 
20
 }
21
else {
22
 digitalWrite(8,LOW);// и так по всем трем 
23
 }
24
if(digitalRead(4)==HIGH)
25
 {
26
delayMicroseconds(Dimmer);
27
 digitalWrite(9,HIGH);
28
 }
29
else {
30
 digitalWrite(9,LOW);
31
 }
32
if(digitalRead(5)==HIGH)
33
 {
34
delayMicroseconds(Dimmer);
35
 digitalWrite(10,HIGH);
36
 }
37
else {
38
 digitalWrite(10,LOW);
39
 }
40
 
41
}
42
 
43
void loop() {
44
Dimmer = map(analogRead(0), 0, 1023, 6000, 0);
45
 
46
}

 

mag155
Offline
Зарегистрирован: 21.12.2017
unsigned long currentMillis = micros();
02
if(currentMillis - previousMillis > interval) {// если прошел интервал 
03
previousMillis = currentMillis;
04
if ( flag == 1){// если флаг поднят 
05
digitalWrite(8,1);// Даем  импульс
06
}
07
else {
08
digitalWrite(8,0);
09
digitalWrite(ledPin, ledState);
10
}
11
}
12
 

 

andryn
Offline
Зарегистрирован: 08.06.2018

 

mag155 пишет:
Есть три фазы сети, есть 6 тиристора на которые нужно выдавать управляющие импульсы.

Это вроде понятно.

mag155 пишет:
Есть три синхроимпульса от пересечения каждой из фаз.

Это непонятно совсем. Пересечения чего с чем?

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

Подождать и что сделать?

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

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

 

nik182
Offline
Зарегистрирован: 04.05.2015

Используя delay невозможно решить данную задачу. Используйте таймеры и их прерывания для генерации импульсов. Используйте возможности процессора а не ардуины. Если не знаете как , учитесь. Задача сложная. То что вы привели в качестве примеров детский лепет. Эту задачу можно решить только при прямом управлении регистрами процессора.

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

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

Ну хоть ссылку скиньте где почитать ??

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

Или примерчик какой ? Для старта так сказать.

nik182
Offline
Зарегистрирован: 04.05.2015
nik182
Offline
Зарегистрирован: 04.05.2015

Вы писали что частота меняется. Скажите как в силовой сети это может произойти?

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

В силовой сети частота не идеальна 50 герц. И если прийдется подключать через генератор допусть в поле там тоже плюс минус пару герц .

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

Тоесть вы считаете что такую задачу можно решить только на с++ непосредственно ?

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

И типа так 

StartTimer1()

не спасет?

nik182
Offline
Зарегистрирован: 04.05.2015

Нет с++ это лишнее. Как раз наоборот. Чем меньше лишнего кода тем лучше. В идеале ассемблер, но и чистый си вполне пойдёт. Читайте уроки.

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

это для меня пока оч сложно . На языке ардуино не как ???

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

Я же просил откомментировать каждую строчку этого чудо-кода .. не хотите или не знаете? Все-таки откомментируйте, может Вам самому станет понятно что flag у вас НЕ устанавливается НИГДЕ в приведенном куске непойми чего, зато ПРОВЕРЯЕТСЯ с какого-то перепугу. А ещё заметьте что ПОКА ИДЕТ прерывание (исполняется код в обработчике), то прерывания (все остальные) - ЗАКРЫТЫ, и соответственно устанавливая Dimmer Вы регулируете в общем-то время запрещенного прерывания до .. 6мсек.

Вообще-то 50Гц это период в 20мсек. 1/2 периода = 10мсек. Три фазы имеют сдвиг 120* или 1/3 периода или .. 6.67мсек. То есть, вроде как успевают ваши задержки, но что называется "на пределе".

Кстати, а хде ваша схема "диодного ИЛИ" которая подает три сигнала на один вход прерывания?

И ещё конструкции типа: if( мойПин ){ нечтоПоднять() }else{ этожеНечтоОпустить() } работают точно как Вы ожидали?

Пример:

1. приходит прерывание по фазеА (первый блок): "да" - сначала ждем Диммер, и только ПОТОМ поднимаем пинДляА, и только потом убеждаемся что пинДляВ и пинДляС надо сбюросить.

2. приходит прерывание по фазеС (последний блок): фигвам, пинДляА сбрасываем СРАЗУ, снова фигвам и пинДляВ сбрасываем практически следом, "да" - только теперь ЖДЕМ ваш Диммер и потом поднимаем пинДляС

Ощущаете "что-то не так в датском королевстве" и как несинхронно работает этот код, в зависимости от фазы? (А ведь просил откомментарить каждую строчку)

andryn
Offline
Зарегистрирован: 08.06.2018

Посмотрев на схему и учитывая написнное ранее:

mag155 пишет:
 Все три импульса подключены на вход прерывания через диодное или 

Напрашивается вывод, что за 1 перид фазы (A) на один вход ардуины приходит 6 импульсов c одинаковой переодичностью. 

Или всетаки задействованы 3 входа?

Опять какая-то угадайка...

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

В обработчике флаг поднимается просто не стал писать решил и так понятно. Вы имеете в виду ждем поднимаем влаг а только потом луп ?

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

Давайте закончим разбор чуда из поста №64, вопросы к которому и пример его работы содержится в посте №84. Перечитайте пост №84 вдумчиво и от Вас требуется:

а) схема вашего "диодного ИЛИ";

б) вдумчивый ответ на пример работы и/или КАК оно должно нормально работать .. что Вы хотели получить от этого кода.

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

Диодное или три импульса с каждой фазы приходят каждая на анод своего диода диодов три катоды диодов соединены вместе и через резистор притянуты на землю . С катодов диодов подключен вход прирывания а с анодов подключены три цифровых входа . Получается что любая из фаз вызывает прирывания а по трем цифровым входам нужно определять какая именно из фаз вызвала прерывания и давать импульс на свой выход.

int ledPin =  8; 
int ledState = LOW;
int flag =0;
long previousMillis = 0;    
 long interval = 2000;  
void setup() {
 
 pinMode(ledPin, OUTPUT); 
attachInterrupt(0, blink,RISING);
}

void blink(){
if(digitalRead(6)==HIGH){
flag = 1;
}
else {
flag = 0;
}
}
void loop() {
unsigned long currentMillis = micros();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
if ( flag == 1){
 digitalWrite(8,1);
}
else {
 digitalWrite(8,0);
}

Вот пробовал еще так ?

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

Это для одного канала .

andryn
Offline
Зарегистрирован: 08.06.2018

mag155 пишет:

Диодное или три импульса с каждой фазы приходят каждая на анод своего диода диодов три катоды диодов соединены вместе и через резистор притянуты на землю . С катодов диодов подключен вход прирывания а с анодов подключены три цифровых входа . Получается что любая из фаз вызывает прирывания а по трем цифровым входам нужно определять какая именно из фаз вызвала прерывания и давать импульс на свой выход.

Становится все понятнее и понятнее. 

 

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

Да он с трех Zero-Cross-ов сигналы посадил на три разных пина и эти же сигналы через диоды завел на пин с внешним прерыванием. В обработчике проверяет, какой из пинов активный (т.е. кто вызывал прерывание), а потом начинает фигней страдать - вместо того, чтобы начинать отсчитывать от этого момента, зачем-то проверяет по флагу раз в 2мс было ли прерывание и пульсирует в выход. фунции местами переставляет туда-сюда, как будто от этого что-то поменяется.

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

Каким образом в обработчике прерывания время расчитывать? Там миллис не работает.

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

Отсчитывать.

andryn
Offline
Зарегистрирован: 08.06.2018

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

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

mag155 пишет:
Каким образом в обработчике прерывания время расчитывать? Там миллис не работает.

в прерывании старт, а отсчет в лупе

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

Опускается сразу как только по входу LOW. Не совсем пойму миллис считает постоянно то есть получается что все что после него будет происходить с указанным интервалом циклично. А надо если флаг 1 то посчитали включили отключили. То есть условие надо до него ? Подскажите как правильно этот момент написать ?

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

mag155 пишет:
Опускается сразу как только по входу LOW. Не совсем пойму миллис считает постоянно то есть получается что все что после него будет происходить с указанным интервалом циклично. А надо если флаг 1 то посчитали включили отключили.

После того как "посчитали - включили - отключили" -  надо сбросить флаг в ноль. И ничего циклично происходить не будет, пока флаг снова не поднимется. И что тут сложного?

Опять в трех соснах заблудились. Который раз повторяю - не ваше это. У вас логического мыгшления в принципе нет.

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

А 17. Строка это что по вашему ?

andryn
Offline
Зарегистрирован: 08.06.2018

mag155 пишет:
Опускается сразу как только по входу LOW.

Вот примернаяя диаграмма для входов.

Можете, хотя бы для себя, нарисовать как должна выглядеть диаграмма выходов? В графике у вас лучше получается, чем в словах.

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

mag155 пишет:
Каким образом в обработчике прерывания время расчитывать? Там миллис не работает.

Вот вам пример начала счета задержки из обработчика. Но в нем есть пара неприкрытых дырок, связанных с обработкой прерываний и изменяемыми в нем переменными, которые придется найти. И, конечно, как вам уже написали, задержки для вашей задачи делаются иначе. Я с высоким электричеством не работаю, но тем, кто написал про таймеры - доверяю.

#define ZC_PIN_01            (6)
#define LED_PIN_01           (8)
#define WAIT_US              (2000)
#define NO_ACTIVE_PIN        (-1)

volatile int8_t activePin = NO_ACTIVE_PIN;
volatile uint32_t startTime = 0;

void zcHandler() {
  if (LOW == digitalRead(ZC_PIN_01)) {
    startTime = micros();
    activePin = LED_PIN_01;
  }
}

void setup() {
  pinMode(ZC_PIN_01, INPUT_PULLUP);
  pinMode(LED_PIN_01, OUTPUT);
  digitalWrite(LED_PIN_01, LOW);

  attachInterrupt(0, zcHandler, RISING);

  while (true) {
    if (0 > activePin) continue;
    if (WAIT_US < micros() - startTime) {
      digitalWrite(activePin, HIGH);
      digitalWrite(activePin, LOW);
      activePin = NO_ACTIVE_PIN;
    }
  }
}

void loop() {
}