Forum: Mikrocontroller und Digitale Elektronik datei erstellen und an sd karte senden


von Peter z. (fedx)


Lesenswert?

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

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

zu wenig Information

von Heinz (Gast)


Lesenswert?

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.

von Peter z. (fedx)


Lesenswert?

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.

von Peter z. (fedx)


Angehängte Dateien:

Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Peter z. (fedx)


Lesenswert?

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

von Christoph R. (crasim)


Lesenswert?

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...

von Peter z. (fedx)


Lesenswert?

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

von Christoph R. (crasim)


Lesenswert?

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.

von asdf (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.