Serial.print и нештатная перезагрузка ARDUINO

AlexBajdin59rus
Offline
Зарегистрирован: 17.12.2019

Здравствуйте! Сможет кто-нибудь объяснить мою проблему? Как влияет вставка команды Serial.print в поведение кода? Весь скетч тут не предоставить, но вот часть, где именно есть проблема:

void loop() {
 while(1)
    {VAR_TCNT3 = pgm_read_word(&ARR_TCNT3[Data_Control.data_dvig.size_step][Data_Control.data_dvig.rpm]);
     VAR_OCR3A = pgm_read_word(&ARR_OCR1A[Data_Control.data_dvig.size_step][Data_Control.data_dvig.rpm][Data_Control.data_dvig.count_imp]);    
     VAR_TCCR3B = pgm_read_byte(&ARR_CS[Data_Control.data_dvig.size_step][Data_Control.data_dvig.rpm]);   // выбор предделителя
// PRINT == 1 раз в секунду в Таймере_2. должен вывести значение DIGIT_FUNC - код нажатой кнопки
     if (PRINT)
        {//Serial.println(String(digit_func));
         PRINT = 0;
        }
     if (change_butt_16 == 1)
       {TCCR2B = 0x00;    
        TIMSK2 = 0x00;
        //Serial.println(String(digit_func));
        switch (Data_Control.data_lcd.mode)
              {case mode_0: switch(digit_func)
                                 {case 1: //Serial.println(String(digit_func));
                                          chang_enable(&Data_Control);
                                          break;    
                                  case 2: chang_mode(&Data_Control);
                                          break;    
                                  case 3: chang_step_size(MINUS, &Data_Control);                                          
                                          break;    
                                  case 4: chang_step_size(PLUS, &Data_Control);                                          
                                          break;    
                                  case 5: timer_or_manual(&Data_Control);        // настройка прокрутки от таймера или вручную
                                          break;
                                  case 6: chang_mode_level(&Data_Control);       // уровни при ручном управлении 010 или 101
                                          break;
                                  case 7: Start_Timer_Motor(&Data_Control);      // включаем работу мотора от таймера
                                          break;
                                  case 8: chang_level(&Data_Control);            // включаем прокрутку мотора вручную
                                          break;
                                  case 14:  //START_MOTOR(&Data_Control);
                                           break;
                                  case 15: // PAUSE MOTOR(&Data_Control);
                                           break;
                                  case 16: // STOP MOTOR(&Data_Control);
                                           break;                   
                                  default: break;
                                 }       
                           update_lcd_mode_0(&Data_Control);
                           break;
//****************************************************************************************************
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!                           
// ПОЧЕМУ-ТО ЗДЕСЬ СТРАННО ЗНАЧЕНИЕ DIGIT_FUNC НУЖНО ИНКРЕМЕНЕТИРОВАТЬ ДЛЯ РАБОТЫ ФУНКЦИЙ РЕЖИМА MODE_2
// НЕ РАБОТАЕТ ФНКЦИЯ STOP_MOTOR
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//****************************************************************************************************
              case mode_1: digit_func++;        
                           //Serial.println(String(digit_func));
                           switch(digit_func)
                              {case 1: chang_enable(&Data_Control);
                                       break;    
                               case 2: chang_mode(&Data_Control);
                                       break;    
                               case 3: //shift_cursor(LEFT, &Data_Control);      // курсор влево
                                       break;    
                               case 4: //shift_cursor(RIGHT, &Data_Control);     // курсор вправо
                                       break;    
                               case 5: chang_step_size(MINUS, &Data_Control);  // Step_Size_--
                                       break;
                               case 6: chang_step_size(PLUS, &Data_Control);   // Step_Size_++

при раскомментировании строки перед SWITCH

        Serial.println(String(digit_func));
        switch (Data_Control.data_lcd.mode)
              {case mode_0: switch(digit_func)

При нажатии на кнопки 1 и 2 клавиатуры 4*4 происходит типа сброса Arduino... Функция:

case 1: chang_enable(&Data_Control);

срабатывает от 3-ей кнопки... Функция:

case 2: chang_mode(&Data_Control);

от 4-ой... При раскомментировании строки Serial.println:

// PRINT == 1 раз в секунду в Таймере_2. должен вывести значение DIGIT_FUNC - код нажатой кнопки
     if (PRINT)
        {//Serial.println(String(digit_func));
         PRINT = 0;
        }

что-то подобное...

КАК ВЛИЯЕТ ВСТАВКА ЭТОЙ КОМАНДЫ НА РАБОТУ ПРОГРАММЫ, ИЗМЕНЕНИЯ ПЕРЕМЕННОЙ DIGIT_FUNC КОДА НАЖАТИЯ КНОПКИ? И ВООБЩЕ ПРИВОДИТ К НЕБОЛЬШОМУ ЗАВИСАНИЮ ARDUINO И ЕГО ПЕРЕЗАГРУЗКЕ. 

AlexBajdin59rus
Offline
Зарегистрирован: 17.12.2019
void loop() {
 while(1)
    {
// PRINT == 1 раз в секунду в Таймере_2. должен вывести значение DIGIT_FUNC - код нажатой кнопки
if (PRINT)
   {//Serial.println(String(digit_func));
    PRINT = 0;
   }
 if (change_butt_16 == 1)
   {TCCR2B = 0x00;    
    TIMSK2 = 0x00;
    Serial.println(String(digit_func));
    switch (Data_Control.data_lcd.mode)
        {case mode_0: switch(digit_func)
                          {case 1: chang_enable(&Data_Control);
                                   break;    
                           case 2: chang_mode(&Data_Control);
                                   break;    
                           case 3: chang_step_size(MINUS, &Data_Control);
                                   break;    
                           case 4: chang_step_size(PLUS, &Data_Control);
                                   break;    
                           case 5: timer_or_manual(&Data_Control);
                                   break;
                           case 6: chang_mode_level(&Data_Control);
                                   break;
                           case 7: Start_Timer_Motor(&Data_Control);
                                   break;
                           case 8: chang_level(&Data_Control);
                                   break;
                           case 14: //START_MOTOR(&Data_Control);
                                    break;
                           case 15: // PAUSE MOTOR(&Data_Control);
                                    break;
                           case 16: // STOP MOTOR(&Data_Control);
                                    break;                   
                           default: break;
                          }
                      update_lcd_mode_0(&Data_Control);
                      break;

Вот так вот без переносов будет...

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

Никак не влияет.

rkit
Offline
Зарегистрирован: 23.11.2016

Какой тип у digit_func ?

AlexBajdin59rus
Offline
Зарегистрирован: 17.12.2019

volatile uint8_t digit_func

В прерывании Таймера digit_func это будет код нажатой кнопки


// ********* Опросс клавы 4*4 ********* 
void Opros_Butt_16(uint8_t *i, uint8_t *j)
{ DDR_BUTT_16 = 0x0F;      // 0-3 выходы, 4-7 входы
  PORT_BUTT_16 = 0xF0;     // на выходах "0", на входах подтяжка к "1"
  delayMicroseconds(10);
  *i=4;
  if ((PIN_BUTT_16 & 0x10)==0x00) *i=0;    //       
  if ((PIN_BUTT_16 & 0x20)==0x00) *i=1;    //
  if ((PIN_BUTT_16 & 0x40)==0x00) *i=2;    //
  if ((PIN_BUTT_16 & 0x80)==0x00) *i=3;    //
  DDR_BUTT_16 = 0xF0;        // 0-3 вход, 4-7 выходы
  PORT_BUTT_16 = 0x0F;    // на выходах "0", на входах подтяжка к "1"
  delayMicroseconds(10);
  *j=4;
  if ((PIN_BUTT_16 & 0x01)==0x00) *j=0;    //
  if ((PIN_BUTT_16 & 0x02)==0x00) *j=1;    //
  if ((PIN_BUTT_16 & 0x04)==0x00) *j=2;    //
  if ((PIN_BUTT_16 & 0x08)==0x00) *j=3;    //    
}

// *********************************************************************
// ********* Опрос клавы 3*4 ********* 
void Opros_Butt_12(uint8_t *i, uint8_t *j)
// ПРОВЕРЬ ПРАВИЛЬНОСТЬ 3*4 или 4*3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
{ DDR_BUTT_12 = 0xF0;      // 0-3 входы, 4-6 выходы, 
  PORT_BUTT_12 = 0x0F;       // на выходах "0", на входах подтяжка к "1"
  delayMicroseconds(10);
  *i = 4;
  if ((PIN_BUTT_12 & 0x01)==0x00) *i = 0;    //
  if ((PIN_BUTT_12 & 0x02)==0x00) *i = 1;    //
  if ((PIN_BUTT_12 & 0x04)==0x00) *i = 2;    //
  if ((PIN_BUTT_12 & 0x08)==0x00) *i = 3;    //
  DDR_BUTT_12 = 0x8F;        // 0-3 выходы, 4-6 входы, 7 - выход
  PORT_BUTT_12 = 0x70;       // на выходах "0", на входах подтяжка к "1"
  delayMicroseconds(10);
  *j = 3;
  if ((PIN_BUTT_12 & 0x10)==0x00) *j = 0;    //
  if ((PIN_BUTT_12 & 0x20)==0x00) *j = 1;    //
  if ((PIN_BUTT_12 & 0x40)==0x00) *j = 2;    //
}  

// =========== Таймер_2 ============
ISR(TIMER2_OVF_vect)
{uint8_t i, j; 
 led_cnt++;
 if (led_cnt == 200)
    digitalWrite(LED_BUILTIN, LOW);
 if (led_cnt == 243)
    {digitalWrite(LED_BUILTIN, HIGH);
     led_cnt = 0;
     PRINT_FLAG = 1;
    }

  // Опрос матричной 4*4 клавиатуры
 if (finish == 1)
    {antidreb_after++;
     if (antidreb_after == end_dreb_after)
        {antidreb_after = 0;
         finish = 0;
         return;
        }
     return;
    }   
 
 if (butt_16_flag == 0) 
  {Opros_Butt_16(&i, &j);
   if ((i != 4)&&(j != 4))
      {butt_16_flag = 1;
       return;
      } 
  }
 
 if ((butt_16_flag == 1) && (antidreb_16 != end_dreb_16))
    {antidreb_16++;
     if (antidreb_16 == end_dreb_16)   // ?????? ???????????
         {Opros_Butt_16(&i, &j);
          if ((i != 4)&&(j != 4))
             {change_butt_16 = 1;
              digit_func = digit_butt_16[i][j];
              return;
             }
         }
     return;    
    }
    
  if ((butt_16_flag == 1) && (antidreb_16 == end_dreb_16) && (change_butt_16 == 0))
  {Opros_Butt_16(&i, &j);
   //msg_2 = 1; 
    if ((i == 4)&&(j == 4))
      {butt_16_flag = 0;
       antidreb_16 = 0;
       finish = 1;
      }
  }
// ****************************
// Опрос цифровой 3*4 клавиатуры
  if ((butt_12_flag == 0) && (butt_16_flag == 0) && (Data_Control.data_lcd.mode == 1))
    {Opros_Butt_12(&i, &j);
     if ((i != 4)&&(j != 3))
        {butt_12_flag = 1;
         return;
        } 
    }
  if ((butt_12_flag == 1)&& (antidreb_12 != end_dreb_12))
     {antidreb_12++;
      if (antidreb_12 == end_dreb_12)   // ?????? ???????????
         {Opros_Butt_12(&i, &j);
          if ((i != 4)&&(j != 3))
             {change_butt_12 = 1;
              digit_func = digit_butt_12[i][j];
              return;
             }
         }
     }
  if ((butt_12_flag == 1) && (antidreb_12 == end_dreb_12) && (change_butt_12 == 0))
     {Opros_Butt_12(&i, &j); 
      if ((i == 4)&&(j == 3))
        {butt_12_flag = 0;
         antidreb_12 = 0;
         finish = 1;
        }
    }

}

 

AlexBajdin59rus
Offline
Зарегистрирован: 17.12.2019

Всё, парни, разобрался... :)