PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Arduino Flash: mit Sketch Speichern und Lesen "großer" 1-2-dim Arrays und Structures?



HaWe
28.11.2014, 17:41
hallo,
wie ist der beste und schnellste Weg zum schnellen Speichern und Lesen "großer" 1-2-dim Arrays und Structures im Flash per Arduino Sketch?
Genau handelt es sich - für den Arduino Due - um entweder

byte array2D[80][80]

oder
byte array[256]

oder arrays von mehreren
struc {
int16_t i;
int32_t j;
int8_t b,c,d;
int8_t str[50];
} data;

data darray[100];

am besten wäre es sicher, alle Arrays als Block auf 1 Rutsch zu schreiben und zu lesen;

beim Lesen der einfachen Arrays geht das auch, weil die Länge bekannt ist,

aber bei den Datensatz-Arrays muss record-weise gelesen werden bis eof() , da die Menge an Datensätzen bei Programmstart noch nicht bekannt ist.


ich möchte auf keinen Fall die Elemente immer nur einzeln lesen oder schreiben;
was ich suche (aber nicht gefunden habe) ist sowas wie
setbuf ();
fputs ();
fflush ();

HaWe
29.11.2014, 08:55
edit:
las gerade, dass man hier sowieso nicht allzu oft schreiben darf (10k-100k).

Das ist ja hundsmiserabel.

Welche anderen Möglichkeiten zum einfachen Anschließen von externem Speicher (EEPROM oder SD etc) gibt es inkl. passende Schreib-/Lese-Software ?

Mxt
30.11.2014, 10:31
Eine Lösung beim Due den Flash zu beschreiben habe ich noch nicht gesehen. Meines Wissens nach gibt es da auch kein Gegenstück zur EEPROM-Funktion der kleinen Arduinos.

Wenn ich nur einfache Konfigurationsdaten speichern will, nehme ich bei den anderen Controllern EEPROMs von Microchip mit I2C-Anschluss, normalerweise den 24LC256. Die gibt es auch mit DIP-Gehäuse, dadurch kann man sie als steckbare Speichermodule verwenden. Es gibt auch größere, wie den 24LC1024 und schnellere mit SPI (25LC...).

Ansonsten "füttere" ich den Due von einem anderem Board. Entweder vom Beaglebone, der kann über USB auch gleich die Stromversorgung vom Due erledigen. Oder von einem zweiten Controllerboard über UART. Das sind dann ein EA LPC4088 Quickstart Board (hat 32 MB SRAM und 8 MB Flash auf dem Board) oder das Freescale Freedom K64F mit Mikro-SD Steckplatz (bis 32 GB).

HaWe
30.11.2014, 16:11
halo,
inzwischen habe ich ein paar Lösungen für den Due gesehen, um seinen Flash zu beschreiben, aber es ist kein EEPROM und verträgt nicht viele Schreibzyklen.
externes EEPROM müsste >> 1 Mio Schreibzyklen vertragen (sind oft auch nur >= 10k)
interner Speicher vom Due wird beim Speichern einer neuen Programmversion auch gelöscht. Das geht nun gar nicht, dann sind nämlich alle bisher mühsam ermittelten Daten weg. Es darf daher der Daten-Teil NICHT gelöscht werden. Außerdem müsste man auch zum Kopieren der Daten Zugriff darauf haben (z.B. auf PC zwischenspeichern und dann auf anderen Arduino-Speicher kopieren).

Also geht wohl beim Due nur externer Speicher, und ich denke fast, eine SD-Card wäre das beste.
Kennt jemand SD-Card Harware mit Libs zum Schreiben und Lesen von Daten (Funktionsumfang etwa wie stdio.h, exakte Syntax ist ntl nicht so wichtig)?

Mxt
30.11.2014, 17:09
Eine SD-Card Library gibt es doch bei Arduino.
http://arduino.cc/en/Reference/SD

Hardware wäre z.B. sowas
http://www.watterott.com/de/mSD-Breakout

Von der Library gibt es auch einen Fork mit

Support soft SPI on any pins with Arduino Due
https://github.com/adafruit/SD

HaWe
30.11.2014, 18:31
ja klar, super, danke!
Was bedeutet aber der Hinweis mit "soft SPI on Due" beim github-Link https://github.com/adafruit/SD?

heißt das, die normale SPI-Lösung wie beim Mega (pins 50-53) im ersten Link http://arduino.cc/en/Reference/SD
geht nicht?

(ps, edit:
50-53 kann ja nicht gehen, aber der Due hat auf dem SPI-Header ja stattdessen 74(MISO), 75(MOSI), 76(SCK).
SS sehe ich gar nicht auf dem SPI-Header, CS auch nicht, nur RESET gegenüber GND.)

Mxt
01.12.2014, 08:06
CS, also Chip Select kann bei meinen Boards ein beliebiger IO-Pin sein.

Habe mir den Code auf github etwas angesehen. So richtig verstanden habe ich nicht, wie das konfiguriert wird. Ich denke aber Soft-SPI ist nur als (langsame) Alternative zur Hardwareversion gedacht. Übrigens ist SPI sowieso die langsamere Variante zum Zugriff auf eine SD, es gibt eine noch eine andere Schnittstelle mit vier Datenleitungen (MCI ?).

Nach dem ich mir die Lib angesehen habe, bin ich ehrlich gesagt ganz froh, mit den anderen Boards zu arbeiten. Hier mal die Doku von deren SD-Lib
http://developer.mbed.org/handbook/SDFileSystem
Man gibt beim Anlegen des Dateisystem-Objektes einfach die Pin-Namen an, an denen die Karte hängt. Dann kann man ganz normal mit den Funktionen aus stdio.h arbeiten ...

Ach ja:
Noch eine Zusatzinfo zu den oben genannten EEPROMs. Da steht im Datenblatt "more than one million write cycles". Auch die Kommunikation ist dort schön mit Beispielen dargestellt. Sollte mit Wire eigentlich gehen.

HaWe
01.12.2014, 09:05
hi,
1 Mio klingt ja absolut ok, und wire ist eigtl. auch ok, halt nicht ganz so gut wie stdio.h
Verstehe auch nicht, wrum die Arduino-Leute da so einen Murks veranstalten.
Aber welchen Speicher mit den EEPROMS meinst du jetzt, welchen Link genau? Meinst du den 24LC256 oder ein anderes Controllerboard?

Mxt
01.12.2014, 10:08
Ja, den 24LC256.

HaWe
01.12.2014, 10:16
habe jetzt mal schnell gegoogelt:

- passt der auf ein Steckboard?
http://www.ebay.de/itm/24LC256-I-P-EEPROM-32Kx8-Bit-seriell-2-5V-DIP8-von-Microchip-/310625265145?pt=Bauteile&hash=item4852b565f9

- wie kann man die Daten auf den PC kopieren (zum Bearbeiten) und auf andere Arduinos übertragen (duplizieren)?

Mxt
01.12.2014, 10:55
Es ist ein 8-poliges IC, wie ein Operationsverstärker.

Zum Zugriff vom PC verwende ich ein selbst geschriebenes Programm in C# auf dem PC und ein passendes Mikrocontrollerprogramm dazu. Dazu eine Steckplatine mit zwei Widerständen und 100 nF Kondensator.

Ich gebe zu, eine SD-Karte ist da einfacher. Ersatzweise höchstens noch ein USB-Stick, manche Boards können das. Habe ich noch nie probiert:
http://developer.mbed.org/cookbook/USBMSDHost

HaWe
01.12.2014, 11:35
USB geht nicht, der Due hat nur slave-Ports

aber dann denke ich auch eher SD.
Frage ist wieder:
wie anschließen?
der Due hat ja kein Hardware-SPI auf Pins 8-13 wie der Uno oder wie 50-53 wie der Mega, sondern nur welche auf den SPI-ICSP-Headern.
Frage, ob man das problemlos als Hardware-SPI auf pins 74-76 (SPI-1-Header) konfigurieren kann, ich blick bei dem Code absolut nicht durch.
http://arduino.cc/en/Reference/SD
https://github.com/adafruit/SD

Software-SPI ist sicher viel zu langsam, vermute ich.

Sisor
01.12.2014, 20:47
Hier kann man das Handbuch des Mikrocontrollers runterladen. (http://www.atmel.com/devices/SAM3X8E.aspx?tab=overview)

Hier ist das Pin-Mapping MC -> Arduino dokumentiert. (http://arduino.cc/en/Hacking/PinMappingSAM3X)

Benutze die Pins 74-76! Man kann übrigens mit DMA Daten vom RAM Richtung SPI (oder andersrum) schaufeln, ohne den MC zu stören. Inwieweit die Arduino-Entwickler das implementiert haben, vermag ich allerdings nicht zu sagen.

HaWe
02.12.2014, 10:13
ja, werde ich versuchen.
Nachdem SPI-SD-Card Halterungen aber auch auf allen TFT Displays hinten mit drauf sind, bin ich doch mal gespannt, ob es nicht doch welche gibt, die man verdammt nochmal endlich auf Due und Mega zum Laufen kriegt.
Habe schon mindestens 10 verschiedene ausprobiert:
Auf Uno kein Problem, aber auf Due und Mega Pustekuchen.

was ein Sch****dreck mit diesen Arduinos, aber bevor ich die Displays mit SD nicht mit SPI zum Laufen kriege, warte ich mit externen gesonderten SD-SPI erstmal ab.
Ich könnte diesen ganzen Arduino-Mist auf den Mond schießen!!
Nichts passt, nichts ist kompatibel!!!
:mad: