Forum: Projekte & Code MMC/SD ansteuern mit AVR


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von bricktop (Gast)


Lesenswert?

Hiho

Folgendes möchte ich realisieren: von MMC nur Lesen
Ich habe eine Textdatei mit kurzen Sätzen à max 20 Zeichen (=20 Bytes
?)
Diese stehen unternander. Es sind ca. 30.000 von diesen Zeilen. Nun
möchte ich, mit einer alfabetischen Tastatur ein Wort eingeben (Display
zeigt an) und der PIC soll dann dieses Wort in der auf der MMC liegenden
.txt suchen und die direkt darunter liegende Zeile auf dem Display
anzeigen. Also eine Datenbank-Applikation. Ich weis nur net, wie
Windows die .txt auf die Karte schreibt. Sie muss das Ende einer Zeile
ja immer erkennen und dann die nächste (darunterliegende) zum PIC
senden.

1.) Wenn Windows also jede Zeile (mit max. 20Bytes) in einen Sektor
(512 Bytes) schreibt, müsste er nur immer zum nächsten Sektor fahren
und dessen Inhalt ausgeben.

2.) Wenn Win aber alles hintereinander anreiht, weiß ich nicht wie man
die Zeilenenden erkennen soll. Also bräuchte man ein
"Erkennungszeichen"?!

Das ganze würde ich in ASM programmieren, weil ich mich da schon eher
auskenne. Oder ist das Unsinn, aufgrund der Ausmaße?

von Rolf F. (Gast)


Lesenswert?

@Lemming:
Es muß mkfs.msdos und nicht mkfs.dos heißen.

@ bricktop:
DOS/MS-Win verwendet "\n\r" als Zeilenendzeichen.
Unter Unix/Linux hat man nur "\n".

von Volkmar (Gast)


Lesenswert?

@bricktop:

So nebenbei: Welche Reaktionszeit erwartest Du, wenn Du 30.000
Worteinträge vergleichen möchtest?

Volkmar

von bricktop (Gast)


Lesenswert?

na das ist ne gute Frage.
Allerdings habe ich gelesen dass so eine MMC ca. 5MB/s lesen kann. Und
diese Text-Datei ist nur 500kB groß

von Volkmar (Gast)


Lesenswert?

Es hängt nicht alleine an der MMC. Sondern auch an dem Controller bzw.
der Umgebung. Schau Dir mal die Geschwindigkeitsangaben hier im Thread
an. Sie schwanken von 30kb/s bis über 400kb/s. Wobei die 400kb/s nur
durch reines sequentielles Auslesen erreicht wurden.

Volkmar

von Daniel (Gast)


Lesenswert?

Kurze Frage an euch:

Ist es denn möglich einen SD-Port Doubler zu bauen?
(an meinen Pocketpc gibt es leider nur einen SDIO-Port, ich bräuchte
aber eine WLAN Karte und eine 1GB SD-Speicherkarte..)

von Nik Bamert (Gast)


Lesenswert?

Ich weiss zwar nicht ob es möglich ist,
aber wenn dir 256 mb auch reichen würden, dann wäre
so was vielleicht eine Lösung:
http://www.sandisk.com/retail/256mb-wifi-sd.asp

von Erik Lins (Gast)


Lesenswert?

Habe seit ein paar Tagen ein neues Board für diesen Zweck fertig:
ATmega128 mit MMC/SD-Karte und ein wenig Peripherie, dazu passend
Displayboard mit LCD und Tastern und ein passendes Gehäuse. Infos auf
www.chip45.com

Viele Grüße,
ER!K

von pebisoft (Gast)


Lesenswert?

hallo, das board gefällt mir gut.
ist eine gute ergänzung für meine gameboycam-experiemente mit dem avr,
um die bilddaten (16kbyte pro bild) in die speicherkarte zu schicken.
werde es mir demnächst bestellen.
mfg pebisoft

von pebisoft (Gast)


Lesenswert?

hallo, bei mir kommen fehlermeldungen:
outb,inp,cbi,sbi
wird nicht erkannt.
wer kann mir dafür ersatzroutinen geben, damit ich die mmc-karte
auslesen kann.
mfg pebisoft

von Elektrikser (Gast)


Lesenswert?

Diese Funktionen gitbt es in der aktuellen Version von WinAVR nicht mehr
(seit 14.02.2005). Lade dir halt die aktuelle Version der MMC-Bibliothek
bei Ulrich Radig (www.ulrichradig.de) herunter. Da ist es schon länger
abgeändert.

Gruß Elektrikser

von marcelKo (Gast)


Lesenswert?

Hallo,
verwendet jemand die MMC funktionen von ProcyonAVRliB von
http://hubbard.engr.scu.edu/embedded/avr/avrlib/ ?

nach ein paar Änderungen hab ich die zum laufen bekommen und kann nun
mit 1048Mbit in 512Byte Blöcken auslesen, bei einem mega128 und 8MHz.

aber nun muss ich noch die FAT einbauen damit der MP3 player richtig
geht.
einfaches auslesen der blöcke und abspielen auf einem VS1001 geht
schon.

sehe ich das richtig, das wenn ich FAT verwende und nur lesen will, das
ich dann garnicht die CID und CSD register lesen muss ?

grüsse

von Ulrich Radig (Gast)


Lesenswert?

Hallo,

Ja das ist Richtig. Diese Register benötige ich nur zum Formatieren.

Mfg Ulrich

von marcelKo (Gast)


Lesenswert?

Ähm,
ich meinte natürlich lesen mit 1048Kbit
und schreiben hab ich gerade probiert geht mit 820Kbit.
grüsse

von Rolf F. (Gast)


Lesenswert?

Und mit welchen Karten erreicht man diese Raten?
Mit einem MSP430 habe ich bei 4 MHz SPI-Takt habe ich nur um 30 kByte/s
(Schreiben etw. langsamer, Lesen schneller) gemessen.

von marcelKo (Gast)


Lesenswert?

Hallo,
das ist eine SanDisk 256MB SD-Card.
ob andere gehen, weis ich nicht, da ich nur diese habe.
grüsse

von Mike (Gast)


Lesenswert?

Habe jetzt mal eine MMC von Reichelt erstanden. Initialisierung scheint
zu funktionieren, jedoch arbeitet der Schreibzugriff (write sector)
nicht, er liefert Null zurück. Die Leseroutine liefert ja kein
Feedback, ob sie erfolgreich war.
CID und CSD lassen sich lesen.

Any ideas?

von arampee junyai (Gast)


Lesenswert?

The Detail your disscuse, it OK. Now I make hobby project for play MP3.
I find & Search some information, After I download example from this
website. My project are successfull

Thakns
J.nut

If you want to visite to Thai, Please let me know, I take care

von Ulrich Radig (Gast)


Angehängte Dateien:

Lesenswert?

Hallo @mike

lade dir mal den neuen Source Code von meiner Webseite herunter!
Die Versionsnummer ist immernoch 2.4 hatte aber noch einen kleinen
fehler.

Mfg Ulrich

von marcelKo (Gast)


Lesenswert?

hi,
hab eine andere MMC probiert. eine nokia 32MB, die bei einem handy
dabei war.
ich bin mehr als erstaunt.
keine probleme beim initialisieren.
noch mehr erstaunt mich die datenrate.
nokia32MB:
lesen mit knapp 1,4Mbit!
schreiben mit knapp 1,3Mbit!

normal sollte doch eine sd card schneller sein ?

die SanDisk 256MB schafft nur etwas über 1Mbit lesen und knapp 800Kbit
schreiben ?

wieso ist die MMC schneller als die SD card ?
sandisk ist doch eigentlich eine gute marke ?

ich hab da noch ein problem mit der sandisk.
und zwar sollte ja im sector 0 bei FAT16 der MBR masterbootrecord drin
sein. bei der sandisk ist im sector 0 aber die VBR volume boot record.
bei der nokia ist es wie es sein sollte, sector 0 der MBR und im sector
64, wie es im MBR steht ist die VBR drin.

wer weis rat ?

ich hatte bei den ersten versuchen mit der sandisk wahllos daten in
wahllose sectoren geschrieben, worauf die digitalcam die card garnicht
mehr erkannt hat. aber windows hat die erkannt und auch formatiert.
erst nachdem ich die karte mit dem AVR " formatiert" hatte, das heist
ich habe von sector 0 bis 10000 alles mit nullen gefüllt, hat die
digitalcam die karte wieder erkannt und konnte die dann formatieren.

kann es sein, das ich bei den test versehentlich ein fuse bit gesetzt
habe, ein protect bit, sodass die card nun irgendwie keinen MBR mehr
hat ?
grüsse

von marcelKo (Gast)


Lesenswert?

so,
nun hab ich die beiden karten in der digicam getestet.
die MMC nokia speichert in der digicam die bilder 2,5mal schneller als
die SD card.
wieso ist die SD card so langsam ?
ich hab die damals gekauft, statt eine MMC, weil die angeblich
schneller sein sollte.
kann es sein, das die card mit der zeit langsamer werden, je öfter die
benutzt wird ?
grüsse

von marcelKo (Gast)


Lesenswert?

hallo,
das problem mit dem MBR hat sich nun erledigt.
es war tatsächlich ein write protect drauf.
mit dem command MMC_CLR_WRITE_PROT sieht nun die karte aus wie normal.
grüsse

von Rolf F. (Gast)


Lesenswert?

@marcelKo:
Das kann sein, da sie eine interne Speicherlogik haben, die defetkte
Sektoren durch Reserve-Sektoren ersetzt, so wie bei einer Festplatte.

von pebisoft (Gast)


Lesenswert?

hallo, wer kann mir ein mmc-aufnahmemodul als fertigen anschluss auf
eine platine anfertigen mit spannungsregler dazu, den die mmc-karte
braucht. würde ich auch mit mmc-karte fertig kaufen. über den preis
verhandle ich nicht, bezahle den übermittelten.
mail: pebisoft@arcor.de

mfg pebisoft

von marcelKo (Gast)


Lesenswert?

hallo,
hab jetzt auch eine 512MB billig reichelt MMC getestet.
marke irgendwas mit euro......

die schaft auch 1,4Mbit lesen und 1,1Mbit schreiben.

wieso ist die Sandisk SD card so langsam ?
kann es sein, das die sd karten nur im 4 bit modus wirklich schneller
als die MMC sind ?
grüsse

von Rolf F. (Gast)


Lesenswert?

Die Sandisk-Karten sind traditionell langsam, insbesondere bei der
Latenzzeit. Man findet das z. B. wenn man nach Karten-Bechmarks
googelt.

von marcelKo (Gast)


Lesenswert?

hi,
das ist gut zu hören,
den eigentlich wollte ich schon 10 euro mehr ausgeben für eine
sandisk.
aber jetzt werd ich wohl doch das billige nehmen und hoffen das die
schneller als die sandisk ist.
grüsse

von Katja (Gast)


Lesenswert?

Hab mir einen card reader besorgt der fast alle Karten liest, nur liest
er meine 128mb MMC nicht, hab keine Ahnung also bitte um Verständnis
und eine Erklärung für blöde...:-)
Er zeigt an das das Laufwerk leer ist...??!!??

HELPPPPP

von Wiskas(TM)-Jäger (Gast)


Lesenswert?

> Er zeigt an das das Laufwerk leer ist...??!!??

Dann liest er die Karte doch. Kannst du sie formatieren?

von Matze (Gast)


Lesenswert?

Help ..

wer kann mir das mit dem CMD18 und CMD23 erklären ?
möchte gerne 200 Blocks am stück auslesen, ohne pausen.

bei CMD17 muss ich immer auf 0xFE,anfang jeder Datenuebertragung
(Block) warten ...Command(0x51,H,L,0xFF)

von Thomas (Gast)


Lesenswert?

Hallo,

ich versuch gerade einen Datenlogger zu entwickeln.
Mein uC ist allerdings ein ATMega8L.
Der WinAVR Compiler mault jetzt dass er bestimmte Konstanten nicht
kennt.
Geht das mit dem ATMega8 überhaupt ? (zuwenig RAM, etc)
Hat sich schon jemadn die Arbeit gemacht den code für ATMega
umzuschreiben ?

Danke .. Thomas

von Stefan Seegel (Gast)


Lesenswert?

@Thomas:

Sollte kein Problem sein, der Mega8 hat genausoviel Ram wie der
Mega16.

@Matze:
MMC Karten arbeiten immer blockorientiert. Du kannst maximal 512 Bytes
lesen und musst dann ein neues Lesekommando senden.

Ich habe in dem Thread

http://www.mikrocontroller.net/forum/read-4-183766.html#183766

übrigens den Code von Uli noch etwas erweitert und modifiziert dass man
auch mit weniger RAM auskommt. Nochmal herzlichen Dank an Uli für das
Vorbild!

Stefan

von Thomas (Gast)


Lesenswert?

@Stefan: Danke

von Thomas (Gast)


Lesenswert?

Hallo,

gestern hab ich die MMC (Sandisk 32MB) an den AtMega8L DIL
"angelötet".
Ich hab dabei die sachaltung von Ullrich Radig genommen.
Die mmc lib ist von Stefan Seegel.

Nach dem ISP Programmieren, wird die MMC erstmal nicht erkannt.
Ein paar Mal reset gedrückt und dann wird die MMC erkannt.
Das wars dann aber leider auch schon.

Weder ein sector_read noch _write klappen.
Die Funktion kommt nicht mehr zurück.
Aus das Lesen CID und CSD Registers der MMC klappt nicht.

Die CS ist am rechten unteren Pin das AT8L (hab leider die Doku grad
nicht da).

Hat jemand einen Tip für mich ?
Wie kann man das Problem am besten analysieren ?

Was mir noch aufgefallen ist:
ISP Programmierung geht nicht mehr.
Die MMC hängt ja auf MIOS, MOSI, etc wie der ISP.
Die MMC scheint das zu stören.
Ohne MMC klappt es ganz prima.

Die Hauptschleife pollt den USART (simples terminal).
Der Timer0 lässt eine LED 1 mal pro Sek blinken.

Danke .. Thomas

von Elektrikser (Gast)


Lesenswert?

Ersetze die zwei Dioden in der Spannungsversorgung durch einen 3,3V
Spannungsregler. Bei mir funktionierte es nicht mit allen SD-Karten,
weil die Versorgungspannung um die 3,6-3,8V lag. Nachdem ich die
Spannung heruntersetzte klappte es einwandfrei...

Gruß Elektrikser

von Stefan Seegel (Gast)


Lesenswert?

@Thomas:

Also wenn man Hilfe erwartet sollte man sich vielleicht doch die Mühe
machen und rausfinden welcher Pin "rechts unten" ist...
Bei welchem Gehäuse ? DIP, TQFP, MLF ? Von wo aus rechts unten ?!

Naja, ich unterstelle einfach mal DIP Gehäuse und dass rechts unten PB1
ist (obgleich auch die Warscheinlichkeit nicht so hoch ist). Jedenfalls
schließt die Beschreibung aus dass du für CS der MMC den SS Pin des
AVRs benutzt. Das muss zwar auch nicht sein, aber zumindest  muss dann
dieser Pin richtig konfiguriert werden, da er fest zum SPI Interface
gehört. Weiteres im Datenblatt des Mega8 Seite 126.

Gruß
Stefan

von Rolf (Gast)


Lesenswert?

@Elektrikser:
Laut SD-Standard ist der zulässige Spannungsbereich 2,7-3,6 V, sofern
es sich nicht um low-voltage-Versionen handelt. Ausserhalb schalten die
Karten ab.
Zur Spannungsmessung kann man auch die SD-Karte verwenden, denn die
speichert die aktuelle Spannung in einem Karten-Register, das man
auslesen kann.

von Thomas (Gast)


Lesenswert?

@Elektrikser: Das ist mir beim ersten Nachmessen auch aufgefallen. Da
liegen bei mir mindestens 3.8V an. Ich dachte, das passt schon (wenn's
so bei Ullrich Radig funktioniert hat, ich selber bin da ziemlich
unbeleckt). Werd ich ändern.

@Stefan: mea culpa, ich entschuldige mich, hast du recht.
Ich hatte schon geschrieben welches Gehäuse "AtMega8L DIL",
bloss war ich auch noch zu blöd und hab DIL statt DIP geschrieben.
Nochmals sorry.
Das mit dem CS Pin hab ich selbst schon gefunden, leider erst nachdem
ich die obige Nachricht geschrieben hatte. Hab ich
gestern auch umgelötet. Einmal hat ein sector_read geklappt (vermutlich
ein Unfall). Allerdings hab ich CS immer noch nicht korrekt konfiguriert
und ich denke das muss wohl auf jeden Fall
sein. Werde ich am Wochenende machen.

Danke an alle für die schnelle Hilfe .. Thomas

von Elektrikser (Gast)


Lesenswert?

@Rolf

Stimmt! Habe ich aber erst gelesen, nachdem die Schaltung bei mir nicht
funktionierte. Vielleicht sollte Ullrich die Dioden aus seiner Schaltung
gleich rauswerfen und einen LD33 einzeichnen. Wenn ich es richtig
mitbekommen habe, sind schon mehrere darauf hereingefallen.

Schade, dass ich momentan wenig Zeit habe. Ich wollte eigentlich noch
die Sources von Holger Klabunde testen, aber das wird dauern...

Gruß Elektrikser

von Thomas (Gast)


Lesenswert?

Mit den beiden Dioden liegen bei mir 4.09 Volt an der Versorgung der MMC
an. Muss ich wohl doch den Spannungsregler besorgen, ...

von Mark (Gast)


Lesenswert?

Hallo,

wäre es auch möglich, mit einem AVR eine Festplatte anzusteuern, das
directory und die Daten dann jeweils umgekehrt an einen "SD-Adapter"
auszugeben? Hintergrund: der Audi A3 hat 2 SD Kartenschächte, wo ich
gern Mucke zuführen würde, oder gibt es dazu schon andere Vorschläge?

Mark

von Rolf (Gast)


Lesenswert?

Übrigens funktionieren die meisten SD-Karten nicht mit 3,0 V; man
braucht 3,3 V; im Gegensatz zu dem was der Standard angibt.

von Shadow (Gast)


Lesenswert?

Hallo zusammen,
ICh weis nich ob meine frage hier rein gehört weil ich ehrlich gesagt
keine ahnung davon habe benötige baer hilfe bei folgendem:
Ich habe mir heute bei einem an und verkauf geschäft eine 128MB MMC
card von Sandisk gekauft, diese wird jedoch in meinem handy nicht
erkannt(hängt sich auf wenn ich die karte anwählen möchte) und im
cardreader am PC kam zunächst die karte sein unformatiert, jedoch
wollte mein pc sie auch nicht formatieren und nun nach einigen
fehlgeschlagenen format versuchen kann ich die karte garnicht mehr
anwählen (so wie bei einem disketten laufwerk wo keine diskette drin
ist)!

Wäre für jede hilfe dankbar!!!!

von Rolf F. (Gast)


Lesenswert?

Die Karte ist defekt.
Auf Garantie umtauschen und gleich im Laden testen.

von Sebastian (Gast)


Lesenswert?

Hallo,

ich versuche schon seit mehreren Tagen eine SD Card mit nem ATmega128
anzusteuern und krieg es nicht zum Laufen. Die Schaltung ist im
Wesentlichen die von Ulrich mit den Wiederständen (allerdings 1k und
2k) und nem Spannungsregler für die 3,3 V. Ich hab die lib von Ulrich
ausprobiert. Die Initilaisierung macht er prima nur wenn ich dann Daten
auselesen möchte, bringt er nur Mist.
Alle Pegel scheinen vernünftig zu sein, ich habs mir stundenlang mit
dem Oszi angesehen. Die Karte antwortet auch eigentlich so wie sie
soll. Nur wenn ich nach der Initialisierung einen Block oder ein
Register auslesen will, antwortet er nicht mit einem 0xFE sondern mit
einem 0xFC und ein paar Daten dahinter. Die Menge der Daten bevor dann
wieder 0xFF kommt, stimmt auch ungefähr (128 Bit beim CSD Register oder
32 beim OCR). Nur ist der Inhalt eben totaler Blödsinn.
Er schickt auch tatsächlich ein 0xFC, das sieht alles aus wie aus dem
Bilderbuch auf dem Oszi.
Hab es auch mit langsamem Takt probiert und tausend anderen Sachen. Die
Karte verhält sich so wie sie soll schickt aber blödsinnige Daten.

Hat jemand eine Idee, was die Karte da mit mir macht?

von Toppy (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

Falls es noch jemand braucht.
Hab mal aus allen möglichen Quellen eine Zusammenfassung für FAT32
gemacht. Hoffe es hilft weiter.

Aber jetzt hätte ich auch noch eine Frage...
Sitze an einem größeren Projekt - controllerseitig bin ich fertig -
habe die Daten auf einer CompactFlash-Karte. Als FAT32-Datei.
Jedoch muss ich teilweise was in den MBR (1. Sector) schreiben.
das ich dann am PC auslesen sollte. Hat jemand Ahnung, wie ich am PC
auf die einzelnen Sektoren einer CompactFlash-Karte zugreifen kann?
Am liebsten in C++ :-)

Danke im Voraus,

Toppy

von e=mmc² (Gast)


Lesenswert?

Tag zusammen.
Ich hab da mal eine generelle Frage:
Wie schnell kann man maximal auf eine MMC Karte im SPI
Modus schhreiben ?

Ich muss 600KByte am Stück schreiben, einfach ohne Filesystem ab Sektor
0 oder so.

Das ganze wird auf einem schnelleren DSP laufen also wird nur die Karte
der begrenzende Faktor sein.

Momentan schreibe ich 300kByte/s wenn ich mehr machen will scheitert
der Datentransfer beim Sektor Write init irgendwie...
Muss ich nochmal genau gucken was ich da falsch mache.
Mein Code basiert auf dem MMC code von U. Radig, vielen Dank dafür !
Er hat mir sehr geholfen ;)

Aber bevor ich suche wüste ich halt gerne ob sich das lohnt und wieviel
ich maximal rausholen kann.
sind 2 MByte/s drin ? Oder gar mehr ?

von Uli (Gast)


Lesenswert?

Hallo @Toppy ,

Der direkte Zugriff auf einzelne Sektoren mit oder ohne Fat ist am
besten unter Linux mit dem Befehl dd möglich.

Gruss
Ulrich Radig

von Meister (Gast)


Lesenswert?

@ sebastian.
hast du einen 10µF direkt an der versorgungsspannung von der SD card ?
wenn nicht dann mach den mal dran.
so nahe wie möglich an der SD.
grü0ße

von Toppy (Gast)


Lesenswert?

@Ulrich Radig:
Vielen Dank für die Info schon mal. dann kann ich mich da schon mal ein
bisschen damit beschäftigen....

Aber das Problem ist ich wollte das in ein Prog mit reinnehmen, das mir
die Daten auswertet.
Geht das unter Windows überhaupt, oder macht da das Mircosoft OS
komplett dicht?

Danke,

Toppy

von thomas (Gast)


Lesenswert?

Hallo,
ich bin inzwischen am Verzweifeln. Es klappt einfach nicht.
Ich versuche immer noch einen Datenlogger zu bauen.
Der Baustein ist ein ATMega8L im DIL Gehäuse.
Ich hab 3 verschiedene MMC Karten probiert, SanDisk 32MB, NoName 128MB
und Toshiba miniSD 128MB. Nicht mal der Init geht, ich bekomme immer
Returcode 2 (Timeout).
Ich verwende die Lib von Ulli Radig (Version 2.4).
Die Pins sind folgendermassen definiert (für HW SPI):
#define SPI_Clock      5
#define SPI_DI        4
#define SPI_DO        3
#define SPI_SS        2
#define MMC_Chip_Select                  1
Heut hab ich noch mal die Verdrahtung geprüft (normaerweise eins meiner
üblichen Probleme) und die Pegel stimmen (3.2-3.3V).
Die Dioden hab ich mit einem Spannungswandler ersetzt.
SS ist als Output initialisiert.
Ich verwende keinen externen Quarz, sondern den internen Taktegber
(4MHZ).
Die Karte steckt in einem ISA Slot mit fliegender Verdrahtung.
Zum Testen ist der ATMega immer vom ISP getrennt.
Timer 0, ein AD Pin und UART ist belegt von eigenem Code, sonst ist da
nicht viel.

Irgendwie hab ich den Eindruck, dass was mit CLK nicht stimmt.
Wenn SPI eingeschaltet ist, kann ich nicht mehr den Pin PB5 low und
high setzen (in einer Testroutine mit sbi(PORTB, 5)).

Hat jemand noch einen Tip für mich ?

Oder gibt es irgendwo ein fertiges Modul für kleinen Preis, kleinenA
bmessungen und programmierbar ?

Danke .. Thomas

von castle (Gast)


Lesenswert?

hallo...
wieviel platz nimmt eure mmc-steuerung auf dem avr ein
(speichergrösse).

Castle

von thomas (Gast)


Lesenswert?

Hallo,

heut nacht hab ich noch was gefunden. Im mmc_init hat das Setzen der
Pins (In-/Ouput) nicht richtig geklappt (keine Ahnung wieso).
Inzwischen geht der init fast immer.

Sind da irgendwelche Macken des Compilers (Win-AVR, avr-gcc 3.4.1)
oder der anderen Tools bekannt ?

Beim Auslesen der CSD und CID Register kommt allerdings fast immer
irgend was anderes raus (bei 2 Abfragen), also fast Zufallswerte.

Einen Sektor Schreiben bzw. Lesen geht gar nicht, da kommen nur Fehler
bzw. Abbrüche.

Scheinbar funktionieren ein paar Sachen, aber es ist nicht stabil.
Hat jemand eine Ahnung woran das liegen könnte ?
Einen Kondensator zwischen GND und Vss hab ich nicht.

Der Code liegt bei 2904 bytes, Variablen hab ich schon abgespeckt.
Das müsste in die 1024 bytes locker reingehen.

Danke .. Thomas

von Geri (Gast)


Lesenswert?

Hallo zusammen

Zuerst mal: Ich finde es toll, welche Infos Ulrich Radig hier zur
Verfügung stellt!
So wie ich es verstanden habe, funktioniert die Kommunikation zwischen
MMC-card und Controller über SPI. Mich würde mal interessieren, welchen
Datentransfer man beim Schreiben und beim Lesen mit so einer Kombination
ungefähr erreichen kann (unter der Annahme, dass SPI vom Controller per
uP-Hardware realisert ist) und der Controller beim Lesen ausgelastet
ist.
Hat jemand von Euch hier Erfahrungen gesammelt?

Freundliche Grüsse und vielen Dank im Voraus
Geri

von Elektrikser (Gast)


Lesenswert?

Hallo Geri,

Holger Klabunde hat mit einer eigenen Variante der MMC- und
CF-Ansteuerung experimentiert. Er hat auch eine FAT 12/16 implementiert
und die Zeiten beim Lesen und Schreiben ausgewertet.
Schau es dir einfach mal an:
http://www.holger-klabunde.de/


Gruß Elektrikser

von Geri (Gast)


Lesenswert?

Hallo Elektrikser

Super, vielen Dank. Das is genau das was ich gesucht habe.

Beste Grüsse
Geri

von thomas (Gast)


Lesenswert?

Hallo,

inzwischen geht das Lesen des CID und CSD Registers konstant.
Allerdings nur bei der Toshiba MiniSD 128 MB, die Noname (takeMS 128 MB
steht drauf) und die SanDISK 32MB gehen nicht.
Auch egal, Hauptsache eine geht.

Lesen & Schreiben eines Sektors geht noch nicht, mal weiter sehen.

Thomas

von thomas (Gast)


Lesenswert?

Ein Tip an alle die das auch probieren wollen:

 Kauft erst mal eine Satz verschiedener Testkarten !

Meine Erfahrungen:

 + Sandisk32 hat gar nicht funktioniert.
 + Noname 128 MB (takeMS von Reichelt) geht auch gar nicht
 + Toshiba miniSD 128 MB (Reichelt), init, CID/CDS lesen geht,
   beliebigen Sektor lesen/Schreiben geht nicht
 + SanDisk 128MB miniSD (Reichelt, alles geht, juchu)

Ich hab die gleichen Ergebnisse mit der MMC Lib von Ulli Radig und
Stefan Seegel.

Thomas

von Ssss S. (sssssss)


Lesenswert?

Hi!

Also bei mir gingen bis jetzt alle Karten.
(uralte 32MB, Sandisk 256 SD, extreME 256 MMC)
Naja zumindest bis ich die eine gekillt habe 8)

Gruss,
Simon

von Uli (Gast)


Lesenswert?

Hallo,

Auf meiner HP habe ich nun auch einen neueren Source Code für den
MMC/SD Karten zugriff für den AVR und ARM. Sogar das Schreiben in eine
vorhandene Datei unter FAT ist nun möglich.

Gruss
Ulrich

von Spider84 (Gast)


Lesenswert?

I tried this code with SanDisk SD 16M - not work :(
on CMD0 card response - 0x05 (illegal command + idle)
Can any body help me?

von Manni (Gast)


Lesenswert?

Dank an Uli,

habe eine "Take-MS" 256 Mbyte Karte verwendet und seine EINFACHE H/W
Schaltung genommen sowie sein Timing Diagramm von seiner Homepage
verwendet, und den entsprechenden Code in Assembler geschrieben - SPI
mit einfachen Port Befehlen, also ohne internem SPI (habe natürlich
auch den C-Code von Uli analysiert) und siehe da, die SD Karte
funktioniert ohne Mukken.

Den Source Code werde ich noch hier im Forum ablegen.

Nochmals Dank an Uli

Gruss Manni

von Michael Stahl (Gast)


Lesenswert?

Hallo,
hab auch angefangen mit einer SD-Card rumzuprobieren. Der Source von
Ulrich Radig hat mich schon ein ganzes Stück nach vorne gebracht. Auch
die Beiträge waren alle sehr hilfreich.
Ich habe aber dennoch ein Problem:
Nach der Initialisierung möchte ich ab Adresse 0 der Karte 512 Byte
auslesen. Es kommt immer 0xFE und dann ein ganzer Sack von Nullen.
Wenn ich die SD-Card mit WinHex auslese steht ab Adresse 0 etwas ganz
anderes.
Die Karte ist mit WinXP auf FAT16 formatiert worden.
Kann mir einer helfen? ist 0xFE normal?

von Lupin (Gast)


Lesenswert?

mach mal nen ganzen dump der karte. also übertrag mal die ersten paar MB
auf deinen PC.

Dann schau mal nach ob du irgendwann was findest was dem aus winhex
entspricht.

Deine Karte ist vielleicht mit einem Master Boot Record formatiert,
d.h. WinHEX zeigt dir nur den Teil an der tatsächlich zum FAT16
Dateisystem gehört aber nicht den MBR der Karte.

Google.de hat alle infos die du dazu wissen musst :)

von Michael Stahl (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Lupin,
vielen Dank für die schnelle Antwort. Ich hab mal die ersten 2KByte der
Karte ausgelesen in 512Byte Blöcken.
Auffällig war, das jeder Block mit 0xFE begonnen hat.
Im HexDump.jpg kann man einen ausgelesenen Bereich sehen. Komisch ist,
das wenn die Daten kommen immer doppelt sind.
Konnte auch keinen übereinstimmung mit WinHex finden.
Die FAT16 besagt doch, das der MBR ab Adr 0 beginnt, 512Byte lang ist
und mit 0x55AA abschließt, oder?
Gibt es ein Programm für XP, mit dem ich die SD-Card 1 zu 1 auslesen
kann?

von Michael Stahl (Gast)


Lesenswert?

Ich bins nochmal.
Der HEX-Dump ist falsch. Bei dem Treiber von Ulrich Radig muss man beim
Auslesen eines Sectors die Sectornummer angeben. Wird dann intern auf
die Adresse umgerechnet.
Hab nochmal ausgelesen ab Adr0 und bekomme ab Adr 512 nur noch Nullen
geschickt.
Sieht so aus als wäre die Karte nicht bereit oder so? Ich arbeite an
der SPI mit 100kHz. Kann doch nicht zu schnell sein, oder?

von Michael Stahl (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
hab eine interessante Entdeckung gemacht. Ich habe ab Adresse 0xC00 512
Byte geschrieben.
Die Bytes standen in einem char Array. Das Array hab ich gefüllt mit
0x01,0x02,0x03... usw bis 0xFF und dann nochmal 0x01,0x02,0x03... usw
bis 0xFF.

Anschließend habe ich die Karte mit dem Controller ausgelesen. Im
Buffer stand 0x02,0x02,0x06,0x06,0x0a,0x0a,0x0e,0x0e,0x12,0x12 usw.

Dann habe ich die Karte mit WinHex ausgelesen und ab Adresse 0xC00
standen die Daten, welche im angehängten Bild zu sehen sind.

Wie ist das möglich?

von Lupin (Gast)


Lesenswert?

>Hab nochmal ausgelesen ab Adr0 und bekomme ab Adr 512 nur noch Nullen
>geschickt.

Ist normal, das sind die "reserved sectors" der Karte, im ersten
sektor stehen die Partitionsinformationen, da steht irgendwo ein
Eintrag mit der Adresse von der aus die tatsächliche FAT16 Partition
beginnt.

Was das mit dem schreiben auf sich hat kann ich auch nicht genau
sagen...

von Manni (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

für alle die "nur" in Assembler programmieren, hier der Source Code
für die Ansteuerung einer SD/MMC Card mit einem ATmega32. Ich habe die
"EINFACHE" H/W Schaltung von Ulrich Radig verwendet (siehe Zip file).
Die S/W ist für eine Karte von 128 Mbyte ausgelegt, kann jedoch durch
die Definition der maximal beschreibbaren Blocks a 512 Byte
entsprechend geändert werden.

Zum Testen der SD/MMC Karte habe ich ein Testprogramm beigelegt. Es
schreibt quasi zufällige Daten in die Blocks der Karte und verifiziert
danach beim Lesen die Inhalte. Bei dieser Kartengröße dauert dieser
Vorgang ca. 1.5 Stunden.

Um überhaupt "SEHEN" zu können, dass sich was im uC tut, verwendet
das Testprogramm an Port C 8 LEDs. Beim Schreiben der 245504 Blocks
leuchtet die LED von Port C0. Beim Lesen der 245504 Blocks leuchten die
LEDs von Port C0 und C1. Wenn alles korrekt gechrieben und gelesen
wurde, blinken alle 8 LEDs mit ca. 1 sec auf.

Ich gehe mal davon aus, dass alles einigermaßen selbst erklärend ist,
da ich die Dokumentation im Quellcode recht ausführlich gestaltet habe
--> Ist so ne Macke von mir.

Viel Spaß beim Ausprobieren. Kommentare sind immer Willkommen.

Gruß Manni

von Michael Stahl (Gast)


Lesenswert?

So, ich kann jetzt Daten auslesen. Es war ein Hardwareproblem. Und zwar
hab ich zum Auslesen eines Blocks einen Continius-Read benutzt.
Zwischen den einzelnen Bytes war also keine Pause. 512x8 Clocks am
Stück. Das hat der Karte nicht gefallen.
Jetzt hab ich nach jedem Byte eine kurze Pause eingefügt und siehe da,
es funktioniert.

Der modifizierte Code von Ulrich Radig läuft.
Das Direktory wird ausgelesen und die Datei MMC.TXT wird auch gefunden.
Nur mit dem Auslesen der Datei hab ich noch Schwierigkeiten. Irgendwie
funktioniert die Blockberechnung noch nicht so ganz.
Hat jemand zu dieser Blockberechnung vielleicht noch ein paar
Unterlagen oder einen nützlichen Link?

Gruß
Michael

von Hermann Mösker (Gast)


Lesenswert?

Hallo zusammen!

möchte eine SD-card im 4-bit-Mode mit einem avr ansteuern!
Hat jemand von Euch Erfahrung damit?

Wie bekommt man die Karte in den 4-Bit-Mode?
Welche Dokumentation gibt es?

Freundliche Grüsse und vielen Dank für eine Antwort

Hermann

von Stefan Seegel (Gast)


Lesenswert?

Was ist ein 4-bit Mode bei SD-Karten ?
Wo hast du das gelesen ?

Stefan

von Nik Bamert (Gast)


Lesenswert?

@Stefan so viel ich weiss ist das der Sd modus der mit vier bit läuft +
zusätzlich noch clk und steursignal, ist glaube ich auch in der hitachi
doku auf ulrich's Seite drinn, kann mich aber nicht mehr genau daran
interessieren.

@Michael
Falls du an einem fat32 System schreibst, kann ich dir
http://www.pjrc.com/tech/8051/ide/fat32.html empfehlen, ist superleicht
erklärt finde ich, allerdings auf englisch :-)

Nik

von Nik Bamert (Gast)


Lesenswert?

Hab nachgesehen und siehe da, es war das hitachi dokument :-)
Ich weiss allerdings nicht ob 4bit mmc = 4bit bei sd ist, aber ich
nehme es mal an.

http://www.ulrichradig.de/site/atmel/avr_mmcsd/pdf/hitachi_hb28b128mm2.pdf
Ab seite 22..

Nik

von Nik Bamert (Gast)


Lesenswert?

Ach Mist, hab mich verlesen, 4bit ist der noch nicht bei der MMC, bei
der SD siehts dann so aus das es einfach ein DAT0-DAT4 gibt, die CMD
und CLK leitungen bleiben bestehen. Irgendwo hab ich das Pdf aber
noch,
wo das drinn steht, werds verlinken falls ich es auftreiben kann

von Nik Bamert (Gast)


Lesenswert?

http://www.arktake.co.jp/pdf/minisd.pdf

Hab's doch noch gefunden, sehr ausführlich ist es leider nicht und
zudem noch für miniSd, aber das Prinzip ist bei Sd's so weit ich weiss
dasselbe

von Hermann Mösker (Gast)


Lesenswert?

Hallo Nik,

Danke für Deine schnelle Antwort!
Hat mir zunächst mal weitergeholfen.

Leider steht in der minisd.pdf nicht drin, wie in den sd-mode
umgeschalltet wird.
Dazu ist wahrscheinlich ein spezielles Kommando erforderlich.

werde mal weitersuchen...

Gruß
Hermann

von Hermann (Gast)


Lesenswert?

Hallo zusammen,

hab bei der Ansteuerung meiner MMC-Karte noch ein kleines Problem.
Benutze das EVA-Board von Glyn, M16C62P, SRC 2.5 von U.Radig (Danke!)
bzw. von Glyn.
Zum Testen liegt der Clock bei 200kHz.

Die Initialisierung funzt einwandfrei,
CSD/CID Lesen klappt ebenfalls problemlos.
Beim Lesen von Sectoren gibt es aber Schwierigkeiten:
Das erstmalige Lesen eines beliebigen Sectors klappt ohne Probleme,
Allerdings schlägt jeder Versuch einen weiteren Sector zu lesen fehl.
Bekomme immer die R1 Response 0x01=Error.

Konnte leider mangels Alternative nur die mitgelieferte X4Store Karte
testen.

Hat jemand dazu eine Idee? Vielleicht seh ich ja den Wald vor lauter
Sectoren nicht mehr...

Danke
Hermann

von Hermann (Gast)


Lesenswert?

Konnte Problem nun doch noch lösen ...
Lag an der Adressierung der Sectoren.
Hatte bei meiner ReadSector den Blocksizefaktor vergessen.

Hermann

von Wolfram Ebel (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Ich hab ein Problem beim Ansteuern einer SD-Karte. Ich verwende einen
ATMega162 auf einem STK500 mit einer internen Clock von 3,686 MHz.
Bei der Initialisierung (Senden von CMD0) scheint die Karte überhaupt
keine Antwort zu geben. Wenn irgendwo ein Timeout auftritt leuchtet
LED7 kurz auf. Bei erfolgreicher Initialisierung soll LED0
aufleuchten.
Bei Tests mit drei verschiedenen SD-Karten kam das selbe negative
Egebnis zu Stande.
Der Quellcode ("reines Assembler") ist im Anhang.

Wenn irgendjemand eine Idee oder Fragen hat, würd ich mich freuen.
Danke für Eure Hilfe.

Wolfram

von Oliver Erb (Gast)


Lesenswert?

Hallo Ulli,

ich verwende deinen Code (mmc u. fat) um eine MP3 Player zu
realisieren. Es klappt auch alle ganz gut, BIS JETZT. Wenn ich eine
Datei mit der Funktion fat_read_file (fstcluster,Buffer,b) lese klappt
das auch, solange ich nur einen Block lese. Ich kann jeden beliebigen
Block der Datei lesen (sieht zumindest so aus). Wenn ich jedoch die
ganze Datei Blockweise lesen lasse und über den Com Port an den PC
übertrage, bricht die Übertragung immer irgendwann ab (mal früher oder
später).

Hier der Code:

unsigned long b = 0;
int a;

for (b = (filesize/512)-1; b < (filesize/512); b++)
{
  fat_read_file (fstcluster,Buffer,b);
  for (a = 0; a <= 512; a++)
  {
    WriteC_Seriell(Buffer[a],0);
  }
  LF; // Linefeet und CR.
}

Woran liegt es das der ATmega128 stehen bleibt wenn man die ganze Datei
Blockweise nacheinander lesen will. Die Irq's sind alle I.O. und habe
auch ihren Handel. Der Watchdog ist ausgeschaltet und der ATmega läuft
mit 11.0592 Mhz.

Gruß Oliver

von Volkmar D. (volkmar)


Lesenswert?

Hallo Oliver,

zumindest solltest Du in der Schleife "a" die Abbruchbedingung
ändern:
  for (a = 0; a < 512; a++)
Sonst läuft die Schleife 513-Mal durch und nicht 512-Mal.

Deine Schleife "b" wird doch nur 1-Mal durchlaufen, oder? Der
Startwert ist gerade 1 niedriger als die Abruchbedingung.

Was passiert wenn Du die MMC/FAT-Routinen auskommentierst und nur
Dummy-Daten an den PC schickst? Wenn es dann auch abbricht, liegt es
nicht an den MMC/FAT-Routinen.

Volkmar

von Oliver Erb (Gast)


Lesenswert?

Hallo Volkmar

jo, hast Recht. Die Schleife a muss ich ändern.
Die Schleife b ist so dargestellt das ich den letzten Block der Datei
lese (ID3 tag steht da drin).
Um die ganze Datei zu lesen mache ich die Schleife so:

for (b = 0; b < (filesize/512); b++)
{...
}
Das auskommentieren der MMC/FAT-Routinen werde ich nachher mal
ausprobieren.

Gruß Oliver

von Stahl Michael (Gast)


Lesenswert?

Ich habe Probleme mit dem Auslesen der Karte. Manchmal werden Bytes
doppelt gelesen. Ich habe festgestellt, wenn man eine Pause nach
mmc_read_byte einfügt, kann man dieses Verhalten ändern. Sauber läuft
es jedoch nicht.
Ich steuer die Kart mit einem Infineon 16-Bit Prozessor an und nutze
das SPI-Interface des Prozessors. Hat irgend jemand in dieser Richtung
schon Erfahrung gesammelt?

Gruß
Michael

von Stahl MIchael (Gast)


Lesenswert?

So, ich habs. Es ist wichtig, das der Idle-Zustand des Clock-Signals
HIGH ist, und das bei steigender Flanke die Daten übernommen werden.

Hab die SPI zu Fuß programmiert.

von Martin (Gast)


Lesenswert?

Ich bin grad dabei eine Multimedia Card im SPI modus anzusteuern und
ich habe bisher nur eine von ca 5 zum laufen gebracht.

kann es sein, dass es MMC Cards oder SD cards ohne SPI modus gibt oder
wird der Fehler eher an meinem Programm bzw an meiner Verschaltung
liegen?

von Rolf (Gast)


Lesenswert?

Der SPI-Modus ist laut MMC-Spezifikation immer vorhanden, so wie auch
bei den SD-Cards. Es macht auch keinen Sinn den wegzulassen, da viele
(langsame) Kartenleser den verwenden und der Hardware-Aufwand dafür
auch auf Karten-Seite minimal ist.

von Benedikt (Gast)


Lesenswert?

Schöne Software, nur leider gibt es noch einige Fehler, wie z.B. hier:

FAT_Byte_Addresse = (Cluster*2) % BlockSize;

//Berechnung des Blocks der gelesen werden muß
FAT_Block_Addresse = ((Cluster*2) / BlockSize) +

Hier wird Cluster*2 nur als int gerechnet, es lassen sich also nur die
erste Hälfte der Sektoren ansprechen. Mit Cluster*2UL funktioniert es
aber.

Weiterhin scheint die Software nicht mit allen Karten zu
funktionieren.
Ich habe einige kleine Karten die nicht erkannt werden.

von Martin (Gast)


Lesenswert?

ich habe nun ein wenig den code von ulrich radig verwendet und da ist
mir aufgefallen, dass er bei der SPI initialisierung den CPOL (SCK high
on idle) nicht setzt. aus dem datenblatt kann man entnehmen, dass das
taktsignal für die MMC karten standardmäßig immer high sein soll.

was ist nun richtig?

von Dennis Kleine-Beck (Gast)


Lesenswert?

Hallo,

wär' chronologisch günstiger gewesen, in dem zweiten Thread
(http://www.mikrocontroller.net/forum/read-4-125350.html#new)weiterzuschreiben,
aber mittlerweile ist es sowieso schon hoffnungslos durcheinander.
Benedikts Anmerkung habe ich auch gleich mal einfließen lassen! Wie
genau äußerte sich der Fehler?

> es lassen sich also nur die erste Hälfte der Sektoren ansprechen

Pro Datei oder generell die Hälfte der Sektoren auf der Speicherkarte?

Welche Karten werden nicht erkannt? Ich habe bisher keine gefunden, die
sich nicht ansprechen lässt (MMC und SD). Allerdings läuft mein M16 nur
mit 4MHz. Als ich in der mmc_init() mal den SPI Clock-Teiler von 128
auf 64 geändert hatte, gab es schon Probleme! D.h. analog mit >= 8Mhz
extern nd 128er SPI-Teiler.

Mir ist auch aufgefallen, dass die Stromaufnahme nach der init hoch
bleibt (ca. 30mA) und erst z.B. nach einem mmc_write auf einen
Bruchteil abfällt ( < 5mA).

In mmc_write_sector() habe ich

//Wartet einen Moment und sendet x Clocks an die MMC/SD-Karte
  //for (a=0;a<100;a++)
  // mmc_read_byte();

auskommentiert. Ich denke, das braucht man nur, wenn man multiple
Blocks schreiben will (s. HITACHI Spec auf Ulrichs website). In Ulrichs
Code wird aber nur single Block geschrieben. So (und mit ein paar
inlines) konnte ich die Schreibgeschwindigkeit nahezu verdoppeln. D.h.
SDS von 55kB/s auf 95kB/s!

Gruß,
Dennis

von Benedikt (Gast)


Lesenswert?

Sobald man über Cluster 32767 hinaus geht, kommt es zu einem Überlauf
und es werden die Cluster 0-32767 nochmal gelesen.
Die obere Hälfte de Karte lies sich also bisher nicht ansprechen.

von Dennis Kleine-Beck (Gast)


Lesenswert?

Mal 'ne blöde Frage:

> Hier wird Cluster*2 nur als int gerechnet

Warum eigentlich "int". Sollte es nicht "unsigned int" ergeben?
Wären dann immerhin 0xFFFF cluster. Also bei z.B. Clustersize 2kB
immerthin 128MB.
Oder wird durch die "2" autom. alles auf "int" gecasted?


Nett wär auch noch die kurze Beantwortung der Frage, welche Karten man
meiden sollte (bzw. gerade die probieren MUSS ;-))

Gruß,
Dennis

von Benedikt (Gast)


Lesenswert?

Stimmt, es ist unsigned int, aber das Problem liegt einfach darint, dass
der Compiler eben 2xunsigned int=unsigned int rechnet und daher der
Überlauf auftritt.

Die Karte war eine 8MB Panasonic Karte, die ich aber eben auch zum
Laufen bekommen habe indem ich beide Timeout Werte bei der mmc_init
Funktion auf 250 erhöht habe. Anscheinend war die Karte nur etwas
langsamer. Mal schauen ob auch alle anderen Karten jetzt funktionieren.

von Dennis Kleine-Beck (Gast)


Lesenswert?

Also, ich habe mir die entsprechenden Werte bei der mmc_init mal auf nem
Display für verschiedene SD / MMC anzeigen lassen. Daraufhin habe ich
das timeout für CMD0 auf 25d reduziert (unkritisch) und das für CMD1
auf 250d erhöht. CMD1 ist offenbar bei manchen SD-Cards kritischer.

Erster timeout = 25d hat den Vorteil, dass die Initialisierung schnell
abbricht, wenn keine Karte eingelegt ist.

Danke für die Info! Werde mal nach Panasonic Karten Ausschau halten...

Dennis

von Benedikt (Gast)


Lesenswert?

Stimmt, den ersten Wert kann ich sogar bei der Panasonic Karte auf <100
erniedrigen, der zweite muss aber unbedingt bei >200 liegen.

von AVRNIX (Gast)


Lesenswert?

abo

von Matthias H. (matthias_hartmann)


Lesenswert?

[x] subscribe ...

von thomas (Gast)


Lesenswert?

Hallo,

ich baue immer noch an meinen Datenlogger (mit ATM8 geht's nicht, mit
ATM32 geht's scheinbar auf Anhieb). Jetzt bin ich am folgenden Punkt:
Die MMC braucht relativ viel Strom, meine Datenrate ist aber sehr
niedrig (einen Sektor all 5 Sekunden). Ich würde die Karte deshalb
gerne nur alle 5 Sekunden kurz einschalten, den Sektor schreiben und
die Karte dann wieder ausschalten. Der ATmegaekann die bis zu 40 mA
aber nicht direkt treiben, also muss ich wohl eine Transistor
dazwischenschalten.
Hat da jemand eine Schaltung parat bzw. welchen Transistor genau kann
ich dafür nehmen ?

Danke .. Thomas

von Werner B. (Gast)


Lesenswert?

Alle mir bekannten MMC/SD Karten schalten sowiso in den "sleep modus"
wenn sich längere Zeit (im ms Bereich - genaues muss man im jeweiligen
Datenblatt nachsehen) nicht angesprochen werden. Was ich festgestellt
habe ist, dass ein 100nF Keramik C direkt an den Versorgungspins des
MMC/SD Sockels/Adapters wahre Wunder bewirken kann.

von Werner B. (Gast)


Lesenswert?

P.S. Reicht dennn dein RAM im M8???

von thomas (Gast)


Lesenswert?

Danke für die Info mit dem Sleep Modus.

Das mit dem Kondensator werd ich nochmal ausprobieren.

Das RAM des ATM8 reicht. FAT brauch ich nicht und neben dem
Sektorbuffer sind da nur noch ~20 Variablen (meist Integer).
Die Probleme sind ja auch schon beim Init und nicht erst wenn ich mit
eine Sektor hantiere.

Thomas

von Florian (Gast)


Lesenswert?

Was ich noch nicht so ganz auf die Reihe kriege ist das
Formatieren/Schreiben der Karten unter Windows XP. Gibt's da nicht
irgendeine ausführliche Anleitung oder ein Tool, womit man das richtig
machen kann, damit mal eine Fehlerquelle ausgeschlossen werden kann?

von Mike (Gast)


Lesenswert?

Natürlich!
http://www.sdcard.org/Downloads.aspx
Heisst SDFormatter.

von Dennis Kleine-Beck (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

üblicherweise geht das auch mit XP-eigenen Mitteln in der DOS-Box. Man
muss evtl. nur mit dem Wert von "a" etwas spielen (ganzzahliges
Vielfaches von 1024), um am Ende "16 bits in each FAT entry" zu
erhalten.

Anbei ein Bsp. für 'ne kleine Karte (Karte ist Laufwerk f: in diesem
Bsp.).

Gruß,
Dennis

von Matthias (Gast)


Lesenswert?

Hallo,

Warum darf es nur 16 Bit in jedem Fat Datensatz geben

ich formatiere 1 oder 2 GB Karten mit 32 Bit in jedem Datensatz
ist das schlecht

gruss
Matthias

von Thomas (Gast)


Lesenswert?

Hi,
ich hab meine Datenlogger jetzt soweit (mit ATM32, ATM8 ging gar nicht).
Leider ist der Stromverbrauch recht hoch.
ATMEGA (mit 1MHz internal clock) ~ 8mA
LED ~ 5mA
MMC (MMCplus, Reichelt, 256MB) ~ 40 mA (in Ruhe!)

Die MMC braucht in Ruhe schon einen Haufen Strom.
Ich würde die MMC gerne abschalten und nur alle 5 Sekunden
kurz einschalten. Das passt auch für meine Applikation.

Leider weiss ich nicht wie ich das anstellen soll.
Analog kann ich nicht.

Ich hab mal gegoogelt und es diletantisch mit BS 170 und
BS250 MOSFET's probiert. Hat aber nicht funktioniert.

Kennt jemand ne Seite im Web wo eine MMC über einen Transistor
Schalter ein und ausgeschaltet wird.
Bitte keine allgemeinen Sachen über Transistoren, ich hätte es
gerne einfach nur zum Nachbauen ohne Grundlagen. (Frech, ich weiss)

Danke .. Thomas

von Michael P. (mipo)


Lesenswert?

Schau mal an, wie Chan das gemacht hat --> 
http://elm-chan.org/fsw/ff/00index_e.html

(In den Samples sind auch Schaltpläne drin.)

von Benedict (Gast)


Lesenswert?

Hi Leute!
ich bin gerade dabei einen GPS-Datenlogger zu bauen. Leider steh ich ein 
wenig auf dem Schlauch, wie ich das alles verkabeln soll. Könnte mal 
jemand bitte seinen schaltplan posten? Als IC hatte ich mir einen 
ATmega128 vorgestellt, oder gibt es auch eine alternative ohne SMD zu 
verlöten?

Vielen Dank und noch frohe Festtage!
Benedict

von emil (Gast)


Lesenswert?

Hallo,

beim Kompilieren von main.c (SourceCodeV2.5 von Uli) bekomme ich immer 
wieder die folgende Error-Message:

main.c:65: warning: passing arg 1 of `fdevopen' from incompatible 
pointer type
main.c:65: error: too many arguments to function `fdevopen'


Dies bezieht sich auf folgenden Funktionsaufruf in main.c:

....
//öffnet einen kanal für printf
fdevopen (uart_putchar, NULL, 0);
...

Was mache ich denn falsch?

von Volkmar (Gast)


Lesenswert?

Tippe mal auf eine neuere Compiler-Version. Ist aber ein Griff ins 
Blaue.

Volkmar

von Richard Brose (Gast)


Lesenswert?

@emil

Einfach fdevopen (uart_putchar, NULL, 0); in
fdevopen (uart_putchar, NULL); ändern.

von emil (Gast)


Lesenswert?

@Richard:

vielen Dank Richard, bin mittlerweile auch darauf gekommen, jetzt klappt 
es!

von Minipilot (Gast)


Lesenswert?

Hallo!

Habe vor Daten von einem GPS Modul auf eine SD karte zu speichen. Das 
ganze soll in einer Text Datei erfolgen. Ich habe gelesen das es möglich 
ist in einer FAT16 formatierten Karte in einer vorhandenen Datei zu 
schreiben. (z.B. wie bei dem Webserver die Bilder). Kann man auch so was 
in einer .txt Datei realisieren, wenn ja wie.


Gruß Lutz

von Marian (Gast)


Lesenswert?

Hallo,

ich versuche auch gerade mit dem SourceCodeV2.5 von Uli eine SD Karte 
anzusprechen und bekomme beim Kompilieren folgende Fehlermeldungen:

MMC_main.c: In function 'main':
MMC_main.c:100: warning: pointer targets in passing argument 1 of 
'printf' differ in signedness
MMC_main.c:107: warning: pointer targets in passing argument 1 of 
'fat_search_file' differ in signedness

fat.c: In function 'fat_search_file':
fat.c:303: warning: pointer targets in passing argument 1 of 
'strcasecmp' differ in signedness
fat.c:303: warning: pointer targets in passing argument 2 of 
'strcasecmp' differ in signedness

Ich benutze AVRstudio 4.13 mit dem neuesten Compiler und verwende diese 
Uartfunktionen:

/* Uart Routine für die printf() Fkuntion*/
int uart_putchar(char c, FILE *stream)
{
  if (c == '\n')
    uart_putchar('\r', stream);
    loop_until_bit_is_set(UCSRA, UDRE);
    UDR = c;
    return 0;
}
FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL,_FDEV_SETUP_WRITE);

In der main() habe ich noch folgendes zu stehen:
 //öffnet einen kanal für printf
 stdout=&mystdout;

Was muss ich noch ändern, damit diese Fehlermeldungen verschwinden?

Gruß,

Marian

von Werner B. (Gast)


Lesenswert?


von Marian (Gast)


Lesenswert?

@Werner B.:

Danke für den Link aber leider kann ich daraus nichts entnehmen was mit 
weiterhilft. Könntest du mir einen spezielleren Tip geben?

von holger (Gast)


Lesenswert?

Warnings sind keine Errors. Meistens kann man sie ignorieren.

Nimm einfach mal das als Beispiel:

>fat.c:303: warning: pointer targets in passing argument 1 of
>'strcasecmp' differ in signedness

strcasecmp() wird wahrscheinlich ein 'unsigned char'
als Parameter 1 übergeben, es sollte aber ein 'char'
sein. Ab Version 4.x.x sind die AVR-GCC penibler
als die früheren Versionen und meckern da rum.

Da hilft dann ein typecast mit (char).

von holger (Gast)


Lesenswert?

>Da hilft dann ein typecast mit (char).

Quatsch, natürlich mit (char *)

von Marian (Gast)


Lesenswert?

Danke Holger,

auf diese Idee bin ich auch schon gekommen aber verändere ich damit 
nicht irgendwie das Ergebnis?

von Werner B. (Gast)


Lesenswert?

Der wichtige Teil:

<cut>
The standard IO facilities API has been enhanced:

    * The backend functions put and get that are passed to fdevopen() 
during the setup of a stream now take the stream itself as an additional 
argument. By defining the macro __STDIO_FDEVOPEN_COMPAT_12 before 
including <stdio.h>, an fdevopen() function prototype will be declared 
that is backwards-compatible with avr-libc version 1.2 and before.
</cut>

von Marian (Gast)


Lesenswert?

@Werner B.:

Auch wenn ich das macro __STDIO_FDEVOPEN_COMPAT_12 vor dem einbinden der 
<stdio.h> definiere, gibt er mir diese Warnungen aus.

Ich werde das jetzt einfach casten und dann funktionierts ja.

Gruß,

Marian

von Martin W. (thepuppetmaster)


Lesenswert?

Hallöle Leute ...

Habe mich jezt auch mal mit der Ansteuerung der SD Karte beschäftigt.
Aus dem Grossen weiten netz habe ich massig an Quellcode gesammelt und 
musste feststellen, das nur 2 oder 3 % der Codes Funktionieren ...

Darum willich euch n kleinen Tip geben, woran es liegen kann, wenn Ihr 
trotz Probieren udn Probieren nicht zum Ziel kommen solltet.

Mir ist nämlich aufgefallen, das di equellcodes ansich nicht immer 
fehlerhaft sind, sondern eigentlich nur 10% der Codes leicht verbugt 
sind.

Das Grösste Problem bei der Ansteuerung sind nicht die Codes, sondern 
die Verwendete Hardware.

Wenn man die Hardware von Ulrich-Radig nuzt, mit den Transistoren, dann 
kann dies zu problemen mit einigen Quellcodes führen. (Nix gegen den 
Schaltplan von Ulrich)

Das Problem das ich ansprechen möchte ist die Geschwindigkeit der 
Kommunikation.

Ich nutze einen M16 mit 11,0592MHz Takt. Bei dieser Rate und dem 
Transistor-Levelshifter von Ulrich, kann es zu Signalverschliess kommen, 
und folglich zu fehlerhafter Kommunikation.

Wer Probleme mit der ansteuerung hat und ein Oszilloskop besizt, sollte 
sich mal die Clocksignale anschaun. Wenn diese verschliffen sind, und 
eher wie Ladekurven von Kondensatoren aussehen, dann solltet Ihr 
entweder einen anderen Quarz am µC nutzen (einen langsammeren), oder die 
Clockrate im Quellcode herab setzen.

Nachdem ich einige (bei mir nicht funktionierende Quellcodes) 
dahingehend Modifiziert habe, udn Warteschleifen, bzw. Clockraten 
geändert habe, haben diese Codes plötzlich Fehlerfrei funktioniert.

Ich kann mir zwar nicht erklären, wo das Problem mit den Transistoren 
(BC850) her kommt, da sie eigentlich eine höhere Transitfrequenz haben 
(einen höheren Frequenzgang als nötig besitzen), aber wie schon 
geschrieben, hat dies zur Lösung des Problems mit den Quellcodes 
geführt, die ich getestet habe.

In einem Quellcode nuzt jemand (weiss grad nicht von wehm das ist), die 
Shiftin udn Shiftout befehle. Um hier die Clockzeiten anzupassen, reicht 
es aus, dem Befehl noch 2 Weitere Parameter zu übergeben

(BASCOM-AVR)
Shiftout Mosi , Clk , Dat , Msbl , 8 , 500
Shiftout Mosi , Clk , Addr , Msbl , 32 , 500

Am ende gibt man zum einen eine "8" oder "32" für die anzahl der Bits 
ein, die übertragen werden sollen ("Dat" hat 8 Bits breite und "Addr" 32 
Bits), und danach eine Delay Zeit von 500 µs.

In anderen Beispielen, in denen Schliefen udn Manuelles Herausschiften 
genuzt wird, kann man eine kleine Wartesub schreiben, die eineige IPS 
abwartet, bis sich der Clockimpuls sauber aufgebaut hat.


Wer kein Oszilloskop besizt, kann auch einfach mal die Clockfrequenz 
runter setzen, auf ein extremes minimum, und eine LED über einen 1K 
wiederstand nach masse am MISO ausgang der Karte (Da wo daten zum µC hin 
laufen) an klemmen.
Bei entsprechender drosselung der Clock-zeiten, und einem 
Terminal-anschluss oder einem LCD, kann man dann schritt für schritt 
mitverfolgen, ob bei den entsprechenden Befehlen Antworten von der Karte 
gesendet werden.


Ich hoffe, ich konnte euch damit etwas weiter helfen.


MfG
TPM

von whitedog (Gast)


Lesenswert?

;) Nur ein kurzer Hinweis auf die Transistorproblematik, Leute immer 
schön dran denken dass die 'komplexen' Widerstände, insbesondere ab nen 
paar MHz sich ganz deutlich von der Gleichspannungsrechnung 
unterscheiden - nicht umsonst nennt das Datenblatt die BC-Gurke 
'low-noise' bis 15kHz ;)
Als pauschaler Tipp: nehmt MOSFETS (läßt sich leichter rechnen, da fast 
nur die Gate-Kapazität mit zu beachten ist) und wenns geht lieber nen IC 
(HC, AC, VHC, etc.) dann habt ihr die ganze Problematik nur wenn die 
Lötpunkte zu dick werden! ;)
Ansonsten, danke fürs Forum, der eine oder andere Tipp war echt 
hilfreich!

von Volker (Gast)


Lesenswert?

Hier (nach unten scrollen) gibt es ein paar nette Oszilloskopbilder zu 
dem Thema: http://www.shop.display3000.com/pi8/pi14/pd102.html
Ich vermute es liegt an der von "whitedog" und der in den Bildern 
gezeigten und nochmal beschriebenen Problematik das der Kartenanschluss 
bei vielen nicht klappt.
Volker

von Uli_2 (Gast)


Lesenswert?

@Manni Beitrag von 23.02.2006
mit SD_CARD_IF_SOFTWARE:ZIP.

Hallo habe deine Routine übernommen und diese auf 2 SD Karten zum laufen 
bekommen. 1000 Dank dafür.
Ich benutze eine 32MB SD Karte und eine 2GB MicroSD. Beide kann ich über 
das TestSDCard.asm ansteuern und testen.

Nach dem Test wird die Karte aber als unformatierte Karte unter XP 
angezeigt. Ist mir soweit auch klar, da ja alle Bereiche der Karte 
wahllos überschrieben werden.

Kann mir jemand weiterhelfen, wie ich unter Assembler die Bereiche für 
die Partition und die Fat und Dateitabelle beschreiben kann ?
Ich möchte nämlich die Daten des Atmega direkt als txt oder dat Datei 
auf der Karte ablegen, diese aber zur Auswertung an jedem Win Rechner 
einlesen können. Am Besten wären txt Datei und die Werte durch Tab 
getrennt. Somit wäre eine einfaches Importieren z.B. in Excel zur 
Datenauswertung einfach möglich.

Wer kann  mir helfen ?
Vielen Dank im voraus

Gruß uli2

von Robeterbauer (Gast)


Lesenswert?

Shiftout Mosi , Clk , Dat , Msbl , 8 , 500
Shiftout Mosi , Clk , Addr , Msbl , 32 , 500

Den scheiss oben von Bascom kann man so nicht nutzen.
Du musst dir davon mal den ASM-Source ansehen, dann wir dir schlecht.


mfg

von Gast (Gast)


Lesenswert?

Hallo,
habe jetzt auch mal das beispiel von radig probiert, leider findet mein 
avr die SD nicht, hab schon mehrere versucht und auch mal den port 
gewechselt, aber es geht einfach nicht. Gibts irgwas was man beachten 
sollte? Oder an was liegt das? Als µC hab ich einen atmega32 benutzt.

mfg

von Helfer (Gast)


Lesenswert?

>Gibts irgwas was man beachten sollte?
http://www.mikrocontroller.net/articles/MMC-_und_SD-Karten

von Gast (Gast)


Lesenswert?

Hab die Schaltung neu aufgebaut und etwas geändert, jetzt wird die karte 
immerhin erkannt, leider kommt jetzt der nächste fehler:
Karte gefunden!!

MBR Signatur not found!

Kommt bei allen karten von mir. Hab auch schon die Frequenz vom 
controller geändert und die karte mehrfach formatiert, aber immer das 
gleiche.

mfg

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.