-         

Ergebnis 1 bis 7 von 7

Thema: Rechnen mit 64bit Variablen

  1. #1
    RN-Premium User Roboter-Spezialist
    Registriert seit
    21.04.2009
    Beiträge
    522

    Rechnen mit 64bit Variablen

    Anzeige

    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?

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    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.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    30.12.2009
    Ort
    Koblenz
    Alter
    38
    Beiträge
    78
    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
    Ich habe bereits bis Unendlich gezählt. Zweimal, und zurück

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.03.2006
    Ort
    Darmstadt
    Alter
    26
    Beiträge
    522
    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

  5. #5
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    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.

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.07.2006
    Ort
    Karlsruhe/München
    Alter
    27
    Beiträge
    587
    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.

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.04.2010
    Beiträge
    170
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •