Forum: Mikrocontroller und Digitale Elektronik SD Karten Library für ATMega gesucht


von Jan H. (jan_h865)


Lesenswert?

Hallo,
Ich bin zureit auf der suche nach einer SD Karten Library für mein 
Projekt. Da ich gerne die ganzen Sensor Wert(Temperatur, Luftdruck, Lux, 
etc...), in einer Daten speichern möchte die ich später auf dem Computer 
auslesen kann.
Da fiel mir die SD Karte ein.
Mit der FatFs Library komme ich nicht wirklich klar. Da ich nicht 
verstehe wie die Library eine Verbindung zu der SD Karte aufbaut.

Kennt einer von euch eine einfache Library für SD Karten? Oder kann mir 
jemand die FatFs erklären?

Mfg jan.

von Falk B. (falk)


Lesenswert?

@Jan Hampel (jan_h865)

>Mit der FatFs Library komme ich nicht wirklich klar.

Schade, die ist nämlich ziemlich gut.

>Da ich nicht
>verstehe wie die Library eine Verbindung zu der SD Karte aufbaut.

Das muss dich nicht interessieren, es funktioniert.

>Kennt einer von euch eine einfache Library für SD Karten? Oder kann mir
>jemand die FatFs erklären?

Was geht denn nicht? Bei Elm Chan gibt es Beispielprojekte für den AVR, 
die kann man mit SEHR wenig Aufwand an seinen speziellen AVR anpassen. 
Man muss nur die Pins für CS und SPI anpassen, das war's!

von Jan H. (jan_h865)


Lesenswert?

Falk B. schrieb:
> Man muss nur die Pins für CS und SPI anpassen, das war's!

Hmm, ich habe jetzt die Library genutzt die man bei fssample in dem 
Ordner avr findet. Dort gibt er aber 108 Fehler, hauptsächlich bei "To 
be filled".

Habe ich da die falsch genommen?

Mfg Jan.

von Falk B. (falk)


Lesenswert?

@Jan Hampel (jan_h865)

>Hmm, ich habe jetzt die Library genutzt die man bei fssample in dem
>Ordner avr findet. Dort gibt er aber 108 Fehler, hauptsächlich bei "To
>be filled".

???

>Habe ich da die falsch genommen?

Keine Ahung, bei meiner Version gibt es 2 avr-Ordner, einmall 
avr_foolproof und avr_complex.

von Jan H. (jan_h865)


Lesenswert?

Falk B. schrieb:
> Keine Ahung, bei meiner Version gibt es 2 avr-Ordner, einmall
> avr_foolproof und avr_complex.

Okay, bei mir gibt es nur avr. Wenn ich dort die Dateien rausnehme und 
in mein Projekt rein packe. Gibt es viele Fehlermeldungen. Die Meisten 
sind bei "To Be Filled"
1
/* Peripheral controls (Platform dependent) */
2
#define CS_LOW()    To be filled  /* Set MMC_CS = low */
3
#define  CS_HIGH()    To be filled  /* Set MMC_CS = high */
4
#define MMC_CD      To be filled  /* Test if card detected.   yes:true, no:false, default:true */
5
#define MMC_WP      To be filled  /* Test if write protected. yes:true, no:false, default:false */
6
#define  FCLK_SLOW()    To be filled  /* Set SPI slow clock (100-400kHz) */
7
#define  FCLK_FAST()    To be filled  /* Set SPI fast clock (20MHz max) */

CS_Low und High ist klar. Aber mmc_CD und WP weiß ich nicht was ich dort 
rein schreiben soll. Die Funktionen power_off() und power_on() habe ich 
komplett herausgenommen da am SPI Bus noch andere Gerät mit dran hängen. 
FCLK_slow und Fast habe ich ebenfalls herausgenommen da ja mehrere 
Geräte am Bus dran hängen

Könntest du mir vielleicht deine FatFs Library senden?

mfg jan.

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

@Jan Hampel (jan_h865)

>/* Peripheral controls (Platform dependent) */
#define CS_LOW()    To be filled  /* Set MMC_CS = low */
#define  CS_HIGH()    To be filled  /* Set MMC_CS = high */
#define MMC_CD      To be filled  /* Test if card detected.   yes:true, 
no:false, default:true */
#define MMC_WP      To be filled  /* Test if write protected. yes:true, 
no:false, default:false */
#define  FCLK_SLOW()    To be filled  /* Set SPI slow clock (100-400kHz) 
*/
#define  FCLK_FAST()    To be filled  /* Set SPI fast clock (20MHz max) 
*/


>CS_Low und High ist klar. Aber mmc_CD und WP weiß ich nicht was ich dort
>rein schreiben soll.

CD card detect
WP write protect

die setzt man konstant auf true und false

>Die Funktionen power_off() und power_on() habe ich
>komplett herausgenommen

MÖÖÖP!!!

Fehler!

>da am SPI Bus noch andere Gerät mit dran hängen.

Das ist egal. Man darf den INHALT der Funktion entfernen, aber nicht die 
Funktion an sich!!!

>FCLK_slow und Fast habe ich ebenfalls herausgenommen da ja mehrere
>Geräte am Bus dran hängen

FEHLER!!! Du brauchst die!

>Könntest du mir vielleicht deine FatFs Library senden?

Siehe Anhang. Das ist ein altes Projekt mir einem ATmega64.

von Jan H. (jan_h865)


Lesenswert?

Falk B. schrieb:
> Siehe Anhang. Das ist ein altes Projekt mir einem ATmega64.

Hallo Falk.

Danke erstmal! Ich habe grade mal über dein Code angeschaut. Also wenn 
ich damit eine SD Karte lesen will brauche ich also denn 1 ms Timebase 
Timer um alle 10 ms die disk_timerproc() Funktion auszuführen.

Sonst noch die diskio.h, ff.c, ff.h, ffconf.h, integer.h, mmc.c richtig?

Was ich nicht verstehe ist du hast bei Card Detected eine Abfrag auf 
Port F Pin 0. Der CS Pin ist aber Port B Pin 0 was hängt dann am Port F 
Pin 0?

Und dann mit f_mount() das ganze Initialisieren.

Wäre das so richtig?

mfg Jan.

von Sebastian V. (sebi_s)


Lesenswert?

Jan H. schrieb:
> Was ich nicht verstehe ist du hast bei Card Detected eine Abfrag auf
> Port F Pin 0. Der CS Pin ist aber Port B Pin 0 was hängt dann am Port F
> Pin 0?

Card Detect und Chip Select sind grundverschiedene Dinge. Card Detect 
ist ein Kontakt im SD Karten Slot der dir sagt ob eine Karte eingelegt 
ist oder nicht. Gleiches für Write Protect das die Position des kleinen 
Schiebers an der SD Karte detektiert. Zum testen kannst du Card Detect 
einfach zu "true" definieren und Write Protect zu "false". Wenn dir die 
Funktionalität wichtig ist kannst du die defines später immer noch durch 
einen echten Test tauschen.

von Falk B. (falk)


Lesenswert?

@Jan Hampel (jan_h865)

>ich damit eine SD Karte lesen will brauche ich also denn 1 ms Timebase

Es reicht eine 10ms Zeitbasis, in meinem Projekt hab ich halt 1ms 
genommen, weil ich das für andere Dinge brauchte.

>Timer um alle 10 ms die disk_timerproc() Funktion auszuführen.

Ja.

>Sonst noch die diskio.h, ff.c, ff.h, ffconf.h, integer.h, mmc.c richtig?

Es fehlt noch ccsbcs_avr.c, wenn du lange Dateinamen mit Unicode 
unterstützen willst.

>Und dann mit f_mount() das ganze Initialisieren.

Ja.

von Jan H. (jan_h865)


Lesenswert?

Falk B. schrieb:
>>ich damit eine SD Karte lesen will brauche ich also denn 1 ms Timebase
>
> Es reicht eine 10ms Zeitbasis, in meinem Projekt hab ich halt 1ms
> genommen, weil ich das für andere Dinge brauchte.
>
>>Timer um alle 10 ms die disk_timerproc() Funktion auszuführen.
>
> Ja.
>
>>Sonst noch die diskio.h, ff.c, ff.h, ffconf.h, integer.h, mmc.c richtig?
>
> Es fehlt noch ccsbcs_avr.c, wenn du lange Dateinamen mit Unicode
> unterstützen willst.
>
>>Und dann mit f_mount() das ganze Initialisieren.
>
> Ja.

Hi Falk!
Ich habe nun denn Code übernommen und angepasst. Jedoch sagt er immer:
undefined reference to "ff_wtoupper"   in ff.c  Zeile 3029
undefined reference to "ff_wtoupper"   in ff.c  Zeile 3029
undefined reference to "ff_convert"    in ff.c  Zeile 3029
undefined reference to "ff_convert"    in ff.c  Zeile 3029

Der Fehler tritt aber auch erst auf nachdem ich in meiner Main die 
f_opendir Funktion aufrufe: rc = f_opendir(&dir, "/test");

Kannst mir da weiter helfen?

Mfg Jan.

von Sebastian V. (sebi_s)


Lesenswert?

Du musst noch die ccsbcs_avr.c von Falks Projekt einbinden oder Long 
Filename Support ausstellen (in der ffconf.h das _USE_LFN define von 1 
auf 0 ändern)

von Jan H. (jan_h865)


Angehängte Dateien:

Lesenswert?

Sebastian V. schrieb:
> Du musst noch die ccsbcs_avr.c von Falks Projekt einbinden oder Long
> Filename Support ausstellen (in der ffconf.h das _USE_LFN define von 1
> auf 0 ändern)

Hallo Sebastian.

Dankeschön. Danach hat er bei denn oben genannten Fehlern nicht mehr 
rumgemeckert. In der ccsbcs_avr.c wurde "prog_uint16_t" verwendet. Diese 
Typenbezeichnung kannte der Compiler nicht. Nach kurzen Googlen habe ich 
auf der Atmel Seite herausgefunden das, die "Funktion" veraltet ist. Ich 
habe daraus dann "PROGMEM uint16_t" gemacht. Danach konnte ich es ohne 
Fehler Kompilieren.

@Falk
Es wäre zu schön gewesen das es direkt beim ersten mal geklappt hätte, 
leider findet das Programm denn Ordner "test" nicht auf der SD Karte.

Ich habe im Programm Code das so programmiert das er nach dem f_mount(0, 
&Fatfs); Das Verzeichnes "test" öffnen soll. Und gebe dann aus ob er es 
gefunden hat oder nicht. Leider sagt er immer "not found".

Das einige was ich geändert habe ist in der mmc.c bei CS Low und High 
auf PB3 angepasst, und Sockins auf 1.

Im Seriallen Monitor kommt nur folgendes an:
1
Init the SD Card
2
SD Card successfully Init!
3
Opening Directory test
4
Free MegaBytes: 0 MB
5
Result: 3
6
Open!
7
Directory not found!

Karte ist noch zu 968 MB Frei. Also nix drauf. Nur der test Ordner.

Ich habe meine main Datei mal angehängt. Die SD Karte kommt in mein TFT 
Display rein dort ist ein Sockel mit dran. RST, DC , tft cs sind nicht 
angeschlossen. TFT Display bekommt auch Strom weil es damit auch die SD 
Karte versorgt.
Sonst sind folgende Klasse eingebunden:
ccsbcs_avr.c, diskio.h, ff.c, ff.h, ffconf.h, integer.h, mmc.c.

//EDIT: Auch wenn keine SD Karte im Sockel ist. Kommen die gleichen 
Nachrichten an. Kann es sein das was mit der SPI Kommunktion nicht 
funktioniert? Ein 10 Kiloohm Widerstand ist zwischen 3,3V und SD_CS.

Mfg Jan.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@Jan Hampel (jan_h865)

>Es wäre zu schön gewesen das es direkt beim ersten mal geklappt hätte,
>leider findet das Programm denn Ordner "test" nicht auf der SD Karte.

Hmmm.

>Ich habe im Programm Code das so programmiert das er nach dem f_mount(0,
>&Fatfs); Das Verzeichnes "test" öffnen soll. Und gebe dann aus ob er es
>gefunden hat oder nicht. Leider sagt er immer "not found".

>Das einige was ich geändert habe ist in der mmc.c bei CS Low und High
>auf PB3 angepasst, und Sockins auf 1.

Hmm.

>Init the SD Card
>SD Card successfully Init!
>Opening Directory test
>Free MegaBytes: 0 MB

Das ist schon mal schlecht, hier muss was gescheites angezeigt werden. 
Man sollte man zuerst die Clustergröße in MB umrechnen und dann mit der 
Anzahl freier Cluster multiuplizieren, denn sonst gibt es einen Überlauf 
bei Karten mit > 4GB.
1
FATFS *fs = &Fatfs;
2
DWORD free_cluster, free_MB;
3
4
 rc = f_getfree("0:", &free_cluster, &fs);
5
 free_MB = free_cluster * (fs->csize / 2048);

>Result: 3

  FR_NOT_READY,      /* (3) The physical drive cannot work */

Da funktiooniert was grundlegendes nicht.

>Ich habe meine main Datei mal angehängt. Die SD Karte kommt in mein TFT
>Display rein dort ist ein Sockel mit dran. RST, DC , tft cs sind nicht
>angeschlossen. TFT Display bekommt auch Strom weil es damit auch die SD
>Karte versorgt.

Klingt nach Arduino-Shield ;-)

>Sonst sind folgende Klasse eingebunden:
>ccsbcs_avr.c, diskio.h, ff.c, ff.h, ffconf.h, integer.h, mmc.c.

Nö, das sind ganz normale C-Dateien mit Funktionen. Klassen gibt es nur 
bei C++.


>//EDIT: Auch wenn keine SD Karte im Sockel ist. Kommen die gleichen
>Nachrichten an. Kann es sein das was mit der SPI Kommunktion nicht
>funktioniert?

Sieht so aus.

>Ein 10 Kiloohm Widerstand ist zwischen 3,3V und SD_CS.

Der ist nebensächlich. Man braucht einen Pull-Up von MISO nach +3V3 
direkt an der SD-Karte. Der fehlt bei einigen Boards und damit 
funktioniert die Initialisierung nur m,it Glück.

: Bearbeitet durch User
von Mike J. (linuxmint_user)


Lesenswert?

Jan H. schrieb:
> Kennt einer von euch eine einfache Library für SD Karten?

Ich habe einige SD-Librarys probiert und finde die von ElmChan sehr gut.
http://elm-chan.org/fsw/ff/00index_e.html

von Jan H. (jan_h865)


Lesenswert?

Falk B. schrieb:
> Da funktiooniert was grundlegendes nicht.

Hi Falk nochmal.

Indirekt. Denn ich habe eine SD Karte 32 GB. Warum auch immer das 
Dateisystem ist RAW. Und nicht FAT32. Wenn ich diese einsteckt sagt er 
Fehlercode: 13: "There is no valid FAT volume". Stimmt das Dateisystem 
ist RAW.

Bei einer 1 GB SD Karte sagt er Fehlercode: 1(Ist aber am Computer 
lesbar, schreibbar)
Bei einer 2 GB MicroSD Karte mit Apdater sagt er Fehlercode: 3.

Also muss die SPI Kommunikation einwandfrei arbeiten

Falk B. schrieb:
> Klingt nach Arduino-Shield ;-)

Ja, ist richtig. Habe ich selber gebastelt.

Falk B. schrieb:
> Der ist nebensächlich. Man braucht einen Pull-Up von MISO nach +3V3
> direkt an der SD-Karte. Der fehlt bei einigen Boards und damit
> funktioniert die Initialisierung nur m,it Glück.

Ich habe ein 4,7 kiloOhm Widerstand dort hinzugefügt. Leider hat es 
nicht geändert.

von Falk B. (falk)


Lesenswert?

@ Jan Hampel (jan_h865)

>Indirekt. Denn ich habe eine SD Karte 32 GB. Warum auch immer das
>Dateisystem ist RAW. Und nicht FAT32. Wenn ich diese einsteckt sagt er
>Fehlercode: 13: "There is no valid FAT volume". Stimmt das Dateisystem
>ist RAW.

Was soll das? FATfs kann nur FAT12/16/32!!!

>Bei einer 1 GB SD Karte sagt er Fehlercode: 1(Ist aber am Computer
>lesbar, schreibbar)
>Bei einer 2 GB MicroSD Karte mit Apdater sagt er Fehlercode: 3.

>Also muss die SPI Kommunikation einwandfrei arbeiten

Nicht zwangsweise.

von Jan H. (jan_h865)


Lesenswert?

Falk B. schrieb:
> Was soll das? FATfs kann nur FAT12/16/32!!!

Okay? Auf der Website steht "FatFs is a generic FAT/exFAT file system 
module for small embedded systems"

Falk B. schrieb:
> Nicht zwangsweise.

Wie meinst du das?

Mfg Jan.

von Falk B. (falk)


Lesenswert?

@Jan Hampel (jan_h865)

>Okay? Auf der Website steht "FatFs is a generic FAT/exFAT file system
>module for small embedded systems"

Und wo steht da was von RAW????

Wenn die Software RAW erkennt, obwohl FAT32 formatiert ist, dann stimmt 
was grundlegendes nicht mit dem SPI-Zugriff.

>> Nicht zwangsweise.

>Wie meinst du das?

Daß ich immer noch meine, daß dein SPI NICHT sauber läuft.
Wenn möglich, schau dir die Signale mit einem Oszi oder wenigstens Logic 
Analyzer an.

von Jan H. (jan_h865)


Lesenswert?

Falk B. schrieb:
> Und wo steht da was von RAW????
>
> Wenn die Software RAW erkennt, obwohl FAT32 formatiert ist, dann stimmt
> was grundlegendes nicht mit dem SPI-Zugriff.

Nein nein, sorry falsch ausgedrückt. Also die SD Karte ist kaputt und 
zeigt unter Windows "RAW" an und kann nicht drauf zu gegriffen werden. 
Man kann sie auch nicht mehr formatieren.
Also es ist kein FAT Dateisystem auf der SD Karte. Und das meldet FatFs 
das dort kein gültiges FAT Dateisystem drauf ist.

Also meiner Ansicht ist das richtig.

Falk B. schrieb:
> Daß ich immer noch meine, daß dein SPI NICHT sauber läuft.
> Wenn möglich, schau dir die Signale mit einem Oszi oder wenigstens Logic
> Analyzer an.

Ein richtiges Oszi habe ich nur so ein 15 Euro DSO138 Oszi. Logic 
Analyzer habe ich auch nicht.
mfg Jan

von Falk B. (falk)


Lesenswert?

@Jan Hampel (jan_h865)

>> Wenn die Software RAW erkennt, obwohl FAT32 formatiert ist, dann stimmt
>> was grundlegendes nicht mit dem SPI-Zugriff.

>Nein nein, sorry falsch ausgedrückt. Also die SD Karte ist kaputt und
>zeigt unter Windows "RAW" an und kann nicht drauf zu gegriffen werden.
>Man kann sie auch nicht mehr formatieren.
>Also es ist kein FAT Dateisystem auf der SD Karte. Und das meldet FatFs
>das dort kein gültiges FAT Dateisystem drauf ist.

Kannst du mir mal erklären, was das soll? Warum in aller Welt testest du 
mit einer DEFEKTEN SD-Karte?

von Jan H. (jan_h865)


Lesenswert?

Falk B. schrieb:
> Kannst du mir mal erklären, was das soll? Warum in aller Welt testest du
> mit einer DEFEKTEN SD-Karte?

Ich habe die ganze Zeit mit einer 1GB SD Karte(von 2010) die Library 
getestet. Nachdem ich mir die ganzen Fehlercodes angeschaut habe, habe 
ich gesehen das Fehlercode 13 auftritt wenn kein gültiges FAT 
Dateisystem auf der Karte ist. Da fiel mir die SD Karte ein, die mal 
kaputt gegangen wahr. Ich habe diese nur verwendet um zu schauen ob die 
SPI Kommunikation richtig arbeitet. Was sie ja offensichtlich ja tut. 
Sonst würde die Library ja nicht Code 13 melden. Sonst habe ich die 
ganze Zeit eine funktionierende 1 GB Karte genutzt.

mfg jan.

von Falk B. (falk)


Lesenswert?

@Jan Hampel (jan_h865)


>Dateisystem auf der Karte ist. Da fiel mir die SD Karte ein, die mal
>kaputt gegangen wahr. Ich habe diese nur verwendet um zu schauen ob die
>SPI Kommunikation richtig arbeitet.

Eine merkwürdige Logik. Mit einer defekten Karte prüfen, ob SPI 
funktioniert 8-0

> Was sie ja offensichtlich ja tut.

Das ist immer noch nicht sicher.

>Sonst würde die Library ja nicht Code 13 melden.

Nö, sie kann auch bei einer defekten SPI-Kommunikation einen anderen 
Fehler melden, das ist NICHT zwingend!

> Sonst habe ich die
>ganze Zeit eine funktionierende 1 GB Karte genutzt.

Na immerhin.

von Jan H. (jan_h865)


Lesenswert?

Falk B. schrieb:
> Na immerhin.

Hallo Falk.

Im Moment funktioniert die Library einwandfrei. Woran das genau liegt 
kann ich nicht sagen. Er erkennt die Speicher Größe richtig. Und der 
test Ordner wird auch gefunden.

Hier ist ein Bild vom Seriallen Monitor: http://prnt.sc/dtcmd0

Mal eine andere Frage. Muss die Funktion die alle 10ms(disk_timerproc) 
aufgerufen werden. Muss sie schon vor dem f_mount() mindestens1 mal 
aufgerufen werden oder erst nach dem f_mount()?

Das wäre jetzt noch eine Vermutung von mir das der Timer vielleicht zu 
früh oder zu spät startet?

Mfg Jan.

von Falk B. (falk)


Lesenswert?

@ Jan Hampel (jan_h865)

>Im Moment funktioniert die Library einwandfrei.

Super! Und wo lag der Fehler? Bis jetzt dachte ich, es geht gar nichts!

>Mal eine andere Frage. Muss die Funktion die alle 10ms(disk_timerproc)
>aufgerufen werden. Muss sie schon vor dem f_mount() mindestens1 mal
>aufgerufen werden

Ja, denn damit werden timeouts geprüft.

>oder erst nach dem f_mount()?

Nein.

von Jan H. (jan_h865)


Lesenswert?

Falk B. schrieb:
> Super! Und wo lag der Fehler? Bis jetzt dachte ich, es geht gar nichts!

Naja, zu früh gefreut. Im Moment geht leider wieder nix. Das 
interessante ist, wenn ich das einmal zum laufen bekomme kann ich ändern 
was ich will solange ich das USB Kabel nicht vom Arduino entferne. Und 
wieder anklemme dann sagt er wieder 0 MB und error, error und error.

Was braucht so eine SD Karte an Strom kann es eventuell zu viel für denn 
USB Port sein?

Mfg Jan.

von Falk B. (falk)


Lesenswert?

@Jan Hampel (jan_h865)

>Naja, zu früh gefreut. Im Moment geht leider wieder nix.

Wackelkontakte?

>Das
>interessante ist, wenn ich das einmal zum laufen bekomme kann ich ändern
>was ich will solange ich das USB Kabel nicht vom Arduino entferne. Und
>wieder anklemme dann sagt er wieder 0 MB und error, error und error.

Klingt nach einem Initialisierungsproblem.

>Was braucht so eine SD Karte an Strom

Das können schone 200-300mA sein, aber nicht beim Lesen, eher beim 
Schreiben.

> kann es eventuell zu viel für denn USB Port sein?

Jain.

von Jan H. (jan_h865)


Lesenswert?

Falk B. schrieb:
> Wackelkontakte?

Könnte sein. Mir im "Shield" oder am USB Kabel?

Falk B. schrieb:
> Klingt nach einem Initialisierungsproblem.

//EDIT 16:04 Es scheint ein Strom Problem zu sein denn seitdem ich 9V 
mit dem LM7805 auf 5V Runter mache und das TFT Display extern Powere und 
GND mit dem Arduino verbunden habe, funktioniert auch die 2GB Microsd 
card die vorher nicht funktioniert hat. Wenn ich das Shield direkt auf 
dem UNO setzt gibts wieder errors mal beobachten

Falk B. schrieb:
> Das können schone 200-300mA sein, aber nicht beim Lesen, eher beim
> Schreiben.

Falk B. schrieb:
>> kann es eventuell zu viel für denn USB Port sein?
>
> Jain.

Ich verwende ein USB 2.0 Port kann dieser nicht nur 100 mA max?

Noch mal ne Frage an dich direkt, du hast ja denn DMXRecorder gemacht. 
Wie steuerst du die SD Karte an? Also Hardware mäßig. Mit Apdater und 
dann Level Shifter(CD4050?)?

mfg jan.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@Jan Hampel (jan_h865)

>> Wackelkontakte?

>Könnte sein. Mir im "Shield" oder am USB Kabel?

Eher in deinem Shield.

>Ich verwende ein USB 2.0 Port kann dieser nicht nur 100 mA max?

Offiziell darf ein USB Gerät ohne Anmeldung max. 100mA ziehen, praktisch 
kann man aber auch ohne Anmeldung 500mA ziehen, bei einigen PC sogar 
noch mehr.

>Wie steuerst du die SD Karte an? Also Hardware mäßig. Mit Apdater und
>dann Level Shifter(CD4050?)?

Fast. Ich hab einen Micro-SD Sockel für die Karte und für die Richtung 
5V->3,3V einen 74LVC245. 74HC4050 geht auch. ABER KEINEN HEF4050, das 
sind die alten, langsamen CMOS-Teile!
Für den Rückweg 3,3V -> 5V ist ein 74HCT1G125 drin. An dessen Eingang 
(=Datenausgang der SD-Karte) hängt auch der wichtige Pull-Up nach 3,3V.

von Jan H. (jan_h865)


Lesenswert?

Falk B. schrieb:
> Offiziell darf ein USB Gerät ohne Anmeldung max. 100mA ziehen, praktisch
> kann man aber auch ohne Anmeldung 500mA ziehen, bei einigen PC sogar
> noch mehr.

Okay. Ich weis nicht ob du mein EDIT gelesen hast. Aber es scheint am 
Strom zu liegen.

"//EDIT 16:04 Es scheint ein Strom Problem zu sein denn seitdem ich 9V
mit dem LM7805 auf 5V Runter mache und das TFT Display extern Powere und
GND mit dem Arduino verbunden habe, funktioniert auch die 2GB Microsd
card die vorher nicht funktioniert hat. Wenn ich das Shield direkt auf
dem UNO setzt gibts wieder errors mal beobachten"

Ich mache jetzt nochmal ein paar Tests und raus zu finden ob es wirklich 
nur am Strom liegt

Mfg Jan.

von Cyblord -. (cyblord)


Lesenswert?

Warum versorgst du dein Modul nicht einfach mal ordentlich mit einem 
ordentlichen Netzteil anstatt über irgendein Krüppel USB? Hörts da bei 
euch Arduino-Zombies schon auf?

von Jan H. (jan_h865)


Lesenswert?

Cyblord -. schrieb:
> Hörts da bei
> euch Arduino-Zombies schon auf?

Der Spannungsregler am Arduino ist defekt

Direkte Stromversorgung über denn Powerjack am Arduino ist nicht mehr 
möglich

: Bearbeitet durch User
von Cyblord -. (cyblord)


Lesenswert?

Jan H. schrieb:
> Cyblord -. schrieb:
>> Hörts da bei
>> euch Arduino-Zombies schon auf?
>
> Der Spannungsregler am Arduino ist defekt
>
> Direkte Stromversorgung über denn Powerjack am Arduino ist nicht mehr
> möglich

Nehmen wir das mal als ein dickes JA.

Siehst du das Problem wirklich nicht? Du arbeitest mit SD-Karten und 
Dateisystemen. Also recht komplexe Dinge. Scheiterst aber an einer 
popeligen Stromversorgung.

Und wenn der Regler defekt ist, dann tausch ihn aus oder lege ihn still 
und speise dort Spannung ein. Oder noch besser: Such dir ein anderes 
Hobby! Interessierst du dich vielleicht fürs Rosen züchten?

von Jan H. (jan_h865)


Lesenswert?

Cyblord -. schrieb:
> Scheiterst aber an einer
> popeligen Stromversorgung.

Nicht direkt. Ich hatte die SD Karte erst in mein Projekt drin dort 
steht dem TFT Display eine 5V Spannung mit 1 Ampere zu Verfügung. 
Scheinbar war es dort ein andere Problem.

Deshalb habe ich denn Arduino genommen da ich so direkt es am ATMega328P 
testen konnte.

Cyblord -. schrieb:
> Und wenn der Regler defekt ist, dann tausch ihn aus oder lege ihn still
> und speise dort Spannung ein.

Habe mir ein Ersatz Spannungregler bei Amazon bestellt. Tauschen in mal 
aus.

Cyblord -. schrieb:
> Interessierst du dich vielleicht fürs Rosen züchten?

Nein danke.

von nur mal so (Gast)


Lesenswert?

ATmega 5V, SDcard 3,3V - Pegelanpassung der SPI Leitungen auf dem Board 
vorhanden ?
Ansonsten macht das schon Sinn das die SD-Karte defekt ist.
Fot vom Aufbau möglich ?

von Jan H. (jan_h865)


Lesenswert?

nur mal so schrieb:
> ATmega 5V, SDcard 3,3V - Pegelanpassung der SPI Leitungen auf dem Board
> vorhanden ?

Mein TFT Display und die SD Karte vertragen nur 3,3 Volt ich weis. Da 
der ATMega der auf 5V läuft auch 5V Signal an denn Ausgängen 
ausgibt(SCK, MOSI, CS), habe ich ein Level Shifter(CD4050) genommen. Auf 
mein Board ist ein 3,3 Volt Low Drop(Schaltregler) drauf der mir 3,32 
Volt liefert. Die SCK, MOSI und CS Leitung gehen erst über denn CD4050 
und dann auf die SD Karte/TFT Display.

Die MISO Leitung hat ein 10K Pull-Up Widerstand auf 3,3 Volt und geht 
dann auf denn MISO Pin des Atmegas.

nur mal so schrieb:
> Ansonsten macht das schon Sinn das die SD-Karte defekt ist.

Ich denke mal das ich das falsch geschrieben habe, also die 32 GB Karte 
ist eine microSD Karte in einen Apdater(für SD damit sie in mein Sockel 
passt). Sie ist mir ca. 3 Monaten mal runtergefallen mit dem Handy 
zusammen seitdem ist irgendwie das Dateisystem auf der Karte beschädigt 
worden. Es ist kein FAT mehr sondern RAW unter Windows.
Die Karte wurde nicht durch mein Board beschädigt!

Mfg Jan.

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

@Jan Hampel (jan_h865)

>ausgibt(SCK, MOSI, CS), habe ich ein Level Shifter(CD4050) genommen. Auf
>mein Board ist ein 3,3 Volt Low Drop(Schaltregler) drauf der mir 3,32
>Volt liefert. Die SCK, MOSI und CS Leitung gehen erst über denn CD4050
>und dann auf die SD Karte/TFT Display.

Ist das WIRKLICH ein CD4050 (langsam!) oder doch ein 74HC4050 (schnell)? 
Die "Experten", die den Arduino-Shield mit 1,8'' TFT + SD-Karte 
entwickelt haben, haben in den Schaltplan den CD4050 reingeschrieben 
aber auf dem Board ist ein 74HC4050!!!

>Die MISO Leitung hat ein 10K Pull-Up Widerstand auf 3,3 Volt und geht
>dann auf denn MISO Pin des Atmegas.

Genau DORT braucht man ihn NICHT!!! Sondern an der SD-Karte!!!

Siehe Anhang, das ist eine aufgeräumte Version des Shields. Der 
kritische Widerstand ist R2!!

>worden. Es ist kein FAT mehr sondern RAW unter Windows

Wenn Windows sie nicht mehr gescheit formatieren kann, wirf sie weg!

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Falk B. schrieb:
>>worden. Es ist kein FAT mehr sondern RAW unter Windows
>
> Wenn Windows sie nicht mehr gescheit formatieren kann, wirf sie weg!

 Warum sollte er so etwas tun ?

von Jan H. (jan_h865)


Lesenswert?

Falk B. schrieb:
> Ist das WIRKLICH ein CD4050 (langsam!) oder doch ein 74HC4050 (schnell)?

Auf dem Chip steht:
HCF4050BE

Falk B. schrieb:
> Genau DORT braucht man ihn NICHT!!! Sondern an der SD-Karte!!!

Jop habe ich auch gemerkt auf dem TFT Display 2,2 Zoll ILI9341 sind zwei 
Widerstande nah am Sockel. Der CS und MISO Pin ist bereits über ein 10K 
Widerstand auf 3,3 Volt gezogen. Meiner ist also überflüssig.

Also die SD Karte funktioniert auf dem ATMega328P ohne Probleme. Bei 
mein Projekt(ATMega644) mit ENC28J60 und TFT display, i2c eeprom, 
ds18b20 sensoren gibt es noch Probleme. Ich weis noch nicht warum er sie 
dort nicht init kann. Wenn ich aber alle Includes entferne funktioniert 
es auch auf dem ATMega644 mal schauen was genau dort stört.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@Jan Hampel (jan_h865)

>> Ist das WIRKLICH ein CD4050 (langsam!) oder doch ein 74HC4050 (schnell)?

>Auf dem Chip steht:
>HCF4050BE

Das ist ein lahme Krücke, den man bei 3,3V nicht mal mit 1 MHz SPI-Takt 
quälen sollte!!!

>Also die SD Karte funktioniert auf dem ATMega328P ohne Probleme.

Schon mal gut!

> Bei
>mein Projekt(ATMega644) mit ENC28J60 und TFT display, i2c eeprom,
>ds18b20 sensoren gibt es noch Probleme. Ich weis noch nicht warum er sie
>dort nicht init kann.

Wahrscheinlich Lötfehler, Wackelkontakte oder schlicht 
Verdrahtungsfehler.

> Wenn ich aber alle Includes entferne funktioniert
>es auch auf dem ATMega644

Du redest wirr.

von Jan H. (jan_h865)


Lesenswert?

Falk B. schrieb:
> Wahrscheinlich Lötfehler, Wackelkontakte oder schlicht
> Verdrahtungsfehler.

Scheinbar nicht, wenn man nur ff.h, integer.h, diskio.h, ... includiert 
dann funktioniert es auf dem atmega644

Falk B. schrieb:
> Du redest wirr.

upps

Falk B. schrieb:
> Das ist ein lahme Krücke, den man bei 3,3V nicht mal mit 1 MHz SPI-Takt
> quälen sollte!!!

Pfffff, SPI Fast ist F_CPU / 2 = 8 Mhz. Ja dann muss ich mir wohl mal 
denn schnellen besorgen

von Falk B. (falk)


Lesenswert?

@Jan Hampel (jan_h865)

>Scheinbar nicht, wenn man nur ff.h, integer.h, diskio.h, ... includiert
>dann funktioniert es auf dem atmega644

Dann istr dein Projekt vermurkst? Selbstgestricktes makefile?

von Jan H. (jan_h865)


Lesenswert?

Falk B. schrieb:
> Dann istr dein Projekt vermurkst? Selbstgestricktes makefile?

Von der makefile lass ich die Finger. Ich teste mal alles durch

von Mike J. (linuxmint_user)


Lesenswert?

Vielleicht solltest du nahe an die Versorgungspins des SD-Karten-Shields 
mal einen Elko oder einen dicken Kerko anlöten, damit die Spannung 
stabiler ist.

Den AVR (auf dem Arduino-Board) kannst du auch auf 3.3V legen, dann 
braucht man keinen Level-Shifter mehr.
Der M328 läuft aber laut Datenblatt nur noch mit einer Frequenz von 
12MHz@3.3V  und der M644 sollte bei der Spannung noch ohne Probleme mit 
20MHz laufen.

Jan H. schrieb:
> Also die SD Karte funktioniert auf dem ATMega328P ohne Probleme. Bei
> mein Projekt(ATMega644) mit ENC28J60 und TFT display, i2c eeprom,
> ds18b20 sensoren gibt es noch Probleme. Ich weis noch nicht warum er sie
> dort nicht init kann. Wenn ich aber alle Includes entferne funktioniert
> es auch auf dem ATMega644 mal schauen was genau dort stört.

Deaktiviere doch vor dem schreibe auf die SD-Karte alle Interrupts (mit 
cli(); ), damit dir keine Routine den Prozess unterbrechen kann und 
aktiviere sie danach wieder mit "sei();".

von Falk B. (falk)


Lesenswert?

@  Mike J. (linuxmint_user)

>Den AVR (auf dem Arduino-Board) kannst du auch auf 3.3V legen, dann
>braucht man keinen Level-Shifter mehr.

Ehr hat schon Pegelwandler, wenn gleich einen schnarchlangsamen.

>Deaktiviere doch vor dem schreibe auf die SD-Karte alle Interrupts (mit
>cli(); ), damit dir keine Routine den Prozess unterbrechen kann und
>aktiviere sie danach wieder mit "sei();".

Nö, das ist keine Sekunde nötig, denn die SPI Datenübertragung darf auch 
Lücken haben. Funktioniert problemlos. Been there, done that.

von Jan H. (jan_h865)


Lesenswert?

Falk B. schrieb:
> Ehr hat schon Pegelwandler, wenn gleich einen schnarchlangsamen

Hallo nochmal,

Erstmal wollte ich mich bei euch bedanken das ihr mir geholfen habt! 
Besonderes an Falk Brunner :)

Denn Pegelwandler habe ich nun gegen ein 74HC4050 getauscht für TFT 
sowie SD Karte. Funktionieren tut es jetzt einwandfrei. Es funktioniert 
auf mein Projekt wo ich es einsetzten wollte erst nicht weil, ich 
vergessen habe in der mmc.c die CS Pins umzustellen dieser stand immer 
noch auf PD7 vom ATMega328P.

Ps: Falls einer weiß wie man am einfachsten alle Zeilen von einer Datei 
bekommt ohne jede Zeile vorher mit f_gets abzuarbeiten und dabei ein 
pointer hoch zu zählen. Würde ich mich sehr freuen wenn es mir einer mit 
teilen kann.

Mfg Jan

von Falk B. (falk)


Lesenswert?

@Jan Hampel (jan_h865)

>Denn Pegelwandler habe ich nun gegen ein 74HC4050 getauscht für TFT
>sowie SD Karte. Funktionieren tut es jetzt einwandfrei.

Schön zu hören.

>Ps: Falls einer weiß wie man am einfachsten alle Zeilen von einer Datei
>bekommt ohne jede Zeile vorher mit f_gets abzuarbeiten und dabei ein
>pointer hoch zu zählen.

Einen Zähler, aka counter, denn der enthält bei dir die Anzahl der 
Zeilen. Ein Pointer ist was anderes, der enthält eine Adresse.

> Würde ich mich sehr freuen wenn es mir einer mit
>teilen kann.

Was ist denn das Problem daran? Um die Anzhal der Zeilen deiner Datei zu 
ermitteln musst du sie komplett einlesen und die Anzahl an \r\n zählen. 
Die Methode mit f_gets ist da gar nicht mal so dumm, ggf. halt langsam.
Wenn es schneller gehen soll, liest man die Datei sektorweise (512 
Bytes) mit f_read() und sucht nur nach \r.

von holger (Gast)


Lesenswert?

>am einfachsten alle Zeilen von einer Datei
>bekommt

Mit f_size() bekommst du die Größe der Datei in Bytes.
Dann liest du das ganze in einem Rutsch mit fread().

von Jan H. (jan_h865)


Lesenswert?

Falk B. schrieb:
> Was ist denn das Problem daran?

Keines. Ich habe mir das so grob durch gedacht. Das ich in einer 
Dauerschleife gehe und mit f_gets() jeden String in ein Buffer schreibe. 
Und dann mit strstr() abfrage ob sich dort ein \r\n befindet. Wenn ja, 
dann zähle ich mein counter um eins höher. Und prüfe mit f_eof()(?) ob 
ich am ende der Datei angekommen bin. Und breche die Dauerschleife mit 
break ab.

Ich war mir da nicht so sicher ob das vielleicht nicht so ganz 
Ressourcenschonend ist, wegen denn ganzen Daten die ich in denn Buffer 
reinpumpe. Und am Ende der Funktion gebe ich mir die Zeilen aus Return 
Wert zurück.(Mal so grob durchdacht)

Falk B. schrieb:
> halt langsam

Wie definierst du langsam und schnell?

Falk B. schrieb:
> Ein Pointer ist was anderes, der enthält eine Adresse.

Oh, da habe ich was verwechselt.

Mfg Jan.

von Falk B. (falk)


Lesenswert?

@Jan Hampel (jan_h865)

>Keines. Ich habe mir das so grob durch gedacht. Das ich in einer
>Dauerschleife gehe und mit f_gets() jeden String in ein Buffer schreibe.
>Und dann mit strstr() abfrage ob sich dort ein \r\n befindet.

Brauchst du nicht, denn f_gets() macht das schon für dich. Sieh Doku.

"The read operation continues until a '\n' is stored, reached end of the 
file or the buffer is filled with len - 1 characters."

Du musst nur prüfen, wenn du das Dateiende erreicht hast. Und du musst 
aufpassen, daß f_gets() nicht mehr Zeichen lies, als dein Lesepuffer 
aufnehmen kann.

> Wenn ja,
>dann zähle ich mein counter um eins höher. Und prüfe mit f_eof()(?) ob
>ich am ende der Datei angekommen bin. Und breche die Dauerschleife mit
>break ab.

So in etwa.

>Ich war mir da nicht so sicher ob das vielleicht nicht so ganz
>Ressourcenschonend ist, wegen denn ganzen Daten die ich in denn Buffer
>reinpumpe.

Es geht ja nicht anders.

>Wie definierst du langsam und schnell?

Relativ. Programmier beide Versionen und teste sie mit großen Dateien.

von Jan H. (jan_h865)


Lesenswert?

Falk B. schrieb:
> Brauchst du nicht, denn f_gets() macht das schon für dich. Sieh Doku.

Okay. Ich habe mir jetzt selber schon eine Funktion geschrieben, bevor 
ich dein Beitrag gelesen habe. Diese funktioniert. Ich habe sie mal rein 
gepackt.
1
uint16_t getLinesInFile(FIL file, char *name, uint16_t bufferSize, uint8_t openFile) {
2
  
3
  uint16_t counteredLines = 0;
4
  char filteredLine[bufferSize];
5
  FRESULT errCode;
6
7
  if(openFile == 1) {
8
    errCode = f_open(&file, name, FA_READ | FA_OPEN_EXISTING);
9
    if(errCode != 0) {
10
      return -1;
11
    }
12
  }
13
14
  while(1) {
15
    f_gets(filteredLine, sizeof(filteredLine), &file);
16
    if(strstr(filteredLine, "\r\n")) counteredLines++;
17
    if(f_eof(&file) != 0) {
18
      counteredLines++;
19
      break;
20
    }
21
  }
22
23
  if(openFile == 1) {
24
    errCode = f_close(&file);
25
    if(errCode != 0) {
26
      return -1;
27
    }
28
  }
29
30
  return counteredLines;
31
}

//EDIT: Upps, alte Funktion, neue gepostet.

Falk B. schrieb:
> Es geht ja nicht anders.

Okay. Dann muss es halt so.

Falk B. schrieb:
> Relativ. Programmier beide Versionen und teste sie mit großen Dateien.

Jo werde ich irgendwann mal machen

Mfg Jan.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Die SD Karte sollte ganz alleine mit dem µC verbunden werden. Keine 
weiteren Belastungen der Leitungen, das macht nur Ärger. Das ist 
zumindest mein Erfahrungswert.

Da benutze ich lieber gewöhnliche I/O Pin im Bit-Banging Modus für die 
SD Karte, wenn der SPI noch für was andere gebraucht wird.

von Falk B. (falk)


Lesenswert?

>uint16_t getLinesInFile(FIL file, char *name, uint16_t bufferSize,

Du willst KEIN FIL Objekt übergeben, eher eine POINTER darauf. Denn was 
willst du mit einer lokalen Kopie davon anfangen?

>uint8_t openFile) {

>  uint16_t lines = 0;
>  uint16_t counteredLines = 0;
>  char filteredLine[bufferSize];

Das geht in C nicht, du kannst keine variablen Array definieren.
Deine Arduino-Umgebung läßt das vielleicht nur deshlab ohne Fehler 
durchgehen, weil sie alles als C++ compiliert.

>    f_gets(filteredLine, sizeof(filteredLine), &file);
>    if(strstr(filteredLine, "\r\n")) counteredLines++;

Und mas machst du, wenn dein "\r\n" mittig auf dem Ende deines Puffers 
liegt, spricht, wenn dein Puffer 20 Bytes lang ist und eine Zeile 19 
sichtbare Zeichen hat? Dann ist das letzte Bytes im Puffer \r, aber die 
Funktion findet niemals \r\n.
Es reicht, die \n zu suchen.

>    if(f_eof(&file) != 0) {

Einen Vergleich mit Null schreibt man im Allgemeinen so.

>> Relativ. Programmier beide Versionen und teste sie mit großen Dateien.

>Jo werde ich irgendwann mal machen

Also nie . . . ;-)

von Falk B. (falk)


Lesenswert?

Etwa so.
1
#define BUFFER_SIZE 50
2
3
uint16_t getLinesInFile(FIL *file, char *name, uint8_t openFile) {
4
  
5
  uint16_t cntLines = 0;
6
  char buffer[BUFFER_SIZE];
7
  FRESULT errCode;
8
9
  if(openFile == 1) {
10
    if ( f_open(file, name, FA_READ | FA_OPEN_EXISTING) ) {
11
      return -1;
12
    }
13
  }
14
15
  while(cntLines < 0xFFFE) {
16
    f_gets(buffer, sizeof(buffer), file);
17
    if(strchr(filteredLine, '\n')) cntLines ++;
18
    if(f_eof(&file)) {
19
      break;
20
    }
21
  }
22
23
  if(openFile) {
24
    if ( f_close(file) ) {
25
      return -1;
26
    }
27
  }
28
29
  return cntLines;
30
}

von Falk B. (falk)


Lesenswert?

@ Stefan Us (stefanus)

>Die SD Karte sollte ganz alleine mit dem µC verbunden werden. Keine
>weiteren Belastungen der Leitungen, das macht nur Ärger. Das ist
>zumindest mein Erfahrungswert.

Die Erfahrung eines Vollprofis oder Bastlers? SD-Karten funktionieren 
solide, auch mit mehreren anderen ICs am SPI-Bus, wenn man solide 
Pegelwandler/Treiber verwendet.

von Jan H. (jan_h865)


Lesenswert?

Falk B. schrieb:
> Etwa so.

Okay. Ne eine Kopie vielleicht nicht. Braucht dann glaubig zu viel RAM.

//EDIT: Falls es dich interessiert, du solltes nach dem f_eof noch 
einmal die cntLines um eines erhöhen denn ohne sagt er das ich 24 Zeilen 
habe, und mit 25 Zeilen und es sind auch 25 Zeile in der Datei drin. 
Scheinbar sagt die f_eof Makro schon 1 wenn er die letzte Zeile hat.

Frage wieso liegst du in deinem Beispiel die Buffersize statisch fest?

Mfg Jan.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@Jan Hampel (jan_h865)

>//EDIT: Falls es dich interessiert, du solltes nach dem f_eof noch
>einmal die cntLines um eines erhöhen denn ohne sagt er das ich 24 Zeilen
>habe, und mit 25 Zeilen und es sind auch 25 Zeile in der Datei drin.
>Scheinbar sagt die f_eof Makro schon 1 wenn er die letzte Zeile hat.

Nein.

>Frage wieso liegst du in deinem Beispiel die Buffersize statisch fest?

Weil es in reinem C ohne echte dynamische Speicherverwaltung mit 
malloc()/free() nicht anders geht.

von Stefan F. (Gast)


Lesenswert?

> Die Erfahrung eines Vollprofis oder Bastlers?

Ich bin erfahrener Bastler. Allerdings hatte ich in diesem konkreten 
Fall Kontakt zu einem Hardware Entwickler mit Dr. Titel aus der 
Automotive Branche, der ebenfalls dazu geraten hat. Genauer gesagt hatte 
ich seinen Schaltungsentwurf (SPI für einen A/D Wandler plus Bit-Banging 
für die SD Karte) in Frage gestellt und er meinte, dass er das so 
gemacht hat, weil die SD Karte sonst nicht zuverlässig funktioniert. 
Dann habe ich es ausprobiert, weil ich meinte ich sei schlauer, kam 
allerdings zu dem selben Ergebnis.

Meine Aussage ist dieses mal wirklich fundiert.

Der Controller war ein AVR Xmega mit 3,3V ohne externe Bustreiber.

von Falk B. (falk)


Lesenswert?

@ Stefan Us (stefanus)

>Ich bin erfahrener Bastler. Allerdings hatte ich in diesem konkreten
>Fall Kontakt zu einem Hardware Entwickler mit Dr. Titel aus der
>Automotive Branche,

Das ist im Einzelfall eher ein Indiz für Praxisferne . . . ;-)

> der ebenfalls dazu geraten hat. Genauer gesagt hatte
>ich seinen Schaltungsentwurf (SPI für einen A/D Wandler plus Bit-Banging
>für die SD Karte) in Frage gestellt und er meinte, dass er das so
>gemacht hat, weil die SD Karte sonst nicht zuverlässig funktioniert.

Jaja. Nachweis? Analyse?

>Dann habe ich es ausprobiert, weil ich meinte ich sei schlauer, kam
>allerdings zu dem selben Ergebnis.

>Meine Aussage ist dieses mal wirklich fundiert.

Aha ;-)

>Der Controller war ein AVR Xmega mit 3,3V ohne externe Bustreiber.

Sollte passen. Aber im Einzelfall kann man auch was vermurksen, 
Ausgangstreiber falsch eingestellt, Pull-Up an DOUT der SD-Karte 
vergessen, Layoutfehler etc.

Es gibt Dutzende Gegenbeispiele. Ohne FUNDIERTE Fehleranalyse ist das 
alles Hörensagen und Legende.

von holger (Gast)


Lesenswert?

>Die SD Karte sollte ganz alleine mit dem µC verbunden werden.

Nein, man muss nur aufpassen was man tut. Siehe:

http://elm-chan.org/docs/mmc/mmc_e.html

Runterscrollen bis zu "Cosideration on Multi-slave Configuration" und 
lesen.
Da hat Meister Chan beschrieben das eine SD nach hochziehen von CS
den Ausgang SDO erst freigiebt wenn noch ein paar SCLK Zyklen
rausgegeben werden. Nur so nebenbei: die Karte zieht solange auch
mehr Strom obwohl CS High ist und geht erst nach diesen SCLK Zyklen
in StandBy.

von Guido B. (guido-b)


Lesenswert?

Oh holger, danke für den Hinweis, da muss ich meine Version auch
noch anpassen. TsTsTs, man sollte immer die ganze Seite lesen. ;-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Falk B. schrieb:
> Das geht in C nicht, du kannst keine variablen Array definieren.

Doch, seit C99 ist das kein Problem.  In diesem Falle (der Wert
für die Länge wird als Funktionsparameter übergeben) ist es sogar
komplett standardkonform, der GCC gestattet (da er ohnehin intern
alloca() besitzt und benutzt) aber auch weitergehende Auslegungen
davon.

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.