PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SD-Karte ansteuern, viele Unklarheiten



Hackes
01.04.2007, 12:57
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.

for_ro
01.04.2007, 15:43
Dass sind ja wirklich viele Fragen.
Ich habe mal ein paar Antworten mit in den Text geschrieben.


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.


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


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


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


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


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


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


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


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

mx3
02.04.2007, 13:36
Hi!
Für so einen Datenlogger würd ich einen Palm nehmen
(Palm m100 mit 2MB oder m105 mit 8MB Speicher gibts bei Ebay ab EUR 10.-)
und mit HotPaw Basic prog.
RS232 Kabel an Palm einstecken ,fertig.

mfg,MX3

Hackes
02.04.2007, 21:04
Hallo,

@for_ro:

Hey Mann, vielen Dank für die Antworten und deine Mühe!!! Danke!!!

Viele Sachen sind doch schon klarer geworden und macht Mut das Projekt doch anzugreifen. Als Anfänger (kann zwar programieren, aber bin neu was µC angeht) sieht das doch alles etwas schwer aus.

Werde mir eine SD-Karte zulegen und dann mal rumprobieren. Sobald ich Erfolge habe (oder auch Probleme ;-)) dann werd ich mich melden.

Das mit dem Kartenleser ist eine gute Idee. Die kriegt man ja nachgeworfen und der wird dann die Teile spenden. Jetzt wundert mich der 74VHC08. Ist ja nur ein UND-Gatter in CMOS. Würde mir die Signale ja nur 1:1 durchgeben bei gebrückten Eingängen und der Ausgang geht ja bei HIGH-Pegel auch auf nahezu 5V oder wird die Betriebsspannung des IC auch auf 3,3V gelegt!? Dann denke ich würds ja klappen.

Deinen 4050 schaue ich mir nachher mal an. An welche Betriebsspannung legst Du den denn? Vielleicht kleine Skizze!???

Wenn ich alles richtig verstehe muß ich also mitzählen bis ich die 512 Byte zusammen habe und kann dann auf die Karte schreiben!?

Was heißt denn, andere Karten funktionieren nicht so einfach?

Ich hoffe, sobald der Regler da ist, mal was experimentieren zu können und werde den Code dann auch mal posten. Wird aber etwa zwei Wochen dauern bis der Regler da ist.

@ mx3:

Auch Dir danke für die Antwort. Das mit dem Palm klingt auch gut. Aber ich suche den Einstieg in díe µC und da die anderen Steuerungen in unsere Hütte auch damit gelöst werden sollen, möchte ich gern bei einem System bleiben. Und der Bastelreiz ist ja auch da. Nix für ungut!!! Wenn andere Logger gebraucht werden, dann denke ich bestimmt an den Palm.Wute ich gar nicht!

Also an Alle, ein Danke!!!

Für weitere Tips immer aufgeschlossen!

Gruß, Hackes.

for_ro
02.04.2007, 22:10
Hallo,
den 74VHC08 kannst du genau wie den 4050 mit 3,3V betreiben, aber 5V auf die Eingänge legen. Der 4050 hat halt 6 Buffer, der 7408 4 UND-Gatter. Für unsere Anwendung egal. Hinten kommen dann immer max 3,3V raus.
Ja richtig, 512 mitzählen in einen zusammenhängenden Speicherbereich, z.B. String oder byte-array. Zum Schreiben die mit VARPTR ermittelte erste Adresse übergeben.
Anfangs konnte ich nur die 256MB Medion Karte lesen und schreiben. Mittlerweile funktionieren aber alle SD/MMC, egal wie groß. Von 16MB bis 1GB hab ich schon probiert, auch die RS MMC geht.
Lesegeschwindigkeit ist bei allen gleich, maximal etwa 80KB/sec. Für mich absolut ausreichend.
Zum Testen benutze ich dieses Programm:


$regfile = "M128def.dat"
$crystal = 16000000

$baud1 = 115200
Open "Com2:" As Binary As #1
Config Clock = Soft
Enable Interrupts
Config Date = Dmy , Separator = .
Dim Mmc_error As Byte
Dim In_buffer As String * 512
Dim In_ptr As Word , Sect_no As Word ' Address-Pointer for read
Dim In_sect As Long
Dim I As Integer
Print #1 , "Wait for Drive"
$Include "Config_MMC.bas"

If Gbdriveerror = 0 Then
Mmc_error = Driveinit()
If Mmc_error = 0 Then
'Wait 1
Print #1 , "Driveinit Ok. "
In_ptr = Varptr(in_buffer)
Sect_no = 10000
Print #1 , "start read of " ; Sect_no ; " sectors"
Print #1 , "syssec=" ; Syssec()
For In_sect = 1 To Sect_no
Mmc_error = Drivereadsector(in_ptr , In_sect)
If Mmc_error = 0 Then
'Print #1 , "ReadSector(" ; In_sect ; ") ok." 'Zum Inhalt drucken, Kommentare entfernen !!!!!!!!!!
'Print #1 , In_buffer ; 'Dann wird es aber langsamer, 115200 baud beim übertragen
'Print #1 , ""
Else
Print #1 , "Error during ReadSector(" ; In_sect ; ") : " ; Mmc_error
End If
Next In_sect
Print #1 , "syssec=" ; Syssec()
Decr In_sect
Print #1 , "read " ; In_sect ; " sectors done"
Else
Print #1 , "Error during Driveinit(): " ; Mmc_error
End If
End If
End


Gruß

Rolf

Hackes
03.04.2007, 16:29
Hallo Rolf,

danke für die Antwort. Mit den ICs und deren Versorgungsspannung hatte ich mir auch so gedacht.

Danke auch für den Testcode.

Muß nach Ostern mal ne kleine SD Karte besorgen und dann ausprobieren. Juckt ja jetzt schon in den Fingern, aber naja, muß halt warten.

Man, hoffe das klappt, dann kann im Mai unser Solarprojekt steigen und wir wollen ja wissen, was wir so an Energie ernten.

Wenns klappt, melde ich mich mal zurück.

Bis dann und frohe Ostern!

Gruß, Hackes.

robby-fant
24.04.2007, 09:22
hallo, meine mmc läuft jetzt auch mit bascom, bzw die datenausgabe.
hatte vorher mal mit einem hexeditor daten auf die mmc-geschrieben, mit dem hexeditor kann man auch die sectoren gut trennen.

das mit den daten einlesen habe ich noch nicht verstanden.
wer kann mir mal die routine erklären, damit ich einen freien block ausgewählen und beschreiben kann?

läuft ein avrdos auch auf dem avr32, wenn ja, wie wird es in betrieb genommen?


mfg