Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

NukeNoob

Frischling

  • »NukeNoob« ist der Autor dieses Themas

Beiträge: 48

Beruf: Student

  • Private Nachricht senden

1

26.03.2013, 19:04

[Arduino C++] SD-Karte beschreiben / lesen

Hallo @ Alle,
ich arbeite gerade ein einem JugendForscht Projekt und bin damit durch den Regional- und Landeswettbewerb in den Bundeswettbewerb gekommen. Um besser überprüfen zu können, wo Fehler auftreten, habe ich mir dieses SD-Shield #mce_temp_url# besorgt. Ich habe es an meinem Arduino MEGA mit der richtigen für den MEGA vorgesehenen Pinbelegung angeschlossen. Es gibt in der Arduino IDE Beispielcodes, welche z.B. den Zustand der SD-Karte auf dem Shield anzeigen. Wenn ich diese Beispielcodes auf meinen Arduino Flashe, funktioniert die SD-Karte einwandfrei und ich kann sie beschreiben, lesen usw. . Kopiere ich jedoch den Beispielcode, bzw. ändere ihn ein wenig ab und integriere ihn in eine Klasse vom meinem Hauptprojekt, meldet sich die SD-Karte plötzlich nicht mehr. An der Pinbelegung habe ich natürlich nichts geändert. Hier einmal der Beispielcode:



C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <SD.h>


#define SDPIN  53  

Sd2Card card;
SdVolume volume;
SdFile root;


void setup()
{
  Serial.begin(9600);
  Serial.print("\nInitializing SD card...");
  pinMode(SDPIN, OUTPUT);     
  pinMode(52, OUTPUT);     
  pinMode(51, OUTPUT);     
  pinMode(50, INPUT);

  if (!card.init(SPI_HALF_SPEED, SDPIN)) {
    Serial.println("initialization failed. Things to check:");
    Serial.println("* is a card is inserted?");
    Serial.println("* Is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");
    return;
  } else {
   Serial.println("Wiring is correct and a card is present."); 
  }

  // print the type of card
  Serial.print("\nCard type: ");
  switch(card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");
  }

  // Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    return;
  }


  // print the type and size of the first FAT-type volume
  uint32_t volumesize;
  Serial.print("\nVolume type is FAT");
  Serial.println(volume.fatType(), DEC);
  Serial.println();
  
  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
  volumesize *= volume.clusterCount();       // we'll have a lot of clusters
  volumesize *= 512;                            // SD card blocks are always 512 bytes
  Serial.print("Volume size (bytes): ");
  Serial.println(volumesize);
  Serial.print("Volume size (Kbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Mbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);

  
  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);
  
  // list all files in the card with date and size
  root.ls(LS_R | LS_DATE | LS_SIZE);
}


void loop(void) {
  
}


Hier der Code integriert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// Init - Setup Funktion
void CP5_TBZ::init ()
{
  // serielle Übertragung starten
  Serial.begin(9600);
  
  // I/O's  
  pinMode(53, OUTPUT);
  pinMode(52, OUTPUT);     
  pinMode(51, OUTPUT);     
  pinMode(50, INPUT);
  pinMode(13, OUTPUT);
  pinMode(10, INPUT);                  
  pinMode(2, INPUT); 
  pinMode(TASTER_PIN, INPUT);
  pinMode(TASTER_PIN2, INPUT);
    
  // SD Karte überprüfen
  checkSD();


[...]


// SD-checken
void CP5_TBZ::checkSD ()
{
  // SD-Shield
  Sd2Card card;
  SdVolume volume;
  SdFile root;
  
  Serial.print("\nInitializing SD card...");
      

  if (!card.init(SPI_HALF_SPEED, 53)) {
    Serial.println("initialization failed. Things to check:");
    Serial.println("- is a card  inserted?");
    Serial.println("- is the wiring correct?");
    Serial.println("- is the right SD_PIN selected?");
    return;
  } else {
   Serial.println("Wiring is correct and a card is present."); 
  }

  // print the type of card
  Serial.print("\nCard type: ");
  switch(card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");
  }

  // Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    return;
  }


  // print the type and size of the first FAT-type volume
  uint32_t volumesize;
  Serial.print("\nVolume type is FAT");
  Serial.println(volume.fatType(), DEC);
  Serial.println();
  
  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
  volumesize *= volume.clusterCount();       // we'll have a lot of clusters
  volumesize *= 512;                            // SD card blocks are always 512 bytes
  Serial.print("Volume size (bytes): ");
  Serial.println(volumesize);
  Serial.print("Volume size (Kbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Mbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);

  
  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);
  
  // list all files in the card with date and size
  root.ls(LS_R | LS_DATE | LS_SIZE);
}


Hier die main:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
void setup()                           
{
  JuFo.init();
}

void loop() 
{
  JuFo.start(false);              
}



Die Funktion init(); wird in der main.ino in der Setup(); aufgerufen. Also sollte es quasi genau das Selbe sein.
Info: Selbst wenn ich alle anderen Funktionen der Klasse "deaktiviere", funktioniert der Code nicht ...

Hat Jemand eine Idee, was ich falsch mache?

LG
Nuke



Edit: Wieso sieht der Code so komisch aus? Ich hab den wie immer reinkopiert. Also ich bekomme es nicht hin, dass der Code normal aussieht. Hat Jemand vielleicht auch dazu einen Tipp? ;)
Edit2: Jetzt ist es normal ;) Danke für den Tipp!

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »NukeNoob« (27.03.2013, 15:34)


patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

2

26.03.2013, 19:56

Einfach im Quelltext-Tab reinschreiben

NukeNoob

Frischling

  • »NukeNoob« ist der Autor dieses Themas

Beiträge: 48

Beruf: Student

  • Private Nachricht senden

3

26.03.2013, 20:08

Du meinst mit dem "Code" nicht "C++" Button? Oder welchen Quelltext-Tab meinst du?

LG

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

4

26.03.2013, 20:42

Direkt über der Auswahl der Schriftart gibt es zwei Tabs: Editor und Quellcode. Dort einfach Quellcode auswählen, dann sollte es funktionieren

Sp3iky

Treue Seele

Beiträge: 232

Beruf: Entwicklungsingenieur

  • Private Nachricht senden

5

27.03.2013, 16:00

Was heißt denn geht nicht? Sind ja reichlich Debugausgaben dabei, welche kommt denn?

Cookiezzz

Frischling

Beiträge: 91

Wohnort: Deutschland

Beruf: Schüler

  • Private Nachricht senden

6

27.03.2013, 16:16

Direkt über der Auswahl der Schriftart gibt es zwei Tabs: Editor und Quellcode. Dort einfach Quellcode auswählen, dann sollte es funktionieren

Nein, damit ändert man soweit ich weiß verändert man damit nur den HTML-Code des Beitrags. Der C++-Knopf ist eigentlich schon richtig. Sollte eigentlich funktionieren.

NukeNoob

Frischling

  • »NukeNoob« ist der Autor dieses Themas

Beiträge: 48

Beruf: Student

  • Private Nachricht senden

7

27.03.2013, 18:01

Die Karte wird nach implementieren des Codes in meine Klasse nicht mal mehr initialisiert. Ich habe zum Testen sogar schon die "halbschnelle Initialisierungsmethode" verwendet, weil das laut Autor der Bibliothek Fehlern vorbeugen soll.
Also: Quellcode drauf -> Seriellen Monitor der Arduino IDE an -> Karte wird nicht initialisiert. Fehlermeldung sieht dann so aus:

Zitat

Initializing SD card...initialization failed. Things to check:
- is a card inserted?"
- is the wiring correct?
- is the right SD_PIN selected?


Normalerweise sollten Typ der SD-Karte, Speichergröße, sowie auf der SD enthaltene Dateien angezeigt werden. Das passier wie schon gesagt, nur, wenn ich das Beispiel benutze.

Ich hoffe das war verständlich ;)

LG

Edit: Und selbstverständlich steckt eine SD-Karte drin, richtig verbunden ist sie auch, in FAT16 formatiert, nicht fehlerhaft, und der richtige Pin ist auch ausgewählt.

Werbeanzeige