SD-Karte ansteuern, viele Unklarheiten
Hallo zusammen!
Ich hoffe ihr könnt mir weiterhelfen. Folgendes Problem:
Wir planen die Anschaffung eines Solarfeldes für eine Blockhütte (alles 12V). Dazu bekommen wir einen Laderegler mit RS232 Schnittstelle der uns alle aktuellen Werte (Ladestrom, Ladespannung, Temperatur, Verbrauch....) liefert. Das Format und die Abfragebefehle konnte ich vom Hersteller schon erfragen. Prima Service! =D>
Nun wollen wir alle 10 Minuten die Werte abfragen und loggen. Da da schon einige Werte zusammenkommen bin ich auf der Suche hier und im Netz auf SD-Karten gekommen, aber da ich noch Anfänger bei µC bin, tun sich da jetzt viele Fragen auf. Leider, darum wär ich sehr dankbar, wenn jemand da schon Erfahrungen oder ein paar Tips hat!!!
- Brauche ich unbedingt einen Mega128 oder geht das auch mit einem Mega32? Davon habe ich ein paar Restposten ergattern können.
- Habe mir das AVR-DOS von Franz Vögele angesehen und das scheint ja genau richtig zu sein.
- Habe gelesen hier, daß ich die Datei mit $Include "Config_MMC.bas" einbinden muß. Was mache ich denn mit all den anderen Dateien, die ich bei ihm runtergeladen habe? Kopf kratz... (FS_Interpreter, MMC.LIB usw.)
- Wenn ich richtig verstanden habe: Ich muß nicht die Pins MISO und MOSI nehmen (da hängt ja auch mein Programmer drann), sondern kann es auch auf andere Portpins umconfigurieren? Wenn ja, wie?
- Mein System läuft mit 5V, also brauche ich zur Pegelwandlung einen 74VHC08. Gut muß ich gleich nach googeln. Für die Betriebsspannung der Karte brauche ich ja auch 3,3V. Müssen die HOCHkonstant sein oder könnte ich einen Spannungsteiler nehmen (die 5V sind mit 7805 stabilisiert) oder einen LM317 nehmen, um die 3,3V zu erzeugen?
- Die Daten werden also im Flashspeicher gesammelt und dann erst im Block auf die Karte geschrieben!? Den Speicher soll man ja nicht so oft verwenden, wenn ich richtig gelesen habe. Hm, wie oft kann ich denn dann auf die Karte schreiben? Oder bin ich da auf dem Holzweg???
- Kann ich handelsübliche, aktuelle Karten nehmen oder muß ich mir eine ältere, sprich Karte mit kleinerem Speicherplatz besorgen? Wieviel MB kann ich denn ansprechen?
- Entsteht auf der Karte eine Binärdatei, die ich dann z.B. mit VisualBasic auslesen kann oder brauch ich dann noch ein spezielles Programm?
Man oh man, soviel Unklares. Ich hoffe ich habe nicht zu sehr genervt und ihr könnt mir etwas helfen. Hat vielleicht jemand ein Stück Programmcode wo ich sehen kann wie man etwas auf Karte schreibt? Muß nur schreiben, mehr nicht.
Gruß, Hackes.
Re: SD-Karte ansteuern, viele Unklarheiten
Dass sind ja wirklich viele Fragen.
Ich habe mal ein paar Antworten mit in den Text geschrieben.
Zitat:
Zitat von Hackes
Hallo zusammen!
Ich hoffe ihr könnt mir weiterhelfen. Folgendes Problem:
Wir planen die Anschaffung eines Solarfeldes für eine Blockhütte (alles 12V). Dazu bekommen wir einen Laderegler mit RS232 Schnittstelle der uns alle aktuellen Werte (Ladestrom, Ladespannung, Temperatur, Verbrauch....) liefert. Das Format und die Abfragebefehle konnte ich vom Hersteller schon erfragen. Prima Service! =D>
Nun wollen wir alle 10 Minuten die Werte abfragen und loggen. Da da schon einige Werte zusammenkommen bin ich auf der Suche hier und im Netz auf SD-Karten gekommen, aber da ich noch Anfänger bei µC bin, tun sich da jetzt viele Fragen auf. Leider, darum wär ich sehr dankbar, wenn jemand da schon Erfahrungen oder ein paar Tips hat!!!
- Brauche ich unbedingt einen Mega128 oder geht das auch mit einem Mega32? Davon habe ich ein paar Restposten ergattern können..
Ich habe einen Mega128 und da läuft es sehr gut. Mit dem Mage32 wird es aber sicherlich auch gehen.
Zitat:
Zitat von Hackes
- Habe mir das AVR-DOS von Franz Vögele angesehen und das scheint ja genau richtig zu sein..
AVR-DOS brauchst du nur, wenn du wirklich Files über den AVR anlegen willst. Ich habe mir eine 256MB große Dummy-Datei mit Windows auf die frisch formatierte Karte geschrieben, dann den ersten Block gesucht und von da ab meine 512-Byte Blöcke geschrieben. Das geht mit den Befehlen "DriveReadSector" und "DriveWriteSector".
Zitat:
Zitat von Hackes
- Habe gelesen hier, daß ich die Datei mit $Include "Config_MMC.bas" einbinden muß. Was mache ich denn mit all den anderen Dateien, die ich bei ihm runtergeladen habe? Kopf kratz... (FS_Interpreter, MMC.LIB usw.).
Was du für die oben beschriebene Art nur brauchst ist die "Config_MMC.bas" und die MMC.LIB. Alles andere kannst du dann vergessen.
Zitat:
Zitat von Hackes
- Wenn ich richtig verstanden habe: Ich muß nicht die Pins MISO und MOSI nehmen (da hängt ja auch mein Programmer drann), sondern kann es auch auf andere Portpins umconfigurieren? Wenn ja, wie?.
Ich habe Soft-SPI genommen, also beliebige Ports vom AVR. Ist zwar nicht ganz so schnell, aber ich schreibe nur einen Block alle 10 Minuten, da macht das nichts. In Config_MMC.bas musst du dafür "Const Cmmc_soft = 1" setzen, und dann deine verwendeten Ports angeben.
Zitat:
Zitat von Hackes
- Mein System läuft mit 5V, also brauche ich zur Pegelwandlung einen 74VHC08. Gut muß ich gleich nach googeln. Für die Betriebsspannung der Karte brauche ich ja auch 3,3V. Müssen die HOCHkonstant sein oder könnte ich einen Spannungsteiler nehmen (die 5V sind mit 7805 stabilisiert) oder einen LM317 nehmen, um die 3,3V zu erzeugen?.
Ja, das ist das eigentliche Problem. Ich habe einen 3,3V Spannungsregler aus einem alten Kartenleser ausgebaut, der auch gleich seinen MMC-Kartenhalter opfern musste. Die Signale laufen dann über einen 4050.
Der MISO Ausgang der Karte ist direkt auf den mit 5V betrieben µC gelegt. Wird problemlos erkannt.
Zitat:
Zitat von Hackes
- Die Daten werden also im Flashspeicher gesammelt und dann erst im Block auf die Karte geschrieben!? Den Speicher soll man ja nicht so oft verwenden, wenn ich richtig gelesen habe. Hm, wie oft kann ich denn dann auf die Karte schreiben? Oder bin ich da auf dem Holzweg???.
Die Daten werden nicht im Flash gesammelt, sondern im SRAM des Mega. Du musst also 512 Byte frei haben zum Sammeln. Man kann wohl auch kleinere Bereiche beschreiben, das habe ich allerdings noch nicht probiert.
Die Karten kannst du nur begrenzt (100.000 mal?) beschreiben, also nicht immer auf dem gleichen Block schreiben. Bei mir läuft eine long-Variable hoch, die die aktuelle Sektor-Nr. hält. Problem ist bei Stromausfall, da musst du dir die Nr. irgendwo merken, z.B. im EEprom.
Zitat:
Zitat von Hackes
- Kann ich handelsübliche, aktuelle Karten nehmen oder muß ich mir eine ältere, sprich Karte mit kleinerem Speicherplatz besorgen? Wieviel MB kann ich denn ansprechen?.
Ich habe eine 256MB MMC Karte genommen, die bei einem Navi dabei war. Mit der ging es ohne Probleme. Andere Karten funktionierten nicht so einfach, keine Ahnung warum.
Zitat:
Zitat von Hackes
- Entsteht auf der Karte eine Binärdatei, die ich dann z.B. mit VisualBasic auslesen kann oder brauch ich dann noch ein spezielles Programm?.
Wie oben schon gesagt, würde ich einfach eine Textdatei mit einem Windows Texteditor erstellen. Die kannst du dann mit allen Programmen lesen.
Zitat:
Zitat von Hackes
Man oh man, soviel Unklares. Ich hoffe ich habe nicht zu sehr genervt und ihr könnt mir etwas helfen. Hat vielleicht jemand ein Stück Programmcode wo ich sehen kann wie man etwas auf Karte schreibt? Muß nur schreiben, mehr nicht.
Mein Programm wird dir nicht viel helfen, aber die eigentlichen Befehle sind nur
Dim Out_ptr As Word ' Address-Pointer für lesen und schreiben
Dim Out_sect As Long 'Sektor-Nr zum Schreiben
Dim Out_buffer As String * 512 ' Zwischenspeicher für die Daten
Dim Mmc_write_error As Byte
Out_ptr = Varptr(out_buffer) 'Pointer zeigt auf den erste Adresse von out_buffer
Gbdriveerror = Driveinit() und 'Gbdriveerror ist 0, wenn alles ok war, ansonsten Fehlercode
Mmc_write_error = Drivewritesector(out_ptr , Out_sect)
Gruß
Rolf