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.
@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!
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.
@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.
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.
@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.
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.
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.
@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.
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.
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)
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
@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
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
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.
@ 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.
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.
@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.
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
@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?
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.
@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.
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.
@ 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.
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.
@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.
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
@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.
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.
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?
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
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?
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.
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 ?
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.
@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!
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 ?
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
@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.
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
@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?
Falk B. schrieb: > Dann istr dein Projekt vermurkst? Selbstgestricktes makefile? Von der makefile lass ich die Finger. Ich teste mal alles durch
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();".
@ 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.
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
@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.
>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().
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.
@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.
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
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.
>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 . . . ;-)
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 | }
|
@ 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.
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
@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.
> 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.
@ 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.
>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.
Oh holger, danke für den Hinweis, da muss ich meine Version auch noch anpassen. TsTsTs, man sollte immer die ganze Seite lesen. ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.