Serial.print и нештатная перезагрузка ARDUINO
- Войдите на сайт для отправки комментариев
Вс, 12/04/2020 - 17:38
Здравствуйте! Сможет кто-нибудь объяснить мою проблему? Как влияет вставка команды 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 И ЕГО ПЕРЕЗАГРУЗКЕ.
Вот так вот без переносов будет...
Никак не влияет.
Какой тип у
digit_func ?
volatile uint8_t digit_func
В прерывании Таймера digit_func это будет код нажатой кнопки
Всё, парни, разобрался... :)