Здравствуйте. Нужно записывать данные с тензодатчика на 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 минуты записи. Проблема эта проявилась совсем не давно. До этого все работало на протяжении года. В чем может быть причина, я даже не представляю.
если шарашить на карточку с максимальной возможной для ардуины скоростью - любая карта быстро сдознет. Да и как-то вообще не похоже, что это код рабочий. Три цикла while(1) без выхода намекают на то. что как минимум половина кода никогда не исполняется. Например строчка "Еnd of experiment" никогда не напечатается Исправил - Сорри, не заметил скобку
Первый цикл while предназначен для непрерывного мигания светодиодом, из него выходит не надо, файл не открыт, и продолжать нет смысла. Второй цикл необходим для непрерывной записи, ну или до нажатия кнопки. Нажатия кнопки оканчивает эксперимент, и уводит ардуино в бесконечный цикл. Код работал на протяжении года, и запись идет с интервалом 12 мс(около 80Hz, или 800 байт/сек).
noName 2 гб. Ей около 5 лет. Скорость записи 8 мб/сек, чтения - 17 мб/сек. Проверить на повреждения нет возможности.
Господа, короткий вопрос. С какой тактовой частотой идет обмен между Ардуиной и 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