Forum: Mikrocontroller und Digitale Elektronik Probleme mit der Verwaltung der SD-Karte


von Luca B. (lucabert)


Angehängte Dateien:

Lesenswert?

Hallo, Leute!

Manche von euch vielleicht erinnern sich noch an dem Wecker, den ich vor 
über ein Jahr (mit eurer Hilfe) gebaut habe.

Der Wecker funktioniert einwandfrei und weckt mich jeden Tag mit der 
Musik, die ich auf der SD-Karte gespeichert habe.
Nun, auf der SD-Karte ist auch eine Konfigurationsdatei, die beim 
Einschalten gelesen wird und auch nochmal gelesen werden soll, wenn ich 
die Karte rausziehe und später wieder reinstecke (zB, weil ich die Liste 
der Feiertage geändert habe).

Nun, wenn ich die SD-Karte rausnehme, wird eine Meldung auf dem Display 
angezeigt (also, völlig in Ordnung), und wenn ich die Karte wieder 
reinstecke wird der Wecker ein Reset führen, anstatt einfach die 
Konfiguration neu zu lesen.

Ich habe das Programm bis zum kotzen geprüft und bin ziemlich sicher, 
daß die Funktion, die prüft ob die SD-Karte wieder verfügbar ist, auch 
richtig arbeiten sollte.
Ich habe auch eine Art "Entprellung" implementiert so daß das Programm 
eine volle Sekunde warten soll, nachdem er das erste Signal "Karte 
verfügbar" kriegt, so daß es nicht passieren kann, daß es versucht Daten 
von der Karte zu lesen, bevor sie ansprechbar ist.
Nichts! Es wird immer sofort ein Reset geführt (sofort wenn ich die 
Karte in dem Halter [CONNECTOR MMC12 bei Reichelt] einlege).

Ich befürchte langsam, daß ein Problem bei der Schaltung gibt...
Also, als Anhang schicke ich euch den Schaltplan des Weckers und der 
kleinen Platine, an dem ich den SD-Karte-Halter gelötet habe.
Hier ist die Funktion, die die Karte verwaltet:
1
/**
2
 * Verwaltet die SD-Karte
3
 * Wenn rausgenommen, zeigt eine Fehlermeldung,
4
 * wenn wieder reingenommen, initialisert sie und liest die
5
 * Konfigurationsdatei erneut
6
 */
7
void manageCard()
8
{
9
  if(!sd_raw_available() && !cardToBeInserted)
10
  {
11
    fat_close_dir(dd);
12
    fat_close(fs);
13
    partition_close(partition);
14
15
    cardToBeInserted = TRUE;
16
    lcdBacklightOn();
17
    lcdGotoXY(0, 2);
18
    lcdPuts(INSERTCARD);
19
    waitingForCard = 0L;
20
  }
21
  if(cardToBeInserted && sd_raw_available())
22
  {
23
    waitingForCard = getUptime();
24
    cardToBeInserted = FALSE;
25
  }
26
// Nachdem die Karte eingelegt wird, warten wir lieber einen Moment,
27
// um sicher zu sein, daß die Kontakte sich nicht mehr bewegen
28
  if(waitingForCard != 0L && sd_raw_available() && (getUptime() > (waitingForCard + WAITINGFORCARD)))
29
  {
30
// Der Code hier wird scheinbar NIE ausgeführt... :(
31
    waitingForCard = 0L;
32
    enableMMC();
33
    initCard(FALSE);
34
    readConfig(FALSE);
35
    disableMMC();
36
    lcdBacklightOff();
37
    lcdGotoXY(0, 2);
38
    lcdPuts(CLEARLINE);
39
  }
40
}

WAITINGFORCARD hat ein Wert von 1000 (also, eine Sekunde).
Der letzte Abschnitt der Funktion wird scheinbar nicht ausgeführt.

Ich freue mich auf eure Hilfe!

Grüße
Luca Bertoncello

von Jens-Dieter (Gast)


Lesenswert?

Luca Bertoncello schrieb:
> Nichts! Es wird immer sofort ein Reset geführt
Wie stabil ist die Spannungsversorgung beim Einstecken der Karte?

von Luca B. (lucabert)


Lesenswert?

Jens-Dieter schrieb:
> Luca Bertoncello schrieb:
>> Nichts! Es wird immer sofort ein Reset geführt
> Wie stabil ist die Spannungsversorgung beim Einstecken der Karte?

Das weiß ich nicht... Ich habe eigentlich auch gedacht, daß eventuell 
was ähnliches passieren konnte, aber wie kann ich es prüfen?
Einfach einen Multimeter anschließen wird wahrscheinlich nicht reichen, 
denn es passiert alles so schnell...

Das Netzteil ist aber wirklich groß (20W) und sollte eigentlich auch für 
eine stabile Spannung versorgen...

Grüße
Luca Bertoncello

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.