Home > Technologie > Spaß mit PIC Versammlung - Episode 25

Spaß mit PIC Versammlung - Episode 25

0
Advertisement

Spaß mit PIC Versammlung - Episode 25

Ein neuer Schritt hat mich aus dem Hobby Loop für die letzten Monate, so ist es gut, endlich wieder zu basteln. Obwohl mein Zeug war verpackt und meine Aufmerksamkeit fokussiert woanders, hatte ich immer noch mein Auge für einige lustige Dinge zu hook up zu einem PIC. Während meiner Ausfallzeit bekam ich eine E-Mail von einem Instructable-Reader, der wollte, dass ich eine Schnittstelle zusammenstellte, damit er eine SD-Karte verwenden konnte, um Daten zu speichern. Nach einer Reihe von Episoden sahen wir, wie wir den PIC-internen Speicher nutzen konnten, um Temperaturwerte zu speichern, aber nur eine minimale Anzahl von Einträgen zuließen. Ich dachte, die SD-Karte Idee wäre ein Spaß zu arbeiten, so ist das, was diese Episode geht. Bitte beachten Sie, dass es sich hierbei um ein Proof-of-Concept-Design oder, wenn Sie es wünschen, um einen grundlegenden Baustein für Ihre Datenerfassung handelt.

Schritt 1: SD-Karten

Es gab eine Vielzahl von SD-Karten-Typen im Laufe der Jahre, aber hier werden wir konzentrieren uns auf die Verwendung der SDHC (High Capacity) Karten, die heute üblich sind. Die spezifischen Karten, die ich für dieses Projekt verwendete, sind alle von SanDisk gemacht und sind 4GB, 8GB und 16GB Geräte. Jeder von ihnen sollte viel billiger Massenspeicher für die meisten PIC-basierte Datenerfassung Aufgaben. Was viele Menschen nicht wissen, ist, dass SD-Karten haben eine eingebaute SPI-Schnittstelle, die auf eine Standard-Satz von definierten Nachrichten reagiert. Während SD-Karten im Allgemeinen in FAT oder ExFAT oder NTFS formatiert sind, können sie direkt geschrieben werden, ohne sich mit dem Windows- oder Linux-Dateisystem herumschlagen zu müssen. Die Oberseite dieser Methode ist einfacher Code, aber der Nachteil ist, dass man nicht lesen Sie die Daten als Datei auf Ihrem Computer. Glücklicherweise gibt es eine Vielzahl von Hex-Datei-Leser da draußen einschließlich einer kostenlosen Version von HxD.

Werbung

Schritt 2: SD-Kartenmodul

Spaß mit PIC Versammlung - Episode 25

Spaß mit PIC Versammlung - Episode 25

Für dieses Projekt kaufte ich ein kostengünstiges SD-Kartenmodul, das einen Steckplatz für eine SD-Karte in voller Größe bietet. Bitte beachten Sie, dass ich nicht versuchen, eine kleinere SD-Karte mit einem Adapter. Es gibt eine Frage heraus auf dem Internet, ob oder nicht die SPI Schnittstellenbefehle die selben mit den Mikro- oder Mini-Sd-Karten arbeiten. Das Modul, das ich verwendete, ist das geläufigste, das ich gesehenes annoncierte und enthält einen 3.3-Volt-Regler, also können Sie einen 5-Volt-Eingang benutzen. Das Schema des Moduls ist hier ebenfalls dargestellt.

Schritt 3: Hardware

Spaß mit PIC Versammlung - Episode 25

Da es sich hierbei um ein Proof-of-Concept-Projekt handelt, habe ich meine Testplatine mit der in Episode 1 beschriebenen LCD-Schnittstelle verwendet. Dadurch konnte ich die Antworten auf die SPI-Befehlsnachrichten sehen, die ich an das SD-Kartenmodul gesendet habe. Weil ich das PIC und das LCD auf 5 Volt laufe, ist es notwendig, Widerstand Spannungsteiler auf den Signalleitungen von der PIC zu dem SD-Modul hinzuzufügen. Der Ausgang des SD-Moduls (MISO) befindet sich auf einem 3,3-Volt-Logikpegel, der ausreicht, um den PIC-Eingang zu steuern.

Wenn Sie mit SPI nicht vertraut sind, handelt es sich um eine synchrone serielle Schnittstelle. Das bedeutet, dass Datenbits gleichzeitig in beide Richtungen getaktet werden. Die MISO-Leitung ist Empfangsleitung für die PIC und die MOSI-Leitung ist die Sendeleitung für die PIC. Die Daten werden 8 Bits gleichzeitig übertragen, und jeder Befehl aus dem PIC enthält ein Befehlskennungsbyte, vier Datenbytes (sie können Nullen sein, wenn keine Daten benötigt werden) und ein Prüfsummenbyte. Die Prüfsumme erfordert einen nicht-trivialen Algorithmus, um richtig zu berechnen, aber glücklicherweise gibt die SPI-Spezifikation an, dass das Slave-Gerät die Prüfsumme nach dem Empfang von Cmd8 ignorieren soll. Die Prüfsummen für Reset und Cmd8 sind bereits definiert, so dass keine Berechnungen erforderlich sind. Die Antworten von dem Slave sind gewöhnlich ein einzelnes Byte, können jedoch mehrere Bytes sein. Es gibt viele Informationen im Web über SPI-Befehle und Antworten, wenn Sie in sie weiter zu vertiefen möchten. Die CS (Chip Select) Leitung erlaubt dem PIC, einzelne Slave-Geräte einzeln anzusprechen. Obwohl wir nur ein einziges Gerät hier haben, ist die CS-Leitung wichtig, weil wir mehrere Dummy-Bytes an den Slave senden müssen, während es deaktiviert ist. Mehr dazu im Software-Bereich.

Schritt 4: Software

Die Software-Link ist unten aufgelistet. Während es für die 16F688 gezielt ist, ist es leicht auf andere Versionen der PIC portiert. Nur stellen Sie sicher, dass Sie eine, die die asynchrone serielle Schnittstelle verfügt. Sie müssen auch die Zeile ändern, die die PIC-Version (LIST =) und die INCLUDE-Datei identifiziert, aber das sind intuitive Änderungen. Die __CONFIG-Zeile kann auch gezwickt werden, nur weil ein oder zwei der verwendeten Etiketten in einigen der INCLUDE-Dateien unterschiedlich geschrieben sind.

Weil ich eine bestehende Testplatine mit einem 16F688 und einem LCD-Interface verwende, verwendet die Software die Bit-Banging-Methode zum Senden und Empfangen von Daten auf dem SPI-Bus. Es gibt neuere Versionen der PIC, die die SPI-Fähigkeit eingebaut haben, so dass Sie es ähnlich wie die Standard-serielle Schnittstelle in den meisten PICs integriert und nur senden und empfangen können im Byte-Format. Die Routinen in dieser Softwareversion würden meistens intakt bleiben, wenn SPI_Xmt und SPI_Rcv vereinfacht werden, wenn eine eingebaute SPI-Schnittstelle verwendet wird. Der andere Vorteil der Verwendung einer neueren Version von PIC ist, dass es wahrscheinlich haben einen viel größeren RAM-Speicherplatz zur Verfügung. Das ist wichtig für eine praktische Anwendung, da die SD-Karte Daten schreibt und als 512-Byte-Sektor liest.

Die Grundlagen der Kommunikation mit der SD-Karte beginnen mit der Initialisierungssequenz. Es wird empfohlen, dass der SPI-Master (PIC) mindestens 74 Takte am Bus ausgibt, ohne den SPI-Slave freizugeben. Praktisch bedeutet dies das Senden von 10 Bytes Dummy-Daten (80 Takte). Danach ist die Reihe der Initialisierungsbefehle abhängig vom Typ der verwendeten SD-Karte. Die Software kann tatsächlich geschrieben werden, um den Kartentyp zu bestimmen, aber das ist nicht im Rahmen dieses Projekts. Stattdessen gehen wir davon aus, dass es sich bei der SD-Karte um eine SDHC handelt, die es zu einer Karte vom Typ 2 macht.

Der erste Befehl, den wir senden, zwingt die SD-Karte, ein Software-Reset durchzuführen. Das ist auch als CMD0 in der Literatur bekannt. Da jeder SPI-Befehl ein Bit 6 des Byte-Satzes haben muss, addieren wir immer 40 Hex auf unsere Befehlsnummer. Eine wichtige Sache zu erinnern ist, dass nach jedem Befehl die SD-Karte eine Antwort bilden wird. Um die Antwort zu erhalten, muss das PIC einen Dummy-Befehl von FF hex senden. Wir könnten das in der SPI_Xmt-Routine tun, aber für Rationalisierungszwecke wurde eine separate SPI_Rcv-Routine hinzugefügt. Wie Sie sehen können, wird der FF-Hex-Wert gesendet, indem einfach die MOSI-Leitung einmal hoch eingestellt wird, bevor in den Antwortbits getaktet wird. Die Antwort auf den Reset-Befehl sollte eventuell 01 hex sein, was bedeutet, dass sich die SD-Karte im Ruhezustand befindet. Die Get_Response-Routine erhält willkürlich 8 Byte von Antwortdaten von der SD-Karte, weil einige der Befehle mehrere Bytes zurückgeben. Zusätzlich ist das erste empfangene Antwortbyte üblicherweise FF hex. Die Get_Response-Routine schirmt diese Werte aus und gibt nur den letzten Nicht-FF-Wert zurück.

Die nächste Aufgabe ist zu sagen, die SD-Karte zu initialisieren und bereit für die Datenkommunikation. Man könnte denken, es würde logisch tun, nach einem Reset-Befehl, aber es nicht. Der eigentliche Befehl für diese Aktion wird normalerweise ACmd41 genannt, der aus zwei einzelnen Befehlen - Cmd55 und Cmd41 besteht. Aber bevor die gesendet werden, müssen wir eine Cmd8 senden. Cmd8 fordert, dass die SD-Karte einige Statusinformationen einschließlich ihrer Spannungsversorgungsfähigkeit sendet. Weil wir wissen, dass unsere SDHC-Karten auf 3,3 Volt arbeiten, ist dies nutzlos, aber der Befehl ist sowieso erforderlich. Das letzte Nicht-FF-Byte, das wir für diesen Befehl erhalten sollten, ist AA hex.

Wenn Sie den SPI-Befehlssatz betrachten, sehen Sie, dass es einige Befehle gibt, die zusammengesetzte Befehle wie ACmd41 sind. Cmd55 ist, was sagt der SD-Karte, dass es einen zweiten Teil der Befehlssequenz. Die Antwort, die wir von Cmd55 erwarten, ist 01 hex (Idle). Danach können wir Cmd41 mit Bit 6 des ersten Datenbyte-Satzes hoch schicken, um anzuzeigen, dass es sich um eine Hochleistungskarte handelt. Die SD-Karte wird einige Zeit in Anspruch nehmen, um den Initialisierungsvorgang abzuschließen, so dass es eine Menge erneutes Senden von ACmd41 dauern kann, bevor wir das Antwortbyte erhalten, das besagt, dass die SD-Karte bereit ist (00 hex). Ich fügte eine Verzögerung von 1 Sekunde hinzu, um die Anzahl der benötigten Lesevorgänge zu verringern. Bevor ich das tat, dauert es bis zu 35 ACmd41 Loops.

Nachdem die SD-Karte angezeigt hat, dass sie initialisiert ist und im Bereitschaftszustand ist, können wir Daten lesen oder schreiben. Die Software hier schreibt nur teilweise, weil sie nicht über den RAM-Bereich verfügt, um die 512 Byte zu speichern, die die SD-Karte senden würde. Ein weiterer Grund ist, dass dieses Programm soll zeigen, wie eine SD-Karte für die Datenerhebung verwendet werden könnte. Der Schreibbefehl ist Cmd24 (58 hex). Normalerweise werden Daten im RAM gesammelt und dann auf der SD-Karte in 512 Byte-Blöcken ausgegeben. Die der Sektorgröße der Karte entspricht. In unserem Beispiel gibt die Software nur abwechselnde Werte von 33 hex und CC hex aus, bis die 512 Byte Grenze erreicht ist.

Cmd24 erfordert das Senden von vier Datenbytes, die den Zielsektor in der SD-Karte für das Schreiben spezifizieren. Die Adresswerte im Beispielcode entsprechen einer reellen Adresse von 1000000 Hex in der Karte. Um diesen Wert zu erhalten, multiplizieren Sie die Sektoradresse mit der Sektorgröße (200 hex). Wenn Sie die Mathematik Sie sehen, dass es tatsächlich entspricht 1100000 hex. Der Grund dafür ist, dass es einen Offset, dass die SD-Karte gilt gleich 800 hex. Ich entdeckte, dass der Offset möglicherweise nicht immer die gleichen für verschiedene SD-Karten, so dass ich sicher, ein anderes Werkzeug als Windows zu verwenden, um die Karten zu formatieren. Das Tool, das ich verwendete, ist die freie Version von MiniTool Partition Wizard. Als ich die Karten für FAT32, Clustergröße = 4096 formatierte, bekam ich alle drei Karten (4GB, 8GB und 16GB), um an die gleiche Stelle im Speicher zu schreiben.

Schritt 5: Daten extrahieren

Wie ich bereits erwähnt, eine gute, kostenlose Hex-Reader-Tool ist HxD. Es hat eine Möglichkeit, von einem Gerät zu lesen, so können Sie sich den Inhalt der SD-Karte, wenn es an Ihren Computer angeschlossen ist. Aus irgendeinem Grund funktioniert das Sektoradressfenster in HxD nur in Dezimal, aber wenn Sie einen Bereich von Daten auswählen möchten, können Sie den "Edit / Select Block" verwenden. Im Popup-Fenster können Sie in Hex-Adressen arbeiten. Sobald Sie die Daten ausgewählt haben, gehen Sie zu "Datei / Export / Editor-Ansicht", um die Auswahl in eine Textdatei auszugeben. Die Werte werden durch Leerzeichen getrennt, sodass Sie die Dateidaten problemlos in Excel importieren und die unerwünschten Sachen wie die Adressen während des Importvorgangs abschneiden können. In Excel 2007 heißt das, auf die Registerkarte Daten zuzugreifen und "Externe Daten / Text auslesen" auszuwählen. Excel wird Sie dann durch die Schritte für die Beseitigung der unerwünschten Zeug gehen.

Schritt 6: Werte anzeigen

Spaß mit PIC Versammlung - Episode 25

Spaß mit PIC Versammlung - Episode 25

Die hier dargestellten Bilder sind die vom Testcode ausgegebenen LCD-Anzeigewerte. Nach dem Einschalten zeigt das Display für ein paar Sekunden "SD Card Interface" an und zeigt dann die Antwortwerte für die verschiedenen Befehle an. Zeile 1 zeigt die Response-Werte für den Reset-Befehl (01), dann das letzte Non-FF-Byte in der Antwort für Cmd8 (AA). Darauf folgt eine Anzahl von Idle-Antworten (01) für ACmd41, bis schließlich eine Ready-Antwort (00) empfangen wird. Die Software gibt dann "R" für bereit. Die zweite LCD-Zeile zeigt Antworten für den Datenschreibbefehl (Cmd24). Es ist wichtig, dass die Anforderung für Antworten nach Cmd55 sofort beendet wird, wenn Ready (00) empfangen wird, weil die SD-Karte dann einen zweiten Befehl sucht. Nachdem Cmd24 gesendet wird, gefolgt von 512 Byte Daten, gefolgt von zwei Dummy-Bytes für die Daten-Prüfsumme, erwarten wir eine X5-Antwort zu sehen. Das bedeutet, dass der Datenbaustein von der SD-Karte akzeptiert wurde. Normalerweise ist die Antwort E5, da Bit 4 immer Null sein sollte.

Nun, das ist es für Episode 25 von "Fun With PIC Assembly". Bleiben Sie dran für weitere Episoden.

Related Reading