Removed pc.printf command that sends empty string once per second and associated timer_4, since the operator program was changed, a new operator Loc () was introduced into it. Instead of pc.printf ("Reset ALARM \ r \ n") now plotter.printf ("Reset ALARM \ r \ n").

Dependencies:   _24LCXXX

Revision:
6:fe0a7180ebb7
Parent:
5:bb595cde0c82
Child:
7:97881cd71b31
--- a/main.cpp	Thu Jun 04 22:55:40 2020 +0000
+++ b/main.cpp	Thu Jun 11 20:22:11 2020 +0000
@@ -1,4 +1,9 @@
-// 05.06.2020 Продолжение (клон )mbed-os5-press6
+// 11.06.2020 Продолжение (клон )mbed-os5-press9
+// Сделан дополнительный блок в парсере для декодирования приходящих аварийных уставок для EEPROM
+// Сделан timer_2 для отсчёта времени открытого состояния вентиля 1
+// Сделан timer_3 для отсчёта времени открытого состояния вентиля 2
+// Подключены цифровые входы D11,D12,D13. Реализованы условия остановки по 10 аварийным событиям.
+// Реализован  сброс события (event_N = 255) через кнопку Стоп в программе оператора 
 // Принимается флаг от кнопки Стоп - полной остановки регулятора - закрытие всех 4-х клапанов и передача статуса кнопки в программу оператора
 // Принимается флаг от кнопок включения - выключения компрессора, - идет команда на дискретный выход digital_6(PB_10)
 // Принимается новая уставка num_chan - переключение номера  активного измерительного канала для обратной связи регулятора. 
@@ -21,24 +26,39 @@
 AnalogIn analog_value_3(A3);                                                      //подключение аналогового входа A3
 AnalogIn analog_value_4(A4);                                                      //подключение аналогового входа A4
 AnalogIn analog_value_5(A5);                                                      //подключение аналогового входа A5
-DigitalOut led(LED1);
+//DigitalOut led(LED1);
 DigitalOut digital_4(PB_5);                                                     //initialize digital pin 4 as an output (high pressure air bulb charge).
 DigitalOut digital_7(PA_8);                                                     //initialize digital pin 7 as an output. (high pressure air bulb discharge)
 DigitalOut digital_5(PB_4);                                                     //initialize digital pin 5 as an output (valve3,4)
 DigitalOut digital_6(PB_10);                                                    //initialize digital pin 6 as an output (compressor on/off)
+DigitalIn idigital_11(PA_7);                                                     //initialize digital pin 11 as an input концевик при растяжении сильфона
+DigitalIn idigital_12(PA_6);                                                     //initialize digital pin 12 as an input концевик при сжатии сильфона
+DigitalIn idigital_13(PA_5);                                                     //initialize digital pin 12 as an input внутрь опрессовщика попала вода 
 
 RawSerial plotter(USBTX, USBRX, 115200);                                        // tx, rx for F411RE    port for serial_plotter and temporary messages
 RawSerial pc(PA_9, PA_10, 115200);                                              // tx, rx for F411RE     port  for  command string distance PC
 EventQueue *queue = mbed_event_queue();                                         //инициализация очереди событий RTOS mbed5
-Timer timer;                                                                    //инициализация таймера
-//========УСТАВКИ========
+Timer timer;                                                                    //инициализация таймера для определения частот переключений вентилей 1 и 2
+Timer timer_2;                                                                  //инициализация таймера 2 для отсчёта времени открытого состояния вентиля 1
+Timer timer_3;                                                                  //инициализация таймера 3 для отсчёта времени открытого состояния вентиля 2
+//========УСТАВКИ_1 EEPROM========
 uint8_t delta_value = 0;                                                        //set delta pressure 1...99
-uint8_t flag_autoset = 0;                                                       //флаг компрессора. При 0 - выключение компрессора, при 1 - включение компрессора
-uint8_t flag_plotter = 0;                                                       //Stop- флаг . При 0 - разрешение работы регулятора, при 1 - запрет и запиране всех клапанов
+uint8_t flag_compressor = 0;                                                    //флаг компрессора. При 0 - выключение компрессора, при 1 - включение компрессора
+uint8_t flag_stopRegulator = 0;                                                 //Stop- флаг . При 0 - разрешение работы регулятора, при 1 - запрет и запиране всех клапанов
 uint8_t num_chan = 1;                                                           //set номер аналогового канала 0...5 (1-as default = Pa)
 int value = 0;                                                                  //set begin value "pressure"   1...3300
-
-//=======================
+//========УСТАВКИ_2 EEPROM========
+int Pd_eeprom = 2000;                                                           // mV,  максимальное дифференциальное давление (беззнаковое)
+int frequencyValve1_eeprom = 5;                                                 // Гц, максимальная частота переключений клапана 1 
+int frequencyValve2_eeprom = 5;                                                 // Гц, максимальная частота переключений клапана 2 
+int WL01_eeprom = 10;                                                           // mV, минимальный вес опрессовщика
+int WL99_eeprom = 2000;                                                         // mV, максимальный вес опрессовщика
+int T_1 = 4000;                                                                 // ms, максимальное время открытого состояния для клапана 1 
+int T_2 = 4000;                                                                 // ms, максимальное время открытого состояния для клапана 2 
+uint8_t event_N = 255;                                                          // номер события , по умолчанию 255 - событий нет
+//======temporary set=====
+int numSet, anySet;
+//=================================
 int value_auto=250 ;                                                            //set begin value auto "pressure"
 int WL = 0;                                                                     //напряжение с аналогового входа А0 (WL - вес опресовщика)
 int sensor_value =0;                                                            //напряжение с аналогового входа А1 (Pa - текущее давление)
@@ -49,6 +69,7 @@
 int counter_cycle1 = 0;                                                         //счётчик цикла while(true)
 int counter_cycle2 = 0;                                                         //счётчик внутри функции auto_set
 int sig = 1;                                                                    //знак инкримента для автоустаки
+
 //                       FIFO_buffer must be full (only char  and '\0') 
 //#define maxnsym 26                                                             // maximum nbr of symbols FIFO_buffer (вариант без символов окончания)
 #define maxnsym 28                                     // maximum nbr of symbols FIFO_buffer +CR+LF (символы окончания должны быть включены на передаче)
@@ -56,18 +77,21 @@
                                                       //уставки и контрольная сумма умноженная на два, должны быть больше нуля  
 char trueSource[maxnsym];                             //верифицированная строка для callback
 char trueSourceOld[maxnsym];                          //предыдущая верифицированная строка для callback
+char trueSource2[maxnsym];                             //верифицированная строка для callback
+char trueSource2Old[maxnsym];                          //предыдущая верифицированная строка для callback
 
 volatile char chr_a;                                        //в прерываниях переменные должны быть защищены  при помощи volatile от оптимизации компилятором
 volatile bool flag_comand_detected = false;                 //если строка декодирована правильно то true
+volatile bool flag_comand2_detected = false;                //если строка в блоке парсинга уставок eeprom декодирована правильно то true
 volatile bool flag_zerostart = false;                       //если строка декодирована c нулевой контрольной суммой то true
-volatile bool flag_stopRegulator = true;                    //флаг остановки , закрыть все клапана 
+//volatile bool flag_stopRegulator = true;                    //флаг остановки , закрыть все клапана 
 //_____________________________________________________________________________
 void save_EEPROM () {
     int data2;
     plotter.printf("EEPROM write------\r\n");    
     eeprom.byte_write(0, delta_value);
-    eeprom.byte_write(1, flag_autoset);
-    eeprom.byte_write(2, flag_plotter);
+    eeprom.byte_write(1, flag_compressor);
+    eeprom.byte_write(2, flag_stopRegulator);
     eeprom.byte_write(3, num_chan);
     data2 = value;
     eeprom.nbyte_write( 10, &data2, sizeof(int));
@@ -82,10 +106,10 @@
     delta_value=data1;
     eeprom.nbyte_read( 1, &data1, 1 );
     plotter.printf("adress 1  =%d \r\n",data1);
-    flag_autoset=data1;
+    flag_compressor=data1;
     eeprom.nbyte_read( 2, &data1, 1 );
     plotter.printf("adress 2  =%d \r\n",data1);
-    flag_plotter=data1;
+    flag_stopRegulator=data1;
     eeprom.nbyte_read( 3, &data1, 1 );
     plotter.printf("adress 3  =%d \r\n",data1);
     num_chan=data1;
@@ -113,7 +137,9 @@
   char Destination[50];
   int pos,len;
   int controlSum1, controlSum2;
-  int value_, delta_value_, flag_autoset_, flag_plotter_, num_chan_;
+  int value_, delta_value_, flag_compressor_, flag_stopRegulator_, num_chan_;
+  int controlSumSet1, controlSumSet2;
+  int numSet_, anySet_;
   int ch = '$';    // Код искомого символа
   int indexCh;       // Char on position
   char *ach;       // Указатель на искомую переменную в строке, по которой осуществляется поиск.
@@ -148,7 +174,7 @@
     
     if (strcmp(Destination,"$press" ) != 0) {                                   //функция возвращает ноль если строки совпадают
       //pc.printf("wrong Destination=%s\r\n",Destination);                         //печать "неправильной" нулевой строки 
-      goto endParsing ;                                                         //в начале сообщения нет $press пропускаем парсинг
+      goto eepromSet ;                                                         //в начале сообщения нет $press , переход с следующему блоку приёма
     }
     pos=8;  //начало подстроки 1000 - на 8 позиции
     len=4;   //длина подстроки 1000 равна 4
@@ -171,13 +197,13 @@
     pos=16;  //начало подстроки 0 - на 16 позиции
     len=1;   //длина подстроки 0 равна 1
     substring(Source,Destination,pos,len);
-    flag_autoset_=atoi(Destination);
-    //pc.printf("for pos=%d and  len=%d  resultat is  d= %s atoi=%d\r\n", pos, len, Destination, flag_autoset_);
+    flag_compressor_=atoi(Destination);
+    //pc.printf("for pos=%d and  len=%d  resultat is  d= %s atoi=%d\r\n", pos, len, Destination, flag_compressor_);
     pos=18;  //начало подстроки 0 - на 18 позиции
     len=1;   //длина подстроки 0 равна 1
     substring(Source,Destination,pos,len);
-    flag_plotter_=atoi(Destination);
-    //pc.printf("for pos=%d and  len=%d  resultat is  d= %s atoi=%d\r\n", pos, len, Destination, flag_plotter_);
+    flag_stopRegulator_=atoi(Destination);
+    //pc.printf("for pos=%d and  len=%d  resultat is  d= %s atoi=%d\r\n", pos, len, Destination, flag_stopRegulator_);
     
     pos=20;  //начало подстроки 1 - на 20 позиции
     len=1;   //длина подстроки 1 равна 1
@@ -191,11 +217,11 @@
     controlSum1=atoi(Destination);
     if (controlSum1==2) {
       flag_zerostart = true;       //индикатор первого пуска удаленной программы на PC без введенных уставок, надо передать текущее состояние на PC
-      flag_autoset=flag_autoset_;  //здесь можно включать-выключать компрессор, но без записи в EEPROM
+      flag_compressor=flag_compressor_;  //здесь можно включать-выключать компрессор, но без записи в EEPROM
       goto endParsing;             //контрольная сумма должна быть больше двух, пропускаем парсинг
     }
     //pc.printf("for pos=%d and  len=%d  resultat is  d= %s atoi=%d\r\n", pos, len, Destination, controlSum1);
-    controlSum2=(value_+delta_value_+flag_autoset_+flag_plotter_+num_chan_)*2;            //удвоение чтобы не было одинаковых чисел в сообщении
+    controlSum2=(value_+delta_value_+flag_compressor_+flag_stopRegulator_+num_chan_)*2;            //удвоение чтобы не было одинаковых чисел в сообщении
     //pc.printf("controlSum1=%d   controlSum2=%d\r\n", controlSum1, controlSum2);
     if (controlSum1!=controlSum2) {                                             //не совпала контрольная сумма
       //pc.printf ("controlSum1!=controlSum2 \r\n");
@@ -203,19 +229,108 @@
     }
     //*********присваиваем проверенные значения глобальным переменным***********
     strcpy(trueSource,Source);                                                  //копировать из Source в trueSource
-    if (value_==0 || delta_value_==0) {                                         //при старте с пустой уставкой не имземняем их в регуляторе и не пишем в EEPROM
-      flag_autoset=flag_autoset_;
-      flag_plotter=flag_plotter_;                                               //для работы кнопки Stop
+    if (value_==0 || delta_value_==0) {                                         //при старте с пустой уставкой не изменяем их в регуляторе и не пишем в EEPROM
+      flag_compressor=flag_compressor_;
+      flag_stopRegulator=flag_stopRegulator_;                                               //для работы кнопки Stop
       } else {
       value=value_;
       delta_value=delta_value_;
-      flag_autoset=flag_autoset_;
-      flag_plotter=flag_plotter_;
+      flag_compressor=flag_compressor_;
+      flag_stopRegulator=flag_stopRegulator_;
       num_chan=num_chan_;  
     }      
     
     flag_comand_detected=true;        //если флаг true, то всем переменным  присвоены новые значения уставок
+ goto endParsing ;                    //завершение блока приема рабочих уставок для работяющего релейного регулятора  
+
+  //========Начало блока приёма аварийных граничных (максимальных) уставок для записи в EEPROM ===================
+ eepromSet:
+    if (strcmp(Destination,"$setup" ) != 0) {                                      //функция возвращает ноль если строки совпадают
+      //pc.printf("wrong Destination=%s\r\n",Destination);                         //печать "неправильной" нулевой строки 
+      goto endParsing ;                                                         //в начале сообщения нет $setup , пропускаем парсинг
+    }
+    pos=8;  //начало подстроки 123 - на 8 позиции
+    len=3;   //длина подстроки 123 равна 3
+    substring(Source,Destination,pos,len);
+    numSet_=atoi(Destination);
+    pos=12;  //начало подстроки 123456 - на 12 позиции
+    len=6;   //длина подстроки 123456 равна 6
+    substring(Source,Destination,pos,len);
+    anySet_ =atoi(Destination);
+    pos=19;  //начало подстроки 1234567 - на 19 позиции
+    len=7;   //длина подстроки 1234567 равна 7
+    substring(Source,Destination,pos,len);
+    controlSumSet1 =atoi(Destination);
+    controlSumSet2=(numSet_+anySet_)*2;
+    if (controlSumSet1!=controlSumSet2) {                                       //не совпала контрольная сумма
+      //pc.printf ("controlSumSet1!=controlSumSet2 \r\n");
+      goto endParsing;                                                          //пропускаем парсинг
+    }
+    //*********присваиваем проверенные значения глобальным переменным***********
+    strcpy(trueSource2,Source);                                                 //копировать из Source в trueSource2
+    if (numSet_==0) {                                                           //при старте с пустым номером не изменяем уставки  и не пишем в EEPROM
+      goto endParsing;                                                          //пропускаем парсинг
+      } else {
+      numSet=numSet_;
+      anySet=anySet_;  
+    }      
     
+    switch ( numSet ) {
+        case 1:            // это двоеточие
+            
+            plotter.printf("1 Valve1=%d\r\n",anySet);
+            break;
+        case 2:
+            plotter.printf("2 Valve2=%d\r\n",anySet);
+            break;
+        case 3:
+            plotter.printf("3 Valve3,4=%d\r\n",anySet);
+            break;
+        case 4:
+            plotter.printf("4 Compressor=%d\r\n",anySet );
+            break;
+        case 10:
+            Pd_eeprom = anySet;
+            plotter.printf( "10 Pd_eeprom=%d\r\n",anySet );
+            break;
+        case 11:
+            frequencyValve1_eeprom = anySet;
+            plotter.printf( "11 frequencyValve1_eeprom=%d\r\n",anySet );
+            break;
+        case 12:
+            frequencyValve2_eeprom = anySet;
+            plotter.printf( "12 frequencyValve2_eeprom=%d\r\n",anySet );
+            break;
+        case 13:
+            WL01_eeprom = anySet;
+            plotter.printf( "13 WL01_eeprom=%d\r\n",anySet );
+            break;
+        case 14:
+            WL99_eeprom = anySet;
+            plotter.printf( "14 WL99_eeprom=%d\r\n",anySet );
+            break;
+        case 18:
+            T_1 = anySet;
+            plotter.printf( "18 T_1=%d\r\n",anySet );
+            break;
+        case 19:
+            T_2 = anySet;
+            plotter.printf( "19 T_2=%d\r\n",anySet );
+            break;                            
+        default:
+            plotter.printf( "Wrong case.\r\n" );
+    } 
+ 
+
+
+
+
+
+
+    
+    flag_comand2_detected=true;        //если флаг true, то всем переменным  присвоены новые значения уставок
+  //========Конец блока приёма аварийных граничных (максимальных) уставок для записи в EEPROM ===================
+ 
  endParsing:   
     
         
@@ -229,7 +344,7 @@
 //______________________________________________________________________________
 void auto_set () {                                                              //подпрограмма управления компрессором
     
-    digital_6.write(flag_autoset);                                              //включение-выкючение компрессора   
+    digital_6.write(flag_compressor);                                              //включение-выкючение компрессора   
  
 }
 //*****************************************************************************
@@ -238,7 +353,7 @@
 int main() {
     
     pc.attach(&onDataReceived, Serial::RxIrq);
-    int time, valve1, valve2, countValve1=0, countValve2=0, temp_valueSensor;
+    int time, time_2, time_3, valve1, valve2, countValve1=0, countValve2=0, temp_valueSensor;
     int frequencyValve1, frequencyValve2;
     float raw_value_sum_0=0, raw_value_sum_1=0, raw_value_sum_2=0, raw_value_sum_3=0, raw_value_sum_4=0, raw_value_sum_5=0;
     digital_4.write(0);                                                         //valve1  off;
@@ -246,7 +361,7 @@
     digital_5.write(0);                                                         //valve3,4  off; 
     digital_6.write(0);                                                         //выключение компрессора
     load_EEPROM ();                                                             //загрузка уставок из EEPROM
-    if (value >= 1 && delta_value >= 1 && flag_autoset < 2 && flag_plotter < 2 && num_chan < 6) {
+    if (value >= 1 && delta_value >= 1 && flag_compressor < 2 && flag_stopRegulator < 2 && num_chan < 6) {
       flag_stopRegulator=false;                                                 //уставки из EEPROM похожи на правду, разрешаем работу регулятора 
     } else {
       flag_stopRegulator = true;                                                //флаг остановки установлен 
@@ -257,13 +372,16 @@
     Watchdog &watchdog = Watchdog::get_instance();
     watchdog.start(100);                         //WDlimit = 100  ms
     timer.start();
+    timer_2.start();
+    timer_3.start();
     
   while (true){                                                                 //бесконечный цикл
     // kick watchdog regularly within provided timeout (сброс собаки в начало счёта)
     watchdog.kick();
     
-    flag_stopRegulator = flag_plotter;                                          //вывод на плоттер не актуален, теперь он будет флагом полной остановки опрессовщика
-    if (flag_stopRegulator) {                                                   //полный останов регулятора и принудительное запирание всех клапанов
+    if (flag_stopRegulator == 1){ event_N = 255;}                               //сброс события через кнопку Стоп в программе оператора 
+    
+    if (flag_stopRegulator == 1 || event_N < 255) {                             //полный останов регулятора и принудительное запирание всех клапанов
       digital_4.write(0);                                                       //valve1  off
       digital_7.write(0);                                                       //valve2  off
       digital_5.write(0);                                                       //valve3,4 off
@@ -271,14 +389,15 @@
     }
     
     if (flag_comand_detected) {                                                 //пришла правильная командная строка
-      pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
-        value,delta_value,flag_autoset,flag_plotter,
+                                                 
+      pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
+        value,delta_value,flag_compressor,flag_stopRegulator,
         sensor_value,frequencyValve1,frequencyValve2,
         WL,Pb,Pw1,Pw2,Pd,
-        digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read());        //передача текущих значений в РС
+        digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read(),event_N,idigital_11.read(),idigital_12.read(),idigital_13.read());        //передача текущих значений в РС
         
     //    pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,*\r\n",
-    //    value,delta_value,flag_autoset,flag_plotter,
+    //    value,delta_value,flag_compressor,flag_stopRegulator,
     //    sensor_value,frequencyValve1,frequencyValve2);                                     //передача текущих значений в РС
         
       //pc.printf("%s\r\n",trueSource);                                         //эхо для отладки канала связи
@@ -295,11 +414,11 @@
     }
     
     if (flag_zerostart) {                                            //пришла командная строка с пустыми уставками (актуально для получения данных на PC при первом запуске)
-      pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
-        value,delta_value,flag_autoset,flag_plotter,
+      pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*\r\n",
+        value,delta_value,flag_compressor,flag_stopRegulator,
         sensor_value,frequencyValve1,frequencyValve2,
         WL,Pb,Pw1,Pw2,Pd,
-        digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read());        //передача текущих значений в РС  
+        digital_4.read(),digital_7.read(),digital_5.read(),digital_6.read(),event_N,idigital_11.read(),idigital_12.read(),idigital_13.read());        //передача текущих значений в РС  
         flag_zerostart = false;
     }   
     
@@ -335,12 +454,13 @@
       raw_value_sum_4 = 0 ;
       //Pd = raw_value_sum_5/20 * 3300;                                           // преобразование в напряжение 0-3300 mV  с усреднением
       //raw_value_sum_5 = 0 ;
+      Pd = abs(sensor_value - Pw1);
       
       if (num_chan == 1) {temp_valueSensor = sensor_value;}                     //теперь источник сигнала для регулятора - канал 1
       if (num_chan == 3) {temp_valueSensor = Pw1;}                              //теперь источник сигнала для регулятора - канал 3
       if (num_chan == 4) {temp_valueSensor = Pw2;}                              //теперь источник сигнала для регулятора - канал 4
       
-      if (flag_stopRegulator == false) {                                        // можно запускать регулятор
+      if (flag_stopRegulator == 0 && event_N == 255) {                          // можно запускать регулятор
         digital_5.write(1);                                                     //valve3,4 открыты - подключаемся к контуру охлаждения макета
         //--------------regulator begin-----------------------
         if (temp_valueSensor > value + delta_value) {
@@ -367,9 +487,57 @@
         countValve1=0;
         countValve2=0;
       }
+      //--------------------==_ALARM_scope_Begin==----------------------
+       if (Pd >= Pd_eeprom) {
+             event_N = 0;
+       }
+       if (frequencyValve1 >= frequencyValve1_eeprom) {
+             event_N = 1;
+       }
+       if (frequencyValve2 >= frequencyValve2_eeprom) {
+             event_N = 2;
+       }
+       if (WL <= WL01_eeprom) {
+             event_N = 3;
+       }
+       if (WL >= WL99_eeprom) {
+             event_N = 4;
+       }
+       if (idigital_11.read()==1) {
+             event_N = 5;
+       }
+       if (idigital_12.read()==1) {
+             event_N = 6;
+       }
+       if (idigital_13.read()==1) {
+             event_N = 7;
+       }
       
-      auto_set();                                                               //включение-выкючение компрессора  через flag_autoset
-      led = !led;                                                               //гасим/зажигаем индикаторный светодиод
+      //-----------------Valve1 open time----------------------
+        if (digital_4.read() == 0) {
+            timer_2.reset(); 
+            time_2 = 0;
+        } else {
+          time_2 = timer_2.read_ms();   
+        }
+        if (time_2 >= T_1) {
+             event_N = 8;
+        }
+     //-----------------Valve2 open time----------------------
+        if (digital_7.read() == 0) {
+            timer_3.reset();
+            time_3 = 0;
+        } else {
+          time_3 = timer_3.read_ms();   
+        }
+        if (time_3 >= T_2) {
+             event_N = 9;
+        }
+      //--------------------==_ALARM_scope_End==----------------------          
+     
+      
+      auto_set();                                                               //включение-выкючение компрессора  через flag_compressor
+      //led = !led;                                                               //гасим/зажигаем индикаторный светодиод
     } 
     ThisThread::sleep_for(1);                                                   // (mc) правильный оператор задержки для mbed5
     counter_cycle1++;