Unterrichts- und Lernmaterial für Mikrocontroller
Unterrichts- und Lernmaterial fürMikrocontroller

1 - Datenspeicher SD-Karte

Für diese Übungen sind Kenntnisse über Pointer notwendig. Bearbeite dazu vorher die Übung Pointer Variable.

Die Möglichkeit, SD Karten auf dem Propellerboard zu nutzen, erhöht die Speicherkapazität des Mikrocontrollers auf mehrere Gigabyte. In dieser Übung lernen wir, wie Daten in einem  Speicher abgelegt und wieder ausgelesen werden.

Material

1x  Prop-BoE oder Prop-AB

1x  microSD Karte 2GB oder höher

Stecke die microSD Karte in den auf dem Board befindlichen Slot.

Abbildung 1 microSD-Kartenslot

Programmbeispiel

Das Projekt SDKarte_1.side legt eine Datei test.txt auf der SD Karte an und öffnet sie für die Dateneingabe. Es werden mehrere Zeichen in die Datei geschrieben; anschließend wird sie geschlossen. Nach einem erneuten Öffnen werden die Daten gelesen, in ein Zeichenfeld kopiert und im SimpleIDE Terminal ausgegeben.

Aufgaben
  • Übertrage das Programm SDKarte_1.c.  in den SimpleIDE Editor und speichere das Programm ab.
  • Starte das Programm mit Run with Terminal.
  • Überzeuge dich, dass der Text "Dies ist ein einfacher Test ..." ausgegeben wird.

2 - Der SD Karte auf die Zunge geschaut

Die Metallzungen auf der Unterseite einer SD Karte stellen die elektrische Verbindung zum Memory Chip in der Karte her. Die Zungen nennt man auch Pads.

DO, CLK, DI und CS sind Namen ganz bestimmter Pads auf der SD Karte. Diese Pads stellen die Verbindung zu den Propeller I/O Pin her, sobald die Karte in den Speicherkartenhalter auf dem Board geschoben wird. Der Propeller Chip sendet Steuersignale an CLK, CS und Daten an DI und er erhält Daten von DO.

Der Programmcode

Der SD-Speicherkartenhalter auf dem Prop-BoE und Prop-AB ist fest verdrahtet mit einzelnen Pin des Propeller. Welche das sind, ist auf den beiden Platinen aufgedruckt (Abb. 1).

Im Initialisierungsteil werden diese I/O Pin des Propeller mit den Pads der microSD Karte über die globalen Variablen durch Zuweisungen

  • DO = 22, CLK = 23, DI = 24, CS = 25 
    

namentlich benannt und im Programm mit der Funktion sd_mount zugewiesen:

  • sd_mount (DO, CLK, DI, CS)
    

Jetzt ist die SD-Karte in das Dateisystem aufgenommen und kann geöffnet werden. Die Funktionen aus der Bibliothek stdio (enthalten in simpletools.h) lassen sich erst jetzt aufrufen. Eine solche erste Funktion ist

  • FILE* fp = fopen("test.txt", "w").
    

Die Funktion fopen legt eine Datei an (wenn sie nicht bereits existiert) und gibt einen sogenannten Dateipointer zurück, der hier fp heißt. Anfangs zeigt fp auf den Anfang der Datei. Später wird er in verschiedenen Aktionen genutzt, wenn eine Datei geöffnet, in sie geschrieben, aus ihr gelesen oder einfach geschlossen werden soll.

Die Funktion fopen enthält zwei Parameter. Der erste ist ein Charakter-Feld mit dem Dateinamen "test.txt", der zweite gibt den Modus an. In unserem Beispiel ist es "w" für schreiben (write) in die geöffnete Datei (weitere Optionen sind "r" für lesen (read) und "a" für anhängen (append)).

Zeichen oder Character werden mit Hilfe der Funktion fwrite in eine Datei geschrieben. In unserem Beispiel kopiert die Funktion

  • fwrite("Dies ist ein einfacher Test ...\n, 1, 15, fp) 
    

die Zeichen des String in aufeinanderfolgende Bereiche der Datei test.txt. Die fwrite Funktion setzt einen Pointer auf den Datapuffer, die Größe jedes Datenelementes in Bytes (1), die Zahl der zu schreibenden Datenelemente (31 Bytes; character) und einen Pointer auf die Datei (fp), in die geschrieben werden soll.

Wurde alles abgearbeitet, schließt fclose(fp) die Datei wieder.

Als nächstes legt das Programm ein Character-Feld als Puffer an für die auszulesenden Daten von der SD-Karte

  • char s[31]; 
    

Die Datei wird zum Lesen geöffnet mit

  • fp = fopen("test.txt", "r").
    

Der Funktionsaufruf

  • fread(s, 1, 15, fp) 
    

weist das Dateisystem an, Daten in das Character Feld s in jeweils 1Byte Blöcken zu kopieren, insgesamt 15 Bytes. Gestartet wird am fp Dateipointer. Da die Datei gerade geöffnet wurde, zeigt fp direkt auf den Anfang der Datei. Abgeschlossen wird der Vorgang mit

  • fclose(fp)
    

der die Datei wieder schließt.

Der Befehl

  • print("%s", s) 
    

gibt die Werte aus, die fread im Characterfeld s abgelegt hat. Die Formatierungsanweisung %s weist die Funktion print an, die im Character-Feld abgelegten Werte als String von ASCII Zeichen im SimpleIDE Terminal auszugeben. Ein letzter Befehl

  • print("\n") 
    

setzt den Cursor an den Anfang einer neuen Zeile am Ende der Terminalausgabe.

Das Programm SDKarte_1.c

Programm SDKarte_1.c

Versuch mal dies!

Mit dem Befehl

  • print("%d\n", val) 
    

wird der Wert einer Variablen val im Terminal angezeigt; mit

  • fwrite(&val, sizeoff(val), 1, fp)
    

lässt sich der Inhalt einer Variablen in die SD Karte schreiben. Und es ist möglich den abgelegten Wert mit fread wieder auszulesen. Versuche es.

wird fortgesetzt ...

Kommentar schreiben

Kommentare

  • olaf (Sonntag, 10. Dezember 2017 08:35)

    wow...die mit Abstand beste Site, die ich bisher zu diesem Thema gesehen habe :-))
    Vielen Dank dafür. Hilft super beim Erklären!!

  • David Eisenblätter (Sonntag, 11. Februar 2018 13:38)

    Sehr schön erklärt, und zufällig heute, wo ich nochmal nach einer detailierten Gedankenstütze diesbezüglich gesucht habe!

    Vielen vielen Dank!

    David.

Bitte geben Sie den Code ein
* Pflichtfelder
Druckversion Druckversion | Sitemap
© Reinhard Rahner - Gettorf