Forum: Mikrocontroller und Digitale Elektronik SD Karte nutzen beim Mega 2560


von Andi W. (andi_w)


Angehängte Dateien:

Lesenswert?

hallöle (wieder mal)

ich habe jetzt folgendes problem, ich möchte meine messwerte nun auch 
auf einer speicherkarte (SD KaRTE 16 MB FAT16) ablegen... (hab auch 
andere versucht)

Mein Setting:

1X Mega 2560
1X TFT LCD Mega Shield V1.0
1X TFT Touch Display mit SD kartenleser (TFT_320QVT)

Link:
http://www.amazon.de/SainSmart-Entwicklungsbrett-Arduino-ATMEGA-TFT-LCD-Schirm/dp/B008K7G702

nun mein problem:

ich mess und versuch seit stunden die richtige bin kombo zu finden...

ich versuche die sd karte erst ein mal über das standard "cardinfo" 
preset
zu finden.. vergebens..
Code:
1
const int chipSelect = 53;    
2
3
void setup()
4
{
5
 // Open serial communications and wait for port to open:
6
  Serial.begin(9600);
7
   while (!Serial) {
8
    ; // wait for serial port to connect. Needed for Leonardo only
9
  }
10
11
12
  Serial.print("\nInitializing SD card...");
13
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
14
  // Note that even if it's not used as the CS pin, the hardware SS pin 
15
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output 
16
  // or the SD library functions will not work. 
17
  pinMode(53, OUTPUT);     // change this to 53 on a mega
18
19
usw.....


was mach ich falsch?

Hab ich da was anders zu machen?
im anhang ist noch ein bild wie weit ich bis jetzt selber gekommen bin..

: Verschoben durch User
von Neofun (Gast)


Lesenswert?

Hallo Andi,
ich selber habe damit auch schon Stunden verbrannt.
Das Problem ist, dass die Witzbolde von Sainsmart bei Ihrem V1.0 Versuch 
die Pins 51 & 52 für HardwareSPI vertauscht haben. Die Umdefinition per 
SoftSPI bringt leider nix.

Hier das Assignment der SPI Pins selbst ausgemessen):

Sainsmart Shield V1.0
LCD Shield(35) - SD Out ->  Arduino Mega(50) HW-MISO
LCD Shield(36) - SD CLK ->  Arduino Mega(51) HW-MOSI vertauscht mit (52)
LCD Shield(37) - SD  IN ->  Arduino Mega(52) HW-CLK  vertauscht mit (51)
LCD Shield(38) - SD  CS ->  Arduino Mega(53) SS

Ich habe die Widerstände auf dem Shield für Pin 51 & 52 abgelötet und so 
angeordnet, dass ich die beidencPins mittels Umverkablung gerade ziehen 
konnte.

Dadurch ist es nun möglich die Karte per CardInfo anzusprechen und der 
Typ wird richtig erkannt. Dummerweise funktioniert das Auslesen des 
Dateisystems (noch) nicht. Ich weiß leider noch nicht genau woran das 
liegt...

Falls ich neue Erkenntnisse gewinne, gebe ich Bescheid.

Viele Grüße
 Neofun

von Andreas W. (andreas_w11)


Lesenswert?

Cool, danke dir! ;)

von Thomas L. (neofun)


Angehängte Dateien:

Lesenswert?

Und hier kommt nun auch die Lösung...

Wenn ich das richtig sehe hat Saintsmart eben nur eine Billiglösung für 
die Anpassung der 5V am Mega auf die 3,3V (für Spannungsversorgung und 
Signale) der SD-Card gewählt. Dadurch denke ich, ist die Performance der 
SD-Karte stark eingeschränkt.
Während auf meinem anderen Shield von iTead Studio mit Spannungsregler 
und CD4050 zur Pegelanpassung ein SPI Speed von mindestens HALFSPEED 
möglich ist, geht bei meinem Sainsmart Shield halt nur ein Sechzehntel 
SPI Speed.

Für die korrekte Funktion ist SD2Card.h um folgendende Zeilen zu 
erweitern:
1
/** Set SCK rate to F_CPU/16. Sd2Card::setSckRate(). */
2
uint8_t const SPI_EIGHTH_SPEED = 3;
3
/** Set SCK rate to F_CPU/32. Sd2Card::setSckRate(). */
4
uint8_t const SPI_SIXTEENTH_SPEED = 4;
Dies sorgt dafür, dass zwei weitere, langsamere SPI Geschwindigkeiten 
(SPI_EIGHTH_SPEED und SPI_SIXTEENTH_SPEED) zur Verfügung stehen.

Nun ist noch bei der Initialisierung der SD-Card z.B. im Sketch "SDInfo" 
folgende Anpassung vorzunehmen:
1
  if (!card.init(SPI_SIXTEENTH_SPEED, SdChipSelect)) {
2
    sdErrorMsg("\ncard.init failed");
3
    return;

Und schon antwortet die SD-Karte auch.

Vielleicht geht bei Dir auch noch SPI_EIGHTH_SPEED - musst Du halt 
ausprobieren.

Wenn mir irgendjemand Zeit schenkt, schaue ich mal, ob sich das Shield 
nicht Hardware-mäßg ein wenig frisieren lässt.
Mein erster Ansatz wäre die SD-Karte über einen Spannungsregler mit 3,3V 
zu versorgen. Vermutlich zieht die Karte bei höheren SPI-Speeds mehr 
Strom, dadurch wird der Spannungsabfall am Vorwiderstand zu groß und die 
Versorgungsspannung der SD-Karte sinkt unter die zulässige Grenze.

Ich habe noch ein Bild von meinem Leiterbahnenpatch des Shields 
angehangen. Ist relativ easy zu löten, wenn man nicht so einen 100W 
Brenner als Lötkolben nimmt. Die verwendeten SMD Widerstände sind 
10KOhm, falls Du doch einen kaputt machst.
Alternativ nimmst Du am besten gleich diskrete 10KOhm Widerstände lötest 
die beiden SMD Widerstände von Pin 51 und 52 aus und machst die 
Überkreuzung mit den diskreten Widerständen.

Viele Grüße
 Thomas

von Thomas L. (neofun)


Angehängte Dateien:

Lesenswert?

Und hier noch ein Update...

Ich habe eine Stunde investiert, die aufgelöteten SMD Widerstände vom 
Shield entfernt und einen Puffer-IC/Pegelwandler (74HC541, es geht aber 
auch ein CD 4050) zwischengeschaltet.
Hierfür habe ich vier Gates verwendet davon drei für die eingehenden 
Signale (vom Arduino an SD-Karte) MOSI/SD-IN, CLK & SS/CS und eines für 
das ausgehende Signal (von SD-Karte zum Arduino) MISO/SD-Out.
Das Ergebnis ist, dass nun sogar SPI_FULL_SPEED mit dem TFT LCD Mega 
Shield V1.0 möglich ist.
Ein Foto vom Aufbau habe ich angehangen - es ist nix schönes, aber ich 
werde es auch gleich mit Heißkleber isolieren.

Die Vertauschung von Pin36 & 37 (CLK & SD-IN) habe ich nun auf der TFT 
Platine aufgelöst und die Widerstände auf der Adapterplatine durch 
Lötbrücken ersetzt.

Viele Grüße
 Thomas

von Andi (Gast)


Lesenswert?

Hallo

Ich weiß das der Thread etwas älter ist. Aber ich bin selber grad dabei 
beim selben Display einen Pegelwandler zu verbauen.

Kann mir jemand den Grund nennen warum hier ein zusätzliches Gate für 
das Signal von der SD zum Arduino verwendet wurde?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Andi schrieb:
> Kann mir jemand den Grund nennen warum hier ein zusätzliches Gate für
> das Signal von der SD zum Arduino verwendet wurde?
Damit wird der SD-Pegel von 3V3 nach Arduino 5V angehoben. Und damit die 
Schaltzeiten verkürzt. Denn die werden von 20..80% gemessen. Und 80% von 
3,3V sind gerade mal 2,8V, was dann wieder zum schnellen Durchschalten 
des Arduino-Eingangs schon recht wenig ist...

von Andi (Gast)


Lesenswert?

Lothar Miller schrieb:
> von 3V3 nach Arduino 5V angehoben

wie kann das sein, der 541 wird ja mit 3,3V betrieben...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Andi schrieb:
> wie kann das sein, der 541 wird ja mit 3,3V betrieben...
Dumm gelaufen...  ;-)
Dann bringt das hier nur was, wenn der Ausgangstreiber der SD-Karte 
"schwächer" ist als der der 541. Auf jeden Fall bringt der 541 hier aber 
seine Laufzeit auch noch mit rein. Das ist eher ungünstig.

von stefanus (Gast)


Lesenswert?

Hab ich das Foto richtig erkannt, da sind 10k Ohm Widerstände in den 
Signalleitungen des SPI Bus? kein Wunder das es nur mit sehr geringen 
Bitraten funktioniert. Ich hätte da höchstens 100 Ohm genommen - dann 
muss der Controller natürlich zwangsläufig mit 3,3V betrieben werden.

von Thomas L. (neofun)


Lesenswert?

Mann Leute,
das war hier mal so ein sauberer Thread...
Jetzt blickt keiner mehr durch und ich würde den Moderator bitten alle 
Beiträge nach 2012 zu löschen.
Folgendes zur Klärung:
Die SD-karte verkraftet nur 3,3V hierfür sollte ein Spannungsregler und 
kein 10KOhm und noch weniger ein 100Ohm Widerstand (!!!) eingesetzt 
werden
Der 74HC541 ist ein in Puffer/Treiber, welcher durch entsprechende 
Beschaltung Open Collector Ausgänge hat. Das heisst die positive 
Spannung an seinem Ausgang kann durch Pull-Up Widerstände seine eigene 
Versorgungsspannung übersteigen.
Die Modifikation erlaubt danach zuverlässig SPI_FULL_SPEED.
Also bitte einfach nur nachbauen & nutzen und nicht den Artikel hier 
unübersichtlich machen. An den paar Euro 50 für den 74HC541 kann es doch 
nicht liegen, oder? Danke.

Gruss
 Thomas

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Thomas Lentz schrieb:
> Das heisst die positive Spannung an seinem Ausgang kann durch Pull-Up
> Widerstände seine eigene Versorgungsspannung übersteigen.
Aber nicht sehr weit, denn das Datenblatt sagt, dass dann die Klemmdiode 
zupackt:
1
Limiting Values
2
IOK output clamping current   VO < -0.5 V or VO > VCC + 0.5 V    - +-20 mA
D.h. auch ein 541, der einen Pullup nach 5V hat, wird nicht über 4V 
kommen.

Ergo: die Schaltung mit dem aus 3,3V versorgten 541 ist auch Murks. 
Sinnvollerweise versorgt man den uC auch mit 3,3V oder man nimmt 
"richtige" Pegelwandler für die entsprechende Richtung...

Thomas Lentz schrieb:
> Jetzt blickt keiner mehr durch und ich würde den Moderator bitten alle
> Beiträge nach 2012 zu löschen.
Keinesfalls! Es besteht doch ein direkter Zusammenhang zur (eigentlich 
fehlerhaften) Beschaltung...

: Bearbeitet durch Moderator
von Falk B. (falk)


Lesenswert?

@ Lothar Miller (lkmiller) (Moderator) Benutzerseite

>> Das heisst die positive Spannung an seinem Ausgang kann durch Pull-Up
>> Widerstände seine eigene Versorgungsspannung übersteigen.

Aua! Open Drain Ausgänge mit Pull Up für schnelle Schnittstellen. Was 
kommt morgen?
Die Rückkehr der Relaisrechner?

>D.h. auch ein 541, der einen Pullup nach 5V hat, wird nicht über 4V
>kommen.

Für Murks reicht es.

>Ergo: die Schaltung mit dem aus 3,3V versorgten 541 ist auch Murks.
>Sinnvollerweise versorgt man den uC auch mit 3,3V oder man nimmt
>"richtige" Pegelwandler für die entsprechende Richtung...

Eben. 74LVC245A von 5->3,3V für SCK, MOSI, CS
von 3,3 -> 5V mit 74HCT125, MISO, gibt es als Single Gaste im SOT23 
Gehäuse.
Damit hat man eine SOLIDE Lösung und SUPER Signale!
10k Pull Up an DO an der SD-Karte nicht vergessen, das ist bei der 
Initialisierung ein Open Drain Ausgang!

Been there, done that.

Siehe Pegelwandler

von Andi (Gast)


Lesenswert?

@ neofun

ich hab deine Lösung nachgebaut. An der Aufnahme von deiner Platine 
verknüpfst du den GND Pin mit dem Gehäuse der SD, während du die beiden 
OE direkt mit GND der SD verbindest. Hat das einen bestimmten Grund? Auf 
meinem Board ist das Gehäuse ptentialfrei, d.h es ist nicht mit GND 
verbunden...

von Thomas L. (neofun)


Lesenswert?

Hallo Falk,
> Aua! Open Drain Ausgänge mit Pull Up für schnelle Schnittstellen. Was
> kommt morgen?
> Die Rückkehr der Relaisrechner?
Als ich das letzte mal geschaut habe, hatte der Arduino Mega 20 MHZ, 
jetzt erklär mir noch mal bitte Deinen Punkt...
Ist 20MHZ Prozessortakt <> Schnittstellengeschwindigkeit schnell?!? :-)

Den µC mit 3,3V versorgen kann nur jemand vorschlagen, der noch nicht 
mit dem Arduino Mega Board gearbeitet hat. Da steht glaube ich für jeden 
lesbar 7V min (Zur Sicherheit & für die Unbelehrbaren: 
http://arduino.cc/en/Main/arduinoBoardMega)

Natürlich kann man für den Rückweg ein eigenes Gate spendieren und auf 
5V hochleveln - wofür? Wir lösen gerade eine Spannungsregelung per 
Widerstand und eine Pegelanpassung mit Widerständen ab. Von 
DOUBLE_FULL_SPEED_SPI habe ich noch nichts gelesen...

von Thomas L. (neofun)


Lesenswert?

@Andi
Meine SD-Card Schirmung ist nicht potentialfrei.
Es spricht natürlich nichts dagegen, den GND (Pin10) mit den anderen 
"ge-groundeten" Pins (OE1/2) direkt zu verbinden.

Gruss
 Thomas

von Falk B. (falk)


Lesenswert?

@ Thomas Lentz (neofun)

>Als ich das letzte mal geschaut habe, hatte der Arduino Mega 20 MHZ,
>jetzt erklär mir noch mal bitte Deinen Punkt...
>Ist 20MHZ Prozessortakt <> Schnittstellengeschwindigkeit schnell?!? :-)

Ein AVR macht bei 20 MHz Takt MAXIMAL 10 MHz SPI Takt. Ob der ARDUINO
das bei SPI_FULL_SPEED WIRKLICH macht, weiß ich nicht.

>Den µC mit 3,3V versorgen kann nur jemand vorschlagen, der noch nicht
>mit dem Arduino Mega Board gearbeitet hat. Da steht glaube ich für jeden
>lesbar 7V min (Zur Sicherheit & für die Unbelehrbaren:
>http://arduino.cc/en/Main/arduinoBoardMega)

Er meinte die Spannung für den PROZESSOR, nicht das Board! Das könnte 
man ändern, einfach anderen Spannungsregler drauf. Dann geht aber 
maximal 8 oder 10 MHz.

>Natürlich kann man für den Rückweg ein eigenes Gate spendieren und auf
>5V hochleveln - wofür?

Damit es SOLIDE ist! Das läuft dann auch bei 10 MHz problemlos mit 1A 
Signalqualität und maximalem Störabstand. Dafür geb ich gern 50 Cent 
aus!

>Wir lösen gerade eine Spannungsregelung per
>Widerstand und eine Pegelanpassung mit Widerständen ab.

Ja, eben DARUM!

> Von DOUBLE_FULL_SPEED_SPI habe ich noch nichts gelesen...

von Andi (Gast)


Lesenswert?

@Neofun

Hast du an deinem Board sonst noch was verändert? Ich habe den HC541 
eingebaut identisch wie bei dir, doch es will auch bei SPI_SPEED_LOW 
nicht klappen.

Ich verwende die Lib von Hennig Karlsen. Wenn keine SD im Schacht ist, 
erhalte ich die Meldung "File not found". Ist eine Karte drin, bleibt 
der Bildschirm einfach schwarz...
Ich hab nun 3 verschiedene SDs probiert, natürlich alle <2GB und mit 
Fat16 formatiert.

von Andi (Gast)


Angehängte Dateien:

Lesenswert?

ok, nun funzts.

Mein Ardu Shield hat die Versions Nummer  1.0. Darum dachte ich, SD CLK 
und SD IN seien vertauscht. Tatsächlich muss es sich aber bei dem Shield 
bereits um eine upgedatete Version handeln, da das Problem schon behoben 
wurde.

Mann, manchmal sucht man sich doof und dämlich.

danke trotzdem für die Hilfe.

Übrigens, SPI Full Speed funktioniert problemlos.

von Falk B. (falk)


Lesenswert?

@ Andi (Gast)

>Mein Ardu Shield hat die Versions Nummer  1.0. Darum dachte ich, SD CLK
>und SD IN seien vertauscht. Tatsächlich muss es sich aber bei dem Shield
>bereits um eine upgedatete Version handeln, da das Problem schon behoben
>wurde.

Was sind das denn für Knalltüten? Erst schaffen sie es nicht, ein 
Produkt gescheit durchzutesten bevor sie es verkaufen und dann verkaufen 
sie eine NEUE, korrigierte Version mit EXAKT der gleichen 
Versionsnummer?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Thomas Lentz schrieb:
> Den µC mit 3,3V versorgen kann nur jemand vorschlagen, der noch nicht
> mit dem Arduino Mega Board gearbeitet hat.
Ich musste es. Mein "Kleiner" musste damit für die Schule was machen...

> Da steht glaube ich für jeden lesbar 7V min
Auch so ein Designfehler...

> die Unbelehrbaren:
Sind augenscheinlich die Bastler, die den uC auf den Markt geworfen 
haben. Wozu soll man eine Aufsteckkarte mit 7V versorgen, wenn man z.B. 
auf dem Baseboard schon 5V hat? Denn andersrum funktioniert es wegen des 
schwächlichen Spannungsreglers sicher nicht: ich kann nicht mein 
Baseboard aus dem Arduino versorgen...

Falk Brunner schrieb:
> Was sind das denn für Knalltüten?
Das habe ich mich bei dem Arduino-Zeugs auch schon gefragt. Eigentlich 
ein Produkt, das man wirklich sinnvoll verwenden könnte. Das dann aber 
trotzdem irgendwie nur halb fertig (gedacht) und grün auf den Markt 
geworfen wurde. Gerade mal so "hingebastelt" halt.
Das geht schon bei der kuriosen Anordnung der Steckerleisten los. Mal 
für 5 Cent mitgedacht und es wäre was Besseres rausgekommen...

: Bearbeitet durch Moderator
von Thomas L. (neofun)


Lesenswert?

Hallo zusammen,
ich glaube da sind wir uns alle wieder einig:
Ein durchgehendes Design ist etwas anderes. Dass die Asiaten nun dafür 
günstige (teils auch billige) Erweiterungsboards machen ist schön, aber 
da sitzen wohl auch nur in den seltensten Fällen Ingenieure mit Zeit und 
Muse dran. Dadurch gibt es halt auch solche "Ausreisser".

Vielleicht hat sich da ja was mit den neuen Arduinos getan, mir fehlte 
leider bisher die Zeit zu schauen und das letzte Projekt hat einen 
Raspberry benötigt. Da sieht dann wieder alles ganz anders aus - ist 
aber auch eine andere Preisklasse, mehr Strom & mehr Platzbedarf.

Viele Grüße
 Thomas

von Sebastian D. (nasedo)


Lesenswert?

Hallo,
habe auch so ein saint smart TFT LCD Mega Shield V1.0 zugelegt, im 
November 2014.

Ich habe ein Problem: Ich möchte die gemessenen Werte, die auf dem TFT 
Display angezeigt werden, auf die SD Karte speichern. Ich habe hier 
schon hin und her probiert. Ich steige da nicht mehr durch.
Es funktioniert nicht. Ich muss dazu sagen, dass ich neu in diesem Fach 
bin.
Ich brauche das für eine Projektarbeit.

Die gespeicherten Werte sollen in einer Excel Tabelle dann dargestellt 
werden.
Es geht um den Wert vom Druck und dem Wert von der Spannung.

Ist das Problen wie oben beschrieben bei den neueren Modelln schon 
behoben?

Danke schon mal für eure Hilfe.

Hier ein kleiner Auszug aus dem sketch.



                analogRead(A0);
                analogRead(A1);
                { int sensorValue = analogRead(A0);         //liest das 
Eingangssignal Von U-Dose
                 sensorValue1= analogRead(A1);         // liesst 
Eingangssignal vom Drucksensor

                 voltage=analogRead(sensorValue);
                 voltage=sensorValue* (5.0 / 1024.0);              // 
Umrechnungsfaktor vom Analogenert für Arduino
                 dtostrf(voltage, 5, 2, voltageBuf);   // float in char
                 myGLCD.print("Spannung [V]" ,  10, 10l)  ;
                 myGLCD.print(voltageBuf , 10, 30);             // 
Anzeigen auf TFT


                 mbar=analogRead(sensorValue1);
                 mbar=sensorValue1*(5.0/1024)*1000-1080.38;   // 
Umrechnungsfaktor vom Analogsignal zum Spannungswert berücksichtigt 
Umgebungsdruck
                 dtostrf(mbar , 5, 2, mbarBuf);      // float  in char
                 myGLCD.print("Druck[mbar]" ,  10,  110)  ;
                 myGLCD.print(mbarBuf, 10, 130);      // Anzeigen auf 
TFT
                 delay (500); // Pause von 500ms

                } // end if




} // void ende

von Michael (Gast)


Lesenswert?

Hallo,
ich weiß alter Thread.
Aber könnte mir jemand die genaue Pinbelegung des Shields zukommen 
lassen.
Habe es mal nach der Doku probiert das ich nur diese Pins 
Durchgeschaltet wo laut Doku benötigt werden.
Hintergrund ich wollte nicht so viele Pins verbrauchen da ich noch paar 
für andere Sachen benötige.
Aber da tut sich nichts. Wenn ich es direkt drauf Stecke geht alles.
Blöde Konstruktion wenn das Shield drauf sitzt kommt man an die anderen 
Anschlüsse und ISP Port nicht dran.
Danke
LG

Michael

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.