mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SD-Karte mit ATMega128


Autor: Andreas M. (helmut68)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Dennis Kleine-Beck (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

> mit PB0 als CS-Leitung

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

Gruß,
Dennis

Autor: Andreas M. (helmut68)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: AVRNIX (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
abo

Autor: Christian E. (eins)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dennis Kleine-Beck (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Gruß,
Dennis

Autor: Andreas M. (helmut68)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dennis Kleine-Beck (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Gruß,
Dennis

Autor: Andreas M. (helmut68)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: mh789 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...;

Autor: Dennis Kleine-Beck (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich vermute, Dein Mega8 wird mit mit 5V betrieben?

MEGA16 @ 3.3V und 4MHz

Dennis

Autor: Andreas M. (helmut68)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.