Forum: Mikrocontroller und Digitale Elektronik SD Karte (1GB) mit AT89C4051 beschreiben?


von Peter R. (koal)


Lesenswert?

Hallo,

ich arbeite von der Schule her an einem Projekt wo ich regelmäßig 
ankommende Daten(wie temperatur,uhrzeit und soche sachen) auf eine SD 
Karte abspeichern muss damit manns dann am PC als .txt datei bekommt.

Ich hab mich im Forum hier durchklickt und hab mir dabei einige ähnliche 
"projekte" angschaut und mir ist aufgefallen das die meißten da AVR 
controller verwenden und des niemand den µC verwendet den ich 
werwende... oder einen ähnlichen also 8051.

Deshalb hab ich mich jetzt gefragt ob das überhaupt möglich ist mit dem 
AT89C4051 erstens weil ich halt nirgends was ähnliches gefunden habe und 
zweitens weil nachdem ich ma die Datenblätter über den Physikal layer 
von der SD Card ein wenig durchgelesen hab , habe ich mir gedacht das 
der µC das viellecht nicht packt weil er wenig RAM hat und das Befehle 
für die SD-Card ziemlich lang sind und ausserdem im vergleich zu anderen 
µC die ich ma noch angeschaut habe hat der keinen SPI aber ich will ja 
die Karte im SPI modus verwenden....

Aber die Anforderungen sind halt auch nich wirklich hoch das einzige was 
ich machen will ist, Daten (max. so 50Byte) die in regelmäßigen 
abständen zum µC kommen auf die SD karte schreiben. Schnell braucht das 
ganze nicht sein... und die Daten sollen dann als eine .txt Datei auf 
der Karte sein damit manns am PC auslesen kann.


Ich hoffe jemand kann mir da weiterhelfen ich bin für jeden Hinweis 
dankbar.

mfg Peter

von Matthias (Gast)


Lesenswert?

Die meisten Programme sind in C geschrieben. Mit ein wenig Anpassung an 
die Microcontroller- und Compilerspezifik lassen sich AVR Programme 
meist problemlos auch für 8051-Systeme oder umgekehrt verwenden.

SPI muss nicht als Hardware vorhanden sein, lässt sich leicht als 
Software implementieren.

RAM des AT89C4051 sollte ausreichen. (Nimm lieber AT89S4051!)

Als C-Compiler gibts SDCC als freeware.

von Peter R. (koal)


Lesenswert?

Danke für die Antwort.

Ürsrünglich hatte ich ja vor in Assembler zu schreibn aber naja :D i 
glaub i werd doch der einfachheit halber in C schribn...

von Matthias (Gast)


Lesenswert?

Du musst Dir im Klaren sein, dass so ein Projekt nicht gerade als 
Einstieg geeignet ist. Einige Erfahrungen in ANSI C und von 
Microkontrollern solltest Du schon haben. Es wird nicht funktionieren, 
wenn Du den Programm-Kode der Beispiele nicht verstehst und Dir die 
Funktionen und Arbeisweise der SD-Karte / FAT nicht 100%ig bekannt sind.

von Peter R. (koal)


Lesenswert?

naja ich hab bisher eigentlich nur C++ programmiert und naja ich sag 
amal Miniprogramme in Assembler sprich a paar LEDs ansteuern.... also du 
hast recht mir fehlt sicher einiges an Grundwissen das merk ich ständig 
wenn ich versuche die Datenblätter zu studieren...

Als ich zugestimmt habe den Part zu übernehmen hatte ich keine Ahnung 
wie komplex so eine SD karte ist ich hab mir eigentlich gedacht des da 
kein großer Unterschied zu an normalen EEPROM ist. Ich bin erst jetzt im 
nachhinein draufkommen das das ein IC ist...

Im moment bin ich dabei die Datenblätter vom physical layer von der SD 
Karte zu studieren und ich schreibs mir halt auf Deutsch zusammen und 
hoffe das ich dadurch schlauer werde :D

mfg Peter

von Olaf (Gast)


Lesenswert?

Du kannst eine SD/MMC Karte nur in Bloecken von 512Bytes beschreiben.
Wenn man dann noch bedenkt das dein Programm ja auch selber noch
etwas Speicher braucht ist die absolut unterste Grenze wo ich
das fuer sinnvoll halte 1kB Ram.

Wenn du dann noch eine halbwegs brauchbare FAT16 Implementierung 
schreiben willst dann wuerde ich schon so 8kb haben wollen, 128kb waeren 
aber netter.

Allerdings kannst du natuerlich deine Datei an einer festen Position 
ablegen und so beschreiben, aber auch dann sollten es schon 1kB sein.

Olaf

von Peter R. (koal)


Lesenswert?

Das heisst ich kann mir meinen AT89C4051 mit 128 Byte RAM abschminken 
wenn ich des jetzt richtig verstehe...

Als alternative hätte ich noch einen ATMEGA16 der hat auch SPI und 1k 
SRAM mit dem müsste es dann gehn?




Olaf wrote:

> Allerdings kannst du natuerlich deine Datei an einer festen Position
> ablegen und so beschreiben, aber auch dann sollten es schon 1kB sein.


Meinst du damit ich könnte eventuell auf FAT verzichten?

mfg Peter

von Falk B. (falk)


Lesenswert?

@ Peter R. (koal)

>Das heisst ich kann mir meinen AT89C4051 mit 128 Byte RAM abschminken
>wenn ich des jetzt richtig verstehe...

Ja.

>Als alternative hätte ich noch einen ATMEGA16 der hat auch SPI und 1k
>SRAM mit dem müsste es dann gehn?

Ja.

>Meinst du damit ich könnte eventuell auf FAT verzichten?

Naja, dann kann dein PC aber nicht wirklich einfach Dateien lesen. Dann 
müsstest du auf dem PC ein Programm schreiben, das feste Sektoren 
ausliest und verarbeitet. Der Aufwand ist auch nicht wesentlich geringer 
als eine FAT Umsetzung, zum es davon schon dutzende fix und fertig gibt.

MFG
Falk

von Peter R. (koal)


Lesenswert?

achso na also es soll schon benutzerfreundlich sein sprich mann schiebt 
die Karte rein und eine .txt Datei is da...

mfg peter

von Falk B. (falk)


Lesenswert?

Also ist FAT ein MUSS.

MFG
Falk

von Philipp (Gast)


Lesenswert?

> Du kannst eine SD/MMC Karte nur in Bloecken von 512Bytes beschreiben.

Laut Spezifikation kann man eine nicht SDHC-Karte (also eine SD 1.0) 
auch mit einzelnen Bytes beschreiben.

von Martin (Gast)


Lesenswert?

> auch mit einzelnen Bytes beschreiben

Woher nimmst du diese Info?

von Peter R. (koal)


Lesenswert?

also was i weis is des die mind. blockgröße 512bit is und deshalb kamma 
nur mindesten 512bit Daten schreiben...

btw. zu meinem projekt: hab an ATmega32 und ich versuch die ganze sache 
mit den routinen von holger-klabunde.de zu realisieruen ... gar nicht so 
einfach^^ (für mich jedenfalls :D )

von Harald (Gast)


Lesenswert?

Hallo Peter,
ein Kollege von mir hat sich auch schon mal lange mit Beschreiben von 
SD-Cards beschäftigt. Es sind ja nicht nur die Probleme, die beim 
grundsätzlichen Umsetzen (Protokoll, FAT) viel Zeit in Anspruch nehmen. 
So ganz nebenbei kommen auch noch so Eigenheiten wie Timing-Unterschiede 
zwischen verschiedenen Karten. Also wenn die eine läuft, muss es noch 
lange nicht mit einer weiteren funktionieren. Daher mein Vorschlag der 
Umstieg auf ein Produkt, das USB-Sticks beschreiben kann:
http://www.vinculum.com/prd_vdrive1.html

Ich habe das Produkt bereits mal getestet, funktioniert sehr gut. Und 
über die serielle Schnittstelle kann man dann Daten lesen und schreiben. 
Alle Kommandos  sind sehr einfach gehalten. Es funktionierte mit allen 
auffindbaren USB-Sticks, keine Inkompatibilitäten festgestellt.

Vor allem aber: Man kann sich auf die wesentliche Aufgabe konzentrieren!

von Peter R. (koal)


Lesenswert?

naja hab eh scho dacht des usb die einfachere variante gewesen wäre da 
viel mehr verbreitet...

aber zu diesem zeitpunkt is bei mir nimmer möglich umzusteigen(Hardware 
is schon in da fertigung und auf mmc/sd ausgelegt)

mfg Peter

von frank (Gast)


Lesenswert?

Ich hätte da einen Tip:

Wir haben das schon mal an der Uni realisiert, war gar nicht so schwer!

Das mit den 512 Byte stört aber nicht, denn unsere Karte war 64MB groß 
und wir haben einfach die 128 Byte RAM komplett und den Rest mit Nullen 
geschrieben. Ein Zähler hat die Blöcke hochgezählt und so hatten wir 
über 128000 Blöcke, also Messwerte. Die Karte (war bei uns MMC) wird 
einfach von Anfang bis Ende beschrieben. Das Auslesen ist noch 
einfacher. Kein Programm oder sowas... ein dd in Linux und alles ist 
super. Dann ein kleines Skript, das die Messwerte aus dem Dump parst und 
alles ist da. Keine Ahnung was man Adressieren kann aber müsste wohl bis 
2GB gehen. Einfach mal Knoppix (Bootcd) oder Ubuntu (installieren) 
nehmen und ausprobieren.

Der dd Befehl lautet


dd if=/dev/sdb of=daten.dump count=128000

if -- Inputfile
of -- Outputfile
count -- Zahl der Blöcke


bei mir ist sdb die SD-Karte. mache als root ein

fdisk -l

dann siehst du wo was liegt.

Aber ganz wichtig ist vor der Benutzung ein

dd if=/dev/zero of=/dev/sdb

machen!! Das setzt alle Bytes auf 0. Der Befehl bricht ab wenn alles 
gesetzt ist. Falls die automtisch gemountet werden sollte erst 
unmounten.
Das ist zwar verschwenderisch, aber die Karten sind doch so billig...


viel Spaß

von Gast (Gast)


Lesenswert?

> blockgröße 512bit is und deshalb

Hey, bitte nicht Bit und Byte verwechseln.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.