Forum: Mikrocontroller und Digitale Elektronik Atmega und SD Karte wollen nicht so wie ich es will


von Stefan M. (schwanzlurch)


Lesenswert?

Hallo zusammen,

ich habe einen minimal Arduino auf einem Steckbrett aufgebaut (Atmega 
168 PU mit 16 Mhz Quarz + 2 x 22 pf Kondensatoren). Bisher lief alles 
was ich so damit gemacht habe HD 44780 Display ansteuern u. ä. Ich 
wollte als nächstes von einer SD Karte schreiben und lesen was leider 
fehlschlägt. Wenn ich die verwendete Karte an einen Arduino UNO oder 
DIeciemilla anschließe funktioniert die Karte.

Was mache ich falsch? Kann mir jemand helfen?

Ich habe die Pins wie in der folgenden Tabelle dargstellt belegt. 
Zwischen SD Karte und Atmega / Arduino habe ich  Spannungsteiler 
geschalten die aus den 5 V des Atmega ca. 3,3 machen. In umgekehrter 
Richtung (SD Karte - > Atmega) ist jeweils eine Diode in 
Durchlassrichtung.

Funktion  SD Karte  Arduino     AtMega
CS          1          4     6
MOSI          2          11     17
GND          3
+ 3,3V          4
SCK          5          13     19
GND          6
MISO          7          12     18

Der Arduino Sketch mit dem ich das beschreiben der Karte teste stammt 
aus den Beispeilsketchen der Arduino IDE. Schlägt das Beschreiben der SD 
Karte fehl blinkt eine LED:

#include <SD.h>

File myFile;

int LedPin = 8;
int sdPin = 4;

// initialize the library with the numbers of the interface pins

void setup()
{

  // On the Ethernet Shield, CS is pin 4. It's set as an output by
default.
  // Note that even if it's not used as the CS pin, the hardware SS pin
  // (10 on most Arduino boards, 53 on the Mega) must be left as an
output
  // or the SD library functions will not work.
  pinMode(10, OUTPUT);
  pinMode(sdPin, OUTPUT);

  pinMode (LedPin, OUTPUT);
  int i = 1;

  if (!SD.begin(sdPin)) {
    // LED blinkt wenn Schreibvorgang failt

    do {
    digitalWrite (LedPin, HIGH);
    delay (200);
    digitalWrite (LedPin, LOW);
    delay (200);
    i++;
    } while (i < 10);

    return;

  }
  digitalWrite (LedPin, HIGH);
  // open a new file and immediately close it:
  // lcd.println("Creating example.txt...");
  myFile = SD.open("example.txt", FILE_WRITE);
  myFile.close();

}

void loop()
{
  // nothing happens after setup finishes.
}

von Jim M. (turboj)


Lesenswert?

Stefan Müller schrieb:
> In umgekehrter
> Richtung (SD Karte - > Atmega) ist jeweils eine Diode in
> Durchlassrichtung.

Wieso das? Raus damit!

Stefan Müller schrieb:
> Schlägt das Beschreiben der SD
> Karte fehl blinkt eine LED:

Nach dem geposteten Code blinkt die LED, wenn die Initialisierung der 
Karte schon fehlschlägt. Außerdem vermisse ich das Setzen von SCK als 
Output Pin, falls das nicht schon die SD SPI Funktionen machen.

von Stefan F. (Gast)


Lesenswert?

> Zwischen SD Karte und Atmega / Arduino habe ich  Spannungsteiler

Möp, schon falsch.

Für SD Karten brauchst du top saubere Signale, die bekommst du mit 
Widerständen und Dioden nicht hin. Hast du den Artikel 
http://www.mikrocontroller.net/articles/MMC-_und_SD-Karten gelesen?

Am wenigsten Stress bekommst du, wenn du den Mikrocontroller mit 3,3V 
versorgst, dann brauchst du gar keinen Konverter.

von Stefan M. (schwanzlurch)


Lesenswert?

Jim Meba schrieb:
> Stefan Müller schrieb:
>> In umgekehrter
>> Richtung (SD Karte - > Atmega) ist jeweils eine Diode in
>> Durchlassrichtung.
>
> Wieso das? Raus damit!
>
> Stefan Müller schrieb:
>> Schlägt das Beschreiben der SD
>> Karte fehl blinkt eine LED:
>
> Nach dem geposteten Code blinkt die LED, wenn die Initialisierung der
> Karte schon fehlschlägt. Außerdem vermisse ich das Setzen von SCK als
> Output Pin, falls das nicht schon die SD SPI Funktionen machen.

- Mmhhh, warum funktioniert das ganze dann am original Arduino?
- SCK als Output sollte hiermit erledigt sein: pinMode(10, OUTPUT);
- Wie gesagt, ich habe ein Beispiel aus der Arduino Bibliothek genommen. 
Mich wundert das das ganze einmal funktioniert und einmal nicht.

: Bearbeitet durch User
von Jonas G. (jstjst)


Lesenswert?

Das ganze funktioniert am original Arduino weil du viel Glück hattest. 
Für Sdcards brauchst du wie schon erwähnt ordentliche Signale.
Schau dir mal das https://www.adafruit.com/products/254 und das 
https://learn.adafruit.com/adafruit-micro-sd-breakout-board-card-tutorial 
an.

Bei deinem Nachbau wird es nicht funktionieren da du sämtliche Abblock-C 
vergessen hast. Wenn du welche einbaust könnte es mit viel Glück 
funktionieren.

Jst

von isnah (Gast)


Lesenswert?

Laut Atmega-Datenblatt ist VIH=2.7V (bei Vcc=5V)

VIH ist die minimale Eingangsspannung am I/O-Pin, welche noch als "1" 
erkannt wird.

Also rechne mal:

3.3V - 0.7V = 2.6V

oder du hast Schottky-Diodeneingesetzt

von Stefan M. (schwanzlurch)


Lesenswert?

Danke erst mal für eure Hilfe. Ich werde mir das ganze in den nächsten 
Tagen nochmal anschauen.

von Stefan F. (Gast)


Lesenswert?

Diese Rechnung ist nett, aber in diesem Fall spielen die Kapazitäten und 
Widerstände eine noch viel größere Rolle. Es geht ja im hohe Frequenzen, 
nicht Gleichspannung.

Also selbst wenn die DC Rechnung aufgehen würde, funktioniert es nicht 
zuverlässig.

von Wolfgang (Gast)


Lesenswert?

Stefan Müller schrieb:
> - Mmhhh, warum funktioniert das ganze dann am original Arduino?

Gegenfrage: Was passiert, wenn du für deine improvisierte Pegelanpassung 
die SPI Taktfrequenz reduzierst. Das hilft oft.

von (prx) A. K. (prx)


Lesenswert?

isnah schrieb:
> Laut Atmega-Datenblatt ist VIH=2.7V (bei Vcc=5V)

In der Praxis. Nominell sind es 0,6 * Vcc = 3,0V.

: Bearbeitet durch User
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.