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
30.12.2015, 20:41
Beitrag #41
RE: digitale Werte trotz Stromunterbrechung nicht verlieren
Ja HILFE liebe Leut's,....
ihe seid ja immer noch am EEPROM beschreiben...Big Grin
Dabei ist das doch so einfach wenn man mal in der arduino Reference sich aufschlaut...

..dazu benötigt man die
Code:
#include <EEPROM.h>  // EEPROM Lib

ein paar Variablen wie diese z.B.
Code:
int counter;                // Counter als Integer mit Vorzeichen
int counterbuffer;         //  Buffer

im Setup das erste auslesen aus dem EEPROM, in dem Fall ein Integer Wert um den letzten Wert wieder herzustellen
Code:
EEPROM.get(Adresse_im_EEPROM, counter);

Dann noch das Updaten in der Loop falls sich counter geaendert hat bzw, vom Wert der im EE gespeichert ist abweicht
Code:
if (counter != EEPROM.get(Adresse_im_EEPROM, counterbuffer))
                {
                EEPROM.put(Adresse_im_EEPROM, counter);
                }

Das Ganze funktioniert auch mit float und long int Variablen.
...getestet mit der IDE 1.6.5
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
30.12.2015, 21:54
Beitrag #42
RE: digitale Werte trotz Stromunterbrechung nicht verlieren
irgendwie hast du recht bitklopfer, mit put und get, geht es etwas einfacher.

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
30.12.2015, 22:10
Beitrag #43
RE: digitale Werte trotz Stromunterbrechung nicht verlieren
(30.12.2015 21:54)avoid schrieb:  irgendwie hast du recht bitklopfer, mit put und get, geht es etwas einfacher.

Danke Danke,,,,du darfst mir ruhig 100 Punkte geben weil was einfacheres habe ich bislang noch nicht gesehen....Tongue
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
30.12.2015, 22:35
Beitrag #44
RE: digitale Werte trotz Stromunterbrechung nicht verlieren
hurra - es klappt ! ihr seid suuuuuper! Heart
tausend dank für eure geduldigen erklärungen und codeschnipsel - ich glaub ich hab ein kleines bischen begriffen - danke für deine ausführlichen erklärungen avoid! aber für eine so schöne lösung wie sie bitklopfer geschrieben hat, hab ich leider längst nicht ausreichend verstanden Undecided - aber ich habs doch fertig gebracht, das in meinen code einzuweben, so dass es funktioniert Smile

jetzt trotzdem noch eine frage - wenn das jetzt so wunderbar klappt, wie oft kann ich denn den counter/schalter betätigen, resp. in das eeprom speichern? gehen 300'000 x oder ist das eeprom damit vollgeschrieben? ich meine auch die zahl 300'000 - du schreibst ja, dass es auch für long int funktioniert. 300'000 wäre ja so eine long int oder?
ich hab mal den counter anstatt um 1 um 55999 erhöht - jetzt zählt er rückwärts...
ich muss aber bis 300'000 zählen können... was muss ich jetzt machen - gibt es einen superbuffer für die ganz grossen zahlen? Wink
ich hab auf euren rat hin ein fram gekauft. wäre das die lösung? das funktioniert ja glaub gleich wie das eeprom oder?

hier ist der fertige, funktionierende code - für die nicht ganz sooo grossen zahlen

Code:
// include the library code:
#include <LiquidCrystal.h>
#include <EEPROM.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 6, 5, 4, 3);

// set pin numbers:
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 ledStatus = LOW;
int tasterGedrueckt = 0;          // abfragen ob Taster gedrückt war

int counter;
int counterbuffer;
int Adresse_im_EEPROM;

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 multipliziert = 0;

void setup() {

  lcd.begin(16, 2);
  lcd.print("m done "); lcd.print(EEPROM.get(Adresse_im_EEPROM, counter));lcd.print(" cl");    
  pinMode(ledPin, OUTPUT);
  pinMode(switchPin, INPUT);
  Serial.begin(9600);
  
  lcd.setCursor(0, 1);
  lcd.print(EEPROM.get(Adresse_im_EEPROM, counter)*1.5);lcd.print(" m");//als startanzeige nach unterbruch
  
EEPROM.get(Adresse_im_EEPROM, counter);
Serial.print(EEPROM.get(Adresse_im_EEPROM, counter));Serial.println(" EEPROM.get(Adresse_im_EEPROM, counter);");
}

void loop() {

lcd.setCursor(0, 1);  
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
  }
  
  if ((millis() - tasterZeit > entprellZeit) && tasterGedrueckt == 1){
    tasterGedrueckt = 0;      // setzt gedrückten Taster zurück

  counter = EEPROM.get(Adresse_im_EEPROM, counterbuffer) + 1;       //  wird um +1 erhöht

  if (counter != EEPROM.get(Adresse_im_EEPROM, counterbuffer))
                {
                EEPROM.put(Adresse_im_EEPROM, counter);
                }
  
    multipliziert = counter * 1.5; //soll int-wert zu float-wert umrechnen
          
  
        lcd.print(multipliziert,3);lcd.print(" m ");
        Serial.print(multipliziert,3);Serial.println(" = m aus multipliziert");    
      
        Serial.print(counter);Serial.println(" = ganzzahl aus counter");

        Serial.print(EEPROM.put(Adresse_im_EEPROM, counter));Serial.println(" = anzahl klicks aus eeprom als ganzzahl");Serial.println();
      
         lcd.print(counter);lcd.print(" cl");    
    }  
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.12.2015, 23:04 (Dieser Beitrag wurde zuletzt bearbeitet: 30.12.2015 23:08 von Bitklopfer.)
Beitrag #45
RE: digitale Werte trotz Stromunterbrechung nicht verlieren
shortcut, in dieser Zeile
Code:
int Adresse_im_EEPROM = 0;  <== zum Beispiel
wäre es sinnvoll gleich eine Adresse im EEPROM zu definieren...sonst kann es sein das da was daneben geht.
Also Atmel sagt das man eine EEPROM Stelle 100.000 mal schreiben kann...also für die 300.000 mußt dir was einfallen lassen....oder das FRAM verwenden....doch dazu wüßte ich nicht das es eine Lib mit dem .put / .get Funktionsumfang gibt...aber ich weis auch nicht alles aus dem effeff.

Achso, diese 55999...bei dem Wertebereich...also auch bei bis 300.000 mußt du counter eh als "long int" deklarieren... int reicht bis ganz grob +/- 32.000 dann überspringt der Wert...
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
31.12.2015, 01:13
Beitrag #46
RE: digitale Werte trotz Stromunterbrechung nicht verlieren
Zitat:int Adresse_im_EEPROM = 0; <== zum Beispiel
das verstehe ich jetzt wieder nicht mehr - eine einzige adresse definieren? wieso?
Zitat:wäre es sinnvoll gleich eine Adresse im EEPROM zu definieren...sonst kann es sein das da was daneben geht.
was könnte denn daneben gehen?

und ja die länge von 300'000 klicks/counter wird wohl das problem sein - aber long int, wie du vorschlägst, gibts bei arduino glaub gar nicht.

es gibt nur long (4 bytes bis +/- 2,147,483,648)
oder unsigned int (2 bytes nur von 0 bis 65,535)

...und damit sind wir auch wieder beim thema mit den 4 bytes. das geht ja offensichtlich mit dem get und put. aber die grösse des eeprom ist das problem, weil zwar mit put nur auf das eeprom geschrieben wird, wenn sich was geändert hat. da ich es mit einem zähler zu tun habe, ändert sich das ja mit jedem click - und schreibt daher ja auch bei jedem click.
wenn ich long benutze, kann ich zwar die zahl 300'000 aufs eeprom schreiben - aber nicht 300'000 mal eine andere zahl - richig? deshalb brauche ich ein FRAM - richtig?

auf euren rat hin habe ich ein FRAM gekauft - das von adafruit - mit library zum runterladen - eine heisst wire.h - die andere heisst Adafruit_FRAM_I2C.h - hier ist mal das beispiel dazu.

hier ist wirklich nix mehr mit get und put - jetzt bin ich wieder am anfang - sozusagen bei null - seufz.... Undecided brauche also weiter eure hilfe....

Code:
#include <Wire.h>
#include "Adafruit_FRAM_I2C.h"

/* Example code for the Adafruit I2C FRAM breakout */

/* Connect SCL    to analog 5
   Connect SDA    to analog 4
   Connect VDD    to 5.0V DC
   Connect GROUND to common ground */
  
Adafruit_FRAM_I2C fram     = Adafruit_FRAM_I2C();
uint16_t          framAddr = 0;

void setup(void) {
  Serial.begin(9600);
  
  if (fram.begin()) {  // you can stick the new i2c addr in here, e.g. begin(0x51);
    Serial.println("Found I2C FRAM");
  } else {
    Serial.println("No I2C FRAM found ... check your connections\r\n");
    while (1);
  }
  
  // Read the first byte
  uint8_t test = fram.read8(0x0);
   Serial.print("Restarted "); Serial.print(test); Serial.println(" times");
  // Test write ++
   fram.write8(0x0, test+1);
  
  // dump the entire 32K of memory!
  uint8_t value;
  for (uint16_t a = 0; a < 32768; a++) {
    value = fram.read8(a);
    if ((a % 32) == 0) {
      Serial.print("\n 0x"); Serial.print(a, HEX); Serial.print(": ");
    }
    Serial.print("0x");
    if (value < 0x1)
      Serial.print('0');
    Serial.print(value, HEX); Serial.print(" ");
  }
}

void loop(void) {

}

}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
31.12.2015, 02:03
Beitrag #47
RE: digitale Werte trotz Stromunterbrechung nicht verlieren
es geht um so was wie ein kilometerzähler, der aber sehr lange und mit grossen zeitlichen abständen laufen muss.
jede umdrehung wird gezählt. die maximale anzahl umdrehungen wird 300'000 sein. also wird die maximale zahl eben auch 300'000 sein.
weil ich jetzt schon weiss, dass ich schon zeitlich bedingt stromunterbruch haben werde, muss ich die zahlen speichern können um bei erneuter stromversorgung weiterzählen zu können.
weil jetzt die anzahl und die zahl so gross sind, brauche ich wohl auch einen grossen speicher - das eeprom scheint nicht gross genug zu sein.
deshalb brauche ich ein FRAM - richtig?
als ich mit meinem projekt angefangen habe, habe ich nicht gedacht, dass das so kompliziert wird. aber der point of no return ist leider überschritten. ich muss da irgendwie durch - mit eurer hilfe - hoffe ich Smile Smile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
31.12.2015, 07:03 (Dieser Beitrag wurde zuletzt bearbeitet: 31.12.2015 07:05 von avoid.)
Beitrag #48
RE: digitale Werte trotz Stromunterbrechung nicht verlieren
Also falls du wirklich das Teil von Adafruit hast, kuck dir bitte deren Anleitung dazu an, die gibt es doch nicht nur damit sie einstaubt.
https://learn.adafruit.com/adafruit-i2c-...t/overview
Da ist alles haarklein beschrieben, zwar in englisch aber wozu gibt's den Google Übersetzer (falls du kein Englisch kannst).

Die sechs Zeilen extra Code, sind doch kein Hexenwerk, jetzt wo du soweit gekommen bist:
Code:
#include <Wire.h>
#include "Adafruit_FRAM_I2C.h"
Adafruit_FRAM_I2C fram = Adafruit_FRAM_I2C();
fram.begin(0x50);
fram.write8(address, byte-value);
fram.read8(address);
aber Obacht, das teil arbeitet wieder mit einzelnen Bytes anstelle des "put" und "get" Luxus.

---------------
ich bin noch immer der Meinung du solltest erst in den eeprom schreiben wenn der Strom ausgefallen ist.
dann kannst du dir all den ärger sparen.

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 146 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 343 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 395 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 207 16.08.2016 14:36
Letzter Beitrag: Maxi290997
  Arduino lässt sich nicht mehr beschreiben Maxi290997 15 981 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 240 16.07.2016 15:59
Letzter Beitrag: Sarius

Gehe zu:


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