PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Rechnen mit 64bit Variablen



Fabian E.
11.06.2010, 23:39
Hallo,
ich wollte meinem RP6, bzw der M32 und der M128 einen Kilometerzähler spendieren.
Dieser sollte allerdings ein richtiger Zähler sein, der sich im EEPROM verewigt.

Die Platine soll alle sagen wir zwei Sekunden die gefahrene Strecke abrufen,
die Differenz zu vorher ausrechen und das ganze dann als Absolutwert ins EEPROM schreiben.

Nun stellt sich mir aber die Frage, ob 16bit hier nicht ein bisschen zu wenig sind,
vorallem wenn ich als Einheit cm nehme.

Ich würde daher gerne mit 32 oder gar 64 bit rechnen.
Das ganze ins EEPROM zu speichern sollte ja nicht das Problem sein,
nur wie rechne ich damit?

Bei 32bit habe ich ja 4 Bytes in denen dann mein Wert steht.
Wie kann ich denn diesem Wert jetzt etwas hinzufügen?

Gibts da vielleicht irgendeine BigInt-Lib oder sowas für C oder Compact C?
Wie gesagt, konkret wäre mein Problem der Vorgang des Auslesens aus
dem EEPROM und das Addieren einer Zahl auf die vier Bytes, sodass diese 4 Bytes zusammengerechnet meinen gewünschten Absolutwert ergeben.

Ich kann sie ja nicht einfach so verknüpfen, mehr als 16 bit in einer Variablen geht ja wohl nicht oder?

Hat irgendjemand eine Idee?

Besserwessi
12.06.2010, 00:16
In C sind 32 Bit-zahlen Standard als Long bzw. unsigned long. Viele Compiler unstützen auch 64 Bit werte (long long).
Solange man nur einfache Operationen braucht, und es nicht zeitkritsich ist, kann man die Funktionen auch gut von Hand Programieren.

Auch bei cm als Einheit, sollten 32 Bit noch ausreichen. Da kommt man immerhin bis rund 40.000 km, also einmal um die Welt.

Beim EEPROM wäre zu überlegen ob man ein spezielles zahlenformat nutz, das nicht so viel Schreibzugriffe braucht, dafür ggf. etwas mehr Speicher. Die letzen Bits müssen ja auch nicht unbedingt ins EERPOM. Wenn man beim Ausschalten jeweils ein paar cm verliert ist das vermutlich nicht so schlimm.

Magelan1979
12.06.2010, 07:18
Die Idee ist ja nicht schlecht, aber besteht bei einem zwei Sekunden Intervall nicht die Gefahr, dass ich mir das EEPROM ganz schnell kaputt schreibe. Ich meine mal etwas von 100.000 Schreibvorgängen gelesen zu haben (kann allerdings auch der ASURO gewesen sein), Dass wären dann 1800 Schreibvorgänge pro Stunde Laufzeit. Nach 55,5h Laufzeit wäre der dann "aufgebraucht". Gut 55h sind nicht gerade wenig, zumal meiner momentan immer nur für Minuten läuft. Ich würde das allerdings nicht eingehen wollen. Ist wie mit den fossilen Brennstoffen

Gruß Magelan

Edit: Lesen Tippen Abspeichern
Bei der M32 sind es 1.000.000 Schreibvorgänge pro Zelle. Das sollte dann doch ausreichend sein. Vor allem mit einem Vernünftigen Speichermanagement. Und wie mein Vorredner bereits aussagte, 32 Bit sollten mit 4.294.967.296 cm Reichweite völlig ausreichend sein

p_mork
12.06.2010, 09:49
Man könnte auch einen größeren EEPROM-Bereich wie z.b. 128 Byte (also 32 Longs) nehmen und die Zählerwerte immer im jeweils nächsten long abspeichern. Sobald man die 128 Byte voll hat, fängt man wieder beim Index 0 an, also wie bei einem Ringbuffer. So kann man 32 Werte abspeichern, dabei aber nur 1 Schreibzugriff machen (die 1000k Schreibzyklen gelten ja für jede Zelle). Wenn der Roboter neu eingeschaltet wird, kann er den letzten Index herausfinden, indem er nach zwei aufeinanderfolgende Zellen sucht, in bei denen der Wert der zweiten Zelle kleiner ist als der der ersten.

MfG Mark

Besserwessi
12.06.2010, 10:12
Wenn man die daten nur speicher, wenn sich wirklich was verändert hat, relativiert sich das Problem mit der Lebendauer auch. Das sind dann 55 h (oder auch mehr) in denen die Motoren laufen. Die Lebensdauer der Motoren ist auch nur Endlich, in der Größenordnung 50-500 Stunden.

Das verteilte Schriben wäre ein Möglichkeit die Schreibzyklen auf mehrere Zellen zu verteilen. Es reicht aber wenn man das für die unteren 8 Bits macht. Die oberen 24 Bits werden ohnehin viel seltener aktualisiert.

s.o.
12.06.2010, 11:38
Vorschlag: Die Variablen einfach im SRAM behalten, und dem MCU ein Power-Fail-Secure-Write spendieren:
Einfach mit einem Komparator die Spannung überwachen, wenn die sagen wir mal unter eine kritische Spannung abfällt einen Interrupt auslösen und schnell speichern. Voraussetzung ist, dass dein MCU noch so lange Zeit hat, abzuspreichern. Das gewährleistest du am Besten über einen Elko.

JoeBlack
12.06.2010, 12:34
Ich stimme s.o. voll und ganz zu.
Das SRAM ist genau dazu gemacht und den Spannungsabfall kann man auch recht leicht erkennen.
In sofern bist Du damit bestens bedient.

MfG JoeBlack