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