EEPROM Strukturen speichern über SPI-Bus

Ähnliche Dokumente
C- Kurs 07 Höhere Datentypen

INE1 Arrays, Zeiger, Datenstrukturen

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Grundlagen der Informatik 6. Arrays I

EEPROM Lesen/Schreiben über SPI-Bus

Einführung in C. Alexander Batoulis. 5. Mai Fakutltät IV Technische Universität Berlin

Zeiger. C-Kurs 2012, 2. Vorlesung. Tino Kutschbach 10.

5.1 Mehr Basistypen. (Wie viele Werte kann man mit n Bit darstellen?)

RO-Tutorien 3 / 6 / 12

Arrays (Felder/Vektoren)

Algorithmen und Datenstrukturen

Pointer und Arrays. INE1, Montag M. Thaler, Office TG208. ZHAW, M. Thaler, K. Rege, G.

Übersicht. Informatik 1 Teil 9: komplexe Datentypen (Strukturen, Enumerationen, Unions)

H S R R a p p e r s w i l \0

Zeiger: Der Adressoperator &

int i=1; //Integerzahl i anlegen und mit 1 initialisieren float wert; //Floatzahl deklarieren scanf( %f,&wert); //Wert über Tastatur eingeben

C-Propädeutikum Höhere Datentypen

C++ - Einführung in die Programmiersprache Zeiger, Referenzen und Strukturen. Leibniz Universität IT Services Anja Aue

1. Referenzdatentypen: Felder und Strings. Referenz- vs. einfache Datentypen. Rückblick: Einfache Datentypen (1) 4711 r

1. Referenzdatentypen: Felder und Strings

2. Programmierung in C

Inhalt. 1 Einstieg in die Welt von C Erste Schritte in C 31. Vorwort... 15

Teil 5: Zeiger, Felder, Zeichenketten Gliederung

Einführung in die Programmiersprache C

Physische Datenstrukturen

Einstieg in die Informatik mit Java

Einführung Sprachfeatures Hinweise, Tipps und Styleguide Informationen. Einführung in C. Patrick Schulz

4.2 Programmiersprache C

RO-Tutorien 17 und 18

Inhalt. 4.5 Arbeit mit Zeigern (engl. Pointer)

GI Vektoren

Übungspaket 14 Eindimensionale Arrays

Objekte werden eindeutig beschrieben durch ihren Typ und einen beliebig wählbaren Bezeichner.

9. Vektoren. (auch Felder/array)

Ausgabe:

Zusammenfassung des Handzettels für Programmieren in C

F Zeiger, Felder und Strukturen in C

C++ Teil 6. Sven Groß. 23. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 15

RO-Tutorien 15 und 16

PicAxe M2 - Das Speicherkompendium. Ausgabe Matthias Heuschele / SSE

Propädeutikum. Dipl.-Inf. Frank Güttler

Viel Erfolg bei der Bearbeitung der Aufgaben!

Übungspaket 20 Zeiger und Zeigervariablen

Herzlich willkommen!

Einführung in die Programmierung für NF MI. Übung 04

Kapitel 3: Variablen

Einführung in die Programmierung

Anregungen zu Übung 2

Grundlagen und Konzepte von C Datenstrukturen

Zeiger (engl. Pointer)

II. Grundlagen der Programmierung. Beispiel: Merge Sort. Beispiel: Merge Sort (Forts. ) Beispiel: Merge Sort (Forts. )

C++ Teil 5. Sven Groß. 8. Mai IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 8. Mai / 16

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Arduino Kurs Das LC-Display. Stephan Laage-Witt FES Lörrach

Abgeleitete Datentypen (1) Richtlinien

Kommentare in C. Keine Ahnung was ich vor einem Jahr gemacht habe. Ich verstehe es nicht ich schreibe es nochmal..

Betriebssysteme, Rechnernetze und verteilte Systeme 1. Crashkurs C (2)

Assembler - Adressierungsarten

Zeiger, Arrays und Strings in C und C++

C++ - Objektorientierte Programmierung Konstante und statische Elemente

Informatik I (D-MAVT)

Programmierkurs C++ Variablen und Datentypen

C++ Teil 5. Sven Groß. 13. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 18

Institut für Programmierung und Reaktive Systeme. Java 2. Markus Reschke

C++ Teil 5. Sven Groß. 16. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 16

Informatik I (D-ITET)

Angewandte Mathematik und Programmierung

Arrays. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 3. 1 Modulübersicht 3

Zeiger (1) Allgemeines

Schwerpunkte. 10. Felder (Arrays) Grundprinzip von Arrays. Klassifikation von Typen in Programmiersprachen

Algorithmen und Datenstrukturen

2.8 Klassen. Nichtgleichartige Elemente können in Klassen zu einem neuen Typ zusammengefasst werden. Beispiel: Die drei Komponenten

Übungen zur Vorlesung Computergrundlagen WS 2008/09 Fakultät Physik, Universität Stuttgart Jens Harting, Martin Hecht, Bibhu Biswal Blatt 14

3.2 Datentypen und Methoden

Variablen, Konstanten und Datentypen

Inhaltsverzeichnis. Kapitel i: Schnelleinstieg 13. Kapitel 2: Was sind Programme? 17. Kapitel 3: Wie erstellt man eigene Programme?

Programmieren in C. Speicher anfordern, Unions und Bitfelder. Prof. Dr. Nikolaus Wulff

7. Organisation von Informationen

Datentypen: Enum, Array, Struct, Union

Teil 6: Strukturen und Unionen Gliederung

Algorithmen und Datenstrukturen

Informatik Vorkurs - Vorlesung 2

Datenfelder (Arrays) Vektoren, Matrizen, Tabellen. Dr. Beatrice Amrhein

Programmieren in C. Funktionen mit Zeigern und Adressen. Prof. Dr. Nikolaus Wulff

Projekt 3 Variablen und Operatoren

Tutorium Rechnerorganisation

Einführung in C. EDV1-04C-Einführung 1

Vorkurs Informatik WiSe 16/17

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Strukturierte Datentypen (struct) 2006 Pearson Education, Inc. All rights reserved.

Eine praktische Einführung in die Programmierung mit der Programmiersprache C

M. Graefenhan Übungen zu C. Blatt 3. Musterlösung

Kurseinheit 3. Spaß an Technik: Elektronik & Mikrorechner. 1. Elektronik. 3. Software. 2. Mikrorechnertechnik. Anhänge. Der Piezowandler Frequenz

5.4 Arrays. Oft müssen viele Werte gleichen Typs gespeichert werden. Idee: Lege sie konsekutiv ab! Greife auf einzelne Werte über ihren Index zu!

Programmiersprachen Einführung in C

Gedächtnis. Während der Abarbeitung eines Algorithmus müssen sich Dinge gemerkt werden bzw. auf Dingen wird gerechnet. Zugriff.

Transkript:

EEPROM Strukturen speichern über SPI-Bus Experiment EEPROMstruct 7 A.Schultze / DK4AQ 18.06.2013 Es soll eine Tabelle aus verschiedenartigen Informationen im EEPROM abgelegt und wieder gelesen werden. Solche Tabellen dienen z.b. zur Abspeicherung von Startwerten und Korrekturwerten für Geräte. Auch die letzte Einstellung vor Abschaltung des gerätes kann man so speichern.. Ein typisches Beispiel ist die Stationseinstellung an Radios, Fernsehern oder Funkgeräten: Kanal Repeater Frequenz/kHz 54 Steinberg 145675,0 723 Wolfsburg 439050,0 58 Bocksberg 145725,0 56 Bergen 145700,0 63 Deister 145787,5 742 Celle 439275,0 746 Brocken 439325,0 684 Wurmberg 438550,0 29.05.14 SPI_EEPROMstring7 1

Bisher haben wir mit normalen Variablen oder mit Arrays (Feldern) gearbeitet. Arrays enthalten eine Anzahl Elemente, die gleiche Bedeutungen haben. Element 0 Element 1 Element 2 Element 3 Element 4 23 74 110 13 99 anzahl unsigned char anzahl[5]; Index // Deklaration eines Arrays mit 5 unsigned char //und dem Namen anzahl anzahl[1] greift auf das Element 1 des Arrays zu.(nicht Element 0!!!) anzahl[3] = 13; x = anzahl[1]; anzahl[ ] = { 23, 74,110,13,99}; anzahl[ ] = { Hello }; 29.05.14 SPI_EEPROMstring7 2

Wenn Informationen abgespeichert werden sollen, dann gehören häufig unterschiedliche Kategorien von Informationen zusammen. Dazu bietet C die Möglichkeit an, eigene Variablentypen zu definieren, in denen mehrere Kategorien zusammengeheftet werden. typedef struct { int kanalnummer; char kanalname[10]; unsigned long frequenz; } kanal_struct; Für ein Fuinkgerät sollen folgende Informationen zur Auswahl stehen: Kanalnummer 0...999 Kanalname 9 ASCII-Zeichen Frequenz 140-500 Mhz mit einer Auflösung von 0,1kHz Mit der obigen Definition einer neuen Struktur lassen sich weitere strukturierte Variablen deklarieren : Man kann auf diese Strukturvariablen Einzelelementweise zugreifen. kanal_struct kanal_daten; ACHTUNG! Textstrings lassen sich kanal_struct eeprom_daten zwar als String bei der Intialisierung der Struktur einfach eingeben, jedoch kanal_daten.frequenz = 4390500; können sie später nur über spezielle Kanal = kanal_daten.kanalnummer; String-Funktionen zugegriffen werden (z.b. strcopy ). 29.05.14 SPI_EEPROMstring7 3

Wenn man nun eine Fernbedienung oder ein Senderauswahlmenü als Ziel hat, kann man die neuen Strukturen auch als Tabelle anlegen (Array of Arrays): kanal_struct kanal_daten[8] = { {54,"Steinberg",1456750}, {723,"Wolfsburg",4390500}, {58, "Bocksberg",1457250}, {56, "Bergen ",1457000}, {63, "Deister ",1457875}, {742,"Celle ",4392750}, {746,"Brocken ",4393250}, {684,"Wurmberg ",4385500} }; Arrays: Zuweisung Strings in dieser Form nur bei Initialisierung möglich! Damit wurd eine Array kanaldaten mit 8 Einträgen definiert. Alle Einträge sind vom Typ kanal_struct. Die Einträge werden zur Initialisierung gleich mit Werten gefüllt. Wird nun z.b. kanal_daten[2] adressiert, so stehen über den Punktoperator die zugehörigen Werte zur Verfügung. x = kanal_daten[2].kanalnummer Serial.print( kanaldaten[2].kanalname y = frequenz 29.05.14 SPI_EEPROMstring7 4

Das Problem beim Transport dieser Daten in das EEPROM ist, dass es nur Bytes akzeptiert. Wie gewinnt man aus der beschriebenen Struktur nun Bytes und trasportiert sie ins EEPROM und kann sie beim Lesen auch wieder zusammenbauen? & : Adressoperator, bedeutet Speicheradresse von * : Inhaltsoperator, bedeutet Inhalt von kanalnummer kanalname frequenz int char string unsigned long 02 D3 W o l f s b u r g 0h 02 9D EF E8 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 Adressen kanal_daten[1] & &kanal_daten[0] -> 1224 Zur Adressierung der einzelnen Bytes werden Pointer verwendet. Pointer haben typabhängige Eigenschaften. 29.05.14 SPI_EEPROMstring7 5

byte *lesezeiger; int *wert_zeig; long *freq_zeig; Byte-Zeiger ändern ihre Speicheradresse bei jedem Inkrement um den Wert 1 Int-Zeiger ändern ihre speciehradresse bei jedem Inkrement um den Wert 2 Long-Zeiger ändern ihre speciehradresse bei jedem Inkrement um den Wert 4 Wenn wir also byteweise lesen wollen, dann benötigen wir einen Bytezeiger. byte *b_ptr; b_ptr = (byte *)&akt_datensatz + i; Das Konstrukt &akt_datensatz wird immer die erste Speicheradresse des gesamten Konstruktes angegeben. Mit &akt_datensatz + i kann man über i die Adresse erhöhen. (byte *) bedeutet, dass der Ausdruck als Byte-Adresse gelesen wird. Der b_ptr zeigt also gesteuert über i auf ein Byte in der Struktur. *b_ptr = SPI.transfer(i); Damit kann man Daten in den Inhalt der Speicherstelle, ablegen, auf b_ptr zeigt. 29.05.14 SPI_EEPROMstring7 6

Schaltung der SPI-EEPROM-Experimente 29.05.14 SPI_EEPROMstring7 7

SPI_EEPROstruct (1) 29.05.14 SPI_EEPROMstring7 8

SPI_EEPROstruct (2) Deklaration und Initialisierung des Arrays (2D) 29.05.14 SPI_EEPROMstring7 9

SPI_EEPROstruct (3) 29.05.14 SPI_EEPROMstring7 10

SPI_EEPROstruct (4) 29.05.14 SPI_EEPROMstring7 11

SPI_EEPROstruct (5) Ende setup( ) 29.05.14 SPI_EEPROMstring7 12

SPI_EEPROstruct (6) Ende setup( ) 29.05.14 SPI_EEPROMstring7 13

SPI_EEPROstruct (7) Schleife: vom Datensatz 0 bis zum Ende der Tabelle akt_datensatz bekommt zu schreibenden Inhalt Startadresse Schreiben im EEPROM übergeben Schleife: Vom Element 0.kanalname bis Element 2.frequenz ausgeben 29.05.14 SPI_EEPROMstring7 14

SPI_EEPROstruct (8) Schleife: vom Datensatz 0 bis zum Ende der Tabelle Schleife: Vom Element 0.kanalname bis Element 2.frequenz ausgeben 29.05.14 SPI_EEPROMstring7 15

SPI_EEPROstruct (9) Schleife: vom Datensatz 0 bis zum Ende der Tabelle Startadresse Lesen im EEPROM übergeben Schleife: Vom Element 0.kanalname bis Element 2.frequenz einlesen 29.05.14 SPI_EEPROMstring7 16

SPI_EEPROstruct (10) 29.05.14 SPI_EEPROMstring7 17

SPI_EEPROstruct (11) 29.05.14 SPI_EEPROMstring7 18

EEPROM Daten byteweise lesen 29.05.14 SPI_EEPROMstring7 19

EEPROM Status lesen EEPROM Freigabe Schreiben 29.05.14 SPI_EEPROMstring7 20

EEPROM Daten byteweise schreiben 29.05.14 SPI_EEPROMstring7 21

EEPROM Memory Management setzen 29.05.14 SPI_EEPROMstring7 22

Symbolische Konstanten für 25L010A 29.05.14 SPI_EEPROMstring7 23

Ergebnis der EEPROM-Schreib- und Lese- Aktion auf dem seriellen Monitor 29.05.14 SPI_EEPROMstring7 24