Самопроизвольная перезагрузка Nano

SemIS
Offline
Зарегистрирован: 05.12.2014
Программа работает корректно: принимает и отсылает данные в COM. Все считается как и должно. Добавляю на исполнение по приему 9 и Arduino начинает циклически перезагружаться.
 if (Serial.available() > 0) {  
        incomingByte = Serial.read();
  switch (incomingByte) {
   case 49: {}    
   break;
   case 57: {                                                    // 9 в коде ANSII                
             Serial.println(" press 9");
             for (int i=0; i<33; i=i+1){
               for (int j=0; j<15; j=j+1){Serial.print( LetterArray[i][j]);Serial.print(" | ");}
                Serial.println(" ");}           
        }
  break;
  default:{Serial.println(incomingByte, DEC);}    
   }
  }

 

Причем эта часть кода должна исполняться только когда приходит "9" из COM, перезагрузки происходят при входе в цикл Loop. Плата Nano328. Создал отдельный скетч только с этим кодом- работает все. Подскажите в чем может быть проблема. 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так если "только с этим кодом работает", зачем Вы нам его выложили? 

Неработающий скетч можете выложить?

А то у Вас получается: мужики, у меня тут есть скетч, который перегружает нанку, я Вам его не покажу, а Вы догадайтесь в чём там дело.

Предположить я, конечно могу - проблема с "распашкой" стека - в том месте, где должен быть адрес некой функции оказывается ноль, а переход по нулевому адресу и есть перезагрузка. Причин распашки стека может быть много: выход за границы массива, нехватка памяти и т.п. Большего, не видя, программы сказать не могу.

SemIS
Offline
Зарегистрирован: 05.12.2014

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

Про срыв стека тоже думал, но ведь он должен происходить при выполнении кода, а этот кусок выполняется только по приходу 9 в com,до чего дело не доходит.

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

SemIS
Offline
Зарегистрирован: 05.12.2014

дополнил скетч кодом 

int freeRam () {                         
  extern int __heap_start, *__brkval; 
  int v; 
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
}

 Serial.print("\n[memCheck]");
 Serial.println(freeRam());

результат в -94 говорит сам за себя.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Стэк залез на кучу. Забавно. 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Именно сам и говорит- используйте  F  для вывода констант:

Serial.println    (   F   (  " press 9 "  ) );

Serial.print  (   F    (  "\n[memCheck]"    ) );