- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 6 von 6

Thema: Werte regelmäßig im EEPROM speichern...Codebeschau

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    19.06.2007
    Ort
    Fürth
    Alter
    41
    Beiträge
    52

    Werte regelmäßig im EEPROM speichern...Codebeschau

    Anzeige

    Praxistest und DIY Projekte
    Hallo Leute!

    Folgendes Problem:

    Ich will einige Werte zwecks Stromausfallsicherheit im EEPROM meines Atmega32 abspeichern. Um das EEPROM nicht unnötig zu strapazieren soll das
    ganze alle Viertelstunde (:timer mit 100Hz / 90000) ablaufen. Bevor geschrieben wird soll überprüft werden ob sich die Werte geändert haben - wenn ja: schreiben...wenn nein: wieder viertelstunde warten.

    Funzt mein Code soweit? [-o<

    Code:
    Dim Z As Long
    Dim Zuspeichernderwert As Single
    
    
    'Timer mit 100 Hz
    Config Timer0 = Timer , Prescale = 1024
    
    On Timer0 Timer_irq
    
    Const Timervorgabe = 100
    
    
    Enable Timer0
    Enable Interrupts
    
    
    Do
    
       Z = Z / 90000                                            'alle Viertelstunde:  Z>1
    
       If 1 <= Z Then
          Dim K As Word
          Dim Speicher As Eram Word
          K = Zuspeichernderwert
          If Speicher <> K Then                                 'Schreibe Zuspeichernderwert in EEPROM
                   Speicher = K                                 'falls irgendwelche Änderungen da sind
          End If
       End If
    
    
    
    
    'Hauptprogramm
    Loop
    
    
    Timer_irq:
      Timer0 = Timervorgabe
    
      Incr Z
    
    
    
       Return

    Danke fürs Weiterhelfen!

    MfG
    Sascha

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    28.10.2004
    Ort
    Baoding
    Alter
    44
    Beiträge
    689
    Ich sage mal der funzt nicht.

    Mit Z = Z / 90000 teilst Du den Wert bei jedem Schleifendurchlauf aber zählst ihn nur einmal im Timerinterrupt hoch. Wie soll der Wert da je größer 1 werden?

    Warum fragst Du nicht einfach ob Z > 90000 ist um deinen Wert zu speichern, das is sicher von der Programmabarbeitung auch schneller als ne division. Den Z-Wert müßte man auch mal wieder auf 0 setzen.

    MfG

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    19.06.2007
    Ort
    Fürth
    Alter
    41
    Beiträge
    52
    Danke für die schnelle Antwort...

    mhja der Code is noch ausbaufähig...mir gehts in erst Linie um die Speicherung des Wertes im eeprom...funktioiert das so? Und wie lese ich den
    Wert nach einem Neustart wieder aus?

    MfG
    Sascha

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.02.2005
    Beiträge
    175
    Hm... bedingte DIM´s hab ich noch nie gesehen... keine Ahnung, ob das funzt!

    Warum deklarierst Du die Variablen nicht oben bei den anderen?

    Grüße

    Torsten

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    19.06.2007
    Ort
    Fürth
    Alter
    41
    Beiträge
    52
    Das isses ja womit ich mich nicht auskenne! Schreibt der wenn ich die var deklariere oder erst wenn ich sie in der schleife zuweise???
    Wenn es andere Wege gibt: immer her damit ich bin für alle Vorschläge offen!


    MfG
    Sascha

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.02.2005
    Beiträge
    175
    Hi,

    das Deklarieren schreibt zunächst mal gar nichts, sondern reserviert einfach nur Speicher für die Variable.

    Wenn Du Single speichern willst, solltest Du natürlich auch die EEPROM-Variable und die Vergleichsvariable K als Single deklarieren, sonst wird das nix, weil die Kommastellen beim Wandeln auf Word abgeschnitten werden und Du anschließend Äpfel mit Birnen vergleichst - im Endergebnis ist dann "K" immer ungleich "Zuspeichernderwert"...

    Versuch mal den folgenden Code. Müsste gehen, ist aber nicht getestet...


    Code:
    Dim Z As Long
    Dim Zuspeichernderwert As Single
    Dim K As Single
    Dim Speicher As Eram Single
    
    'Timer mit 100 Hz
    Config Timer0 = Timer , Prescale = 1024
    
    On Timer0 Timer_irq
    
    Const Timervorgabe = 100
    
    
    Enable Timer0
    Enable Interrupts
    
    'Einmaliges Rücklesen der EEPROM-Variable
    K = Speicher
    
    Do
       If Z = 90000 And K <> Zuspeichernderwert Then
          'K = Zuspeichernderwert
          Speicher = Zuspeichernderwert
          Z = 0
       End If
    
    Loop
    
    
    Timer_irq:
    Timer0 = Timervorgabe
    Incr Z
    Return
    Viele Grüße

    Torsten

Berechtigungen

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

LiFePO4 Speicher Test