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

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

Зачем в 4 строке -1 ?

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

Посмотрите на строку 24, подумайте.

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

А в 10 если LOW ? Прокоментируйте код если не трудно. И что таймер микрос можно запускать по команде ? Читал что он считает пока не переполнится ?

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

Какой таймер микрос? Где вы этой белиберды начитались?

И давайте вы сами попробуете прокомментировать код. А то потом начнете выклянчивать дописывание всех своих входов. 

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

За попробую но учтите три месяца как занимаюсь ардуино так что не ржать.

mag155
Offline
Зарегистрирован: 21.12.2017
#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)) {// вот это не пойму если вход равен LOW ??
    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) {// если прошло 2000 
      digitalWrite(activePin, HIGH);// вкл 
      digitalWrite(activePin, LOW);//выкл 
      activePin = NO_ACTIVE_PIN;
    }

  }

}

 
void loop() {

}
 

 

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

Вы наверно имели в виду 22 строку если 0 больше?

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

Ну поставьте HIGH, если LOW не нравится. В остальной логике, как я понимаю, вы разобрались.

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

Да благодарю буду тестить отпишусь.

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

Проблема такого подхода к написанию диммера в вопросе - адальше что? Вы ж захотите им управлять. Кнопочки нажимать, к компу подключать. Вот с этого места и начнуться нерешаемые проблемы - любое действие будет приводить к катострофическому изменению углов регулирования. В теме про диммер на attiny85 всё разжовано. Возьмите три таких и будет вам счастье. Они по 3 фазам отлично будут в параллель работать и даже управляться с одной вашей ардуины. 

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

Осцилограф для этого имеется и опыт коекакой загвоздка только в таймере. Я вам больше скажу этот проект в будущем будет поддерживать момент на валу и тормозить рекупирацией. А про три ардуино тоже думал но как то это не красиво.

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

На ардуине не получится.Надо на stm32 переходить. Там даже таймер есть специально по это заточенный. Один на 6 выходов со всеми необходимыми задержками и запретами. 

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

В будущем я буду летать в красной майке с буквой "S" вокруг планеты и тормозить ее.

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

Смотрел что ее можно шить через ардуино идее .

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

Прикольно наверное будите смотрется.

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

mag155 пишет:

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

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);

}

 

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

volatile int Dimmer;
uint32_t time_F1;
uint32_t time_F2;
uint32_t time_F3;
bool flag_F1 = 0;
bool flag_F2 = 0;
bool flag_F3 = 0;

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

void blink()
{
  if (digitalRead(6) == HIGH)   {
    flag_F1 = 1;
    time_F1 = millis();
    digitalWrite(8, LOW);
  }
  else if (digitalRead(4) == HIGH)   {
    flag_F2 = 1;
    time_F2 = millis();
    digitalWrite(9, LOW);
  }
  else if (digitalRead(5) == HIGH)   {
    flag_F3 = 1;
    time_F3 = millis();
    digitalWrite(10, LOW);
  }
}

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

  if (flag_F1 && millis() - time_F1 >= Dimmer) {
    flag_F1 = 0;
    digitalWrite(8, HIGH);
  }

  if (flag_F2 && millis() - time_F2 >= Dimmer) {
    flag_F2 = 0;
    digitalWrite(9, HIGH);
  }

  if (flag_F3 && millis() - time_F3 >= Dimmer) {
    flag_F3 = 0;
    digitalWrite(10, HIGH);
  }

}

 

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

Получается что Выключать будем по прерыванию а включено будет между прерываниями. А надо включать по прерыванию а выключать через примерно 100 милисикунд. За код благодарю в понедельник испытаю если что допилю .

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
Ну за основу я взял пример из Вашего (почти работающего ) кода
void blink()
 {
  if(digitalRead(6)==HIGH)
 {
 delayMicroseconds(Dimmer); //здесь задержка
 digitalWrite(8,HIGH);  // А после задержки включение
 }

 

 
Ну если надо наоборот тогда так
volatile int Dimmer;
uint32_t time_F1;
uint32_t time_F2;
uint32_t time_F3;
bool flag_F1 = 0;
bool flag_F2 = 0;
bool flag_F3 = 0;

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

void blink()
{
  if (digitalRead(6) == HIGH)   {
    flag_F1 = 1;
    time_F1 = millis();
    digitalWrite(8, HIGH);
  }
  else if (digitalRead(4) == HIGH)   {
    flag_F2 = 1;
    time_F2 = millis();
    digitalWrite(9, HIGH);
  }
  else if (digitalRead(5) == HIGH)   {
    flag_F3 = 1;
    time_F3 = millis();
    digitalWrite(10, HIGH);
  }
}

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

  if (flag_F1 && millis() - time_F1 >= Dimmer) {
    flag_F1 = 0;
    digitalWrite(8, LOW);
  }

  if (flag_F2 && millis() - time_F2 >= Dimmer) {
    flag_F2 = 0;
    digitalWrite(9, LOW);
  }

  if (flag_F3 && millis() - time_F3 >= Dimmer) {
    flag_F3 = 0;
    digitalWrite(10, LOW);
  }

}

 

 

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

Что то вы немного напутали так будет идти импульс сразу по прерыванию без задержки. Задержка будет при отключении . Думаю лучше вынести включение и отключение из прерывания и делать это в лупе а в прерывания только флаг подымать.?

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

mag155 пишет:
А надо включать по прерыванию а выключать через примерно 100 милисикунд..

А как это понять?

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

Нужны импульсы длиной минимум 100 микросекунд. А то если будут короче то тиристора не успеет открыться.

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

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

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

Хотелосьбы уточнить, вот Вы пишете (Нужно так : прерывание, определяем по какому входу ждем и даем импульс длиной 100 микросекунд.) Слово ждем подразумевает даные с резистора? А импульс 100 микросекунд или 100 милисекунд, как Вы указали в посте #117

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

Да ждем это данные с резистора. Можно просто включать а потом выключать но тогда импульс будет слишком длинным. В идиале так : по прерыванию ждем (данные с резистора) потом включаем, ждем 100 микросекунд (фиксированное значение ) и включаем.

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

То есть слишком коротким.

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

Выключаем в смысле . С телефона пишу.

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

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

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

Все в микросекундах. По этому нужно не миллис а микрос.

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

Пробуйте

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() {
  Serial.begin(9600);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(4, INPUT);
  pinMode(5, INPUT);
  pinMode(6, INPUT);
  attachInterrupt(0, blink, RISING);
}

void blink()
{
  if (digitalRead(6) == HIGH)   {
    flag_F1on = 1;
    time_F1 = micros();
  }
  else if (digitalRead(4) == HIGH)   {
    flag_F2on = 1;
    time_F2 = micros();
  }
  else if (digitalRead(5) == HIGH)   {
    flag_F3on = 1;
    time_F3 = micros();
  }
}

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

  if (flag_F1on && micros() - time_F1 >= Dimmer) {
    time_F1 = micros();
    flag_F1on = 0;
    flag_F1oF = 1;
    digitalWrite(8, HIGH);
  }
  if(flag_F1oF && micros() -time_F1 >= 100){
    digitalWrite(8, LOW);
    flag_F1oF = 0;
  }

  if (flag_F2on && micros() - time_F2 >= Dimmer) {
    time_F2 = micros();
    flag_F2on = 0;
    flag_F2oF = 1;
    digitalWrite(9, HIGH);
  }
  if(flag_F2oF && micros() -time_F2 >= 100){
    digitalWrite(9, LOW);
    flag_F2oF = 0;
  }

  if (flag_F3on && micros() - time_F3 >= Dimmer) {
    time_F3 = micros();
    flag_F3on = 0;
    flag_F3oF =1;
    digitalWrite(10, HIGH);
  }
  if(flag_F3oF && micros() -time_F3 >= 100){
    digitalWrite(10, LOW);
    flag_F3oF = 0;
  }

}

 

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

Ого все на таймерах. Признаюсь приятно удивлен, что вы
Вот так просто потратили свое время. Побольше бы таких на форуме, а то только умничать только могут. В понедельник проверю.

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

Вот только не пойму где вы в лупе проверяете что флаг поднят ?

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

В смысле почему не так : if (flag_F1on ==1 && micros() - time_F1 >= Dimmer) { ?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

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

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

mag155 пишет:
В смысле почему не так : if (flag_F1on ==1 && micros() - time_F1 >= Dimmer) { ?

Если немножко глубже вникните в програмирование то увидите что

if (flag_F1on) Равносильно if (flag_F1on == 1)

 if (!flag_F1on) Равносильно if (flag_F1on == 0) 

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

То есть если с отрицанием значит снят ? Если просто флаг это значит весит.Я понял.Еще прикольно вы типы переменных обозначили как по мне это круче чем писать типа: unsigned long,. А для работы контроллера разница есть ?

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

Это не программирование, это - булева алгебра.

А, учитывая, что в С/С++ слабая типизация и нет различия между целым и булевым типами, следует знать, что "ложь" - это 0, а "истина" - это все кроме 0.

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

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

То есть если бы это была к примеру кнопка можно было просто написать имя переменной кнопки и это было бы верно. А со знаком отрицания лож.?

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

Что такое "переменная кнопки"? Что она должна отражать?

Номер пина? Формально - можно, но вряд ли это будет иметь физический смысл.

Состояние нажата/не нажата - не только можно, но именно этим и следует пользоваться. Если кнопка нажата - "истина", а не нажата - "ложь", то, естественно, со знаком отрицания будет наоборот (нажата - "ложь", не наждата - "истина"). Справедливо и обратное утверждение.

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

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

Вот примерно с тем же успехом можно программировать и логику программы, не зная, что такое "истина", "ложь", конъюнкция, дизъюнкция, отрицание...

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

Благодарю за пояснение.! Буду вникать.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
Еще хотелбы обратить Ваше внимание на самое узкое место в Вашей прграмме. Это функция 
Dimmer = map(analogRead(0), 0, 1023, 6000, 0);
В связи с тем что все вычисления ведутся на (micros()) Функция analogRead(0) очень медленная. Время ее выполнения больше 100 микросекунд а она вызывается при каждом проходе void loop() . Это значит что о точности выполнения программы речи НЕТ.
Решения: 
1- Отказаться от функции и управлять напрямую, там время в районе 20 mks (На мой взгля Вам рано)
2- Вынести функцию в void setup() и при каждом изменении сопротивления перезапускать программу.
3- Делать замер не в каждом проходе а например 1 раз в секунду, тогда хоть и будет неточность но 1 раз в сек.
mag155
Offline
Зарегистрирован: 21.12.2017

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

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

Тогда вариант №1

Вот очень полезная ссылка изучайте http://arduino.ru/forum/programmirovanie/atsp-cherez-registry#comment-172270

http://narodstream.ru/avr-urok-22-izuchaem-acp-chast-1/

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

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

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

Вообще данная задумка планировалось либо на двух мк. Один раздает импульсы а второй все остальное. Либо использовать более быструю ардуино DUE .?

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

Вот еще одно интересное высказывание о скорости

Подключив микропроцессорную плату к осцилографу, и написав цикл digitalWrite(HIGH), и ниже digitalWrite(LOW), на осцилографе обнаружил довольно унылый меандр с частотой 50Гц. Это кошмар. Это крах, подумал я, на фоне требуемых 1Мгц.
Далее, через осцилограф, я изучил еще несколько скоростей выполнения:
AnalogRead() — скорость выполнения 110 мкс.
AnalogWrite() — 2000 мкс
SerialPrintLn() — при скорости 9600 около 250мкс, а при максимальной скорости около 3мкс.
DigitalWrite() — 1800мкс
DigitalRead() — 1900мкс
 
vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Так что да для Вашей задачи толь битовые операции!!!

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

Это радует.

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

А где почитать про орфографию. ?

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

Смотрите чтобы не заморачиваться с битами нужно скачать и установить библиотеку  CyberLib, там теже операции с битами только проще для написаня и понимания. АЦП - придется писать ручками!

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

Прошу прощения там в библиотеке есть и АЦП.

Сейчас я Вам накидаю скетч с использованием библиотеки по идее все должно работать