Uhrzeit und Eprom

Hallo zusammen

Ich bastel mir gerade eine Schach Uhr, da ich diese Uhr immer mal bei mir und mal bei meinem Nachbarn verwenden möchte und die Uhrzeit über ** char time[]=TIME;**
** int stunden,minuten,sekunden;**
geholt wird. habe ich natürlich die Schwierigkeiten mit dem Resetten beim wieder anschliessen der Uhr bei meinem Nachbar. Jetzt habe ich mir gedacht, man könnte doch die Uhrzeit in den Eprom schreiben, z.B. alle 15 Min. und wenn ich die Uhr zum Nachbarn transportiere behält das Eprom ja die gespeicherte Zeit. Nach dem anschliessen der Uhr was ja innerhalb von ein paar Minuten passiert, sollte die Uhr , nach 30 Minuten sich die gespeicherte Uhzreit wieder aus dem Eprom holen, die vergangenen 30 Minuten dazu zählen und die Uhrzeit neu stellen. ist das Möglich? und wie nutze ich den Eprom ich habe das noch nie gemacht.

Das hilft dir wahrscheinlich besser weiter: Arduino Playground - DS1302

Ansonsten kannst du den EEPROM einfach mir Write schreiben und mit Read die gewünschte Adresse auslesen: http://arduino.cc/de/Reference/EEPROM

malerlein:
Ich bastel mir gerade eine Schach Uhr, da ich diese Uhr immer mal bei mir und mal bei meinem Nachbarn verwenden möchte und die Uhrzeit über ** char time[]=TIME;**
** int stunden,minuten,sekunden;**
geholt wird. habe ich natürlich die Schwierigkeiten mit dem Resetten beim wieder anschliessen der Uhr bei meinem Nachbar.

Batteriegepufferte Echtzeituhren existieren.

Im übrigen dachte ich immer, eine Schachuhr wird zu Beginn der Schachpartie auf eine bestimmte Bedenkzeit für jeden Spieler eingestellt, startet mit dieser Zeit und zählt dann pro Spieler abwechselnd herunter bis null. Irgendwie klingt das von Deiner Beschreibung her gar nicht so.

jurs:
Batteriegepufferte Echtzeituhren existieren.

Im übrigen dachte ich immer, eine Schachuhr wird zu Beginn der Schachpartie auf eine bestimmte Bedenkzeit für jeden Spieler eingestellt, startet mit dieser Zeit und zählt dann pro Spieler abwechselnd herunter bis null. Irgendwie klingt das von Deiner Beschreibung her gar nicht so.

Jup, so kenne ich das auch. Ist zwar schon ca. 35 Jahre her, das ich im Schachclub gespielt habe, aber so viel sollte sich seit damals nicht geändert haben :stuck_out_tongue:
Umsetzen lassen müßte sich das, indem man mit einem Analogeingang die Versorgungsspannung überwacht. Sobald die absinkt, werden die 2 Variablen ins EEPROM geschrieben und beim Anschalten über einen Dialog verwerfen/verwenden wieder geladen - oder eben auch nicht. Damit die Spannung nicht zu schnell weg ist, einfach einen dicken Elko oder ein Goldcap verwenden. Achtung, auf die Spannung achten, es gibt auch Typen, die keine 5V verkraften!

Gruß Gerald

Ja so ist es ja auch , doch das ist ja lediglich der Zähler, das ist ja nicht das was ich speichern will, an dem Gerät ist mittig eine komplette Uhr die die Zeit an zeigt :slight_smile: und nach der Uhr richtet sich dann der Zähler für die Zeit die man Zur verfügung hat um den Zug aus zu führen. Und mit der RTC sicher ist das möglich, da habe ich ja noch 3 Stck von , aber dann habe ich nichts mehr u Programmieren und aus zu probieren. Ich wollte im Grunde nur wissen wie man das mit dem Eprom bewerkstelligt, also die Zeit dort speichert und sie sich wieder holt so das man im Programm die verflossene Zeit ergänzt. Die Tips die Ihr gebt sind ja schon in Ordnung, nur ich habe ja auch eine echte Schach Uhr, die könnte ich ja auch nutzen, dan bräuchte ich ja auch nicht mehr zu basteln

Das geht eigentlich ganz einfach.

Es gibt eine Library "EEPROM.h", die stellt die Befehle
EEPROM.write() und EEPROM.read() zur verfügung, mit denen kannst du einfach was ins interne EEPROM schreiben oder lesen.
Da beide Funktionen aber jeweils ein Byte schreiben, ist es sinnvoll sich für größere Variablen eine Funktion zu schreiben.

Als code sieht das dann in etwa so aus:

#include <EEPROM.h>

int Bespielwert1;
long int Bespielwert2;
void setup(){
  EEPromLoad((byte*) &Bespielwert1, 2,  0);  // 2 byte lesen, beginnend bei Adresse 0
  EEPromLoad((byte*) &Bespielwert2, 4,  2);  // 4 byte lesen, beginnend bei Adresse 2
  
}

void loop(){
  // Bespielwert1 wird in Funtkion geändert  
  if (Beispielewert1 geändert oder Zeitpunkt richtig){
     EEPromSave((byte*) &Bespielwert1, 2,  0);   // 2 byte schreibe, beginnend bei Adresse 0
  }
  
  // Bespielwert2 wird in Funtkion geändert  
  if (Beispielewert2 geändert oder Zeitpunkt richtig){
    EEPromSave((byte*) &Bespielwert2, 4,  2);     // 4 byte schreiben, beginnend bei Adresse 2
  }
}




/*******************************************************************************************
** Funktion EEPRomSave                                                                    **
** Schreibt die übergebene Variable ins EEProm                                            **
** input:                                                                                 **
**   wert: pointer to byte array which holds the value to save                            **
**   numbytes: number of bytes to be saved                                                **
**   eprom_offset: offset in EEPROM for saving bytes                                      **
** output: void (nothing)                                                                 **
*******************************************************************************************/
void EEPromSave(byte* wert, int numbytes, int eprom_offset){  
  for (int i=0;i<numbytes;i++)
    EEPROM.write(eprom_offset+i, wert[i]);
}// end of funkion EEPromSave


/*******************************************************************************************
** Funktion EEPRomLoad                                                                    **
** holt  die übergebene Variable aus dem EEProm                                            **
** input:                                                                                 **
**   wert: pointer to byte array which holds the value to save                            **
**   numbytes: number of bytes to be saved                                                **
**   eprom_offset: offset in EEPROM for saving bytes                                      **
** output: void (nothing)                                                                 **
*******************************************************************************************/
void EEPromLoad(byte* wert, int numbytes, int eprom_offset){
  for (int i=0;i<numbytes;i++)
    wert[i] = EEPROM.read(eprom_offset+i);
}// end of funkion EEPromLoad

Die Funktionen habe ich nicht selbst geschrieben, die sind hier aus dem Forum

Ich danke Dir Gunther

Damit komme ich schon zurecht. werde mich nachher einmal daran begeben das aus zu probieren.