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
29.12.2015, 19:40
Beitrag #33
RE: digitale Werte trotz Stromunterbrechung nicht verlieren
ich habs soeben ausprobiert und habe deinen counter 1234 durch meinen echten counter ersetzt. der hat beim initialisieren den wert 0 an.
was ich nicht verstehe ist, dass du int adresse = 256; schreibst - heisst das, du schreibst auf adresse nr. 256 oder auf das ende der ersten adresse?

hab das script laufen lassen - es zeigt mir bei jedem click immer zahlen an - aber im minusbereich.
ich habs so gemacht - in der hoffnung, dass es jetzt zählt
counter = (EEPROM.read(adresse))*256 + EEPROM.read(adresse+1);
so sollte doch der click in den counter geschrieben werden oder?

das ist, was er ausspuckt, wenn ich auf den schalter drücke. irgendwie scheint er rückwärts zu zählen...

Counter ist:
-28074
eeprom ist:
147HighByte ist:
146
LowByte ist:
86
-28074 ganzzahl aus counter
-42111.000 m aus multipliziert
146 anzahl klicks als ganzzahl aus EEPROM

Counter ist:
-28366
eeprom ist:
146HighByte ist:
145
LowByte ist:
50
-28366 ganzzahl aus counter
-42549.000 m aus multipliziert
145 anzahl klicks als ganzzahl aus EEPROM
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.12.2015, 20:17
Beitrag #34
RE: digitale Werte trotz Stromunterbrechung nicht verlieren
So nebenbei.
Um das ständige EE-Prom schreiben zu unterbinden kann man auch ein RTC UHr Modul mit Batterie nutzen (1,5 Eus)
Das Teil hat ja einen freien Ram Speicher.
Alle anderen bisher durchgekauten Probleme bleiben natürlich erhalten!
Grüße

Nicht jeder Neuling in einem Forum hat keine Ahnung über die Materie!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.12.2015, 20:37 (Dieser Beitrag wurde zuletzt bearbeitet: 29.12.2015 20:38 von goldfisch.)
Beitrag #35
RE: digitale Werte trotz Stromunterbrechung nicht verlieren
das bild mit dem highByte und lowByte - ist es richtig, dass z.b.

zahl: 65536
highByte: 256=(256x256)
LowByte: 256

ergeben?
hab ich das begriffen?

(29.12.2015 20:37)goldfisch schrieb:  das bild mit dem highByte und lowByte - ist es richtig, dass z.b.

zahl: 65536
highByte: 256=(256x256)
LowByte: 256

ergeben?
hab ich das begriffen?

und was mache ich mit der zahl 300'000 ? passt die noch in eine 2byte speicher?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.12.2015, 20:45 (Dieser Beitrag wurde zuletzt bearbeitet: 29.12.2015 20:48 von avoid.)
Beitrag #36
RE: digitale Werte trotz Stromunterbrechung nicht verlieren
ja das hast du richtig verstanden, das mit dem bild.

int adresse = 256; macht nix anderes als fest zu legen an welche stelle im eeprom du speichern willst. meinetwegen kannst du da gerne 0 rein schreiben damit er mit der ersten stelle beginnt. der eeprom ist 512 Byte groß, such dir einfach eine stelle aus.

Code:
counter = (EEPROM.read(adresse))*256 + EEPROM.read(adresse+1);
macht nix anderes als deine gespeicherten Daten wieder aus dem eeprom zu lesen.
wenn da nix drin ist dann kann er da natürlich nix sinnvolles raus lesen.

also musst du vorher was rein speichern.
vorzugsweise nach dem du den taster gedrückt hast.

---nachtrag---
ja es hat den Anschein du zählst rückwärts, kuck nochmal nach was du da genau machst wenn dein Taster gedrückt wird.

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, 14:30
Beitrag #37
RE: digitale Werte trotz Stromunterbrechung nicht verlieren
int adresse = 256;
heisst das, dass der befehl (EEPROM.read(adresse))*256 auf adresse 256 schreibt?
wozu brauche ich dann das *256?
wenn er 8 bit in adresse 256 schreibt, dann muss er die nächsten 8 bit in adresse 0 schreiben - weil es ja nur 256 adressen hat, er also dann ja wieder von vorne beginnt? richtig?
demzufolge der befehl + EEPROM.read(adresse+1); auf adresse 0 springt?
ist das richtig so?

und wegen dem ausgeben
ja ich muss ja schon was in den speicher laden - dann drücken und das neue resultat speichern.
jetzt beginnt mein script aber erst mit dem ersten klick - also muss ich doch zuerst das eeprom lesen und dann schreiben, weil das lesen des eeprom ja in den counter gespeichert wird. deshalb ist er vor dem allerersten klick wohl im besten fall «leer». macht doch nichts oder?
wenn er dann allerdings beim ersten mal durch alle adressen durch ist und wieder bei null beginnen muss - zählt er dann das, was schon drin ist mit oder überschreibt er es?
jetzt zählt er richtig - aber irgendwie findet er die auf dem eeprom gespeicherte zahl nicht mehr nach einem stromunterbruch. er beginnt bei null, wahrscheinlich bei der nächsten adresse, wo nichts steht...? resp. beim read steht immer 0...

übrigens muss mein counter die clicks zählen - danach muss er z.b. mit 1.5 multiplizieren und das ergebnis mit float ausgeben.

hier ist nochmals der code und was er ausspuckt

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 tasterGedrueckt = 0;          // abfragen ob Taster gedrückt war

int ledStatus = LOW;
//int counter = 0;
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;


int counter = 0; // dein 16 bit (2 byte) großer wert.  (int = highbyte & lowbyte)
int adresse = 256;  // max. 512 speicherstellen nutzbar.

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  
  lcd.print("m done ");lcd.print("xx ");lcd.print(EEPROM.read(adresse)) + EEPROM.read(adresse+1); //zählerstand oben
  
    // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(switchPin, INPUT);
  Serial.begin(9600);
  
  lcd.setCursor(0, 1);
  lcd.print("er ");lcd.print(EEPROM.read(adresse)) + EEPROM.read(adresse+1); //als startanzeige nach unterbruch
}

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

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)
    {

      tasterGedrueckt = 0;    // setzt gedrückten Taster zurück
  
            // so kannst du zweiByte Werte wieder lesen
   counter = (EEPROM.read(adresse)) + EEPROM.read(adresse+1);
// counter = (EEPROM.read(adresse))*256 + EEPROM.read(adresse+1);
  Serial.print("Counter ist: "); Serial.println(counter);
  Serial.print("eeprom read ist: ");Serial.print(EEPROM.read(adresse))*256 + EEPROM.read(adresse+1); Serial.println();
  //Serial.print("eeprom read ist ohne * 256: ");Serial.print(EEPROM.read(adresse)) + EEPROM.read(adresse+1); Serial.println();
      //counter = EEPROM.read(254) + 1;             //  wird um +1 erhöht
      
  
    counter = counter + 1;    
    multipliziert = counter * 1.5;  



     // so kannst du zweibyte werte speichern
  EEPROM.write(adresse,highByte(counter));   // speichert die oberen 8 bits der variablen an die angegebene adresse des eeprom
  Serial.print("eeprom write HighByte ist: "); Serial.println(highByte(counter));
  EEPROM.write(adresse+1,lowByte(counter));  // speichert die unteren 8 bits der variablen hinter die angegebene adresse des eeprom
  Serial.print("eeprom write LowByte ist: "); Serial.println(lowByte(counter));

        Serial.println();
          
        Serial.print(counter);Serial.println(" ganzzahl aus counter");
        
        Serial.print(multipliziert,3);Serial.println(" ganzzahl aus multipliziert");Serial.println();
        lcd.print(multipliziert,3);lcd.print(" m ");
        lcd.print(counter);lcd.print(" cl");      
    }  
}

Zitat:Counter ist: 75
eeprom read ist: 0
eeprom write HighByte ist: 0
eeprom write LowByte ist: 76

76 ganzzahl aus counter
114.000 ganzzahl aus multipliziert

Counter ist: 76
eeprom read ist: 0
eeprom write HighByte ist: 0
eeprom write LowByte ist: 77

77 ganzzahl aus counter
115.500 ganzzahl aus multipliziert

Counter ist: 77
eeprom read ist: 0
eeprom write HighByte ist: 0
eeprom write LowByte ist: 78

78 ganzzahl aus counter
117.000 ganzzahl aus multipliziert
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.12.2015, 18:01 (Dieser Beitrag wurde zuletzt bearbeitet: 30.12.2015 18:03 von avoid.)
Beitrag #38
RE: digitale Werte trotz Stromunterbrechung nicht verlieren
offensichtlich fehlt dir Grundwissen in der Mathematik und noch immer das Verständnis wie ein eeprom funktioniert.
Kuck dir bitte mal dieses Video an um zu verstehen was beim lesen und schreiben des eeprom passiert.

https://www.youtube.com/watch?v=u0R471TwVPQ

wie du im Video sehen kannst, gibt es einen Befehl (lesen oder schreiben) eine Adresse der Speicherzelle (in deinem fall die Zelle 256 -> der EEPROM des Arduino ist 512 Zellen groß) und die eigentlichen Daten (maximal 8bit also 1byte pro Zelle).
du willst einen int-wert speichern und lesen der aber nicht 8bit sondern 16bit groß ist. zum speichern musst du also den wert in die ersten 8bit (highbyte) und die zweiten 8bit (lowbyte) zerlegen und in zwei verschiedene Zellen schreiben. zum lesen musst du die zwei verschiedenen Zellen lesen und die beiden 8bit werte wieder zu einem 16bit wert zusammensetzen.
wenn du eine zahl mit Komma verarbeiten willst brauchst du sogar 32bit also 4x8bit. Einfacher bzw. grundlegender kann ich es nun wirklich nicht mehr erklären.

nun denke mal nach was der folgende Code genau macht ...
Code:
counter = (EEPROM.read(adresse))*256 + EEPROM.read(adresse+1);
Richtig, es ist ein einfaches zusammenrechnen der beiden Speicherzellen des eeprom und dann wird das Ergebnis in die variable Counter übergeben.

ich erkläre es dir nochmal am Beispiel der zahl 12345 aus der Grafik, die ich dir gezeichnet hatte.
--------------------------------------------------------
zum speichern:
12345 Dezimal = 0011000000111001 Binär (16bit).
damit du den wert in die 8bit zellen des eeprom bekommst, musst du ihn jetzt in zwei 8bit teile zerlegen.
48 Dezimal = 00110000 Binär (8bit-highbyte) und 57 Dezimal = 00111001 Binär (8bit-lowbyte).
dann brauchst du noch zwei Adressen in die du den wert speichern willst (welche spielt keine rolle).
in deinem fall "256" und "256+1" also "257". warum verwendest du überhaupt 256 und nicht 0?
dann speicherst du also das highbyte in 256 und das lowbyte in 257.

zum auslesen:
die beiden Speicherzellen "256" und "257" haben jetzt jeweils 8bit als Inhalt.
wenn du das lowbyte aus der Zelle "257" ausliest stimmt die zahl 57 weil es die unteren 8bit sind.
wenn du das highbyte aus der Zelle "256" ausliest bekommst du die Zahl 48 die aber auch nur 8bit hat. mit "Zelleninhalt*256" verschiebst du die zahl um 8bit nach links. Das hat nix mit der Adresse der Zelle zu tun. viele verwenden dafür auch >> oder << je nach dem ob nach links oder rechts verschoben wird.
hier noch die Referenz zum programmieren des Arduino: https://www.arduino.cc/en/Reference/Bitshift
vorher = 00000000 00110000
nachher = 00110000 00000000

dann rechnest du die beiden zusammen und packst sie in Counter.
Fertig. Wink

Noch ein kleiner Hinweis:
Solche grundlegenden Verständnisse fehlen natürlich besonders Anfängern und werden in vielen Lehrbüchern einfach aus Fachverblödung der Autoren vergessen aber in solchen Foren ist für solche Erklärungen in der Regel weder Zeit noch der Richtige platz. Du solltest dich zukünftig. besser vorher über deine Hardware kundig machen bevor du damit arbeitest und Probleme auftauchen. Denn du hast gesehen das fehlendes Grundwissen dazu führen kann das Lösungsvorschläge die du bekommst genau so unverständlich bleiben wie das eigentliche Problem das du hast.

ich hoffe du kannst nun etwas damit anfangen und dein Programm läuft wie gewünscht.

Gruß,
avoid

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, 18:14
Beitrag #39
RE: digitale Werte trotz Stromunterbrechung nicht verlieren
Wo wir schonmal dabei sind, dann hab ich dazu mal ne Frage

Ein Byte im Speicher kann ja nur Zahlen von 0 bis 255 speichern.

Angenommen ich nehme ne For Schleife und zähle von 0 bis 65025 (255*255)
Diese Zahl splitte ich nun von einem auf 2 bytes, (HiByte und LowByte)
Dann schicke die Werte in den zwei EEprom Zellen
Dazu verwende ich 2 Mal "EEPROM.update();"
Also:

EEPROM.update(0, LowByte);
EEPROM.update(1, HighByte);

Jetzt schliesse ich die For Schleife wieder.


Wie Oft wird jetzt in dieser einen For Schleife die Speicherzelle 0 und wie oft die Speicherzelle 1 neu geschrieben?
Das HighByte wird doch 255 mal geschrieben
Das LowByte aber in jedem Schleifendurchlauf, weil es sich jedes mal verändert, oder ?

Oder hab ich das falsch verstanden?

Binatone
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.12.2015, 19:43 (Dieser Beitrag wurde zuletzt bearbeitet: 30.12.2015 19:45 von avoid.)
Beitrag #40
RE: digitale Werte trotz Stromunterbrechung nicht verlieren
ja, das ist richtig so.
update aktualisiert ja nur bei Veränderungen.
darum auch mein Hinweis erst in den EEPROM zu speichern wenn der Strom unterbrochen wurde.
Zitat:hier noch ein link zu der Geschichte, erkennen ob Strom ausgefallen ist.
http://www.mikrocontroller.net/articles/...minimieren

Du verwendest einen Pin des Arduino um festzustellen ob der Strom noch da ist oder nicht. ist er ausgefallen läuft der Arduino noch kurz über den Strom der in einem ELKO gepuffert ist und kann dann mittels Trigger das speichern in den eeprom einleiten. beim speichern schreibst du am besten auch in eine zusätzliche Speicherzelle des eeprom einen 1 oder 0 als Status ob der Strom ausgefallen ist (ein sogenanntes flag).

Beim Programmstart rufst du dann das flag ab und weißt ob dein Programm mit 0 beginnen soll oder ob schon werte im eeprom sind die verwendet werden müssen.
Das ist eine total übliche Vorgehensweise bei Professionellen Geräten.

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 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 208 16.08.2016 14:36
Letzter Beitrag: Maxi290997
  Arduino lässt sich nicht mehr beschreiben Maxi290997 15 983 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