hi, wie kann ich eine Datei erstellen? Das Problem ist, dass es kein normales fopen() gibt, sondern nur ein fdevopen(). ich möchte eine datei erstellen und dort etwas rein schreiben, sobald das erledigt ist, möchte ich die an eine sd karte senden. Die datei müsste ja automatisch zunächst im flash- speicher angelegt werden oder ? mfg
Peter z. schrieb: > wie kann ich eine Datei erstellen? Das Problem ist, dass es kein > normales fopen() gibt, sondern nur ein fdevopen(). > ich möchte eine datei erstellen und dort etwas rein schreiben, sobald > das erledigt ist, möchte ich die an eine sd karte senden. Die datei > müsste ja automatisch zunächst im flash- speicher angelegt werden oder ? Bitte die Netiquette http://www.mikrocontroller.net/articles/Netiquette#.C3.84u.C3.9Fere_Form beachten.
ok ich versuche es mal etwas genauer. Ich habe ein MyEthernet Board und habe die passenden libraries vom Hersteller implementiert. Nun wollte ich eine Datei (z.b. .txt in der irgendetwas steht) erstellen um die Schnittstelle zur Sd-karte zu testen. ich kenne das Datei erstellen so, dass man stdio inkludiert und dann mit fopen("dateiname","w") eine Datei erstellt und in diese mit fprintf etwas schreiben kann. Das Problem ist nun, dass die stdio.h von AVR Studio 5 bzw 4 nur eine "fdevopen()" kennt allerdings verstehe ich den Prototyp davon nicht so ganz, diese Funktion erwartet zwei Pointer auf zwei Funktionen. Wie kann ich nun mit dieser Funktion eine beliebige Datei erstellen und dort einen beliebigen Inhalt hinein schreiben? Die examples die ich bisher fand haben mir nicht wirklich weiter geholfen. Vieleicht könnte mir jemand kurz erklären, was genau fdevopen() erwartet und wie ich damit anstelle von fopen() eine Datei erstellen kann.
Hi, scheinbar habe ich mein Problem noch nicht genau genug geschildert. Ich Nutze: MyEthernet 64k Board AVR Studio 5 das Library Paket zu myEthernet.h Mein Ziel ist es zunächst ein text file zu erstellen und dieses im Anschluss auf die SD-Card zu speichern. Dabei habe ich die SD-Card folgendermaßen initialisiert:
1 | test.spiStop();//ethernet aus |
2 | //sbi(DDRC,6); sbi(PORTC,6); //SS port der SD karte
|
3 | //////// sdCard-init ///////////////
|
4 | ok=sdCard.config(); |
5 | while(!ok) |
6 | {
|
7 | sbi(DDRC,5);sbi(PORTC,5); // LED rot |
8 | DebugPrintFlash("FEHLER: bei MicroSD-Card Initialisierung\n"); |
9 | ok = sdCard.config(); |
10 | }
|
11 | cbi(DDRC,5); cbi(PORTC,5); //rote LED aus |
12 | sbi(DDRC,4); sbi(PORTC,4); //grüne LED an |
Das funktioniert scheinbar auch, denn wenn ich die Karte draußen lasse bleibt die LED auf Rot und wenn sie drinnen ist dann leuchtet die grüne LED. Aus dem Example 3 habe ich dann versucht nachzuvollziehen, wie ein File auf der SD-Card erstellt wird. Daraus habe ich dann folgendes geschrieben:
1 | Directory dir; |
2 | |
3 | File file; |
4 | file.open("test"); |
5 | |
6 | dir.getEntry().fat->lastError=0; |
7 | |
8 | uint8_t text[]="test\0"; |
9 | uint8_t test_2=6; |
10 | |
11 | sdCard.spiWrite(text,sizeof(text)); |
Ich finde leider in den Examples kein Beispiel das mir weiterhilft. Vllt. kann mir ja hier jemand helfen. Vielen Dank im Voraus für die Antworten! Mit freundlichen Grüßen Peter
Peter z. schrieb: > Das Problem ist nun, dass die stdio.h von AVR Studio 5 bzw 4 nur eine > "fdevopen()" kennt allerdings verstehe ich den Prototyp davon nicht so > ganz, diese Funktion erwartet zwei Pointer auf zwei Funktionen. > Du musst dir 2 Dinge klar machen * zum einen bist du nicht auf einem Desktopsystem, hast also keinen Unterbau in Form eines Betriebssystems zur Verfügung. * zum anderen musst du dir klar machen, wie Ausgaben über die Standard- funktionen eigentlich ablaufen Rufst du eine Standardfunktion wie printf oder fprintf auf, dann übernehmen die ein paar Parameter, grummeln mit denen rum, bis sie etwas haben, was auf den Ausgabekanal geschickt werden muss. Was hinter diesem Ausgabekanal steckt, interessiert printf nicht, das hat einen String zusammengebaut und der muss über einen Mechanismus, den man im weitesten Sinne einen Treiber nennen kann, auf den Ausgabekanal überspielt werden. Die komplette Logik des Ansteuerns des eigentlichen 'Gerätes' muss dabei dieser Treiber übernehmen, der .. normalerweise Teil des Betriebssystems ist, welches du aber nicht hast. Also gibt es hier ein Problem. Wenn man sich die Software in Hierarchieschichten ansieht dein Code printf Code Grummel-grummel Code Treiber dann gibt es 2 Dinge, die du anpassen musst: zum einen ist das natürlich dein Code, der die Ausgabe erst mal anleiert. Zum anderen musst du aber ganz unten den "Treiber" Code einschleusen, der dann letztendlich die eigentliche Kommunikation mit 'dem Gerät' macht. Denn: Auf einem AVR kann es dafür keinen Standardtreiber geben! Was soll der den machen? Auf UART ausgeben? Auf einem LCD ausgeben? Auf einem GLCD ausgeben? Auf eine SD-Karte schreiben? Auf einem I2C-Gerät ausgeben? Per Can-Bus verschicken? Per Ethernet verschicken? ... Hier gibt es unzählige Variationen und man kann sich auf so einem kleinen Prozessor ganz einfach nicht den Luxus erlauben, für alles was überhaupt möglich ist entsprechende Treiber vorzuhalten. Also muss dein Code ran. Man kann diese 'Treiberschicht' auf den kleinsten gemeinsamen Nenner überhaupt abspecken: 2 Funktionen. Die eine versendet ein Zeichen an ein Ausgabegerät, die andere empfängt ein Zeichen von einem Ausgabegerät. (Wieder: 'Ausgabegerät' als Synonym für Tastatur, Drucker, LCD, Ethernet, SD-Karte, etc. sehen) Und genau da kommt jetzt fdevopen ins Spiel. Dieser Funktion werden genau diese beiden Funktionen übergeben, die letztendlich dafür zuständig sind, ein einzelnes Zeichen zu transportieren. Was hilft dir das? Gar nichts. Denn was du brauchst ist eine Lib, mit der du SD-Karten erst mal prinzipiell ansprechen kannst. Erst dann, wenn du die hast und die auch funktioniert, könntest du hergehen und entsprechende Funktionen bauen, die du mit fdevopen dem I/O Überbau unterjubeln kannst, so dass du einen fprintf( sdFile, "format\n" ); überhaupt benutzen kannst. Kannst, aber nicht musst. Denn letzten Endes wirst du in dieser SD_Karten Lib eine Funktion haben, die einen Text in ein File ausgibt. Wie auch immer diese Funktion heißt. UN dob du diese Funktion jetzt in den Unterbau des I/O Sytems einschleust um wie oben einen fprintf machen zu können, oder ob du das selber in Form eines sprintf( Buffer, "format\n" ); sd_card_write_string( ..., Buffer ); mit Hilfe dieser Funktion aus der SD-Library aufs File schreibst, bleibt sich völlig egal. > Vieleicht könnte mir jemand kurz erklären, was genau fdevopen() erwartet > und wie ich damit anstelle von fopen() eine Datei erstellen kann. Du suchst an den falschen Stellen. Weder fdevopen noch fopen helfen dir weiter. Was du brauchst ist eine Lib, die mit SD-Karten umgehen kann, denn deine Standard-Runtime Library kann das nicht. Daher ist es auch sinnlos, die Standard-Funktionen danach abzusuchen.
Hi, ich dachte ich kann die Lib benutzen die ich vorher angehängt habe um die SD-Karte anzusteuern.Ich glaube ich weis nur einfach nicht wie ich die Library letztendlich anwenden muss. Kann vielleicht jemand eine Library empfehlen mit der das auf dem My Ethernet Board funktioniert? bzw. Ein einfaches Beispiel für das Senden von Dateien auf eine SD-Karte? Vielen Dank schonmal für die Antworten. Mit freundlichen Grüßen Peter
Wenn Du in die file.h-Lib deiner Beispiele schaust siehst Du, das da offensichtlich nur der Lesezugriff auf das Dateisystem der SD-Karte implementiert ist. In der mmccard.h hast Du aber Funktionen zum Lesen und Schreiben eines Blocks, das sollte reichen um darauf z.B. die FatFS-Dateisystembibliothek auszusetzen (http://elm-chan.org/fsw/ff/00index_e.html). Allerdings ist das nicht unbedingt das was man als erste Übung mit Mikrocontrollern machen sollte...
hi, was genau meinst du mit aufsetzten? die FatFS Library hatte ich mir auch schon einmal angeschaut und versucht diese für den MyEthernet zu konfigurieren. Dies habe ich allerdings nicht hin bekommen, da die SD Karte im FatFS Beispiel zu AVRs anders angeschlossen wurde. Welche Dateien der FatFS müsste ich wie ändern, um von dieser Library Gebrauch machen zu können? mit freundlichen Grüßen Peter
FatFs ist erstmal von der Hardware völlig unabhängig. Deshalb steht auch auf der Webseite "However the low level disk I/O module is not a part of FatFs module so that it must be provided by user. The sample drivers are also available in the resources.". Die Hardwarezugriffsfunktionen die FatFs braucht (vor allem DiscRead/DiscWrite) musst Du selbst schreiben, in deinem Fall müssen die eigentlich nur die genannten Funktionen in der mmccard.h aufrufen. Bevor Du dann versuchst damit was zu schreiben solltest Du erstmal schauen dass der Lesezugriff klappt, d.h. mit FatFs die Namen der Dateien auf der SD-Karte auslesen oder sowas. Deine Fragen lassen allerdings vermuten, dass Dir einfach das Grundwissen fehlt, um das selbst zu lösen. Falls dem so ist kann Dir hier wohl nur jemand helfen, der zufällig das gleiche Board hat und Dir direkt lauffähigen Code zur Verfügung stellen kann.
Ich habe gute Erfahrungen mit der Lib von Roland Riegel gemacht: http://www.roland-riegel.de/sd-reader/index.html
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.