Проблемы с записью на Sd card

Тема в разделе "Arduino & Shields", создана пользователем LeTaGa, 31 окт 2019.

  1. LeTaGa

    LeTaGa Нерд

    Здравствуйте. Нужно записывать данные с тензодатчика на sd card. Карту подключил согласно схеме указанной на сайте:
    https://lesson.iarduino.ru/page/urok-20-podklyuchenie-i-rabota-s-flesh-kartoy-na-arduino/
    Код записи:
    Код (C++):
    digitalWrite(LCD_BLUE, HIGH); // подаем сигнал о начале эксперимента
      delay(10000); // ждём
      digitalWrite(LCD_BLUE, LOW); // даём сигнал об окончании отсчета
      myFile = SD.open("EXP.txt", FILE_WRITE); // Открываем файл для записи, если файла нет, то создаем его.
       if(!myFile){ // Проверяем открыт ли файл.
          while(1){
              delay(200);          // файл не открыт
              digitalWrite(LCD_RED, HIGH);
              delay(200);
              digitalWrite(LCD_RED, LOW);          
             }
         }
     
       myFile.println(""); // Отступаем от прошлых записей.
       myFile.print("Experiment"); // пишем эксперимент.
       myFile.print(EEPROM.read(0)); // Даем ему номер. ( на карте их могут быть несколько, и в них надо как-то ориентироваться)
       myFile.println("");// Отступаем от прошлых записей.
       EEPROM.write(0, (EEPROM.read(0) + 1)); // прибавляем 1 к номеру эксперимента.
       digitalWrite(LCD_RED, HIGH); // даем сигнал о начале записи
       digitalWrite(START, HIGH); // Даем сигнал на запуск эксперимента
       ad0 = millis(); // записываем время начало эксперимента
       while(1){
         ad1 = millis(); // записываем время начало считывания показаний
         units = scale.get_units(), 10; // Считываем показания датчика.
         ad2 = millis(); // записываем окончания считывания
         myFile.print(units); // записываем показания
         myFile.print(" ");
         myFile.print(ad2); // записываем время
         myFile.print(" ");
         myFile.print(ad1); // записываем время
         myFile.print(" ");
         myFile.println(ad0); // записываем время
        if((ad2 - ad0) >= 2000){ //
          digitalWrite(START, LOW);
        }
        if(digitalRead(button) != 1){ // нажата ли кнопка?
          delay(10);
          if(digitalRead(button) != 1){
            myFile.println("End to Experiment");
            myFile.close();
            while(1){
              digitalWrite(LCD_BLUE, HIGH);
              digitalWrite(LCD_RED, LOW);
              delay(100);
              digitalWrite(LCD_BLUE, LOW);
              digitalWrite(LCD_RED, HIGH);
              delay(100);
            }
          }
        }
       }
    Так вот, ровно через 4,4 секунды записи, запись прерывается, файл становится не доступен для записи. Частично проблему удалось решить уменьшив объем записываемых данных в 3 раза, но проблема все равно проявлялась через 1,5 минуты записи. Проблема эта проявилась совсем не давно. До этого все работало на протяжении года. В чем может быть причина, я даже не представляю.
     
  2. parovoZZ

    parovoZZ Гуру

    флешка сдохла.
    Форматни, отрежь кусок дохлого пространства и пиши в другую область памяти.
     
    NikitOS нравится это.
  3. b707

    b707 Гуру

    если шарашить на карточку с максимальной возможной для ардуины скоростью - любая карта быстро сдознет.
    Да и как-то вообще не похоже, что это код рабочий. Три цикла while(1) без выхода намекают на то. что как минимум половина кода никогда не исполняется. Например строчка "Еnd of experiment" никогда не напечатается

    Исправил - Сорри, не заметил скобку
     
    Последнее редактирование: 31 окт 2019
  4. LeTaGa

    LeTaGa Нерд

    Первый цикл while предназначен для непрерывного мигания светодиодом, из него выходит не надо, файл не открыт, и продолжать нет смысла.
    Второй цикл необходим для непрерывной записи, ну или до нажатия кнопки.
    Нажатия кнопки оканчивает эксперимент, и уводит ардуино в бесконечный цикл.
    Код работал на протяжении года, и запись идет с интервалом 12 мс(около 80Hz, или 800 байт/сек).
     
  5. LeTaGa

    LeTaGa Нерд

    Вероятно. Карту форматировал, но на повреждения не проверял.
     
  6. parovoZZ

    parovoZZ Гуру

    скажи, что за карта?
     
  7. LeTaGa

    LeTaGa Нерд

    noName 2 гб. Ей около 5 лет. Скорость записи 8 мб/сек, чтения - 17 мб/сек. Проверить на повреждения нет возможности.
     
  8. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Господа, короткий вопрос. С какой тактовой частотой идет обмен между Ардуиной и SD картами при стандартной библиотеке? В примерах нет задания этого параметра. И на каком фронте (райз или фелл) происходит защелкивание данных ? Прошу прощения, но кто знает, тот поймет.

    ПС. Поскольку ответов нет - отвечаю сам. С помощью проб и ошибок обнаружил, что :
    Тактовая частота (Master clock frequency) = 250КГц.
    Команда сброса - последовательность (hex) = 0x40, 0x00, 0x00, 0x00, 0x00, 0x95.
    Направление байта = Бит7(Master) - первый, Бит0(Least) - последний.
    Остальные - Работают в любой (из 4х) комбинации. С этим не понял !
    Исходный уровень такта (SCK Idle State) = LOW или HIGH.
    Защелкивание данных (Sampling Edge) = LOW- to- HIGH или HIGH to-LOW
     
    Последнее редактирование: 20 ноя 2019