Difference between revisions of "SD CARD (Deutsch)"
(→Anschluss) |
(→Control6) |
||
| Line 60: | Line 60: | ||
== [[Control6_(Deutsch)|Control6]] == | == [[Control6_(Deutsch)|Control6]] == | ||
| + | |||
| + | Hier vielleicht ein kleines Beispiel, das die Daten per VFS_LOG in die Datei "temp.log" schreibt sobald sich die Temperatur um mehr als ein Grad zur letzten Messung verändert hat. | ||
| + | |||
| + | <pre> | ||
| + | #include <stdlib.h> | ||
| + | |||
| + | int16_t Temperatur; | ||
| + | int16_t Temperatur_alt; | ||
| + | |||
| + | CONTROL_START | ||
| + | |||
| + | THREAD(read_temp) | ||
| + | Temperatur = ONEWIRE_GET(10d85594010800eb); | ||
| + | ON abs(Temperatur-Temperatur_alt)>10 DO | ||
| + | uint8_t sign = Temperatur<0; | ||
| + | div_t res = div(abs(Temperatur),10); | ||
| + | VFS_LOG("temp.log", "temperature changed %S%d.%d",sign?PSTR("-"):PSTR(""),res.quot,res.rem) | ||
| + | Temperatur_alt = Temperatur; | ||
| + | END | ||
| + | WAIT(15); | ||
| + | THREAD_END(read_temp) | ||
| + | |||
| + | ON STARTUP DO | ||
| + | Temperatur = Temperatur_alt = 0; | ||
| + | THREAD_START(read_temp); | ||
| + | END | ||
| + | |||
| + | CONTROL_END | ||
| + | </pre> | ||
Revision as of 11:58, 4 June 2013
| SD/MMC-Card Reader | |
|---|---|
| Status | Stable
|
| menuconfig | I/O->SD/MMC-Card Reader |
| Pinning | yes |
| Ecmd | yes |
| Control6 | yes |
| Depends on | ECMD |
| Code | https://github.com/ethersex/ethersex/tree/master/hardware/storage/sd_reader |
Das Modul basiert auf Roland Riegels MMC/SD/SDHC card library ergänzt um die Anbindung an das Ethersex Virtual File System.
Contents
Anschluss
MMC- und SD-Speicherkarten lassen sich im SPI-Modus relativ einfach mit einem Mikrocontroller ansteuern. Prinzipiell gibt es zwischen SD-Card und MMC nicht viele Unterschiede, allerdings sind SD-Karten weiter verbreitet, in der Regel schneller als MMCs, und haben ein besser implementiertes SPI-Interface. Es existieren diverse Varianten (miniSD, microSD), die zur normalen SD-Card weitgehend kompatibel sind.
Die Karte liest das anliegende Datenbit mit der steigenden Taktflanke ein, als SPI-Modi eignen sich somit Mode 0 und Mode 3. Bei MMCs ist der SPI-Modus nicht genau spezifiziert, somit kommt es durchaus mal vor, dass der SPI-Modus je nach Karte unterschiedlich gewählt werden muss.
SD-Karten werden typischerweise mit 3,3V und Microcontroller oft mit 5V betrieben. Das erzwingt eine Pegelanpassung, weil die Eingangsleitungen zur SD-Karte nicht 5V tolerant sind. Von einer Pegelanpassung mit Widerständen wird abgeraten.
Neben den Leitungen, die zur SD-Karte führen, gibt es noch zwei weitere Leitungen, die auf den SD-Karten-Sockel führen: nämlich die card-detect Leitung und die write-protect Leitung. Sie dienen dazu, wie die Namen schon sagen, das physische Vorhandensein einer Karte im SD-Sockel und die Stellung des Schreibschutzschiebers zu signalisieren.
Wird Hardware-SPI verwendet, muss nur die chip select Leitung konfiguriert werden. Die card-detect Leitung und die write-protect Leitung sind optional.
ifdef(`conf_SD_READER', ` /* port the sd-reader CS is attached to */ pin(SPI_CS_SD_READER, PB2, OUTPUT) /* uncomment and edit this if you have connected the CD (card detect) signal */ pin(SD_READER_AVAILABLE, PD4, INPUT) /* uncomment and edit this if you have connected the WP (write protected) signal */ pin(SD_READER_WR_PROTECT, PD5, INPUT) ')
Konfiguration
| | General Setup ---> | |
...
| | [*] VFS (Virtual File System) support ---> | |
...
| | [*] SD/MMC-Card Filesystem | |
| | I/O ---> | |
...
| | [*] SD/MMC-Card Reader ---> | |
...
| | [ ] SDHC support | |
| | [*] VFAT LFN support | |
| | [ ] Read-only mode | |
| | [*] Use read-timeout | |
| | [*] Ping-read SD card every 10s | |
| | --- Debugging Flags | |
| | [ ] SD-Reader | |
ECMD
Control6
Hier vielleicht ein kleines Beispiel, das die Daten per VFS_LOG in die Datei "temp.log" schreibt sobald sich die Temperatur um mehr als ein Grad zur letzten Messung verändert hat.
#include <stdlib.h>
int16_t Temperatur;
int16_t Temperatur_alt;
CONTROL_START
THREAD(read_temp)
Temperatur = ONEWIRE_GET(10d85594010800eb);
ON abs(Temperatur-Temperatur_alt)>10 DO
uint8_t sign = Temperatur<0;
div_t res = div(abs(Temperatur),10);
VFS_LOG("temp.log", "temperature changed %S%d.%d",sign?PSTR("-"):PSTR(""),res.quot,res.rem)
Temperatur_alt = Temperatur;
END
WAIT(15);
THREAD_END(read_temp)
ON STARTUP DO
Temperatur = Temperatur_alt = 0;
THREAD_START(read_temp);
END
CONTROL_END