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 И ЕГО ПЕРЕЗАГРУЗКЕ.
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;Вот так вот без переносов будет...
Никак не влияет.
Какой тип у
digit_func ?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; } } }Всё, парни, разобрался... :)