PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Werte regelmäßig im EEPROM speichern...Codebeschau



masabuana
10.07.2007, 14:38
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<



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

Rofo88
10.07.2007, 16:24
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

masabuana
10.07.2007, 17:07
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

Torsten_G
10.07.2007, 18:34
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

masabuana
10.07.2007, 18:58
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

Torsten_G
10.07.2007, 20:07
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...




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