mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SD Karte mit FAT 16


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HI,

ich möchte eigentlich Holger Klabundes Fat System 
(http://www.holger-klabunde.de/) für meine Schaltung verwenden. Ein 
ATMEGA32L soll auf die SD-Karte per Hardware SPI schreiben und lesen.

Da ich mit Holgers Programm bisher noch keine brauchbare Fehlermedlung 
bekommen habe, nutze ich nun Ulrich Radig´s FAT System. Über den USART 
bekomme ich dann folgende Meldungen:

***********************************************
System OK

Karte gefunden!!
0 26 0 32 5f 59 83 c8 be fb cf ff 92 40 40 d7
Directory


Directory Ende

FERTIG!!
***********************************************

Wenn ich das richtig interpretiere, dann wird die Karte zwar erkannt, 
allerdings das Dateisystem nicht, bzw. wird das Root-Verzeichnis nicht 
gefunden oder ausgelesen.

Nun ich habe die SD-Karte schon auf verschiedenste Weisen formatiert.
Die letzte Variante war:
Mit Knoppix meinen Wi***** Rechner gestartet. Dann per konsole mit 
"fdisk /dev/sda" zuerst eine leere Dos-Partitionstabelle erstellt, dann 
eine Partition mit einem FAT16 Dateiformat (Hex 6) und dann das ganze 
mit "w" geschrieben. Habe dann eine "mmx.txt" Datei erstellt in die ich 
nur den Text "Test" reingeschrieben habe.

Was mache ich also falsch ? Ich schätze das es an meiner Formatierung 
weiterhin liegt. Bin für jede Hilfe dankbar.

Autor: Andreas W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

was hast für eine Karte?
versuch mal die software von roland riegel, hab damit gute erfahrungen 
gemacht, ist hier in der code-sammlung, braucht aber momentan 15kB 
flash. da kann man aber noch etwas machen um 2-4 kB einzusparen, das war 
mir aber im moment nicht so wichtig da ich sie auf einen mega128 
einsetze.

gruß
Andreas

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verwende eine Sandisk Mini SD Karte mit Adapter auf die normale 
SD-Karten-Grösse und einen Kartenleser von Reichelt.

Ich bin mir ziemlich sicher, dass es nicht an der Software liegt, da es 
vorallem über Ulrich Radiks Software doch auch viele positive Feedbacks 
auch auf dieser Website gibt.

Der Fehler, so glaube ich liegt an meiner Formatierung. Die Karte wird 
ja erkannt nur die Debug-Messages über die USART sind für mich zu schwer 
zu interpretieren.

Ich weiss das die Hex Zahlen die Rückgabewerte der CSD-Abfrage sind, 
kann diese aber nicht interpretieren.

Aussderdem gibt die fat_read_dir_ent ein 0xffff zurück.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So geschafft, ich hatte bei der letzten Formatierung vergessen eine 
"mmc.txt" wieder anzulegen. Nun hat er den Text "Test" im HT ausgegeben. 
Bleibt dann nach der Ausgabe dort stehen.

Autor: Andreas W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die SD-karte sollte gehen wenn sie nicht größer 1GB ist.

Ich hab meine MMC Karte unter windows formatiert. mit FAT16 (heist bei 
windows FAT) und es läuft.

Könnte noch an die art der Partition liegen, hast du eine Primäre 
Partition angelegt? Schaue mal nach ob die Sektoren 512 Byte groß sind, 
sollte eigendlich so sein solange die karte kleiner gleich 1 GB ist. 
Hast du der karten einen namen gegeben?
Wie hast du die Stromversorgung gemacht? eine so eine karte zieht 
spitzen bis 200mA.

Die roland-riegel lib beruht auf ulrich radigs und die beispielanwendung 
sagt ganz genau woran sie scheitert. ob beim karte finden, Partition 
wählen, dateisystem öffnen oder hauptverzeichniss öffnen.

Autor: Andreas W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh gut, dann ist das problem ja behoben :)

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Holger Klabundes System funktioniert nun auch ;-) Zumindest erkennt er 
die Karte nun und gibt folgendes aus:

***********************************
FirstDataSector 581
maxsect 1984000
FirstDirCluster 0
maxcluster 61959
Using FAT12
Using FAT16
Using FAT32

Using FAT Buffer
MMC/SD Card
FAST_SPI_WRITE
FAST_SPI_READ
FAST_FWRITE
FAST_FREAD
F_CPU 4194304

Start writing files
  1 374.21s   5.3kB/s

*********************************

Is nich schnell aber bei der Frequenz normal oder ? Werde auch auf einen 
ATMEGA32 und dann einem Takt von 16MHz wechseln

Autor: Marian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Matthias,

ich bin auch gerade dabei Holgers Code zum laufen zu bekommen aber habe 
dabei ein paar Probleme. Der Code erkennt einfach das Dateisystem nicht. 
Könntest du vielleicht dein Programm mal hochladen, damit ich das 
vergleichen kann und somit möglicherweise meinen Fehler finde?

Schonmal Danke im Voraus.

Gruß,

Marian

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann liegt das an der Formatierung der Karte.
Lade dir mal das Tool: "Hard Disk Low Level Format Tool" runter und 
formatier deine Karte komplett. Dann in Windows XP unter 
Datenträgerverwaltung neu formatieren auf Fat. Dann geht das. ;-)

Autor: Marian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe gemacht was du geschrieben hast und das Problem besteht immer noch.
Muss ich bei der Formatierung eine bestimmte Zuordnungseinheit wählen 
oder kann ich das auf Standard lassen?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Findest du unter:

http://hddguru.com/

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich benutze genau das Programm von Holger, deswegen würde es keinen Sinn 
machen, dass hochzuspielen sry

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gib mal an, was für einen Chip, welchen Takt, welche Versorgung und 
welche Spannunsgteiler du verwendest

Autor: Marian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich nutze folgendes:

-Atmega32-L mit 7.3728MHz, d.h. SPI Takt von 57,6 KHz
-Versorgung: LiPo-Akku 3.6 V , 1200mAh

Ich verwende keine Spannungsteiler, da mein ganzes System durch 3.3V 
Spanungsregler begrenzt wird, d.h. die Pins der SD Karte sind direkt mit 
dem Atmega32 verbunden. Ich habe auch noch einen Sensor in der 
Schaltung, den ich Problemlos über SPI auslese.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok hatte ich auch zuerst, dann könnte es an den FUSE Bits liegen. Wie 
sind die eingestellt ?

Das Protokoll gibt dir wahrscheinlich "No Flash" zurück oder ?

Ist die Pin Belegung der SD-Karte richtig ? siehe http://ulrichradig.de/

Wie lange ist deine Leitung zur Karte, eventuell benötigst du Pull-Ups ?

An dem Prog liegt es jedenfalls nicht, das funkt, hab auch erst mehrere 
kleine Fehler herausfinden müssen bis es ging.

Was für eine Karte nimmst du ?

Du hast auch ganz sicher zuerst die Low Level Formatiernug gemacht ? Hat 
dann Windows die Karte erkannt und konntest du darauf zugreifen ?

>Muss ich bei der Formatierung eine bestimmte Zuordnungseinheit wählen
>oder kann ich das auf Standard lassen?

ich habs mit Standard gemacht, dann ging es.

Wird deine Karte erkannt ? MMCIdentify(); ?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Marian

Poste hier weiter, und nicht in "GCC" !

>Wird deine Karte erkannt ? MMCIdentify(); ?

Ja tut sie, aber scheinbar kommen falsche Werte aus dem CSD.
Zeigt nur 98MB statt 128MB an.
Dann wird auch der FAT Typ nicht erkannt.
SPI ist auf Minimum runtergeschraubt.

So weit zur Zusammenfassung.

Das hängt sicherlich irgendwie zusammen.

Aber was da jetzt faul ist ? Keine Ahnung.

Du benutzt einen LiPo Akku mit 3.6V und dann noch einen
Spannungsregler 3.3V. Selbst für einen LowDrop Regler
bleibt da nicht viel Marge. Hast du mal die Spannung
hinter dem 3.3V Regler gemessen ?

Autor: Marian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja sorry wegen dem Doppelpost aber in beiden wurde ich was gefragt und 
wollte halt nur nett antworten :).

@Holger:
Der Akku liefert voll geladen 4,2 Volt und das geht auch direkt an den 
Atmega. Nur die restliche Peripherie wird über den Spannungsregler 
versorgt welcher auch die 3,3 Volt am Ausgang hat.

@Matthias:

Die Fusebits sind "normal" eingestellt. Jtag aus, Brown out ist 
aus,Externe Quarz ist an. Willst du was spezielles dazu wissen?

Ja, es gibt "no flash" zurück, da er in der Readsector Routine beim MBR 
Check abbricht, da dort der bootsector größer ist als maxsector.

Tja wie lang die Leitung ist kann ich nicht genau sagen. Das ist alles 
auf einer Platine geätzt worden, schätzte so maximal 4 cm.

Ich benutze eine 128 MB MMC von Kingston.

Ja ich hab zuerst die LLF mit deinem Tool gemacht. Dann habe ich sie in 
der Datenträgerverwaltung so wie du gesagt hast formatiert.

Kann ich davon ausgehen, wenn die Karte erkannt wird (auch wenn nicht 
ganz richtig), dass die Routinen so weit funktionieren oder kann es 
sein, das er irgendwo anders die Werte herbekommt, die ich sehe?

Gruß,

Marian

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marian wrote:
> Der Akku liefert voll geladen 4,2 Volt und das geht auch direkt an den
> Atmega.

> Ich verwende keine Spannungsteiler, da mein ganzes System durch 3.3V
> Spanungsregler begrenzt wird

Was denn nun?

Autor: Marian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm war wohl etwas unglücklich ausgedrückt.

Der Atmega (und nur der) liegt direkt am Akku, der Rest wird über die 
Spannungsregler versorgt.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marian wrote:
> Hm war wohl etwas unglücklich ausgedrückt.
>
> Der Atmega (und nur der) liegt direkt am Akku, der Rest wird über die
> Spannungsregler versorgt.

Und warum hast du dann keine Levelshifter (zB Spannungsteiler)?

Autor: Marian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil uns damals, als die Schaltung gebaut wurde, nicht bekannt war das 
das wichtig ist. Laut den SPI bzw. TTL Spezifikationen sind kleine 
Schwankungen auf den Leitungen ja ok. Also haben wir unsere Platine ohne 
gebaut. Auf dieser PLatine befinden sich auch noch 2 weitere Sensoren 
(Ein Beschleunigungssensor und ein Drucksensor) die über SPI korrekt 
ausgelesen werden. Deshalb wurde bei der Erweiterung mit dem SD Karten 
Slot auch nichts an den SPI Leitungen verändert.

Ich habe ja auch schon den SourceCode 2.5 von Ulrich Radig verwendet, 
mit dem ich lesen und schreiben konnte, aber leider nicht mit voller 
zufriedenheit, da dieser Code das schreiben ja nicht voll unterstützt, 
weshalb ich nun zum Code von Holger gekommen bin.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Kann ich davon ausgehen, wenn die Karte erkannt wird (auch wenn nicht
>ganz richtig), dass die Routinen so weit funktionieren oder kann es

Ja, du kannst. Mein Programm funktioniert bei mehreren
SD/SDHC/MMC Karten. Die Kartengröße wird richtig berechnet.
Sie wird nicht richtig berechnet wenn von der Karte falsche
Werte kommen.

>sein, das er irgendwo anders die Werte herbekommt, die ich sehe?
>>Und warum hast du dann keine Levelshifter (zB Spannungsteiler)?

Das wird genau das Problem sein. Latchup der 4.2V vom Atmega
über die SD/MMC Datenleitungen in die 3.3V. Wer weiss ob die
Karte noch OK ist ?

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger wrote:
> Das wird genau das Problem sein. Latchup der 4.2V vom Atmega
> über die SD/MMC Datenleitungen in die 3.3V. Wer weiss ob die
> Karte noch OK ist ?

Tja, würde ich nicht drauf wetten. Zumindest würde ich das erstmal 
sofort abklemmen...

"Kleine Schwankungen" Wer erzählt denn so einen Mist im Bezug auf 
Levelshifting? *Kopfschüttel

Autor: Marian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In Windows kann ich sie noch beschreiben und lesen, also wird sie wohl 
noch heile sein.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal ne ganz andere Frage: Wieso wird der ATMega32L nicht
auch aus den 3.3V versorgt ? Damit könnte man einige Probleme
aus der Welt schaffen.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie hast du meine Routinen getestet ?
In dein Programm eingefügt ?

Vieleicht hast du einfach keine 1kB RAM mehr frei.
Wenn du meine Routinen benutzen möchtest solltest
du bei so wenig freiem RAM auf jeden Fall den FAT-Buffer
abschalten. Auch alle Funktionen die du von meinem
FAT nicht brauchst.

avr-size meldet die erforderliche RAM Größe
nicht ausführlich genug. Da fehlt z.B. der Stack
Bedarf. Den muss man abschätzen.

Autor: Marian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil das ein portables Gerät ist und ich ansonsten keine Batterieanzeige 
für den Akku hätte. Wenn ich den Atmega an 3,3 Volt hänge, kann ich ja 
den Bereich von 4,2 bis 3,3 V leider nicht messen. Also haben wir den 
ADC etwas missbraucht und Aref an den Akku gelegt, so dass wir als Aref 
jetzt die Akkuspannung haben (damit die immer größer oder gleich groß 
der zu messenden Spannung ist). Dann haben wir an ADC0 die 3,3 Volt 
gelegt und quasi den ADC invertiert um somit den Batterieverbrauch zu 
ermitteln.

Ich hoffe das war jetzt richtig nausgedrückt :).

Autor: Marian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab dein Programm ohne alles andere getestet. Ich habe error-Codes 
eingebaut, die ich mir über Bluetooth an meinen Laptop schicke, weshalb 
ich auch weiß, dass es beim MBR Check hängen bleibt.
Das AVRstudio gibt einen RAM bedarf von 74,8% aus. Ich habe auch 
versucht alles abzuschalten was ich nicht benötige, wie z.B. Dateien 
erstellen oder löschen usw.

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst du denn wenigstens mal ausprobieren, den AVR (sowie den Rest) mit 
3.3V zu versorgen? Es könnte ja durchaus sein, dass da teilweise einige 
Bits verrutschen (Sind denn die Ergebnisse immer gleich?), wenn du die 
SD ein gutes Stück ausserhalb der Spezifikation betreibst. Sind in den 
Datenleitungen denn wenigstens Widerstände?

Die Akkuspannung hättest du übrigens auch messen können, ohne den AVR an 
die Betriebsspannung zu hängen. Mit einem sehr hochohmigen 
Spannungsteiler und (falls nötig) den unteren Widerstand an einem 
Port-Pin statt direkt an GND müsste sich die Spannung recht sparsam 
messen lassen.
Ist der Stromverbrauch denn überhaupt ein grösseres Kriterium 
(Akkulaufzeit)? Dann solltest du nämlich die SD und alles andere Zeugs 
auch abschalten können. Das ist alles nicht unbedingt so sparsam.

Autor: Marian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Kannst du denn wenigstens mal ausprobieren, den AVR (sowie den Rest) mit
3.3V zu versorgen?

Möglich ja aber etwas schwierig ,da alles auf einer Platine verbaut ist. 
Ich könnte den Akku abtrennen und ein Labornetzteil dran hängen.

>>Es könnte ja durchaus sein, dass da teilweise einige
Bits verrutschen

Ich denke nicht das Bits verrutschen, da die Ergebnisse immer gleich 
sind und  bei den anderen Sensoren auch keine Schwankungen auftreten. 
Wie oben schon erwähnt sind dort keine Widerstände? Kann mir mal bitte 
einer erklären warum diese Spannungsteiler bzw. Levelshifting so wichtig 
ist? Darüber habe ich mir noch nie so den Kopf gemacht, da die anderen 
Sensoren über SPI perfekt funktionieren. Ist eine SD Karte anfälliger 
für Störungen?

>>Ist der Stromverbrauch denn überhaupt ein grösseres Kriterium
(Akkulaufzeit)? Dann solltest du nämlich die SD und alles andere Zeugs
auch abschalten können. Das ist alles nicht unbedingt so sparsam.

Hm das man die Akkuspanung auch so messen kann wusste ich noch nicht. Ja 
die Akkulaufzeit ist sehr wichtig, weshalb ich auch das Bluetooth und 
den Rest immer abschalte sofern ich ihn nicht benötige. Im Moment will 
ich halt nur die SD Karte zum laufen bekommen, um meine Daten Online und 
"in freier Wildbahn" aufnehmen und abspeichern zu können.

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marian wrote:
>>>Kannst du denn wenigstens mal ausprobieren, den AVR (sowie den Rest) mit
> 3.3V zu versorgen?
>
> Möglich ja aber etwas schwierig ,da alles auf einer Platine verbaut ist.
> Ich könnte den Akku abtrennen und ein Labornetzteil dran hängen.

Dann solltest du aber den Spannungsregler rausnehmen und überbrücken, 
sonst hast du wegen dem Spannungsabfall des Reglers wiederum eine 
tiefere Spannung an der Karte (Und am Rest der Schaltung).

>>>Es könnte ja durchaus sein, dass da teilweise einige
> Bits verrutschen
>
> Ich denke nicht das Bits verrutschen, da die Ergebnisse immer gleich
> sind und  bei den anderen Sensoren auch keine Schwankungen auftreten.
> Wie oben schon erwähnt sind dort keine Widerstände? Kann mir mal bitte
> einer erklären warum diese Spannungsteiler bzw. Levelshifting so wichtig
> ist? Darüber habe ich mir noch nie so den Kopf gemacht, da die anderen
> Sensoren über SPI perfekt funktionieren. Ist eine SD Karte anfälliger
> für Störungen?

Ganz einfach: Wenn die SD-Karte mit 3.3V versorgt wird, der AVR aber 
(schlimmstenfalls) mit 4.2V, dann liegt an den Eingängen der Karte eine 
um 0.9V höhere Spannung als Vcc an. Das geht nicht gut...

>>>Ist der Stromverbrauch denn überhaupt ein grösseres Kriterium
> (Akkulaufzeit)? Dann solltest du nämlich die SD und alles andere Zeugs
> auch abschalten können. Das ist alles nicht unbedingt so sparsam.
>
> Hm das man die Akkuspanung auch so messen kann wusste ich noch nicht. Ja
> die Akkulaufzeit ist sehr wichtig, weshalb ich auch das Bluetooth und
> den Rest immer abschalte sofern ich ihn nicht benötige. Im Moment will
> ich halt nur die SD Karte zum laufen bekommen, um meine Daten Online und
> "in freier Wildbahn" aufnehmen und abspeichern zu können.

Dann ist ein Linearregler eigentlich fehl am Platz. Für sowas gibt es 
ganz kleine Schaltregler, da wird dann wenigstens auch keine Leistung 
verheizt (Oder nur sehr wenig). Ausserdem musst du auch beachten, dass 
auf der Versorgungsleitung für die Karte genügend grosse Kondensatoren 
sitzen. Die will beim Schreiben schonmal 100mA oder so.


BTW: Welchen Thread denn jetzt?

Autor: Daniel (x2) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe damals keine Level-Shifter benutzt da das Datenblatt des 
Atmegas zeigte, dass die Pins ungefähr Vcc-0.5V ausgeben. Bei einer 
durchschnittlichen Akkuspannung von 4V käme man somit auf 3.5V. Das ist 
nicht die feine Art, allerdings sollten 0.2V ein TTL-Signal nicht in dem 
Maße beeinflussen.

Das ist alles schon ne Weile her und Marian hat nun eine fertig 
bestückte Platine. Einfach mal Umlöten sollte also nur als Notlösung 
dienen.

Grüße,
Daniel

Autor: Marian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also seltsam ist das schon alles. Heute morgen habe ich nochmal ein 
wenig im Programm was geändert wie z.B. unnötige Errorcodes entfernt und 
den FAT-Buffer und andere Routine mal defined und wieder undefined und 
siehe da, jetzt geht es. Kann mir das einfach nicht erklären! Ich teste 
jetzt mal die Karte vollständig zu beschreiben, dauert ja ne Weile. 
Danach melde ich mich nochmal.

Vielen Dank an alle die sich mit mir hier so lange rumgeschlagen haben!

Gruß,

Marian

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel (x2) wrote:
> ich habe damals keine Level-Shifter benutzt da das Datenblatt des
> Atmegas zeigte, dass die Pins ungefähr Vcc-0.5V ausgeben.

Wo steht denn sowas? Die AVRs haben 2 Fets, die gegenläufig verschaltet 
sind am Port. Die Spannung, die bei einer 1 am Port anliegt, hängt vom 
Strom ab, der dort fließt.
Wenn du allerdings ne Steuerleitung anschließt (Strom ziemlich klein) 
liegt die Spannung bei nahezu VCC.

Autor: Daniel (x2) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wo steht denn sowas?

Wie erwähnt, ist das alles schon ziemlich lang her. Ich denke, es stand 
im Datenblatt des Atmega32.

Autor: Marian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK die 128 MB zu beschreiben habe ich mal unterbrochen, das dauert mir 
etwas zu lange :).

Habe nun einfach etwas in die Datei hineingeschrieben und es 
funktioniert endlich. Wo der Fehler lag, weiß ich leider immer noch 
nicht.

Nochmals danke an euch!

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel (x2) wrote:
>>Wo steht denn sowas?
>
> Wie erwähnt, ist das alles schon ziemlich lang her. Ich denke, es stand
> im Datenblatt des Atmega32.

Du hast garnicht mal so unrecht. Im Mega16 Datenblatt steht:

VOH (Output High Voltage)
bei Vcc = 5V; IOH = -20mA
->4,2V

Beachte aber, dass das bei 20mA Stromfluss ist. Deine Steuerleitung wird 
kaum dauerhaft 20mA ziehen. Ergo wird die Spannung am Portpin noch etwas 
höher sein, als 4,2V.

Autor: Marian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Holger:

Eine Frage hätte ich noch. Auf deiner Homepage steht folgendes :
>Ein reines Lesesytem für FAT12/16/32 kommt mit ca. 5kB Code aus. Ein KLEINES 
Schreib/Lesesystem mit ca. 10kB. Wenn man ALLE Funktionen benutzen möchte, kann es 
in einem ATMega16 schon ziemlich eng werden. RAM Bedarf ohne FAT-Buffer ca. 0.7kB. 
Mit FAT-Buffer 1.2kB

Bei mir sieht der RAM Bedarf leider nicht so aus. Ohne FATbuffer steht 
bei mir 1099 Bytes und mit FATbuffer 1651 Bytes. Ich habe folgendes 
defined:
// #undef defines below in "mydefs.h" if you don't need them
// spare program memory by deciding if you want to read, write or both
#define DOS_READ  //define this if you want to read files
#define DOS_WRITE  //define this if you want to write files
// spare program memory by deciding if we want to use FAT12, FAT16, FAT32.
// don't touch if you don't know the FAT type of your drive !
#define USE_FAT16  //define this if you want to use FAT16

Wieso wird bei mir mehr RAM benötigt als bei dir? Muss ich zusätzlich zu 
den undefines noch mehr auskommentieren?

Gruß,

Marian

Autor: Daniel (x2) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Beachte aber, dass das bei 20mA Stromfluss ist. Deine Steuerleitung wird
>kaum dauerhaft 20mA ziehen.

Meine Pins ziehen immer 20mA! :P:P:P
Hehe, es scheint ja nun zu funktionieren - so schlecht kann die 
Schaltung also nicht gewesen sein. :)

Autor: Ingmar Rosenhagen (irosenhagen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey,
bin auch gerade dabei an MMC/SD mit FAT zu werkeln.
Lesen klappt schon gut und recht schnell.
Jetzt will auch noch das schreiben implementieren. Dazu wollt ich mal 
fragen wie ich das am sinnvollsten angehe:

1) In der FAT einen freien Sektor suchen und die Adresse im Root Dir 
eintragen
2) den nächsten Sektor suchen und dessen Adresse im vorigen eintragen.
3) 512 Byte Daten an die adresse des vorigen schreiben
4) Loop über 2/3 bis das Schreiben beendet ist.

Das wäre jetzt meine spontane Vorgehensweise.
Voraussichtlich fallen ca 32kbit also 4kB Daten an (IMA APDCM bei 8kHz). 
Da ich vorher nicht weiß wie lange ich jeweils aufzeichne kann ich 
leider nicht vorher berechnen wieviele Cluster ich ungefähr brauche und 
da schon mal eine Clusterkette schreiben lassen.

Autor: GAST (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den Atmel auch an die 3,3V hängen und den Akku hochohmig über einen 
Spannungsteiler an einen A/D Port hängen. Zieht dann praktisch kein 
Strom und wenn du keine Spikes detektieren willst, dann geht das auch 
wunderbar.

Größenordnung so um die 100k/100k, dann bist du bei 4,2V Akku bei 2,1V 
A/D.
Zieht dann etwa 20µA, was ok ist denke ich, ggf. kannste die Were noch 
hochschrauben. Dann würde ich aber einen Kerko oder so noch 
dhinterhängen, wen der A/D seine paar µA zieht. Das geht bei mir ganz 
gut...

Autor: Martin M. (martin69)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe nun auch versucht, eine SD-Karte anzusprechen. Erst gabs 
Probleme aufgrund verschliffener Signale durch den Spannungsteiler an 
den Signalen (vermutlich C´s in der Karte und parasitäre Kapazitäten 
durch den wilden Testaufbau). Hab dann den SPI-Takt herunter gedreht und 
nun gehts.

Weil es am Anfang mit Ulrich Radigs Software nicht ging (aufgrund des 
oben beschriebenen Probleme) habe ich die Software von Roland Riegel 
getestet. Da die mir aber zu kompliziert ist, habe ich nach dem Finden 
des Fehlers wieder die von Ulrich Radig verwendet.

Die geht auch soweit. Allerdings ist mir aufgefallen, daß das Programm 
die Daten bei der Übertragung "verfälscht". Wenn Daten von der Karte 
geholt und auf die Schnittstelle geschickt werden, dann passiert 
folgendes:

Ist ein Zeichen 0x0D (LF) in der Datei auf der SD-Karte enthalten, dann 
wird über die Schnittstelle anschließend ein weiteres 0x0D bei der 
RS232-Übertragung zum PC eingeschoben.

z.B.
Daten auf Karte: 0x00 0x00 0x0D 0xFF 0xEE
vom PC empfangen: 0x00 0x00 0x0D 0X0D 0xFF 0xEE

Bei Text ist das nicht so kritisch, aber ich habe ein Bitmap übertragen, 
das danach etwas "verschoben" ausgesehen hat.

Bin bisher nicht dahinter gekommen, wo das passiert. Hat jemand ne 
Erklärung dafür? Kommt das schon von der SD-Karte so oder gibts da in 
der Software eine Stelle, wo dieses 0x0D eingeschoben wird? Falls ja, 
was ist der Grund dafür?

Autor: Martin M. (martin69)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab das Problem mit den "eingeschobenen "0x0D" gelöst. Es wurde nicht 
nach einem 0x0D, sondern vor einem 0x0A (das erwähnte Beispiel entsprach 
nicht ganz der Realität - hab 0x00...0xff ausgegeben und geschaut, an 
welcher Stelle das Problem passiert). Habe nun einfach ne neue Funktion 
geschrieben, die den Bufferinhalt vn der SD-Karte 1:1 weiter gibt.

Der Dateizugriff (Lesen) auf Daten vom Hauptpfad der SD-Karte 
funktioniert nun problemlos. Hab auch die Größe der gesendeten Datei auf 
die tatsächliche Dateigröße begrenzt.

Kann man mit der Software von Ulrich Rading auch irgendwie auf Dateien 
auf Unterpfaden zugreifen?

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Beispielcode für Assembler -freunde:

Beitrag "SD-Karte Initialisierung Read Write FAT ATmega8 (Assembler)"


Bernhard

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.