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
digitale Werte trotz Stromunterbrechung nicht verlieren
26.12.2015, 17:26
Beitrag #17
RE: digitale werte trotz stromunterbruch nicht verlieren
das heisst also, dass meine zahl aus dem zähler - sagen wir es ist im moment z.b. 50.327 - mit diesem befehl
static union {
byte byteein[4];
unsigned long int longein;
};
so umgeschrieben wird, dass das eeprom es lesen kann? - aber wie kommt es denn jetzt ins eeprom?

und wohin im script gehört das static union? in den loop?
dort entsteht ja auch die zahl aus dem counter
counter = counter + 12.732;
tasterGedrueckt = 0; // setzt gedrückten Taster zurück
Serial.print(counter,3);Serial.println(" m");

wie schreibe ich jetzt das, was im Serial.print steht ins eeprom?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.12.2015, 19:31
Beitrag #18
RE: digitale werte trotz stromunterbruch nicht verlieren
(26.12.2015 17:26)goldfisch schrieb:  das heisst also, dass meine zahl aus dem zähler - sagen wir es ist im moment z.b. 50.327 - mit diesem befehl
static union {
byte byteein[4];
unsigned long int longein;
};
so umgeschrieben wird, dass das eeprom es lesen kann? - aber wie kommt es denn jetzt ins eeprom?

und wohin im script gehört das static union? in den loop?
dort entsteht ja auch die zahl aus dem counter
counter = counter + 12.732;
tasterGedrueckt = 0; // setzt gedrückten Taster zurück
Serial.print(counter,3);Serial.println(" m");

wie schreibe ich jetzt das, was im Serial.print steht ins eeprom?

..also die Union ist eine Variablendeklaration und gehört somit zu den anderen Variablendeklarationen vor das Setup.

Und nein...das EEPROM liest die Bytes nicht aus der Union aus...das mußt DU programmieren das die Werte aus dem Bytearray in das EEPROM geschrieben wird. Schätze mal an der Stelle fehlen dir noch die Grundkenntnisse im programmieren wie was vor sich zu gehen hat....also am besten mal üben...

Und das was im Serial.print steht.... also das geht auf den Monitor und nicht ins EE...

ins EE schreibt man so:
EEPROM.write(EE-Adresse,Wert);

Hierzu empfehle ich mal in den Beispielen dich mit "eeprom_write example" bzw. "eeprom_read" zu beschäftigen. Auch das Programm "eeprom_put" sieht interessant aus...

lgbk


lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.12.2015, 13:46
Beitrag #19
RE: digitale werte trotz stromunterbruch nicht verlieren
da hast du natürlich recht, dass mir da ein paar grundkenntnisse fehlen. ich hab jetzt folgendes probiert:
Code:
#include <EEPROM.h>

float counter = 0;

void setup() {

  Serial.begin(9600);
}

void loop() {
  
   counter = counter + 12;           // ganzzahl wegen eeprom  

        Serial.print(counter,3);Serial.println(" m aus counter");

        Serial.print(EEPROM.read(256));Serial.println(" aus EEPROM ");Serial.println();
        
        EEPROM.write(256,(counter));
    }
}
der counter zählt in 12 schritten - im moment der einfachheit noch ganzzahlen... resp. kann ich float zahlen ins eeprom lesen? ich hab es mit zahlen mit 3 stellen nach dem komma zu tun... also z.b. 12.654 etc.

im serial monitor zeigt er mir jetzt zwar die letzte zahl aus dem eeprom bevor der strom unterbrochen wurde, ich muss allerdings das script nochmals hochladen, damit der serial monitor überhaupt funktioniert. nach dem strom einschalten zählt er gleich noch einmal 12 dazu, weil ich ja zuerst den knopf drücken muss, damit überhaupt etwas angezeigt wird. bei nächsten mal knopf drücken überschreibt es die gespeicherte zahl und er beginnt wieder von vorne zu zählen und ist daher auch gleich einmal 12 hinterher. er sollte aber die zahl aus dem eeprom behalten und dort weiterzählen. das problem scheint zu sein, dass es die zahl einfach überschreibt... ich mach also was falsch - aber was? Sad
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.12.2015, 14:43 (Dieser Beitrag wurde zuletzt bearbeitet: 27.12.2015 14:53 von goldfisch.)
Beitrag #20
RE: digitale werte trotz stromunterbruch nicht verlieren
jetzt hab ich noch folgendes geändert. es zählt jetzt gleichmässig und mit ganzzahlen scheint es mit dem weiterzählen nach stromunterbruch auch zu klappen. das dumme daran ist nur, dass ich den schalter 21 x oder 22 x drücken kann - dann beginnt er wieder bei null... was geschieht da genau? liegt das daran, dass ich nur eine adresse, nämlich nr. 254 beschreibe? und die hat zu wenig platz?
Code:
void loop() {
     // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);
  
val = digitalRead(switchPin); // read input value

EEPROM.read(254);

if (val == HIGH) { // check if the input is HIGH (button released)
    tasterZeit = millis();      // aktualisiere tasterZeit
    tasterGedrueckt = 1;        // speichert, dass Taster gedrückt wurde
  }
  
// Wenn die gewählte entprellZeit vergangen ist und der Taster gedrückt war...
  if ((millis() - tasterZeit > entprellZeit) && tasterGedrueckt == 1)
    {
      counter = EEPROM.read(254) + 12;             //  wird um +1 erhöht
      tasterGedrueckt = 0;      // setzt gedrückten Taster zurück

    EEPROM.write(254,(counter));
  
        lcd.print(counter,3);lcd.print(" m ");
        Serial.print(counter,3);Serial.println(" m aus counter");

        Serial.print(EEPROM.read(254));Serial.println(" aus EEPROM ");Serial.println();
        lcd.print(EEPROM.read(254));    
    }  
}
das problem mit den floatzahlen habe ich immer noch. wie lese ich die ins eeprom und wieder raus?

(27.12.2015 14:39)Lötzinnerhitzer schrieb:  warum speicherst Du nicht einfach den Counter in's EE und addierst den konstanten Float-Wert nach dem Auslesen wieder hinzu ?
ansonsten kann ich BK nur zustimmen:
Zitat:Schätze mal an der Stelle fehlen dir noch die Grundkenntnisse im programmieren wie was vor sich zu gehen hat....also am besten mal üben...

ich hab doch den counter ins ee geschrieben - auf adresse 254 in data
EEPROM.write(254,(counter));
aber er liest nach den kommastellen die zahlen nicht mehr und verrechnet sie auch nicht ;(
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.12.2015, 17:11
Beitrag #21
RE: digitale werte trotz stromunterbruch nicht verlieren
liebe leute - lasst mich bitte nicht hängen Undecided ich bemühe mich ja - kann ich aber nur im rahmen meiner möglichkeiten - und die sind nicht so gross Sad

ich bin echt am verzweifeln
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.12.2015, 07:08 (Dieser Beitrag wurde zuletzt bearbeitet: 29.12.2015 07:34 von avoid.)
Beitrag #22
RE: digitale werte trotz stromunterbruch nicht verlieren
Hallo Goldfischli, Wink

sorry, aber ich hab mir jetzt nicht die mühe gemacht, die vier Seiten durch zu lesen, was schon durchgekaut wurde .... trotzdem versuche ich mal dir zu helfen.

Wenn ich das richtig verstehe, willst du einen float-Wert (Fließkommazahl) im EEPROM ablegen damit er dir erhalten bleibt. (Wichtig: idr. ist nach ca. 1.000.000 Schreibzyklen die Speicherstelle nicht mehr fehlerfrei nutzbar)
Ich empfehle dir deinen float-Wert in den Ram zu schreiben und nur wenn der Strom ausfällt in den EEPROM zu sichern.
Das hilft dir aber nicht bei deinem Problem das die Kommastelle beim speichern verschwindet, richtig? Wink

Code:
// du verwendest also
float counter = 0; // als variable
EEPROM.write(254,(counter)); // zum speichern
EEPROM.read(254); // zum auslesen

Du arbeitest also immer auf der ein Byte großen Speicherstelle 254 deines EEPROM, egal wie groß er tatsächlich ist.
Doch dein Problem ist das fehlende Verständnis was ein float Wert ist und was beim "EEPROM.write()" und "EEPROM.read()" tatsächlich mit deinem float passiert.

Kleine Lehrstunde ... schrieb:int = (ganze Zahlen von -32.768 bis 32.767) diese wird als 16-bit (2-Byte) gespeichert.
float = (Zahl mit Kommastelle von -3.4028235E+38 bis 3.4028235E+38) diese als 32-bit (4 Byte) gespeichert.
Also ist ein int wert "256 x 256" groß und ein float "256 x 256 x 256 x 256" groß.

Dein EEPROM ist genau wie der RAM aber in einzelne Bytes eingeteilt.
Ich vergleich es gern mit einem Buch, das muss Seite für Seite geschrieben werden und man muss ständig umblättern um weiter schreiben zu können. Genau so wird es dann auch gelesen, Seite für Seite und auch wieder das umblättern nicht vergessen. (Mann hat es die Generation Hörbuch gut Big Grin )

Wenn du jetzt nur das einzelne Byte 254 beschreibst, dann fehlt dir der Rest natürlich. Und lustiger weise liest du auch nur das eine Byte, weswegen dir auch da der Rest fehlt, selbst wenn du deinen float-Wert komplett in den EEPROM gespeichert hättest.

Des Rätzels Lösung ist also was? Eine Schleife die alle vier Byte deines float-Wert in den EEPROM packt .... und eine die genau so wieder raus liest. Dabei solltest du dann eher bei 250 anfangen weil du ja vier Byte Platz brauchst. Aber denk zusätzlich mal über den Ram nach. Wink

Ich hab mal versucht einen Code zusammen zu stöpseln der dir veranschaulichen soll, was ich meine. Leider stimmt wohl etwas in meiner Umwandelung von float zum Bytearray nicht, aber das ist ja nur noch eine kleine Baustelle. Hoffe es hilft dir weiter.

Code:
#include <EEPROM.h>
float counter = 0; // als variable

void setup() {
   Serial.begin(9600);
}

void loop() {
  // an dieser stelle liest du deinen wert ein oder was auch immer.
  counter = 50.12; // als beispiel
  Serial.print("Counter ist: "); Serial.println(counter);
  
  // hier wird der Wert in den EEPROM geschrieben.
  writeFloat(250, counter); // zum speichern
  
  // hier wird der Wert aus dem EEPROM gelesen.
  counter = readFloat(250);
  delay(5000);
}

float readFloat(unsigned int addr) {
  Serial.println("Starte lesen.");
  byte b[4];
  for(int i = 0; i < 4; i++) {
    b[i] = EEPROM.read(addr+i);
    Serial.print("EEPROM_Pos: "); Serial.print(addr+i); Serial.print(" Wert: "); Serial.print(b[i]); Serial.println(" gelesen.");
    EEPROM.read(addr+i); // zum auslesen
  }
  int i = b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24);
  return *(float*) &i;
}

void writeFloat(unsigned int addr, float f) {
  Serial.println("Starte schreiben.");
  byte b[4];
  for(int i = 0; i < 6; i++)
  {
    byte * b = (byte *) &f;
    b[i]   = ((int)f      )  & 0x00FF;
    b[i+1] = ((int)f >> 8 )  & 0x00FF;
    b[i+2] = ((int)f >> 16)  & 0x00FF;
    b[i+3] = ((int)f >> 24);
  }
  for(int i = 0; i < 4; i++) {
    Serial.print("EEPROM_Pos: "); Serial.print(addr+i); Serial.print(" Wert: "); Serial.print(b[i]); Serial.println(" geschrieben.");
    EEPROM.write(addr+i, b[i]); // zum speichern
  }
}

------nachtrag------
hier noch ein link zu der geschichte, erkennen ob Strom ausgefallen ist.
http://www.mikrocontroller.net/articles/...minimieren
im grunde misst man mit einem Spannungsteiler ob die Spannung noch da ist, muss aber gleichzeitig mit einem ausreichenden ELKO genug Spannung hinter der Messung puffern damit der Arduino noch ein par Millisekunden zeit hat den RAM in den EEPROM zu speichern und ein flag zu setzen das der Strom ausgefallen ist.

Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.12.2015, 13:15
Beitrag #23
RE: digitale Werte trotz Stromunterbrechung nicht verlieren
vielen dank, dass du dir die mühe machst, mir zu helfen ! Smile

ich hab jetzt mal dein script versucht mit meinem mit den schalter zu verweben. leider gibt es ein problem mit dem schalter - wenn ich ihn einsetze gibt es eine fehlermeldung

'writeFloat' was not declared in this scope

und so habe ich es gemacht:
(meine scriptteile sind immer etwas mehr eingerückt)
Code:
#include <EEPROM.h>

                const int switchPin =2; // choose the input pin (for a pushbutton)
                const int ledPin = 13; // choose the pin for the LED

                int val = LOW; // variable for reading the pin status
                int tasterGedrueckt = 0;        // abfragen ob Taster gedrückt war
               // float counter = 0;
                int ledStatus = LOW;

                int entprellZeit = 200;         // Zeit für Entprellung, anpassen!

                unsigned long tasterZeit = 0;   // Zeit beim drücken des Tasters
                unsigned long ledMillis = 0;    // Zeit für den Blinkrythmus der LED


float counter = 0; // als variable

void setup() {

               // initialize the LED pin as an output:
                pinMode(ledPin, OUTPUT);
                // initialize the pushbutton pin as an input:
                 pinMode(switchPin, INPUT);
                

  
   Serial.begin(9600);
}

void loop() {

             val = digitalRead(switchPin); // read input value


                if (val == HIGH) { // check if the input is HIGH (button released)
            tasterZeit = millis();    // aktualisiere tasterZeit
            tasterGedrueckt = 1;      // speichert, dass Taster gedrückt wurde
             }
  
            // Wenn die gewählte entprellZeit vergangen ist und der Taster gedrückt war...
             if ((millis() - tasterZeit > entprellZeit) && tasterGedrueckt == 1)
            {
  
  // an dieser stelle liest du deinen wert ein oder was auch immer.
  counter = 50.12; // als beispiel
  Serial.print("Counter ist: "); Serial.println(counter);
  
  // hier wird der Wert in den EEPROM geschrieben.
  writeFloat(250, counter); // zum speichern
  
  // hier wird der Wert aus dem EEPROM gelesen.
  counter = readFloat(250);
  delay(5000);
}

float readFloat(unsigned int addr) {
  Serial.println("Starte lesen.");
  byte b[4];
  for(int i = 0; i < 4; i++) {
    b[i] = EEPROM.read(addr+i);
    Serial.print("EEPROM_Pos: "); Serial.print(addr+i); Serial.print(" Wert: "); Serial.print(b[i]); Serial.println(" gelesen.");
    EEPROM.read(addr+i); // zum auslesen
  }
  int i = b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24);
  return *(float*) &i;
}

void writeFloat(unsigned int addr, float f) {
  Serial.println("Starte schreiben.");
  byte b[4];
  for(int i = 0; i < 6; i++)
  {
    byte * b = (byte *) &f;
    b[i]   = ((int)f      )  & 0x00FF;
    b[i+1] = ((int)f >> 8 )  & 0x00FF;
    b[i+2] = ((int)f >> 16)  & 0x00FF;
    b[i+3] = ((int)f >> 24);
  }
  for(int i = 0; i < 4; i++) {
    Serial.print("EEPROM_Pos: "); Serial.print(addr+i); Serial.print(" Wert: "); Serial.print(b[i]); Serial.println(" geschrieben.");
    EEPROM.write(addr+i, b[i]); // zum speichern
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.12.2015, 13:57 (Dieser Beitrag wurde zuletzt bearbeitet: 29.12.2015 13:59 von avoid.)
Beitrag #24
RE: digitale Werte trotz Stromunterbrechung nicht verlieren
hm, du solltest evtl. etwas mehr darauf achten deinen Code sauber an zu ordnen. Im Grunde hattest du nur vergessen deinen "Loop() {}" zu zumachen. Sowas kann man leichter erkennen wenn man sauberer arbeitet.
Welches Programm verwendest du um deinen Code zu schreiben?
Code:
#include <EEPROM.h>

const int switchPin =2; // choose the input pin (for a pushbutton)
const int ledPin = 13; // choose the pin for the LED

int val = LOW; // variable for reading the pin status
int tasterGedrueckt = 0;        // abfragen ob Taster gedrückt war
int ledStatus = LOW;
int entprellZeit = 200;         // Zeit für Entprellung, anpassen!

unsigned long tasterZeit = 0;   // Zeit beim drücken des Tasters
unsigned long ledMillis = 0;    // Zeit für den Blinkrythmus der LED

float counter = 0; // als variable

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(switchPin, INPUT);
  Serial.begin(9600);
}

void loop() {
  val = digitalRead(switchPin); // read input value
  if (val == HIGH) { // check if the input is HIGH (button released)
    tasterZeit = millis();    // aktualisiere tasterZeit
    tasterGedrueckt = 1;      // speichert, dass Taster gedrückt wurde
  }
  // Wenn die gewählte entprellZeit vergangen ist und der Taster gedrückt war...
  if ((millis() - tasterZeit > entprellZeit) && tasterGedrueckt == 1) {
    // an dieser stelle liest du deinen wert ein oder was auch immer.
    counter = 50.12; // als beispiel
    Serial.print("Counter ist: "); Serial.println(counter);
    // hier wird der Wert in den EEPROM geschrieben.
    writeFloat(250, counter); // zum speichern
    // hier wird der Wert aus dem EEPROM gelesen.
    counter = readFloat(250);
    delay(5000);
  } // <--- das hier hattest du vergessen ;)
}

float readFloat(unsigned int addr) {
  Serial.println("Starte lesen.");
  byte b[4];
  for(int i = 0; i < 4; i++) {
    b[i] = EEPROM.read(addr+i);
    Serial.print("EEPROM_Pos: "); Serial.print(addr+i); Serial.print(" Wert: "); Serial.print(b[i]); Serial.println(" gelesen.");
    EEPROM.read(addr+i); // zum auslesen
  }
  int i = b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24);
  return *(float*) &i;
}

void writeFloat(unsigned int addr, float f) {
  Serial.println("Starte schreiben.");
  byte b[4];
  for(int i = 0; i < 6; i++)
  {
    byte * b = (byte *) &f;
    b[i]   = ((int)f      )  & 0x00FF;
    b[i+1] = ((int)f >> 8 )  & 0x00FF;
    b[i+2] = ((int)f >> 16)  & 0x00FF;
    b[i+3] = ((int)f >> 24);
  }
  for(int i = 0; i < 4; i++) {
    Serial.print("EEPROM_Pos: "); Serial.print(addr+i); Serial.print(" Wert: "); Serial.print(b[i]); Serial.println(" geschrieben.");
    EEPROM.write(addr+i, b[i]); // zum speichern
  }
}

kuck mal ob es jetzt geht und dann musst du dich darüber schlau machen wie genau diese bitshift Geschichte von f nach b[] in der writeFloat() Funktion geht.

Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Arduino lässt sich nicht installieren bergfrei 4 147 20.11.2016 18:34
Letzter Beitrag: bergfrei
  Arduino Mega 2560 läuft nicht Wolfgang50 6 185 13.11.2016 10:50
Letzter Beitrag: Wolfgang50
  Ardublock übertragt nicht an IDE oder UNO R3 tobi83 5 347 16.10.2016 14:07
Letzter Beitrag: Pit
  Upload funktioniert nicht Levi 5 247 22.09.2016 20:19
Letzter Beitrag: hotsystems
  ESP8266 tuts nicht sowerum 7 396 19.09.2016 21:01
Letzter Beitrag: sowerum
  If-Bedingung funktioniert nicht bei Serial1.write Datatom 6 226 16.09.2016 20:36
Letzter Beitrag: Datatom
  SD Karte wird nicht erkannt... Maxi290997 2 208 16.08.2016 14:36
Letzter Beitrag: Maxi290997
  Arduino lässt sich nicht mehr beschreiben Maxi290997 15 984 07.08.2016 11:40
Letzter Beitrag: Maxi290997
  Arduino Uno+Motor Shield+Velleman Mustercode funktionieren nicht Dubidu 8 489 20.07.2016 19:05
Letzter Beitrag: Scheams
  Sketch konnte nicht angelegt werden Sarius 2 241 16.07.2016 15:59
Letzter Beitrag: Sarius

Gehe zu:


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