gerne würde ich die Zeit verkürzen, die die SD.h / SPI.h benötigt, um zu erkennen, dass die SD Karte nicht eingelegt ist. Ich habe einem Post gefunden "SD Card Status Prüfer - Deutsch - Arduino Forum" in welchem beschrieben wird, dass diese "Timeout" Zeit auf 2000ms festgelegt ist. Der folgende Code ist aus dem beschriebenen Thread entnommen.
/** init timeout ms */
uint16_t const SD_INIT_TIMEOUT = 2000;
Nun würde ich diese Zeit gern ändern. Wie kann ich auf diese Bibliothek zugreifen und den Code verändern? Ich finde zwar diverse Arduino Bibliotheken auf meinem PC, nicht jedoch SD.h und SPI.h. Eine längere Recherche hierzu war leider unerfolgreich.
Hintergrund ist eine Regelung, die massiv anfängt zu Überschwingen, da der Prozessor für diese 2 Sekunden unnötig blockiert wird (Der Code darf leider nicht veröffentlicht werden). Anhand des folgenden Codes kann man das Problem aber durchaus gut nachvollziehen.
//started by Felix 14.01.2020, 14:50
/*
* Ziel dieses Sketches ist herauszufinden wie SD.begin und Data.open funktionieren
* 14.01.2020 14:55 Beim Entfernen der SD-Karte gerät der Regelkreis in Schwinung und schwingt bis ans Maximum auf.
* 14:58 Grund ist eine Pause durch eine der Funktionen SD.open oder SD.begin. Welche der Auslöser ist ist noch unklar.
*
*/
#include <SPI.h>
#include <SD.h>
File Data;
void setup() {
Serial.begin(9600);
Serial.print("Initialisiere SD-Karte");
if(!SD.begin()){
Serial.println("Initialisierung fehlgeschlagen");
return;
}
Serial.println("Initialisierung erfolgreich");
}
void loop() {
Data = SD.open("daten.txt", FILE_WRITE);
if (!SD.begin())
{
digitalWrite(9, !digitalRead(9));
}
else
{
Serial.println("Erfolg");
}
Data.close();
}
Es dauert zwischen 2 und 2,5 Sekunden bis die LED ihren Zustand wechselt.
Zusammengefasst lautet meine Frage:
Wo finde ich die entsprechende Bibliothek und kann ich sie bearbeiten?
Beste Grüße,
Felix
@paulpaulson:
Das Problem ist, dass im Beispiel innerhalb von loop() immer wieder if (!SD.begin()) ...
aufgerufen wird.
Wenn man das wirklich braucht, weil z.B. damit zu rechnen ist, dass im laufenden Betrieb die SD Karte gewechselt wird, hat man natürlich was zu tun.
Fraglich, ob simples Verkürzen der Zeit reicht.
Aber das wird man bei einem solch hochgeheimen Arduino-Projekt nicht erfahren...
fcms:
(Der Code darf leider nicht veröffentlicht werden).
Schon geprüft, ob du die SD Library überhaupt benutzen darfst?
A) Lizenz der SD library?
B) Eigene Sicherheitsregeln?
C) Wenn du nichtmal die verwendete Library findest, ist natürlich fraglich, ob du als Programmierer überhaupt geeignet bist, solch hochsensible Software zu betreuen. (Aber das braucht ja keiner zu wissen)
michael_x: @paulpaulson:
Das Problem ist, dass im Beispiel innerhalb von loop() immer wieder if (!SD.begin()) ...
aufgerufen wird.
Wenn man das wirklich braucht, weil z.B. damit zu rechnen ist, dass im laufenden Betrieb die SD Karte gewechselt wird, hat man natürlich was zu tun.
Fraglich, ob simples Verkürzen der Zeit reicht.
Aber das wird man bei einem solch hochgeheimen Arduino-Projekt nicht erfahren...Schon geprüft, ob du die SD Library überhaupt benutzen darfst?
A) Lizenz der SD library?
B) Eigene Sicherheitsregeln?
C) Wenn du nichtmal die verwendete Library findest, ist natürlich fraglich, ob du als Programmierer überhaupt geeignet bist, solch hochsensible Software zu betreuen. (Aber das braucht ja keiner zu wissen)
Hallo
mit der Annahme würde ich nochmal über das Systemdesign von Echtzeitsystemen nachdenken.....
ich arbeite erst seit relativ kurzer Zeit mit Arduino und bin kein professioneller Programmierer, der nichts anderes tut. Ich bin mir nicht sicher, ob es hilfreich ist persönlich zu werden... Es wird kein Geld damit verdient, es ist ein Bachelorprojekt. Aber lassen wir das.
Nichtsdestotrotz erst einmal vielen Dank für die vielen, teils sehr hilfreichen Antworten.
michael_x: @paulpaulson:
Das Problem ist, dass im Beispiel innerhalb von loop() immer wieder if (!SD.begin()) ...
aufgerufen wird.
Genau dies ist mir bereits bewusst. Ich würde die entsprechende Funktion gern implementiert haben, da es mir wichtig wäre vor etwaigen SD Fehlern gewarnt zu werden beziehungsweise den Nutzer darauf hinzuweisen, dass es ein Problem mit der SD Karte gibt.
Danke an agmue, Deine Antwort war sehr hilfreich, ich habe die Bibliothek gefunden. Ich hatte mich wohl durch die falschen Ordner geklickt.
@ paulpaulson
Weil das eigentliche Programm ein anderes ist.
Vielen Dank nochmals.
es ist eine ganz schlechte Idee mitten im Betrieb die Karte zu ziehen. Man weiß ja nie wann er plötzlich anfängt Daten schreiben/lesen zu wollen. Vorschlag. Programmiere dir einen Taster zum Karten wechseln. Wenn der gedrückt wurde leuchtet eine Led und es werden alle Kartenzugriffe unterbunden. Nach einschieben der Karte drückt man wieder den Taster und die Karte wird neu initialisiert und weiter gehts mit dem schreiben/lesen.
es ist eine ganz schlechte Idee mitten im Betrieb die Karte zu ziehen. Man weiß ja nie wann er plötzlich anfängt Daten schreiben/lesen zu wollen.
Hi,
es ist mir tatsächlich nicht so wichtig, wenn mal ein paar Daten verloren gehen. Der Arduino speichert alle 15 Sekunden die Daten auf der SD Karte, da das ganze aber über Stunden läuft ist es absolut unproblematisch, wenn mal eine Minute oder so fehlt. Vielen Dank trotzdem!
@michael_x Danke für den Hinweis mit der Lizenz. Ich hatte vorher gar nicht darüber nachgedacht und mich jetzt mal belesen. So wie ich die Lizenz verstehe, darf ich nichts was diese Bibliothek beinhaltet verschlüsselt verkaufen, ist das korrekt? Ich kenne mich damit nicht so gut aus, entschuldige bitte mein Unwissen. So wie ich die Lizenz verstehe komme ich damit auf jeden Fall nicht in Berührung. Vielen Dank bereits im Voraus!
Das ändern der Bibliothek auf eine Zeitspanne von 200 ms statt 2000 ms funktioniert übrigens auf den ersten Blick hervorragend. Ich muss noch weitere Tests zur Stabilität des Schreiben auf die SD Karte machen aber im ersten Moment sieht alles gut aus
Zum Thema Lizenz:
Da gibt es zig Varianten. Nur weil du etwas legal findest, darfst du es noch lange nicht beliebig verwenden. OpenSource verwenden aber selbst den eigenen Code nicht veröffentlichen kann legal sein, muss aber nicht.
es ist mir tatsächlich nicht so wichtig, wenn mal ein paar Daten verloren gehen. Der Arduino speichert alle 15 Sekunden die Daten auf der SD Karte, da das ganze aber über Stunden läuft ist es absolut unproblematisch, wenn mal eine Minute oder so fehlt. Vielen Dank trotzdem!
Wenn die Datei gerade beschrieben wird und Du ziehst die Karte ist zu 99% alles weg was in der Datei drin war. Karte ziehen bei Zugriff ist eine ganz schlechte Idee. Ich habe mir schon mehrmals den kompletten Karteninhalt zerschossen weil ich am Windows Rechner die Karte zu früh gezogen habe. Seit diesem Zeitpunkt sage ich er soll sie auswerfen. Wenn er dann sagt das die Karte ausgeworfen wurde, ziehe ich sie erst heraus.