Forum: Mikrocontroller und Digitale Elektronik SD-Karte mit ATMega128


von Andreas M. (helmut68)


Angehängte Dateien:

Lesenswert?

Hallo Forum,

ich hänge bereits seit einigen Tagen an einem mysteriösen Problem und
weiss mittlerweile nicht mehr weiter.

Ich möchte einen Datenlogger bauen (Nutzung des AVR-GCC mit der Procyon
AVRlib), der in kurzen Abständen die Werte vom A/D-Umsetzer auf einer
SD-Karte ablegt. Dazu verwende ich das Mega128 Modul RS232 Rev1.2 von
Embedit (http://shop.embedit.de/product_002001_205.php). Messung also
kontinuierlich, die Maximalwerte gemerkt und alle 4 Sekunden mit einer
Art Timestamp versehen auf der Speicherkarte ablegen.
Die Ansteuerung der SD-Karte erfolgt über Hardware-SPI (mit PB0 als
CS-Leitung) nach der Anleitung von Ulrich Radig mit dem Spannungsregler
LM317 mit ebenfalls seinen C-Routinen dafür, allerdings ohne
FAT-Unterstützung.
Bisher habe ich eine Trägerplatine für das Mikrocontroller-Modul
angefertigt und die gesamte Schaltung aufgebaut (als Grafik und für
Eagle im Anhang).

Die Abfrage der Analogwerte ist problemlos möglich, nur bei der
Ansteuerung der SD-Karte treten komische Probleme auf:
Die Initialisierung der Karte (mittels mmc_init()) gibt keine
Fehlermeldung zurück, ebensowenig das Schreiben von Daten
(mmc_write_sector()) auf die Karte (ab Block 1, Null bleibt original).
Ich schlussfolgere daraus, dass die Pinbelegung der SPI-Schnittstelle
ebenso wie die CS-Leitung (zur Speicherkarte) korrekt sind.

Klingt zwar erstmal gut, nun aber meine Probleme:
(1) Schaue ich mittels Disk Editor (Tiny Hexer) auf die Karte, so sind
dort keinerlei Daten zu entdecken.
(2) Sobald ich lesend (mmc_read_sector(), mmc_read_csd() oder
mmc_read_cid()) auf die Karte zugreife, gerät die Software in eine
Endlosschleife.

Folgende mögliche Fehlerquellen konnte ich bereits ausschließen:
- Verbindung zwischen Speicherkarte und Schaltung (Durchgang geprüft)
- Pegelwandlung (5V TTL am Controller, 3.30V an der SD-Karte der
Ausgänge vom Controller zur SD-Karte sowie umgekehrt die Eingänge
durchgemessen

Die SD-Bibliothek der Procyon AVRlib (Autor: Pascal Stang) habe ich
ebenfalls ausprobiert, hierbei jedoch kann ich die Karte nichteinmal
initialisieren (Rückgabe-Fehlercode -1 bereits beim Befehl
MMC_GO_IDLE_STATE).

Möglicherweise hilfreich: Das Kabel zwischen Aufnahme der SD-Karte und
der Leiterplatte ist knapp 3cm, der ISP ist beim Testen nicht
angeschlossen.
Ein Oszilloskop besitze ich ebenso wenig wie andere Spezialmessgeräte -
Multimeter ist aber vorhanden :-)

Irgendwie werde ich das Gefühl nicht los, dass es sich um ein
Hardware-Problem handelt...

Über Hilfe oder Tipps jeglicher Art würde ich mich sehr freuen.
Viele Grüße, Andreas

von Dennis Kleine-Beck (Gast)


Lesenswert?

Hallo,

> mit PB0 als CS-Leitung

Nach der (unmodifizierten) SW von Ulrich Radig ist CS aber PB3.

Gruß,
Dennis

von Andreas M. (helmut68)


Lesenswert?

Hallo Dennis,

jo - diesen Wert habe ich bereits an PB0 angepasst. Die originale SW
von Ulrich (testweise aufgespielt) zeigt bei mir folgendes an:
   System Ok
   Karte gefunden!!

Nachfolgend passiert dann nichts mehr. Zusätzliche Debugausgaben vor
jeder neuen odezeile entlarven die nachfolgende Funktion
fat_cluster_data_store() als Grund dafür.

Wie oben bereits vermutet denke ich, dass das Problem beim Lesen von
Daten von der Karte auftritt...

Viele Grüße, Andreas

von AVRNIX (Gast)


Lesenswert?

abo

von Christian E. (eins)


Lesenswert?

Hallo Andreas,

ganz schön langes Post :-).

Ich hatte zufälligerweise das gleiche Problem und habe es bis jetzt
nicht gelöst. Ich habe mal ein Ausgaben eingebaut und habe festgestellt
dass die Funktion
   fat_cluster_data_store
die Funktion
   fat_addr aufruft.
Dort komme ich bis zur Funktion
   mmc_read_sector (MASTER_BOOT_RECORD,Buffer).

Diese bleibt dann hängen und ich habe keine Ahnung woran es liegt.
Vielleicht ist bei dir ja ähnlich. Eine Lösung würde mich auch
interessieren.

Viele Grüße,

Christian

von Dennis Kleine-Beck (Gast)


Lesenswert?

Hallo,

ja, mit fat_cluster_data_store hatte ich auch Probs.

Ich benutze nen MEGA16, der hat bekanntlich 1kB RAM. Ulrich war so
groszügig in der genannten Funktioen nen extra Buffer mit Größe 512
Bytes (BLOCKSIZE) zu spendieren, was mein RAM sprengte.

Man kann den (nach meiner Meinung) getrost auskommentieren und damit
ausschließlich den vorhandenen "Multi Purpose Buffer" verwenden:

void fat_cluster_data_store (void)
//###################################################################### 
######
{
 struct BootSec *bootp; //Zeiger auf Bootsektor Struktur

//unsigned char Buffer[BlockSize]; // DKB: Use multi purpose buffer
only!!!

volume_boot_record_addr = fat_addr (Buffer);  /getVolumeBootRecord
address

.
.
.

Außerdem empfehle ich:
http://www.mikrocontroller.net/forum/read-4-125350.html#364526

Gruß,
Dennis

von Andreas M. (helmut68)


Lesenswert?

Hallo Dennis,

leider brachte Dein Vorschlag nicht den gewünschten Erfolg. Auch die
Änderung des Originalcodes von Ulrich entsprechend Deiner Anleitung
halfen nichts.
Der Controller hängt sich immer wieder beim Aufruf von
mmc_read_sector() (in diesem Fall aus der fat_addr() aufgerufen) auf.

Das passiert bei wirklich jedem lesenden Zugriff - ich vermute das
Problem ja in der Hardware - softwareseitig benötige ich keinerlei
FAT-Unterstützung, will die Daten einfach nur blockweise ablegen und
später wieder einlesen...

Viele Grüße, Andreas

von Dennis Kleine-Beck (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

habe mal meine HW-Anbindung angehängt. Vielleicht hilft's ja.

Gruß,
Dennis

von Andreas M. (helmut68)


Lesenswert?

Hallo Dennis,

Danke für den Plan - werde ihn mir gleich einmal zu Gemüte führen. Ich
vermute, Dein Mega8 wird mit mit 5V betrieben?

Grüße, Andreas

von mh789 (Gast)


Lesenswert?

> Der Controller hängt sich immer wieder beim Aufruf von
> mmc_read_sector() (in diesem Fall aus der fat_addr() aufgerufen)
auf.

Init geht aber beim Lesen kommt das Daten-Start-Byte nicht an? Klingt
wie das Problem mit der Flankensteilheit, das ich auch hatte.

<http://www.mikrocontroller.net/forum/read-1-312491.html#321153>;

von Dennis Kleine-Beck (Gast)


Lesenswert?

> Ich vermute, Dein Mega8 wird mit mit 5V betrieben?

MEGA16 @ 3.3V und 4MHz

Dennis

von Andreas M. (helmut68)


Lesenswert?

Hmm, ok - das habe ich befürchtet... bin leider auf eine
Spannungsversorgung von 5V angewiesen.

Im Link von mh789 (PS: Danke für den Tipp mit der Flankensteilheit!)
wird die Karte zwar mit 3.3V versorgt, Signalpegel jedoch TTL.
Irgendwie ist mir dabei nicht wohl, hab Angst um die SD-Karte, aber
werde die Idee mit den Flanken jedoch einmal näher betrachten.

Danke dafür, viele Grüße, Andreas

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.