INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Ins eeprom schreiben/lesen
15.12.2015, 12:13
Beitrag #1
Ins eeprom schreiben/lesen
Güß euch,
Ich bin gerade dabei meine ersten Schritte zu tun, und habe einige Verständnisfragen.

Mit Programmieren in welcher Form auch immer, hatte ich bis jetzt nicht zu tun ;-)
So als Erklärung, wenn manche Fragen etwas merkwürdig anmuten.

Ich möchte einen Kettenöler für Motorräder programieren. Das gibt es natürlich schon fertig. Aber wo bleibt da der Spaß, und man lernt auch nichts dabei. LINK

Die Funktionalität, hab ich schon funktionsfähig Programiert Big Grin
Via Bluetooth HC06 Modul kann ich auch schon Verbindung aufnehmen!
Als nächstes muss ich einige Variablen ins eeprom schreiben.

ich möchte die lib EEPROMex verwenden.

Die Variablen die ich wegschreiben möchte:

float Raddurchmesser = 1.780 ; // in m Raddurchmesser in mm
int StreckeOelen = 2000 ; // in m nach welcher gefahrenen Strecke soll geschmiert werden
byte AnzMagnete = 1 ; // Wie viele Magnete/Impulse je Radumdrehung)
byte Pumpstoesse = 5; // Anzahl der Pumpvorgänge bei einem Ölvorgang

Und bei Bedarf:
int ImpulsHallgeber = 0; // Zählt die Impulse vom Hallsensor

Ich hab mich eingelesen, soweit ich kann, aber so richtig verstanden habe ich es nicht.

Adressen sind von 0 - 1023
eine Adresse ist 1 Byte
wenn eine Variable z.B. int 2 Byte belegt, muss ich die auch zuweisen.

z.B.
EEPROM.write(0,Raddurchmesser); // float Raddurchmesser = 1.780
EEPROM.write(2,StreckeOelen); // int StreckeOelen = 2000
EEPROM.write(4,AnzMagnete); // byte AnzMagnete
EEPROM.write(5,Pumpstoesse); // byte Pumpstoesse
EEPROM.write(6,ImpulsHallgeber); // int ImpulsHallgeber

Ist das richtig so ?

und auslesen:

Raddurchmesser = EEPROM.read(0); // float Raddurchmesser
StreckeOelen = EEPROM.read(2); // int StreckeOelen
AnzMagnete = EEPROM.read(4); // byte AnzMagnete
Pumpstoesse= EEPROM.read(5); // byte Pumpstoesse
ImpulsHallgeber = EEPROM.read(6); // int ImpulsHallgeber

Würde das so funktionieren ?

Andi
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.12.2015, 12:40
Beitrag #2
RE: Ins eeprom schreiben/lesen
moin,

ich hab ma geguckt, interessiert mich auch... hab folgendes dazu gefunden

ArduinoPlayGround.cc



gruss

Nicht denken,...
...nachdenken... Rolleyes
http://capsicum-felicitas.de.tl
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.12.2015, 15:02
Beitrag #3
RE: Ins eeprom schreiben/lesen
(15.12.2015 12:40)Hilgi schrieb:  moin,

ich hab ma geguckt, interessiert mich auch... hab folgendes dazu gefunden

ArduinoPlayGround.cc

gruss

Von dort ist das Beispiel Smile natürlich abgewandelt, und aus dem
/*
* EEPROMEx
*
* Demonstrates reading, writing and updating data in the EEPROM
* to the computer.
* This example code is in the public domain.
*/

#include <EEPROMex.h>

Da steht aber noch jede menge Code, den ich nicht verstehe.
Braucht man das alles, oder er geht es so einfach wie ich hoffe Shy
lg
andi
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.12.2015, 17:30
Beitrag #4
RE: Ins eeprom schreiben/lesen
Hi!
Ein Float benötigt 32 Bits oder 4 bytes.
Selbst wenn die Eprom Lib das automatisch erledigt, und Du in Byte 0 den Float Wert packst, kannst Du nicht in Byte 2 das Nächste schreiben, sondern erst in Byte 5.

Sollte die Library das nicht automatisch machen (Float auf 4 Bytes verteilen) wäre die einfachste Variante folgende:
Einfach den Raddurchmesser in Dezimeter oder Zoll als Ganzzahl zwischen 0 und 255 nehmen.
So brauchst Du nur ein Byte im Eprom und sparst Dir das Umwandeln.
Es kommt doch in diesem Fall nicht drauf an, das Du exakt nach 2000 Metern schmierst.
2100 oder 1900 ist doch auch völlig in Ordnung.

Binatone
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.12.2015, 00:40
Beitrag #5
RE: Ins eeprom schreiben/lesen
Hallo anwo,

EEPROMex kenne ich nicht, mit der Standard EEPROM-Library würde es gehen (bis auf den Flüchtigkeitsfehler mit float).

Probiere mal Folgendes (habe ich eben bei mir probiert), das spart die Rechnerei und vermeidet Fehler:

byte offset = 0;
EEPROM.write(offset,Raddurchmesser); // float Raddurchmesser = 1.780
offset = offset + sizeoff(Raddurchmesser);
EEPROM.write(offset,StreckeOelen); // int StreckeOelen = 2000
....

In der Arduino-Sprachdefinition sind nur elementare Funktionen beschrieben, wahrscheinlich, um den Einstieg zu erleichtern und um unabhängig vom C-Compiler zu sein.
Ich bin eigentlich PASCALER, da kenne ich sizeoff. Dann Google mit "sizeof C" gab sofort die Bestätigung dass es gehen sollte, und es ging.

Noch etwas: EEPROM.write stresst; z. B. ATMLEL 328P (Arduino UNO) Lebensdauer 100.000 x Schreiben (in das gleiche Byte) .
Viel Erfolg
GuaAck
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.12.2015, 09:32
Beitrag #6
RE: Ins eeprom schreiben/lesen
(16.12.2015 00:40)GuaAck schrieb:  Hallo anwo,

EEPROMex kenne ich nicht, mit der Standard EEPROM-Library würde es gehen (bis auf den Flüchtigkeitsfehler mit float).

Probiere mal Folgendes (habe ich eben bei mir probiert), das spart die Rechnerei und vermeidet Fehler:

byte offset = 0;
EEPROM.write(offset,Raddurchmesser); // float Raddurchmesser = 1.780
offset = offset + sizeoff(Raddurchmesser);
EEPROM.write(offset,StreckeOelen); // int StreckeOelen = 2000
....

In der Arduino-Sprachdefinition sind nur elementare Funktionen beschrieben, wahrscheinlich, um den Einstieg zu erleichtern und um unabhängig vom C-Compiler zu sein.
Ich bin eigentlich PASCALER, da kenne ich sizeoff. Dann Google mit "sizeof C" gab sofort die Bestätigung dass es gehen sollte, und es ging.

Noch etwas: EEPROM.write stresst; z. B. ATMLEL 328P (Arduino UNO) Lebensdauer 100.000 x Schreiben (in das gleiche Byte) .
Viel Erfolg
GuaAck
Hallo Probiert mal folgendes. Funktioniert bei mir ohne Probleme.
Die Funktionen für das schreiben und lesen von Float mit Pointern sind notwendig,
können aber von allen Stellen aufgerufen werden.
[code]
#include <EEPROM.h>
byte X1;
int X2;
float X3;
long X4;
void setup()
{
// Setup Code
}

void loop()
{
// Byte nach und vom EERom ------------------------------------------
EEPROM.update(0, X1); // Byte X1 nach EEprom schreiben
X1 = EEPROM.read(0); // Byte X1 vom EEprom lesen

// Word - Int 2 Byte nach und vom EERom ------------------------------------------
EEPROM.update(1, highByte(X2)); // Int nach EEProm schreiben
EEPROM.update(2, lowByte (X2));

X2 = EEPROM.read(1); // High-Byte lesen
X2 = X2 << 8;
X2 = X2 | EEPROM.read(2); // Low-Byte lesen

// Float 4 Byte nach und vom EERom ------------------------------------------
Float_nach_EEPROM(); // Aufruf Funktion Schreiben nach EEProm
Float_vom_EEPROM_Lesen(); // Aufruf Funktion lesen vom EEProm

// Long 4 Byte nach und vom EERom ------------------------------------------
EEPROM.update((7), ((X4 >> 24) & 255)); // HH-Byte
EEPROM.update((8), ((X4 >> 16) & 255)); // H-Byte
EEPROM.update((9), ((X4 >> 8) & 255)); // L-Byte
EEPROM.update((10), (X4 & 255)); // LL-Byte

X4 = EEPROM.read(7); // HH-Byte
X4 = X4 << 8;
X4 = X4 | EEPROM.read(8); // H-Byte
X4 = X4 << 8;
X4 = X4 | EEPROM.read(9); // L-Byte
X4 = X4 << 8;
X4 = X4 | EEPROM.read(10); // LL-
}

void Float_nach_EEPROM()
{
char *ptr = (char*) & X3;
EEPROM.update(3, *ptr++);
EEPROM.update(4, *ptr++);
EEPROM.update(5, *ptr++);
EEPROM.update(6, *ptr++);
}
void Float_vom_EEPROM_Lesen()
{
char *ptr = (char *) & X3;
*ptr++ = EEPROM.read (3);
*ptr++ = EEPROM.read (4);
*ptr++ = EEPROM.read (5);
*ptr++ = EEPROM.read (6);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.12.2015, 08:02
Beitrag #7
RE: Ins eeprom schreiben/lesen
Ich danke euch für die Antworten Heart

Ich arbeite mich mal durch, damit ich auch alles verstehe.

Ich werde euch dann meine Implementierung zeigen

lg
Andi
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.12.2015, 08:28 (Dieser Beitrag wurde zuletzt bearbeitet: 18.12.2015 08:29 von anwo.)
Beitrag #8
RE: Ins eeprom schreiben/lesen
Big Grin Big Grin

Danke für alle Denkanstöße Heart

Ich verwende die EEPROMex da erspare ich mir das zusammensetzen der Variablen Blush

Der Code ist sicher nicht besonders elegant, und es gäbe noch vieles was man einbauen könnte, aber soweit bin ich noch nicht Rolleyes

Hab ich das richtig verstanden, wenn ich ein EEPROM.updateXXXX mache, wird das eeprom nur beschrieben wenn der Wert im eeprom sich von dem den ich wegschreiben will unterscheidet?

Code:
#include <EEPROMex.h>

float Raddurchmesser = 1780 ;       // 4Byte in m Raddurchmesser in mm
int StreckeOelen = 2000 ;            // 2Byte in m  nach welcher gefahrenen Strecke soll geschmiert werden
byte AnzMagnete = 1 ;                // 1Byte Wie viele Magnete/Impulse je Radumdrehung)

// Pumpe
byte Pumpstoesse = 5;                // 1Byte Anzahl der Pumpvorgänge bei einem Ölvorgang

float OutRaddurchmesser = 0;      
int OutStreckeOelen = 0;          
byte OutAnzMagnete = 0;                
byte OutPumpstoesse = 0;


byte addrPumpstoesse = 0;
byte addrAnzMagnete = 1;
byte addrStreckeOelen = 2;
byte addrRaddurchmesser = 4;




void setup()
{
Serial.begin(9600);
EEPROM.updateFloat(addrRaddurchmesser, Raddurchmesser);
EEPROM.updateInt(addrStreckeOelen, StreckeOelen);
EEPROM.updateInt(addrAnzMagnete, AnzMagnete);
EEPROM.updateByte(addrStreckeOelen, StreckeOelen);
EEPROM.updateByte(addrPumpstoesse, Pumpstoesse);



OutRaddurchmesser = EEPROM.readFloat(addrRaddurchmesser);      
OutStreckeOelen = EEPROM.readInt(addrStreckeOelen);          
OutAnzMagnete = EEPROM.readByte(addrAnzMagnete);                
OutPumpstoesse = EEPROM.readByte(addrPumpstoesse);

Serial.print("Raddurchmesser = 1780       ");
Serial.print(Raddurchmesser);
Serial.print("\t");
Serial.print(OutRaddurchmesser);
Serial.println();

Serial.print("StreckeOelen = 2000        ");
Serial.print(StreckeOelen);
Serial.print("\t");
Serial.print(OutStreckeOelen);
Serial.println();

Serial.print("AnzMagnete = 1             ");
Serial.print(AnzMagnete);
Serial.print("\t");
Serial.print(OutAnzMagnete);
Serial.println();

Serial.print("Pumpstoesse = 5             ");
Serial.print(Pumpstoesse);
Serial.print("\t");
Serial.print(OutPumpstoesse);
Serial.println();



}
void loop() { }
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Data Logger Daten auf SD Card schreiben Crichton 12 284 22.11.2016 18:32
Letzter Beitrag: Crichton
  Serial Monitor ASCII 1 schreiben BennIY 11 579 01.08.2016 16:42
Letzter Beitrag: Mathias
  String in EEPROM Speichern BennIY 2 410 27.06.2016 10:23
Letzter Beitrag: BennIY
  Grundlagenfrage EEPROM Tobias1984 3 492 14.04.2016 10:43
Letzter Beitrag: Bitklopfer
  char* inhalt in eine Datei auf SD-Karte schreiben MartinK 0 341 30.03.2016 16:42
Letzter Beitrag: MartinK
  Attempt to write outside of EEPROM memory anwo 1 375 12.02.2016 11:06
Letzter Beitrag: anwo
  Suche Konzept für ein Inhaltsverzeichnis eines EEPROM avoid 0 311 27.01.2016 10:49
Letzter Beitrag: avoid
  Teensy- Tastaturblöcke in Schreiben einfügen Modinox 19 1.386 10.01.2016 19:09
Letzter Beitrag: Modinox
  Pro Mini ADC Kanal 8 lesen Bitklopfer 8 617 30.12.2015 20:27
Letzter Beitrag: Bitklopfer
  float in eeprom goldfisch 4 670 28.12.2015 18:54
Letzter Beitrag: Bitklopfer

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste