Конфликт sd.h и gsm модуля на atmega2560

vanila
Offline
Зарегистрирован: 25.08.2015

b707 пишет:

ну так что, продолжим? - если оставить в скетче ТОЛЬКО СД-карт - виснет при создании каталога без карты?

меня тут пока дети из строя вывели, щас спать лягут продожу)

vanila
Offline
Зарегистрирован: 25.08.2015

похоже таки ненавистный гайвер тут нипричем, в этот раз) 

вот этот код не рабочий, виснет при попытке создать каталог

#include <Arduino.h>

#include <SPI.h>
#include <SD.h>
const int chipSelect = 53;
char result_file_name[] = "24_15_22.txt";

// прототипы
String sendATCommand(String, bool);
String waitOtvet();
void read_dtchk_tepl();
void dtchk_tepl();

void sd_write();

void setup()
{

  Serial3.begin(9600); // SIM800
  Serial.begin(9600);  //
  Serial.println(F("Serial Initializing..."));

  sendATCommand("AT", true);

  // sd карта
  pinMode(chipSelect, OUTPUT);
  if (!SD.begin(chipSelect)) Serial.println(F("Карта НЕ завелась"));
  else Serial.println(F("карта завелась"));
  
}


void loop()
{
  static int count = 0;
  
  delay(5000);
  count++;
  sendATCommand("AT+CSQ", true); // Проверка качества сигнала
  Serial.println(count);

  sd_write();
}

String sendATCommand(String cmd, bool waiting)
{
  String respond = "";  // Для хранения результата
  Serial3.println(cmd); // Отправляем команду модулю
  if (waiting)
  {                          // Если необходимо дождаться ответа
    respond = waitOtvet();   // ждем, ответа
    Serial.println(respond); //ответ в монитор порта
  }
  return respond; // передаем ответ дальше
}

String waitOtvet()
{                                           // ожидаем ответа
  String respond = "";                      // для ответа
  unsigned long _timeout = millis() + 6000; // таймаут 6 секунд
  while (!Serial3.available() && millis() < _timeout)
  {
  } // ждем ответа 6 секунд
  // если есть ответ
  if (Serial3.available())
    respond = Serial3.readString(); // считываем
  else
    return "Timeout";

  return respond;
}

void sd_write()
{
if(!SD.exists(result_file_name)){
  SD.mkdir("20"); // создаем каталог
}

  File logFile = SD.open(result_file_name, FILE_WRITE);
  if (logFile)
  {
    logFile.print("21:22:32");   // сохраняем время на  SD карту
    logFile.println();           //конец
    logFile.close();             //закрываем файл
    Serial.print(F("записали в файл"));
  }
  else Serial.print(F(" файл  не записывается"));
   
}//sd_write


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

#include <Arduino.h>


#include <SPI.h>
#include <SD.h>
const int chipSelect = 53;
char result_file_name[] = "24_15_22.txt";

// прототипы
String sendATCommand(String, bool);
String waitOtvet();
void read_dtchk_tepl();
void dtchk_tepl();

void sd_write();

void setup()
{
  Serial.begin(9600);  //
  Serial.println(F("Serial Initializing..."));
   // sd карта
  pinMode(chipSelect, OUTPUT);
  if (!SD.begin(chipSelect)) Serial.println(F("Карта НЕ завелась"));
  else Serial.println(F("карта завелась"));
}


void loop()
{
  static int count = 0;
 
  delay(5000);
  count++;
  Serial.println(count);

  sd_write();
}

void sd_write()
{
if(!SD.exists(result_file_name)){
  SD.mkdir("20"); // создаем каталог
}

  File logFile = SD.open(result_file_name, FILE_WRITE);
  if (logFile)
  {
    logFile.print("21:22:32");   // сохраняем время на  SD карту
    logFile.println();           //конец
    logFile.close();             //закрываем файл
    Serial.print(F("записали в файл"));
  }
  else Serial.print(F(" файл  не записывается"));
   
}//sd_write


 

vanila
Offline
Зарегистрирован: 25.08.2015

что то странное, вот это код не рабочий, виснет при создании папки: 

#include <Arduino.h>

#include <SPI.h>
#include <SD.h>
const int chipSelect = 53;
char result_file_name[] = "24_15_22.txt";

// прототипы
void sendATCommand(String, bool);
String waitOtvet();
void sd_write();

void setup()
{
  Serial3.begin(9600); // SIM800
  Serial.begin(9600);  //
  Serial.println(F("Serial Initializing..."));

  sendATCommand("AT", false);

  // sd карта
  pinMode(chipSelect, OUTPUT);
  if (!SD.begin(chipSelect)) Serial.println(F("Карта НЕ завелась"));
  else Serial.println(F("карта завелась"));
  
}


void loop()
{
  static int count = 0;
  
  delay(5000);
  count++;
  sendATCommand("AT+CSQ", false); // Проверка качества сигнала
  Serial.println(count);

  sd_write();
}

void sendATCommand(String cmd, bool waiting)
{
  String respond = "";  // Для хранения результата
  Serial3.println(cmd); // Отправляем команду модулю
}

void sd_write()
{
if(!SD.exists(result_file_name)){
  SD.mkdir("20"); // создаем каталог
}

  File logFile = SD.open(result_file_name, FILE_WRITE);
  if (logFile)
  {
    logFile.print("21:22:32");   // сохраняем время на  SD карту
    logFile.println();           //конец
    logFile.close();             //закрываем файл
    Serial.print(F("записали в файл"));
  }
  else Serial.print(F(" файл  не записывается"));
   
}//sd_write


а этот рабочий, думает долго но не виснет: 

#include <Arduino.h>

#include <SPI.h>
#include <SD.h>
const int chipSelect = 53;
char result_file_name[] = "24_15_22.txt";

// прототипы
void sendATCommand(String);

void sd_write();

void setup()
{
  Serial3.begin(9600); // SIM800
  Serial.begin(9600);  //
  Serial.println(F("Serial Initializing..."));

  sendATCommand("AT");

  // sd карта
  pinMode(chipSelect, OUTPUT);
  if (!SD.begin(chipSelect)) Serial.println(F("Карта НЕ завелась"));
  else Serial.println(F("карта завелась"));
  
}


void loop()
{
  static int count = 0;

  delay(5000);
  count++;
  sendATCommand("AT+CSQ"); // Проверка качества сигнала
  Serial.println(count);

  sd_write();
}

void sendATCommand(String cmd)
{
  String respond = "";  // Для хранения результата
  Serial3.println(cmd); // Отправляем команду модулю
}

void sd_write()
{
if(!SD.exists(result_file_name)){
  SD.mkdir("20"); // создаем каталог
}

  File logFile = SD.open(result_file_name, FILE_WRITE);
  if (logFile)
  {
    logFile.print("21:22:32");   // сохраняем время на  SD карту
    logFile.println();           //конец
    logFile.close();             //закрываем файл
    Serial.print(F("записали в файл"));
  }
  else Serial.print(F(" файл  не записывается"));
   
}//sd_write


 

vanila
Offline
Зарегистрирован: 25.08.2015

На данный момент следующая картина: 

нерабочий код:

#include <Arduino.h>

#include <SPI.h>
#include <SD.h>

// прототипы

void sd_write();

void setup()
{
  Serial3.begin(9600); // SIM800
  Serial.begin(9600);  //
  Serial.println(F("Serial Initializing..."));
  Serial3.println("AT+CSQ"); // Отправляем команду модулю
  // sd карта
  pinMode(53, OUTPUT);
  if (!SD.begin(53))
    Serial.println(F("Карта НЕ завелась"));
  else
    Serial.println(F("карта завелась"));
}

void loop()
{
  static int count;
  delay(5000);
  count++;
  Serial3.println("AT+CSQ"); // Отправляем команду модулю
  Serial.println(count);

  sd_write();
}


void sd_write()
{
  Serial.println(F("зашли"));
  if (!SD.exists("24_15_22.txt"))
  { Serial.println(F("нет файла"));
    SD.mkdir("20"); // создаем каталог
    Serial.println(F("не записали"));
  }
Serial.println(F("открываем файл"));
  File logFile = SD.open("24_15_22.txt", FILE_WRITE);
  if (logFile)
  {
    logFile.print("21:22:32"); // сохраняем время на  SD карту
    logFile.println();         //конец
    logFile.close();           //закрываем файл
    Serial.print(F("записали в файл"));
  }
  else
    Serial.print(F(" файл  не записывается"));

} //sd_write

В мониторе следующее:

vanila
Offline
Зарегистрирован: 25.08.2015

теперь такая картина:

#include <Arduino.h>

#include <SPI.h>
#include <SD.h>

// прототипы

void sd_write();

void setup()
{
  Serial3.begin(9600); // SIM800
  Serial.begin(9600);  //
  Serial.println(F("Serial Initializing..."));
  Serial3.println("AT+CSQ"); // Отправляем команду модулю
  // sd карта
  pinMode(53, OUTPUT);
  if (!SD.begin(53))
    Serial.println(F("Карта НЕ завелась"));
  else
    Serial.println(F("карта завелась"));
}

void loop()
{
  static int count;
  delay(5000);
  count++;
  Serial.println(F("отправляем команду"));
  Serial3.println("AT+CSQ"); // Отправляем команду модулю
  Serial.println(count);

  sd_write();
}


void sd_write()
{
    Serial.println(F(" зашли"));
    SD.mkdir("20"); // создаем каталог
    Serial.println(F("  не записали"));
 
  Serial.println(F("   открываем файл"));
  File logFile = SD.open("24_15_22.txt", FILE_WRITE);
  if (logFile)
  {
    logFile.print("21:22:32"); // сохраняем время на  SD карту
    logFile.println();         //конец
    logFile.close();           //закрываем файл
    Serial.print(F("записали в файл"));
  }
  else
    Serial.println(F("    файл  не записывается"));

} //sd_write

На этом виснет

vanila
Offline
Зарегистрирован: 25.08.2015

теперь такая, не рабочий код

#include <Arduino.h>
#include <SPI.h>
#include <SD.h>
// прототипы
void sd_write();

void setup()
{
  Serial.begin(9600); 
  Serial.println(F("Serial Initializing..."));
  pinMode(53, OUTPUT);
  if (!SD.begin(53))
    Serial.println(F("Карта НЕ завелась"));
  else
    Serial.println(F("карта завелась"));
}

void loop()
{
  static int count=0;
  delay(5000);
  count++;
  Serial.println(F("отправляем команду"));
  Serial.println(count);
  sd_write();
}


void sd_write()
{
    Serial.println(F(" зашли"));
    SD.mkdir("20"); // создаем каталог
    Serial.println(F("  не записали"));
 
  Serial.println(F("   открываем файл"));
  File logFile = SD.open("24_15_22.txt", FILE_WRITE);
  if (logFile)
  {
    logFile.print("21:22:32"); // сохраняем время на  SD карту
    logFile.println();         //конец
    logFile.close();           //закрываем файл
    Serial.print(F("записали в файл"));
  }
  else
    Serial.println(F(" файл  не записывается"));

} //sd_write

картина в мониторе порта таже что и предыдущая

vanila
Offline
Зарегистрирован: 25.08.2015

что интересно, если карту вставить, то все работает но и если ее вынуть в процессе работы, во время паузы ессессно, то продолжает выводиться следующее, даже когда карты в слоте давно уже нет: 

 

жаль у меня второй меги нет, может сама плата так мозги делать?

vanila
Offline
Зарегистрирован: 25.08.2015

у кого есть мега попробуйте загрузите последний код, зависнет? 

vanila
Offline
Зарегистрирован: 25.08.2015

отковырял таки еще одну мегу, зависает в том же месте

vanila
Offline
Зарегистрирован: 25.08.2015

В оконцове, выходит что это таки в библиотеке sd.h что-то накуролесино, если заменить ее на SdFat.h, то как минимум последний нерабочий скетч работает без проблем, с картой, без карты, вообще без модуля, как угодно. 

И пока что весь код полностью у меня тоже работает и ни перезагрузок не глюков с жсм никаких. 

#include <Arduino.h>
#include <SPI.h>
#include "SdFat.h"

const byte chipSelect = 53;
SdFat SD;

// прототипы
void sd_write();

void setup()
{
  Serial.begin(9600); 
  Serial.println(F("Serial Initializing..."));
  pinMode(53, OUTPUT);
  if (!SD.begin(53))
    Serial.println(F("Карта НЕ завелась"));
  else
    Serial.println(F("карта завелась"));
}

void loop()
{
  static int count=0;
  delay(5000);
  count++;
  Serial.println(F("отправляем команду"));
  Serial.println(count);
  sd_write();
}


void sd_write()
{
  Serial.println(F(" зашли"));
  SD.mkdir("20"); // создаем каталог
  Serial.println(F("  не записали"));
 
  Serial.println(F("   открываем файл"));
  File logFile = SD.open("24_15_22.txt", FILE_WRITE);
  if (logFile)
  {
    logFile.print("21:22:32"); // сохраняем время на  SD карту
    logFile.println();         //конец
    logFile.close();           //закрываем файл
    Serial.print(F("записали в файл"));
  }
  else
    Serial.println(F(" файл  не записывается"));

} //sd_write

 

vanila
Offline
Зарегистрирован: 25.08.2015

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

b707
Offline
Зарегистрирован: 26.05.2017

vanila пишет:

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

чем же вы таким забили всю оперативку меги - 8к?

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

b707 пишет:

чем же вы таким забили всю оперативку меги - 8к?

Это непросто, но специалисты имеются.

vanila
Offline
Зарегистрирован: 25.08.2015

b707 пишет:

vanila пишет:

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

чем же вы таким забили всю оперативку меги - 8к?

всяким.

вообще мне показывало остаточных 1к, так что строго говоря не все 8к) 

сейчас перевел весь вывод до которого дотянулся во флеш, плюс стринги в обработке смс передавал не по ссылке, сейчас 3к свободно. 

это во время выполнения программы, при компиляции 50% показывает