Hallo,
ich fange neu mit der Programmierung von Microcontrollern an, kenne mich
mit C und C++-Bereich aber schon sehr gut aus.
Nun möchte ich auch die Möglichkeit haben, Daten extern zu speichern.
Meine Frage: soll ich dafür lieber USB-Sticks oder SD Cards nehmen? Daa
Dateisystem ist erst einmal zweitrangig, ich würde aber gerne FAT32
verwenden.
Ist das mit akzeptablem Aufwand machbar? Und gibt es ansonsten bessere
Lösungen?
Wenn ihr eine der beiden angedachten Speichermedien bevorzugt, könnt ihr
mir dann nach Möglichkeit bitte auch noch sagen, wie man das konkret am
besten verwendet? Die Lösung soll letztendlich auf eine
Lochrasterplatine aufgelötet werden. Es reicht vermutlich nicht, einfach
die vier Pins einer USB-Buchse mit VCC, GND und zwei I/O-Ports zu
verbinden und mithilfe von C eine Datei zu erstellen, oder? Wenn doch,
was ist der Pfad?
Nach dem, was ich bisher gelesen habe, muss ich einen Host-Controller
einbauen. Hat da jemand ein Beispiel, den man auch auflöten kann?
Ich möchte den Microcontroller auch nicht direkt mit einem PC verbinden.
Deswegen sind Device-Controller wohl für meine Zwecke nicht zu
gebrauchen.
Auf jeden Fall danke schon einmal im Voraus!
Wie du schon richtig erkannt hast brauchst du einen Mikrocontroller der
als USB Host arbeiten kann, wenn du einen USB Stick benutzen möchtest.
Mir scheint daher der Weg über SD Karten einfacher, denn SD Karten
unterstützen einen SPI Modus und SPI hat nun wirklich jeder
Mikrocontroller. Wenn es schnell werden soll haben einige ARM
Mikrocontroller auch ein SDIO Interface. Zum ansprechen bietet sich die
FatFs Bibliothek (http://elm-chan.org/fsw/ff/00index_e.html) an. Da hast
du dann auch dein gewünschtes FAT Dateisystem. Hier im Wiki sind auch
noch einige vermutlich hilfreiche Links:
https://www.mikrocontroller.net/articles/MMC-_und_SD-Karten
Danke schon einmal für die schnelle Antwort.
Das Problem ist, dass ich irgendwie absolut keinen SD Card Reader zum
Auflöten finde. Hast du da einen Link für mich, bevorzugt bei reichelt?
Externe libs lassen sich dabei wohl auch nicht vermeiden, oder?
Ich habe bereits einen ATmega8A da. Die ARMs sind aber auch insgesamt
für meinen Geschmack zu teuer. Dafür zerlege ich die Dinger zu oft. Gibt
es sonst einen IC, um den ATmega8A entsprechend um USB zu erweitern?
Weshalb kann man denn nicht einfach den USB-Slot verbinden und mit
Softwarelösungen (dafür gibt es doch mit Sicherheit libs) den USB-Stick
ansteuern?
Asker schrieb:> Das Problem ist, dass ich irgendwie absolut keinen SD Card Reader zum> Auflöten finde.
Die SD-Karte bietet SPI und SDIO als Schnittstelle an. Beide können von
Mikrocontrollern bedient werden. Bei SDIO sollte diese aber auch
hardwareseitig unterstützt werden. Ein SD-Card-Reader ist auch nur ein
SDIO<->USB Umsetzer.
Asker schrieb:> Weshalb kann man denn nicht einfach den USB-Slot verbinden und mit> Softwarelösungen (dafür gibt es doch mit Sicherheit libs) den USB-Stick> ansteuern?
USB Fullspeed (brauchst du für einen USB-Stick) arbeitet mit 12 MHz. Das
macht man nicht per Software und ein AVR schafft das auch nicht einmal
ansatzweise.
Schau dir am besten FatFS an und versuche das zum Laufen zu bringen. Das
ist um Längen einfacher als ein USB-Host.
Asker schrieb:> Externe libs lassen sich dabei wohl auch nicht vermeiden, oder?
Wenn man alles selbst schreibt kann man das schon vermeiden aber eine
Library zum einlesen eines FAT Dateisystems ist mal nicht an einem
Nachmittag geschrieben.
Asker schrieb:> Ich habe bereits einen ATmega8A da.
Der dürfte schon recht knapp sein mit seinen 8KB Flash. Die Variante von
der FatFS Library für kleine 8Bit Mikrocontroller spricht von 2K-4K
Flash bedarf. Je nachdem was du da sonst noch an Code drauf hast sind
die 8KB schnell voll.
Asker schrieb:> Die ARMs sind aber auch insgesamt für meinen Geschmack zu teuer.
Was heißt denn zu teuer? Einen STM32f103c8t6 Beispielsweise kriegt man
bei Reichelt für 3,50€, in China sogar für 1,50€ das Stück. Das Problem
ist wohl eher, dass es die meist nur als SMD Variante gibt.
zum Basteln kann man auch einen Adapter SD zu Micro_SD direkt einlöten
und dann die Micro_SD karte tauschen wie man will.
libs gibt es einige, erste Testläufe habe ich an einem Feierabend
hinbekommen. Ist aber schon eine Weile her.
Aufpassen ist: Das ganze gilt nur für SD-Karten bis max. 2GB Größe. Die
anderen heißen SDHC undsoweiter. Da ist der Anschluß hardwareseitig
anders, das geht so also nicht!
Asker schrieb:> Nun möchte ich auch die Möglichkeit haben, Daten extern zu speichern.
Das solltest du etwas genauer beschreiben. Wenn du z.B. kontinuierlich
Daten erfasst und die dann auf die SD Karte schreiben willst, dann musst
du wissen, dass diese Karten Auszeiten von bis zu 500ms nehmen können,
in denen du nicht schreiben kannst und die Daten zwischenspeichern
musst.
Bei einigermaßen hohen Datenanfall und 8-Bit Controllern mit doch eher
kleinem RAM kann das schnell mal zum Problem werden. (Ging mir gerade so
mit ~11kB Daten/s und etwas weniger als 4kB RAM)
nixundnul schrieb:> Aufpassen ist: Das ganze gilt nur für SD-Karten bis max. 2GB Größe. Die> anderen heißen SDHC undsoweiter. Da ist der Anschluß hardwareseitig> anders, das geht so also nicht!
Nö der ist gleich, zumindest bei SPI. Die Unterschiede sind "nur" in
Software. D.h. man nimmt (oder portiert) das neueset Chan FATFS und hat
SDXC Support.
Allerdings ist der SPI Modus bei MicroSDHC/MicroSDXC optional, ich habe
hier aber noch keine Karte ohne SPI Mode gesehen. Dafür allerdings
Karten mit Bedenkzeiten von ca. 1 Sekunde, aber das mit dem großen
Puffer im RAM haben ja schon andere hier angesprochen.